KiCad PCB EDA Suite
Loading...
Searching...
No Matches
zone_create_helper.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 The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20#include <core/spinlock.h>
24#include <tool/tool_manager.h>
25#include <zone.h>
26#include <pcb_shape.h>
27#include <footprint.h>
28#include <board_commit.h>
30#include <pcb_painter.h>
31#include <tools/pcb_actions.h>
33#include <view/view_controls.h>
36#include <pcb_base_edit_frame.h>
37
39 m_tool( aTool ),
40 m_params( aParams ),
41 m_parentView( *aTool.getView() )
42{
44}
45
46
48{
49 // remove the preview from the view
50 m_parentView.SetVisible( &m_previewItem, false );
51 m_parentView.Remove( &m_previewItem );
52}
53
54
56{
57 PCB_BASE_EDIT_FRAME* frame = m_tool.getEditFrame<PCB_BASE_EDIT_FRAME>();
58 BOARD* board = frame->GetBoard();
59
60 // By default, new zones get the first unused priority
61 std::set<unsigned> priorities;
62
63 for( ZONE* zone : board->Zones() )
64 {
65 if( zone->GetTeardropAreaType() == TEARDROP_TYPE::TD_NONE
66 && ( zone->GetLayerSet() & LSET::AllCuMask() ).any()
67 && !zone->GetIsRuleArea() )
68 {
69 priorities.insert( zone->GetAssignedPriority() );
70 }
71 }
72
73 unsigned priority = 0;
74
75 for( unsigned exist_priority : priorities )
76 {
77 if( priority != exist_priority )
78 break;
79
80 ++priority;
81 }
82
83 aZoneInfo.m_ZonePriority = priority;
84}
85
86
87std::unique_ptr<ZONE> ZONE_CREATE_HELPER::createNewZone( bool aKeepout )
88{
89 PCB_BASE_EDIT_FRAME* frame = m_tool.getEditFrame<PCB_BASE_EDIT_FRAME>();
90 BOARD* board = frame->GetBoard();
91 BOARD_ITEM_CONTAINER* parent = m_tool.m_frame->GetModel();
92 KIGFX::VIEW_CONTROLS* controls = m_tool.GetManager()->GetViewControls();
93 std::set<int> highlightedNets = board->GetHighLightNetCodes();
94
95 // Get the current default settings for zones
96 ZONE_SETTINGS zoneInfo = board->GetDesignSettings().GetDefaultZoneSettings();
97 zoneInfo.m_Layers.reset().set( m_params.m_layer ); // TODO(JE) multilayer defaults?
98 zoneInfo.m_LayerProperties.clear(); // Do not copy over layer properties
99 zoneInfo.m_Netcode = highlightedNets.empty() ? -1 : *highlightedNets.begin();
100 zoneInfo.SetIsRuleArea( m_params.m_keepout );
101
102 // A new zone starts unnamed, do not inherit the last drawn zone's name (issue 23131)
103 zoneInfo.m_Name = wxEmptyString;
104
105 if( m_params.m_thieving )
106 {
108 zoneInfo.m_Netcode = 0;
110 }
111
113 && ( zoneInfo.m_Layers & LSET::AllCuMask() ).any() )
114 {
115 setUniquePriority( zoneInfo );
116 }
117
118 // If we don't have a net from highlighting, maybe we can get one from the selection
119 PCB_SELECTION_TOOL* selectionTool = m_tool.GetManager()->GetTool<PCB_SELECTION_TOOL>();
120
121 if( selectionTool && !selectionTool->GetSelection().Empty() && zoneInfo.m_Netcode == -1 )
122 {
123 EDA_ITEM* item = *selectionTool->GetSelection().GetItems().begin();
124
125 if( BOARD_CONNECTED_ITEM* bci = dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
126 zoneInfo.m_Netcode = bci->GetNetCode();
127 }
128
129 if( m_params.m_mode != ZONE_MODE::GRAPHIC_POLYGON && m_params.m_mode != ZONE_MODE::STITCH && !m_params.m_thieving )
130 {
131 // When drawing a new zone, skip the pre-draw dialog for thieving copper and
132 // graphic polygons as it is more disruptive than useful
133 int dialogResult;
134
135 if( m_params.m_keepout )
136 dialogResult = InvokeRuleAreaEditor( frame, &zoneInfo, m_tool.board() );
137 else if( ( zoneInfo.m_Layers & LSET::AllCuMask() ).any() )
138 dialogResult = InvokeCopperZonesEditor( frame, nullptr, &zoneInfo );
139 else
140 dialogResult = InvokeNonCopperZonesEditor( frame, &zoneInfo );
141
142 if( dialogResult == wxID_CANCEL )
143 return nullptr;
144
145 controls->WarpMouseCursor( controls->GetCursorPosition(), true );
146 frame->GetCanvas()->SetFocus();
147 }
148
149 wxASSERT( !m_tool.m_isFootprintEditor || ( parent->Type() == PCB_FOOTPRINT_T ) );
150
151 std::unique_ptr<ZONE> newZone = std::make_unique<ZONE>( parent );
152
153 // Apply the selected settings
154 zoneInfo.ExportSetting( *newZone );
155
156 return newZone;
157}
158
159
160std::unique_ptr<ZONE> ZONE_CREATE_HELPER::createZoneFromExisting( const ZONE& aSrcZone )
161{
162 BOARD* board = m_tool.getModel<BOARD>();
163
164 std::unique_ptr<ZONE> newZone = std::make_unique<ZONE>( board );
165
166 ZONE_SETTINGS zoneSettings;
167 zoneSettings << aSrcZone;
168
169 zoneSettings.ExportSetting( *newZone );
170 newZone->SetZoneName( board->GetUniqueZoneName( newZone->GetZoneName() ) );
171
172 return newZone;
173}
174
175
176void ZONE_CREATE_HELPER::performZoneCutout( ZONE& aZone, const ZONE& aCutout )
177{
178 BOARD_COMMIT commit( &m_tool );
179 std::vector<ZONE*> newZones;
180
181 // Clear the selection before removing the old zone
182 TOOL_MANAGER* toolMgr = m_tool.GetManager();
184
185 SHAPE_POLY_SET originalOutline( *aZone.Outline() );
186 SHAPE_POLY_SET cutoutOutline( *aCutout.Outline() );
187
188 // Clipper2 cannot carry arcs through boolean operations when either operand has holes or
189 // the clip side has outlines, so strip arc metadata first. Without this, zones built from
190 // circles (or any arc-bearing outline) get corrupt arc endpoints written to disk and
191 // render as garbage after reload. See SHAPE_POLY_SET::booleanOp.
192 originalOutline.ClearArcs();
193 cutoutOutline.ClearArcs();
194
195 originalOutline.BooleanSubtract( cutoutOutline );
196
197 // After substracting the hole, originalOutline can have more than one main outline.
198 // But a zone can have only one main outline, so create as many zones as originalOutline
199 // contains main outlines:
200 for( int outline = 0; outline < originalOutline.OutlineCount(); outline++ )
201 {
202 SHAPE_POLY_SET* newZoneOutline = new SHAPE_POLY_SET;
203 newZoneOutline->AddOutline( originalOutline.Outline( outline ) );
204
205 // Add holes (if any) to the new zone outline:
206 for (int hole = 0; hole < originalOutline.HoleCount( outline ) ; hole++ )
207 newZoneOutline->AddHole( originalOutline.CHole( outline, hole ) );
208
209 ZONE* newZone = new ZONE( aZone );
210 newZone->SetOutline( newZoneOutline ); // zone takes ownership
211 newZone->SetLocalFlags( 1 );
212 newZone->HatchBorder();
213 newZone->UnFill();
214 newZones.push_back( newZone );
215 commit.Add( newZone );
216 }
217
218 commit.Remove( &aZone );
219 commit.Push( _( "Add Zone Cutout" ) );
220
221 // Select the new zone and set it as the source for the next cutout
222 if( newZones.empty() )
223 {
224 m_params.m_sourceZone = nullptr;
225 }
226 else
227 {
228 m_params.m_sourceZone = newZones[0];
229 toolMgr->RunAction<EDA_ITEM*>( ACTIONS::selectItem, newZones[0] );
230 }
231}
232
233
234void ZONE_CREATE_HELPER::commitZone( std::unique_ptr<ZONE> aZone )
235{
236 switch ( m_params.m_mode )
237 {
239 // For cutouts, subtract from the source
240 performZoneCutout( *m_params.m_sourceZone, *aZone );
241 break;
242
243 case ZONE_MODE::ADD:
245 {
246 BOARD_COMMIT commit( &m_tool );
247
248 aZone->HatchBorder();
249
250 commit.Add( aZone.get() );
251 commit.Push( _( "Draw Zone" ) );
252
253 m_tool.GetManager()->RunAction<EDA_ITEM*>( ACTIONS::selectItem, aZone.release() );
254 break;
255 }
256
258 {
259 BOARD* board = m_tool.getModel<BOARD>();
260 GENERATOR_TOOL* generatorTool = m_tool.GetManager()->GetTool<GENERATOR_TOOL>();
261
262 // Build the stitcher detached from the board so the properties dialog can
263 // edit its settings before we commit it. Parented to the board (without
264 // being added) so net lookups in the dialog work.
265 std::unique_ptr<PCB_VIA_STITCH> stitcher = std::make_unique<PCB_VIA_STITCH>();
266 stitcher->SetFlags( IS_NEW );
267 stitcher->SetParent( board );
268 stitcher->SetOutline( *aZone->Outline() );
269 stitcher->InitializeDefaults( board );
270
271 // Pop the properties dialog up-front so the user picks net / pitch / pattern
272 // before any vias materialize. Cancel discards the whole creation.
273 PCB_BASE_EDIT_FRAME* editFrame = dynamic_cast<PCB_BASE_EDIT_FRAME*>( m_tool.GetManager()->GetToolHolder() );
274
275 if( editFrame )
276 {
277 DIALOG_VIA_STITCH_PROPERTIES dlg( editFrame, stitcher.get() );
278
279 if( dlg.ShowModal() != wxID_OK )
280 break;
281 }
282
283 BOARD_COMMIT commit( &m_tool );
284 PCB_VIA_STITCH* released = stitcher.release();
285
286 released->EditStart( generatorTool, board, &commit );
287 released->Update( generatorTool, board, &commit );
288 released->EditFinish( generatorTool, board, &commit );
289
290 commit.Push( _( "Create Via Stitch" ) );
291
292 m_tool.GetManager()->RunAction<EDA_ITEM*>( PCB_ACTIONS::selectItem, released );
293 break;
294 }
295
297 {
298 BOARD_COMMIT commit( &m_tool );
299 BOARD* board = m_tool.getModel<BOARD>();
300 PCB_LAYER_ID layer = m_params.m_layer;
301 PCB_SHAPE* poly = new PCB_SHAPE( m_tool.m_frame->GetModel() );
302
303 poly->SetShape( SHAPE_T::POLY );
304 poly->SetFilled( layer != Edge_Cuts && layer != F_CrtYd && layer != B_CrtYd );
305
308 poly->SetLayer( layer );
309 poly->SetPolyShape( *aZone->Outline() );
310
311 commit.Add( poly );
312 commit.Push( _( "Draw Polygon" ) );
313
314 m_tool.GetManager()->RunAction<EDA_ITEM*>( ACTIONS::selectItem, poly );
315 break;
316 }
317 }
318}
319
320
322{
323 // if we don't have a zone, create one
324 if( !m_zone )
325 {
326 if( m_params.m_sourceZone )
327 m_zone = createZoneFromExisting( *m_params.m_sourceZone );
328 else
329 m_zone = createNewZone( m_params.m_keepout );
330
331 if( m_zone )
332 {
333 m_tool.GetManager()->RunAction( ACTIONS::selectionClear );
334
335 // set up properties from zone
336 const RENDER_SETTINGS& settings = *m_parentView.GetPainter()->GetSettings();
337 COLOR4D color = settings.GetColor( nullptr, m_zone->GetFirstLayer() );
338
339 m_previewItem.SetStrokeColor( COLOR4D::WHITE );
340 m_previewItem.SetFillColor( color.WithAlpha( 0.2 ) );
341
342 m_parentView.SetVisible( &m_previewItem, true );
343
344 LEADER_MODE mode = m_tool.GetAngleSnapMode();
345
346 aMgr.SetLeaderMode( mode );
347 }
348 }
349
350 return m_zone != nullptr;
351}
352
353
355{
356 // Handle a cancel-interactive
357 if( m_zone && !aMgr.IsPolygonInProgress() )
358 {
359 m_zone = nullptr;
360 m_parentView.SetVisible( &m_previewItem, false );
361 return;
362 }
363
364 // send the points to the preview item
365 m_previewItem.SetPoints( aMgr.GetLockedInPoints(), aMgr.GetLeaderLinePoints(),
366 aMgr.GetLoopLinePoints() );
368}
369
370
372{
373 const SHAPE_LINE_CHAIN& finalPoints = aMgr.GetLockedInPoints();
374
375 if( finalPoints.PointCount() < 3 )
376 {
377 // just scrap the zone in progress
378 m_zone = nullptr;
379 }
380 else
381 {
382 // if m_params.m_mode == DRAWING_TOOL::ZONE_MODE::CUTOUT, m_zone will be merged to the
383 // existing zone as a new hole.
384 m_zone->Outline()->NewOutline();
385 SHAPE_POLY_SET* outline = m_zone->Outline();
386
387 for( int i = 0; i < finalPoints.PointCount(); ++i )
388 outline->Append( finalPoints.CPoint( i ) );
389
390 // In DEG45 mode, we may have intermediate points in the leader that should be included
391 // as they are shown in the preview. These typically maintain the 45 constraint
393 {
394 const SHAPE_LINE_CHAIN leaderPts = aMgr.GetLeaderLinePoints();
395
396 for( int i = 1; i < leaderPts.PointCount(); i++ )
397 outline->Append( leaderPts.CPoint( i ) );
398
399 const SHAPE_LINE_CHAIN loopPts = aMgr.GetLoopLinePoints();
400
401 for( int i = 1; i < loopPts.PointCount() - 1; i++ )
402 outline->Append( loopPts.CPoint( i ) );
403 }
404
405 SHAPE_LINE_CHAIN& chain = outline->Outline( 0 );
406
407 chain.SetClosed( true );
408 chain.Simplify( true );
409
410 // Remove the start point if it lies on the line between neighbouring points.
411 // Simplify doesn't handle that currently.
412 if( chain.PointCount() >= 3 )
413 {
414 SEG seg( chain.CLastPoint(), chain.CPoint( 1 ) );
415
416 if( seg.LineDistance( chain.CPoint( 0 ) ) <= 1 )
417 chain.Remove( 0 );
418 }
419
420 // hand the zone over to the committer
421 commitZone( std::move( m_zone ) );
422 m_zone = nullptr;
423 }
424
425 m_parentView.SetVisible( &m_previewItem, false );
426}
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
Definition actions.h:223
static TOOL_ACTION selectionClear
Clear the current selection.
Definition actions.h:220
BASE_SET & reset(size_t pos)
Definition base_set.h:153
BASE_SET & set(size_t pos)
Definition base_set.h:126
void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
Abstract interface for BOARD_ITEMs capable of storing other items inside.
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:411
wxString GetUniqueZoneName(const wxString &aBaseName, const ZONE *aExclude=nullptr) const
Return a name based on aBaseName that is not used by any other zone or rule area on the board.
Definition board.cpp:1465
BOARD_DESIGN_SETTINGS & GetDesignSettings()
Definition board.cpp:1290
static const COLOR4D WHITE
Definition color4d.h:403
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
Definition commit.h:86
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
Definition commit.h:74
int ShowModal() override
Modal properties editor for a PCB_VIA_STITCH generator.
Tool responsible for drawing graphical elements like lines, arcs, circles, etc.
void SetFocus() override
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:98
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
virtual void SetFilled(bool aFlag)
Definition eda_shape.h:144
Handle actions specific to filling copper zones.
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
COLOR4D WithAlpha(double aAlpha) const
Return a color with the same color, but the given alpha.
Definition color4d.h:309
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
virtual COLOR4D GetColor(const VIEW_ITEM *aItem, int aLayer) const =0
Returns the color that should be used to draw the specific VIEW_ITEM on the specific layer using curr...
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual void WarpMouseCursor(const VECTOR2D &aPosition, bool aWorldCoordinates=false, bool aWarpView=false)=0
If enabled (.
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition lset.cpp:595
Common, abstract interface for edit frames.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
BOARD * GetBoard() const
The selection tool: currently supports:
PCB_SELECTION & GetSelection()
void SetShape(SHAPE_T aShape) override
Definition pcb_shape.h:212
void SetPolyShape(const SHAPE_POLY_SET &aShape) override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void SetStroke(const STROKE_PARAMS &aStroke) override
void EditStart(GENERATOR_TOOL *, BOARD *, BOARD_COMMIT *) override
bool Update(GENERATOR_TOOL *, BOARD *, BOARD_COMMIT *) override
void EditFinish(GENERATOR_TOOL *, BOARD *, BOARD_COMMIT *) override
Class that handles the drawing of a polygon, including management of last corner deletion and drawing...
const SHAPE_LINE_CHAIN & GetLockedInPoints() const
Get the "locked-in" points that describe the polygon itself.
LEADER_MODE GetLeaderMode() const
void SetLeaderMode(LEADER_MODE aMode)
Set the leader mode to use when calculating the leader/returner lines.
const SHAPE_LINE_CHAIN & GetLoopLinePoints() const
Get the points from the current cursor position to the polygon start point.
const SHAPE_LINE_CHAIN & GetLeaderLinePoints() const
Get the points comprising the leader line (the line from the last locked-in point to the current curs...
Definition seg.h:38
int LineDistance(const VECTOR2I &aP, bool aDetermineSide=false) const
Return the closest Euclidean distance between point aP and the line defined by the ends of segment (t...
Definition seg.cpp:710
const std::deque< EDA_ITEM * > GetItems() const
Definition selection.h:125
bool Empty() const
Checks if there is anything selected.
Definition selection.h:114
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
int PointCount() const
Return the number of points (vertices) in this line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
Represent a set of closed polygons.
void ClearArcs()
Removes all arc references from all the outlines and holes in the polyset.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
int AddHole(const SHAPE_LINE_CHAIN &aHole, int aOutline=-1)
Adds a new hole to the given outline (default: last) and returns its index.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
const SHAPE_LINE_CHAIN & CHole(int aOutline, int aHole) const
int OutlineCount() const
Return the number of outlines in the set.
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
Simple container to manage line stroke parameters.
Master controller class:
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
void commitZone(std::unique_ptr< ZONE > aZone)
Commit the current zone-in-progress to the BOARD.
PARAMS & m_params
Parameters of the zone to be drawn.
bool OnFirstPoint(POLYGON_GEOM_MANAGER &aMgr) override
Called before the first point is added - clients can do initialization here, and can veto the start o...
ZONE_CREATE_HELPER(DRAWING_TOOL &aTool, PARAMS &aParams)
std::unique_ptr< ZONE > createNewZone(bool aKeepout)
Prompt the user for new zone settings, and create a new zone with those settings.
void performZoneCutout(ZONE &aZone, const ZONE &aCutout)
Cut one zone out of another one (i.e.
void setUniquePriority(ZONE_SETTINGS &aZoneInfo)
Choose a new priority for aZoneInfo.
void OnGeometryChange(const POLYGON_GEOM_MANAGER &aMgr) override
Interface for receiving POLYGON_GEOM_MANAGER update.
std::unique_ptr< ZONE > m_zone
The zone-in-progress.
std::unique_ptr< ZONE > createZoneFromExisting(const ZONE &aSrcZone)
Create a new zone with the settings from an existing zone.
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
The preview item to display.
void OnComplete(const POLYGON_GEOM_MANAGER &aMgr) override
Called when the polygon is complete.
KIGFX::VIEW & m_parentView
view that show the preview item
Handle zones parameters.
void SetIsRuleArea(bool aEnable)
void ExportSetting(ZONE &aTarget, bool aFullExport=true) const
Copy settings to a given zone.
void SetPadConnection(ZONE_CONNECTION aPadConnection)
unsigned m_ZonePriority
std::map< PCB_LAYER_ID, ZONE_LAYER_PROPERTIES > m_LayerProperties
ZONE_FILL_MODE m_FillMode
Handle a list of polygons defining a copper zone.
Definition zone.h:70
bool UnFill()
Removes the zone filling.
Definition zone.cpp:563
void SetLocalFlags(int aFlags)
Definition zone.h:419
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
Definition zone.cpp:1614
SHAPE_POLY_SET * Outline()
Definition zone.h:421
void SetOutline(SHAPE_POLY_SET *aOutline)
Definition zone.h:424
int InvokeCopperZonesEditor(PCB_BASE_FRAME *aCaller, ZONE *aZone, ZONE_SETTINGS *aSettings, CONVERT_SETTINGS *aConvertSettings)
Invoke a modal dialog window for copper zone editing.
int InvokeNonCopperZonesEditor(PCB_BASE_FRAME *aParent, ZONE_SETTINGS *aSettings, CONVERT_SETTINGS *aConvertSettings)
Invoke a modal dialog window for non-copper zone editing.
int InvokeRuleAreaEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aZoneSettings, BOARD *aBoard, CONVERT_SETTINGS *aConvertSettings)
Invoke a modal dialog window for copper zone editing.
#define _(s)
#define IS_NEW
New item, just created.
LEADER_MODE
The kind of the leader line.
@ DEG45
45 Degree only
@ DEG90
90 Degree only
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
@ F_CrtYd
Definition layer_ids.h:112
@ Edge_Cuts
Definition layer_ids.h:108
@ B_CrtYd
Definition layer_ids.h:111
@ GEOMETRY
Position or shape has changed.
Definition view_item.h:51
@ SIMILAR
Add a new zone with the same settings as an existing one.
Definition pcb_actions.h:37
@ CUTOUT
Make a cutout to an existing zone.
Definition pcb_actions.h:36
@ GRAPHIC_POLYGON
Definition pcb_actions.h:38
@ ADD
Add a new zone/keepout with fresh settings.
Definition pcb_actions.h:35
Parameters used to fully describe a zone creation process.
const SHAPE_LINE_CHAIN chain
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition typeinfo.h:78
@ NONE
Pads are not covered.
Definition zones.h:45