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 (C) 2023 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, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <pcb_generator.h>
26
27
29 PCB_GROUP( aParent, PCB_GENERATOR_T, aLayer )
30{
31}
32
33
35{
36}
37
38
40{
41 // Use copy constructor to get the same uuid and other fields
42 PCB_GENERATOR* newGenerator = static_cast<PCB_GENERATOR*>( Clone() );
43 newGenerator->m_items.clear();
44
45 for( BOARD_ITEM* member : m_items )
46 {
47 if( member->Type() == PCB_GROUP_T )
48 newGenerator->AddItem( static_cast<PCB_GROUP*>( member )->DeepClone() );
49 else
50 newGenerator->AddItem( static_cast<BOARD_ITEM*>( member->Clone() ) );
51 }
52
53 return newGenerator;
54}
55
56
58{
59 aCommit->Modify( this );
60}
61
62
64 const wxString& aCommitMsg, int aCommitFlags )
65{
66 aCommit->Push( aCommitMsg, aCommitFlags );
67}
68
69
71{
72 aCommit->Revert();
73}
74
75
76void PCB_GENERATOR::Remove( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit )
77{
78 aCommit->Remove( this );
79}
80
81
82bool PCB_GENERATOR::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, BOARD_COMMIT* aCommit )
83{
84 return true;
85}
86
87
88std::vector<EDA_ITEM*> PCB_GENERATOR::GetPreviewItems( GENERATOR_TOOL* aTool,
89 PCB_BASE_EDIT_FRAME* aFrame,
90 bool aStatusItemsOnly )
91{
92 return std::vector<EDA_ITEM*>();
93}
94
95
96bool PCB_GENERATOR::MakeEditPoints( std::shared_ptr<EDIT_POINTS> aEditPoints ) const
97{
98 return true;
99}
100
101
102bool PCB_GENERATOR::UpdateFromEditPoints( std::shared_ptr<EDIT_POINTS> aEditPoints,
103 BOARD_COMMIT* aCommit )
104{
105 return true;
106}
107
108
109bool PCB_GENERATOR::UpdateEditPoints( std::shared_ptr<EDIT_POINTS> aEditPoints )
110{
111 return true;
112}
113
114
116{
117 BOX2I bbox;
118 return bbox;
119}
120
121
122void PCB_GENERATOR::Move( const VECTOR2I& aMoveVector )
123{
124 m_origin += aMoveVector;
125
126 PCB_GROUP::Move( aMoveVector );
127}
128
129
131{
132 // Items can only be in one group at a time
133 if( aItem->GetParentGroup() )
134 aItem->GetParentGroup()->RemoveItem( aItem );
135
136 m_items.insert( aItem );
137 aItem->SetParentGroup( this );
138 return true;
139}
140
141
143{
144 return PCB_GROUP::GetLayerSet() | LSET( GetLayer() );
145}
146
147
149{
150 m_layer = aLayer;
151}
152
153
155{
156 return m_generatorType;
157}
158
159
161{
163
164#ifdef GENERATOR_ORDER
165 props.set( "update_order", m_updateOrder );
166#endif
167
168 props.set( "origin", m_origin );
169
170 return props;
171}
172
173
175{
176#ifdef GENERATOR_ORDER
177 aProps.get_to( "update_order", m_updateOrder );
178#endif
179
180 aProps.get_to( "origin", m_origin );
181}
182
183
184std::vector<std::pair<wxString, wxVariant>> PCB_GENERATOR::GetRowData()
185{
186#ifdef GENERATOR_ORDER
187 return { { _HKI( "Update Order" ), wxString::FromCDouble( GetUpdateOrder() ) } };
188#else
189 return { {} };
190#endif
191}
192
193
194wxString PCB_GENERATOR::GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) const
195{
196 return wxString( _( "Generator" ) );
197}
198
199
201{
202 return wxS( "PCB_GENERATOR" );
203}
204
205
207{
208 return aItem && PCB_GENERATOR_T == aItem->Type();
209}
210
211
212#ifdef GENERATOR_ORDER
213static struct PCB_GENERATOR_DESC
214{
215 PCB_GENERATOR_DESC()
216 {
221
222 const wxString groupTab = _HKI( "Generator Properties" );
223
224 propMgr.AddProperty( new PROPERTY<PCB_GENERATOR, int>( _HKI( "Update Order" ),
225 &PCB_GENERATOR::SetUpdateOrder,
226 &PCB_GENERATOR::GetUpdateOrder ),
227 groupTab );
228 }
229} _PCB_GENERATOR_DESC;
230#endif
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
virtual void Revert() override
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:77
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:226
void SetParentGroup(PCB_GROUP *aGroup)
Definition: board_item.h:90
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:91
PCB_LAYER_ID m_layer
Definition: board_item.h:388
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:281
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been removed.
Definition: commit.h:92
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
Definition: commit.h:105
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:88
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:100
Handle actions specific to filling copper zones.
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:574
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)
wxString m_generatorType
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
virtual void Remove(GENERATOR_TOOL *aTool, BOARD *aBoard, BOARD_COMMIT *aCommit)
virtual void EditRevert(GENERATOR_TOOL *aTool, BOARD *aBoard, BOARD_COMMIT *aCommit)
wxString GetClass() const override
Return the class name.
virtual bool UpdateEditPoints(std::shared_ptr< EDIT_POINTS > aEditPoints)
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)
virtual bool MakeEditPoints(std::shared_ptr< EDIT_POINTS > aEditPoints) const
bool AddItem(BOARD_ITEM *aItem) override
Add item to group.
virtual void EditPush(GENERATOR_TOOL *aTool, BOARD *aBoard, BOARD_COMMIT *aCommit, const wxString &aCommitMsg=wxEmptyString, int aCommitFlags=0)
VECTOR2I m_origin
static bool ClassOf(const EDA_ITEM *aItem)
PCB_GENERATOR * DeepClone() const
virtual void EditStart(GENERATOR_TOOL *aTool, BOARD *aBoard, BOARD_COMMIT *aCommit)
virtual std::vector< EDA_ITEM * > GetPreviewItems(GENERATOR_TOOL *aTool, PCB_BASE_EDIT_FRAME *aFrame, bool aStatusItemsOnly=false)
virtual bool Update(GENERATOR_TOOL *aTool, BOARD *aBoard, BOARD_COMMIT *aCommit)
void Move(const VECTOR2I &aMoveVector) override
Move this object.
virtual std::vector< std::pair< wxString, wxVariant > > GetRowData()
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
virtual const STRING_ANY_MAP GetProperties() const
virtual wxString GetGeneratorType() const
virtual bool UpdateFromEditPoints(std::shared_ptr< EDIT_POINTS > aEditPoints, BOARD_COMMIT *aCommit)
A set of BOARD_ITEMs (i.e., without duplicates).
Definition: pcb_group.h:51
std::unordered_set< BOARD_ITEM * > m_items
Definition: pcb_group.h:216
PCB_GROUP * DeepClone() const
Definition: pcb_group.cpp:203
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
Definition: pcb_group.cpp:305
void Move(const VECTOR2I &aMoveVector) override
Move this object.
Definition: pcb_group.cpp:345
virtual bool RemoveItem(BOARD_ITEM *aItem)
Remove item from group.
Definition: pcb_group.cpp:95
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: pcb_group.cpp:195
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:85
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:87
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 _HKI(x)
#define _(s)
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
#define TYPE_HASH(x)
Definition: property.h:71
#define REGISTER_TYPE(x)
Definition: property_mgr.h:366
const double IU_PER_MM
Definition: base_units.h:76
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
Definition: typeinfo.h:91
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition: typeinfo.h:110