KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_generator.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2023 Alex Shvartzkop <[email protected]>
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21#include "pcb_generator.h"
22
23#include <board.h>
24#include <properties/property.h>
26
27
29 PCB_GROUP( aParent, PCB_GENERATOR_T, aLayer ),
31 m_origin(),
32 m_isDirty( false )
33{
34}
35
36
40
41
43{
44 // Use copy constructor to get the same uuid and other fields
45 PCB_GENERATOR* newGenerator = static_cast<PCB_GENERATOR*>( Clone() );
46 newGenerator->m_items.clear();
47
48 for( EDA_ITEM* member : m_items )
49 {
50 if( member->Type() == PCB_GROUP_T )
51 newGenerator->AddItem( static_cast<PCB_GROUP*>( member )->DeepClone() );
52 else if( member->Type() == PCB_GENERATOR_T )
53 newGenerator->AddItem( static_cast<PCB_GENERATOR*>( member )->DeepClone() );
54 else
55 newGenerator->AddItem( static_cast<BOARD_ITEM*>( member->Clone() ) );
56 }
57
58 return newGenerator;
59}
60
61
62std::vector<EDA_ITEM*> PCB_GENERATOR::GetPreviewItems( GENERATOR_TOOL* aTool,
63 PCB_BASE_EDIT_FRAME* aFrame,
64 bool aStatusItemsOnly )
65{
66 return std::vector<EDA_ITEM*>();
67}
68
69
71{
72 return true;
73}
74
75
77{
78 return true;
79}
80
81
83{
84 return true;
85}
86
87
89{
90 BOX2I bbox;
91 return bbox;
92}
93
94
95void PCB_GENERATOR::Move( const VECTOR2I& aMoveVector )
96{
97 m_origin += aMoveVector;
98
99 PCB_GROUP::Move( aMoveVector );
100}
101
102void PCB_GENERATOR::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
103{
104 RotatePoint( m_origin, aRotCentre, aAngle );
105
106 PCB_GROUP::Rotate( aRotCentre, aAngle );
107}
108
109void PCB_GENERATOR::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
110{
111 baseMirror( aCentre, aFlipDirection );
112
114
115 PCB_GROUP::Flip( aCentre, aFlipDirection );
116}
117
118void PCB_GENERATOR::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
119{
120 baseMirror( aCentre, aFlipDirection );
121
122 PCB_GROUP::Mirror( aCentre, aFlipDirection );
123}
124
125void PCB_GENERATOR::baseMirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
126{
127 if( aFlipDirection == FLIP_DIRECTION::TOP_BOTTOM )
128 MIRROR( m_origin.y, aCentre.y );
129 else
130 MIRROR( m_origin.x, aCentre.x );
131}
132
134{
135 return PCB_GROUP::GetLayerSet() | LSET( { GetLayer() } );
136}
137
139{
140 return m_generatorType;
141}
142
143
145{
146 STRING_ANY_MAP props( pcbIUScale.IU_PER_MM );
147
148#ifdef GENERATOR_ORDER
149 props.set( "update_order", m_updateOrder );
150#endif
151
152 props.set( "origin", m_origin );
153
154 return props;
155}
156
157
159{
160#ifdef GENERATOR_ORDER
161 aProps.get_to( "update_order", m_updateOrder );
162#endif
163
164 aProps.get_to( "origin", m_origin );
165}
166
167
168std::vector<std::pair<wxString, wxVariant>> PCB_GENERATOR::GetRowData()
169{
170#ifdef GENERATOR_ORDER
171 return { { _HKI( "Update Order" ), wxString::FromCDouble( GetUpdateOrder() ) } };
172#else
173 return { {} };
174#endif
175}
176
177
178wxString PCB_GENERATOR::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
179{
180 return wxString( _( "Generator" ) );
181}
182
183
185{
186 return wxS( "PCB_GENERATOR" );
187}
188
189
191{
192 return aItem && PCB_GENERATOR_T == aItem->Type();
193}
194
195
196#ifdef GENERATOR_ORDER
197static struct PCB_GENERATOR_DESC
198{
199 PCB_GENERATOR_DESC()
200 {
205
206 const wxString groupTab = _HKI( "Generator Properties" );
207
208 propMgr.AddProperty( new PROPERTY<PCB_GENERATOR, int>( _HKI( "Update Order" ),
209 &PCB_GENERATOR::SetUpdateOrder, &PCB_GENERATOR::GetUpdateOrder ),
210 groupTab );
211 }
212} _PCB_GENERATOR_DESC;
213#endif
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:121
BOX2< VECTOR2I > BOX2I
Definition box2.h:927
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition board_item.h:86
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
std::unordered_set< EDA_ITEM * > m_items
Definition eda_group.h:91
void AddItem(EDA_ITEM *aItem)
Add item to group.
Definition eda_group.cpp:58
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:84
EDIT_POINTS is a VIEW_ITEM that manages EDIT_POINTs and EDIT_LINEs and draws them.
Handle actions specific to filling copper zones.
LSET is a set of PCB_LAYER_IDs.
Definition lset.h:37
Common, abstract interface for edit frames.
virtual ~PCB_GENERATOR()
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
virtual void SetProperties(const STRING_ANY_MAP &aProps)
void baseMirror(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
wxString m_generatorType
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
wxString GetClass() const override
Return the class name.
virtual bool UpdateFromEditPoints(EDIT_POINTS &aEditPoints)
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
PCB_GENERATOR(BOARD_ITEM *aParent, PCB_LAYER_ID aLayer)
void Mirror(const VECTOR2I &aCentre, FLIP_DIRECTION aMirrorDirection) override
Mirror this object relative to a given horizontal axis the layer is not changed.
VECTOR2I m_origin
static bool ClassOf(const EDA_ITEM *aItem)
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
virtual bool MakeEditPoints(EDIT_POINTS &aEditPoints) const
PCB_GENERATOR * DeepClone() const
virtual bool UpdateEditPoints(EDIT_POINTS &aEditPoints)
virtual std::vector< EDA_ITEM * > GetPreviewItems(GENERATOR_TOOL *aTool, PCB_BASE_EDIT_FRAME *aFrame, bool aStatusItemsOnly=false)
void Move(const VECTOR2I &aMoveVector) override
Move this object.
virtual std::vector< std::pair< wxString, wxVariant > > GetRowData()
virtual const STRING_ANY_MAP GetProperties() const
virtual wxString GetGeneratorType() const
void Mirror(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Mirror this object relative to a given horizontal axis the layer is not changed.
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
void Move(const VECTOR2I &aMoveVector) override
Move this object.
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
PCB_GROUP(BOARD_ITEM *aParent)
Definition pcb_group.cpp:43
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
A name/value tuple with unique names and wxAny values.
bool get_to(const std::string &aKey, T &aVar) const
void set(const std::string &aKey, const T &aVar)
#define _(s)
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
Definition layer_id.cpp:179
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Definition mirror.h:41
FLIP_DIRECTION
Definition mirror.h:23
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
Definition mirror.h:25
#define _HKI(x)
Definition page_info.cpp:40
#define TYPE_HASH(x)
Definition property.h:74
#define REGISTER_TYPE(x)
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
Definition trigo.cpp:225
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
Definition typeinfo.h:83
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition typeinfo.h:103
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683