KiCad PCB EDA Suite
ZONE_CREATE_HELPER Class Reference

An adjunct helper to the DRAWING_TOOL interactive tool, which handles incoming geometry changes from a POLYGON_GEOM_MANAGER and translates that into a ZONE based on given parameters. More...

#include <zone_create_helper.h>

Inheritance diagram for ZONE_CREATE_HELPER:
POLYGON_GEOM_MANAGER::CLIENT

Classes

struct  PARAMS
 Parameters used to fully describe a zone creation process. More...
 

Public Member Functions

 ZONE_CREATE_HELPER (DRAWING_TOOL &aTool, PARAMS &aParams)
 
virtual ~ZONE_CREATE_HELPER ()
 
ZONEGetZone () const
 
void OnGeometryChange (const POLYGON_GEOM_MANAGER &aMgr) override
 Called when the polygon is complete. More...
 
bool OnFirstPoint (POLYGON_GEOM_MANAGER &aMgr) override
 Called before the first point is added - clients can do initialization here, and can veto the start of the process (e.g. More...
 
void OnComplete (const POLYGON_GEOM_MANAGER &aMgr) override
 
std::unique_ptr< ZONEcreateNewZone (bool aKeepout)
 Prompt the user for new zone settings, and create a new zone with those settings. More...
 
std::unique_ptr< ZONEcreateZoneFromExisting (const ZONE &aSrcZone)
 Create a new zone with the settings from an existing zone. More...
 
void performZoneCutout (ZONE &aZone, const ZONE &aCutout)
 Cut one zone out of another one (i.e. More...
 
void commitZone (std::unique_ptr< ZONE > aZone)
 Commit the current zone-in-progress to the BOARD. More...
 

Private Attributes

DRAWING_TOOLm_tool
 Parameters of the zone to be drawn. More...
 
PARAMSm_params
 The preview item to display. More...
 
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
 view that show the preview item More...
 
KIGFX::VIEWm_parentView
 The zone-in-progress. More...
 
std::unique_ptr< ZONEm_zone
 

Detailed Description

An adjunct helper to the DRAWING_TOOL interactive tool, which handles incoming geometry changes from a POLYGON_GEOM_MANAGER and translates that into a ZONE based on given parameters.

Definition at line 42 of file zone_create_helper.h.

Constructor & Destructor Documentation

◆ ZONE_CREATE_HELPER()

ZONE_CREATE_HELPER::ZONE_CREATE_HELPER ( DRAWING_TOOL aTool,
PARAMS aParams 
)
Parameters
aToolthe DRAWING_TOOL to provide the zone tool to.
aParamsthe parameters to use to guide the zone creation.

Definition at line 38 of file zone_create_helper.cpp.

38  :
39  m_tool( aTool ),
40  m_params( aParams ),
41  m_parentView( *aTool.getView() )
42 {
44 }
DRAWING_TOOL & m_tool
Parameters of the zone to be drawn.
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
view that show the preview item
KIGFX::VIEW & m_parentView
The zone-in-progress.
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
PARAMS & m_params
The preview item to display.
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
Definition: view.cpp:322

References KIGFX::VIEW::Add(), m_parentView, and m_previewItem.

◆ ~ZONE_CREATE_HELPER()

ZONE_CREATE_HELPER::~ZONE_CREATE_HELPER ( )
virtual

Definition at line 47 of file zone_create_helper.cpp.

48 {
49  // remove the preview from the view
52 }
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition: view.cpp:352
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
view that show the preview item
KIGFX::VIEW & m_parentView
The zone-in-progress.
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
Definition: view.cpp:1449

References m_parentView, m_previewItem, KIGFX::VIEW::Remove(), and KIGFX::VIEW::SetVisible().

Member Function Documentation

◆ commitZone()

void ZONE_CREATE_HELPER::commitZone ( std::unique_ptr< ZONE aZone)

Commit the current zone-in-progress to the BOARD.

This might be adding a new zone, or modifying an existing zone with a cutout, depending on parameters.

Parameters
aZoneis the drawn zone outline to commit.

Definition at line 190 of file zone_create_helper.cpp.

191 {
192  switch ( m_params.m_mode )
193  {
194  case ZONE_MODE::CUTOUT:
195  // For cutouts, subtract from the source
197  break;
198 
199  case ZONE_MODE::ADD:
200  case ZONE_MODE::SIMILAR:
201  {
202  BOARD_COMMIT commit( &m_tool );
203  BOARD* board = m_tool.getModel<BOARD>();
204 
205  aZone->HatchBorder();
206 
207  // TODO Refill zones when KiCad supports auto re-fill
208 
209  commit.Add( aZone.get() );
210 
211  std::lock_guard<KISPINLOCK> lock( board->GetConnectivity()->GetLock() );
212 
213  commit.Push( _( "Add a zone" ) );
214  m_tool.GetManager()->RunAction( PCB_ACTIONS::selectItem, true, aZone.release() );
215  break;
216  }
217 
219  {
220  BOARD_COMMIT commit( &m_tool );
221  BOARD* board = m_tool.getModel<BOARD>();
222  PCB_LAYER_ID layer = m_params.m_layer;
223  PCB_SHAPE* poly;
224 
226  poly = new FP_SHAPE( static_cast<FOOTPRINT*>( m_tool.m_frame->GetModel() ) );
227  else
228  poly = new PCB_SHAPE();
229 
230  poly->SetShape( S_POLYGON );
231 
232  if( layer == Edge_Cuts || layer == F_CrtYd || layer == B_CrtYd )
233  poly->SetFilled( false );
234  else
235  poly->SetFilled( true );
236 
238  poly->SetLayer( layer );
239  poly->SetPolyShape( *aZone->Outline() );
240 
241  commit.Add( poly );
243 
244  commit.Push( _( "Add a graphical polygon" ) );
245 
246  break;
247  }
248  }
249 }
Add a new zone with the same settings as an existing one.
T * getModel() const
Return the model object if it matches the requested type.
Definition: tool_base.h:197
ZONE * m_sourceZone
Zone leader mode.
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:194
void SetFilled(bool aFlag)
Definition: pcb_shape.h:94
DRAWING_TOOL & m_tool
Parameters of the zone to be drawn.
polygon (not yet used for tracks, but could be in microwave apps)
Definition: board_item.h:54
PCB_LAYER_ID m_layer
The zone mode to operate in.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:141
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.h:593
TOOL_MANAGER * GetManager() const
Return the instance of TOOL_MANAGER that takes care of the tool.
Definition: tool_base.h:144
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT) override
Adds an item to the container.
Definition: board.cpp:563
PCB_LAYER_ID
A quick note on layer IDs:
void SetShape(PCB_SHAPE_TYPE_T aShape)
Definition: pcb_shape.h:129
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition: board.h:416
Add a new zone/keepout with fresh settings.
bool m_isFootprintEditor
void performZoneCutout(ZONE &aZone, const ZONE &aCutout)
Cut one zone out of another one (i.e.
Make a cutout to an existing zone.
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:270
PARAMS & m_params
The preview item to display.
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:190
#define _(s)
Definition: 3d_actions.cpp:33
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
Definition: pcb_actions.h:66
void SetWidth(int aWidth)
Definition: pcb_shape.h:117
void SetPolyShape(const SHAPE_POLY_SET &aShape)
Definition: pcb_shape.h:276
ZONE_MODE m_mode
Zone settings source (for similar and cutout zones)

References _, ADD, COMMIT::Add(), B_CrtYd, CUTOUT, Edge_Cuts, F_CrtYd, BOARD::GetConnectivity(), BOARD::GetDesignSettings(), BOARD_DESIGN_SETTINGS::GetLineThickness(), TOOL_BASE::GetManager(), TOOL_BASE::getModel(), PCB_BASE_FRAME::GetModel(), GRAPHIC_POLYGON, DRAWING_TOOL::m_frame, PCB_TOOL_BASE::m_isFootprintEditor, ZONE_CREATE_HELPER::PARAMS::m_layer, ZONE_CREATE_HELPER::PARAMS::m_mode, m_params, ZONE_CREATE_HELPER::PARAMS::m_sourceZone, m_tool, performZoneCutout(), BOARD_COMMIT::Push(), TOOL_MANAGER::RunAction(), S_POLYGON, PCB_ACTIONS::selectItem, PCB_SHAPE::SetFilled(), BOARD_ITEM::SetLayer(), PCB_SHAPE::SetPolyShape(), PCB_SHAPE::SetShape(), PCB_SHAPE::SetWidth(), and SIMILAR.

Referenced by OnComplete().

◆ createNewZone()

std::unique_ptr< ZONE > ZONE_CREATE_HELPER::createNewZone ( bool  aKeepout)

Prompt the user for new zone settings, and create a new zone with those settings.

Parameters
aKeepoutshould the zone be a keepout
Returns
the new zone, can be null if the user aborted

Definition at line 55 of file zone_create_helper.cpp.

56 {
58  BOARD* board = frame->GetBoard();
61  std::set<int> highlightedNets = board->GetHighLightNetCodes();
62 
63  // Get the current default settings for zones
64  ZONE_SETTINGS zoneInfo = frame->GetZoneSettings();
65  zoneInfo.m_Layers.reset().set( m_params.m_layer ); // TODO(JE) multilayer defaults?
66  zoneInfo.m_NetcodeSelection = highlightedNets.empty() ? -1 : *highlightedNets.begin();
67  zoneInfo.SetIsRuleArea( m_params.m_keepout );
69 
70  // If we don't have a net from highlighing, maybe we can get one from the selection
72 
73  if( selectionTool && !selectionTool->GetSelection().Empty()
74  && zoneInfo.m_NetcodeSelection == -1 )
75  {
76  EDA_ITEM* item = *selectionTool->GetSelection().GetItems().begin();
77 
78  if( BOARD_CONNECTED_ITEM* bci = dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
79  zoneInfo.m_NetcodeSelection = bci->GetNetCode();
80  }
81 
83  {
84  // Get the current default settings for zones
85 
86  // Show options dialog
87  int dialogResult;
88 
89  if( m_params.m_keepout )
90  dialogResult = InvokeRuleAreaEditor( frame, &zoneInfo );
91  else
92  {
93  // TODO(JE) combine these dialogs?
94  if( ( zoneInfo.m_Layers & LSET::AllCuMask() ).any() )
95  dialogResult = InvokeCopperZonesEditor( frame, &zoneInfo );
96  else
97  dialogResult = InvokeNonCopperZonesEditor( frame, &zoneInfo );
98  }
99 
100  if( dialogResult == wxID_CANCEL )
101  return nullptr;
102 
103  controls->WarpCursor( controls->GetCursorPosition(), true );
104  }
105 
106  // The new zone is a ZONE if created in the board editor and a FP_ZONE if created in the
107  // footprint editor
108  wxASSERT( !m_tool.m_isFootprintEditor || ( parent->Type() == PCB_FOOTPRINT_T ) );
109 
110  std::unique_ptr<ZONE> newZone = m_tool.m_isFootprintEditor ?
111  std::make_unique<FP_ZONE>( parent ) :
112  std::make_unique<ZONE>( parent );
113 
114  // Apply the selected settings
115  zoneInfo.ExportSetting( *newZone );
116 
117  return newZone;
118 }
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:750
int InvokeNonCopperZonesEditor(PCB_BASE_FRAME *aParent, ZONE_SETTINGS *aSettings)
Function InvokeNonCopperZonesEditor invokes up a modal dialog window for non-copper zone editing.
DRAWING_TOOL & m_tool
Parameters of the zone to be drawn.
PCB_LAYER_ID m_layer
The zone mode to operate in.
Definition: bitmap.cpp:63
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
TOOL_MANAGER * GetManager() const
Return the instance of TOOL_MANAGER that takes care of the tool.
Definition: tool_base.h:144
int m_NetcodeSelection
Definition: zone_settings.h:93
PCB_SELECTION & GetSelection()
Return the set of currently selected items.
virtual void WarpCursor(const VECTOR2D &aPosition, bool aWorldCoordinates=false, bool aWarpView=false)=0
If enabled (.
void ExportSetting(ZONE &aTarget, bool aFullExport=true) const
Function ExportSetting copy settings to a given zone.
const ZONE_SETTINGS & GetZoneSettings() const
const std::deque< EDA_ITEM * > GetItems() const
Definition: selection.h:133
An interface for classes handling user events controlling the view behavior such as zooming,...
Handle a list of polygons defining a copper zone.
Definition: zone.h:57
void SetIsRuleArea(bool aEnable)
bool m_isFootprintEditor
int InvokeRuleAreaEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aSettings)
Function InvokeRuleAreaEditor invokes up a modal dialog window for copper zone editing.
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:122
class FOOTPRINT, a footprint
Definition: typeinfo.h:88
PCB_BASE_EDIT_FRAME * m_frame
Definition: drawing_tool.h:270
ZONE_SETTINGS handles zones parameters.
Definition: zone_settings.h:67
PARAMS & m_params
The preview item to display.
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
KIGFX::VIEW_CONTROLS * GetViewControls() const
Definition: tool_manager.h:291
Common, abstract interface for edit frames.
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:190
The selection tool: currently supports:
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:150
T * getEditFrame() const
Return the application window object, casted to requested user type.
Definition: tool_base.h:185
int InvokeCopperZonesEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aSettings)
Function InvokeCopperZonesEditor invokes up a modal dialog window for copper zone editing.
Abstract interface for BOARD_ITEMs capable of storing other items inside.
BOARD * GetBoard() const
POLYGON_GEOM_MANAGER::LEADER_MODE m_leaderMode
bool m_keepout
< Should create a keepout zone?
ZONE_MODE m_mode
Zone settings source (for similar and cutout zones)
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:163

References LSET::AllCuMask(), POLYGON_GEOM_MANAGER::DEG45, SELECTION::Empty(), ZONE_SETTINGS::ExportSetting(), PCB_BASE_FRAME::GetBoard(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), TOOL_BASE::getEditFrame(), SELECTION::GetItems(), TOOL_BASE::GetManager(), PCB_BASE_FRAME::GetModel(), PCB_SELECTION_TOOL::GetSelection(), TOOL_MANAGER::GetTool(), TOOL_MANAGER::GetViewControls(), PCB_BASE_FRAME::GetZoneSettings(), GRAPHIC_POLYGON, InvokeCopperZonesEditor(), InvokeNonCopperZonesEditor(), InvokeRuleAreaEditor(), DRAWING_TOOL::m_frame, PCB_TOOL_BASE::m_isFootprintEditor, ZONE_CREATE_HELPER::PARAMS::m_keepout, ZONE_CREATE_HELPER::PARAMS::m_layer, ZONE_SETTINGS::m_Layers, ZONE_CREATE_HELPER::PARAMS::m_leaderMode, ZONE_CREATE_HELPER::PARAMS::m_mode, ZONE_SETTINGS::m_NetcodeSelection, m_params, m_tool, ZONE_SETTINGS::m_Zone_45_Only, PCB_FOOTPRINT_T, ZONE_SETTINGS::SetIsRuleArea(), EDA_ITEM::Type(), and KIGFX::VIEW_CONTROLS::WarpCursor().

Referenced by OnFirstPoint().

◆ createZoneFromExisting()

std::unique_ptr< ZONE > ZONE_CREATE_HELPER::createZoneFromExisting ( const ZONE aSrcZone)

Create a new zone with the settings from an existing zone.

Parameters
aSrcZonethe zone to copy settings from
Returns
the new zone

Definition at line 121 of file zone_create_helper.cpp.

122 {
123  BOARD* board = m_tool.getModel<BOARD>();
124 
125  std::unique_ptr<ZONE> newZone = std::make_unique<ZONE>( board );
126 
127  ZONE_SETTINGS zoneSettings;
128  zoneSettings << aSrcZone;
129 
130  zoneSettings.ExportSetting( *newZone );
131 
132  return newZone;
133 }
T * getModel() const
Return the model object if it matches the requested type.
Definition: tool_base.h:197
DRAWING_TOOL & m_tool
Parameters of the zone to be drawn.
void ExportSetting(ZONE &aTarget, bool aFullExport=true) const
Function ExportSetting copy settings to a given zone.
ZONE_SETTINGS handles zones parameters.
Definition: zone_settings.h:67
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:190

References ZONE_SETTINGS::ExportSetting(), TOOL_BASE::getModel(), and m_tool.

Referenced by OnFirstPoint().

◆ GetZone()

ZONE* ZONE_CREATE_HELPER::GetZone ( ) const
inline

Definition at line 74 of file zone_create_helper.h.

74 { return m_zone.get(); }
std::unique_ptr< ZONE > m_zone

References m_zone.

Referenced by DRAWING_TOOL::DrawZone().

◆ OnComplete()

void ZONE_CREATE_HELPER::OnComplete ( const POLYGON_GEOM_MANAGER aMgr)
overridevirtual

Implements POLYGON_GEOM_MANAGER::CLIENT.

Definition at line 293 of file zone_create_helper.cpp.

294 {
295  auto& finalPoints = aMgr.GetLockedInPoints();
296 
297  if( finalPoints.PointCount() < 3 )
298  {
299  // just scrap the zone in progress
300  m_zone = nullptr;
301  }
302  else
303  {
304  // if m_params.m_mode == DRAWING_TOOL::ZONE_MODE::CUTOUT, m_zone
305  // will be merged to the existing zone as a new hole.
306  m_zone->Outline()->NewOutline();
307  auto* outline = m_zone->Outline();
308 
309  for( int i = 0; i < finalPoints.PointCount(); ++i )
310  outline->Append( finalPoints.CPoint( i ) );
311 
312  // In DEG45 mode, we may have intermediate points in the leader that should be
313  // included as they are shown in the preview. These typically maintain the
314  // 45 constraint
316  {
317  const auto& pts = aMgr.GetLeaderLinePoints();
318  for( int i = 1; i < pts.PointCount(); i++ )
319  outline->Append( pts.CPoint( i ) );
320  }
321 
322  outline->Outline( 0 ).SetClosed( true );
323  outline->RemoveNullSegments();
324  outline->Simplify( SHAPE_POLY_SET::PM_FAST );
325 
326  // hand the zone over to the committer
327  commitZone( std::move( m_zone ) );
328  m_zone = nullptr;
329  }
330 
332 }
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...
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
view that show the preview item
LEADER_MODE GetLeaderMode() const
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
KIGFX::VIEW & m_parentView
The zone-in-progress.
void commitZone(std::unique_ptr< ZONE > aZone)
Commit the current zone-in-progress to the BOARD.
std::unique_ptr< ZONE > m_zone
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
Definition: view.cpp:1449
const SHAPE_LINE_CHAIN & GetLockedInPoints() const
Get the "locked-in" points that describe the polygon itself.

References SHAPE_LINE_CHAIN::Append(), commitZone(), POLYGON_GEOM_MANAGER::DEG45, POLYGON_GEOM_MANAGER::GetLeaderLinePoints(), POLYGON_GEOM_MANAGER::GetLeaderMode(), POLYGON_GEOM_MANAGER::GetLockedInPoints(), m_parentView, m_previewItem, m_zone, SHAPE_POLY_SET::PM_FAST, and KIGFX::VIEW::SetVisible().

◆ OnFirstPoint()

bool ZONE_CREATE_HELPER::OnFirstPoint ( POLYGON_GEOM_MANAGER aMgr)
overridevirtual

Called before the first point is added - clients can do initialization here, and can veto the start of the process (e.g.

if user cancels a dialog)

Returns
false to veto start of new polygonSent when the polygon geometry changes

Implements POLYGON_GEOM_MANAGER::CLIENT.

Definition at line 252 of file zone_create_helper.cpp.

253 {
254  // if we don't have a zone, create one
255  // the user's choice here can affect things like the colour of the preview
256  if( !m_zone )
257  {
258  if( m_params.m_sourceZone )
260  else
262 
263  if( m_zone )
264  {
266 
267  // set up poperties from zone
268  const auto& settings = *m_parentView.GetPainter()->GetSettings();
269  COLOR4D color = settings.GetColor( nullptr, m_zone->GetLayer() );
270 
272  m_previewItem.SetFillColor( color.WithAlpha( 0.2 ) );
273 
275 
278  }
279  }
280 
281  return m_zone != nullptr;
282 }
static TOOL_ACTION selectionClear
Clear the current selection.
Definition: pcb_actions.h:63
ZONE * m_sourceZone
Zone leader mode.
void SetStrokeColor(const COLOR4D &aNewColor)
Set the fill color to set before drawing preview.
int color
Definition: DXF_plotter.cpp:60
DRAWING_TOOL & m_tool
Parameters of the zone to be drawn.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:141
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
view that show the preview item
void SetLeaderMode(LEADER_MODE aMode)
Set the leader mode to use when calculating the leader/returner lines.
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:207
TOOL_MANAGER * GetManager() const
Return the instance of TOOL_MANAGER that takes care of the tool.
Definition: tool_base.h:144
KIGFX::VIEW & m_parentView
The zone-in-progress.
Unconstrained point-to-point.
void SetFillColor(const COLOR4D &aNewColor)
Set the line width to set before drawing preview.
PARAMS & m_params
The preview item to display.
Definition: color4d.h:48
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
std::unique_ptr< ZONE > createZoneFromExisting(const ZONE &aSrcZone)
Create a new zone with the settings from an existing zone.
std::unique_ptr< ZONE > m_zone
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
Definition: view.cpp:1449
std::unique_ptr< ZONE > createNewZone(bool aKeepout)
Prompt the user for new zone settings, and create a new zone with those settings.
bool m_keepout
< Should create a keepout zone?
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:98

References color, createNewZone(), createZoneFromExisting(), POLYGON_GEOM_MANAGER::DEG45, POLYGON_GEOM_MANAGER::DIRECT, TOOL_BASE::GetManager(), KIGFX::VIEW::GetPainter(), KIGFX::PAINTER::GetSettings(), ZONE_CREATE_HELPER::PARAMS::m_keepout, m_params, m_parentView, m_previewItem, ZONE_CREATE_HELPER::PARAMS::m_sourceZone, m_tool, m_zone, TOOL_MANAGER::RunAction(), PCB_ACTIONS::selectionClear, KIGFX::PREVIEW::SIMPLE_OVERLAY_ITEM::SetFillColor(), POLYGON_GEOM_MANAGER::SetLeaderMode(), KIGFX::PREVIEW::SIMPLE_OVERLAY_ITEM::SetStrokeColor(), KIGFX::VIEW::SetVisible(), and WHITE.

◆ OnGeometryChange()

void ZONE_CREATE_HELPER::OnGeometryChange ( const POLYGON_GEOM_MANAGER aMgr)
overridevirtual

Called when the polygon is complete.

Implements POLYGON_GEOM_MANAGER::CLIENT.

Definition at line 285 of file zone_create_helper.cpp.

286 {
287  // send the points to the preview item
290 }
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...
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
view that show the preview item
KIGFX::VIEW & m_parentView
The zone-in-progress.
void SetPoints(const SHAPE_LINE_CHAIN &aLockedInPts, const SHAPE_LINE_CHAIN &aLeaderPts)
Set the polygon points.
const SHAPE_LINE_CHAIN & GetLockedInPoints() const
Get the "locked-in" points that describe the polygon itself.
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition: view.cpp:1503
Position or shape has changed.
Definition: view_item.h:54

References KIGFX::GEOMETRY, POLYGON_GEOM_MANAGER::GetLeaderLinePoints(), POLYGON_GEOM_MANAGER::GetLockedInPoints(), m_parentView, m_previewItem, KIGFX::PREVIEW::POLYGON_ITEM::SetPoints(), and KIGFX::VIEW::Update().

Referenced by DRAWING_TOOL::DrawZone().

◆ performZoneCutout()

void ZONE_CREATE_HELPER::performZoneCutout ( ZONE aZone,
const ZONE aCutout 
)

Cut one zone out of another one (i.e.

subtraction) and update the zone..

Parameters
aZonethe zone to removed area from
aCutoutthe area to remove

Definition at line 136 of file zone_create_helper.cpp.

137 {
138  BOARD_COMMIT commit( &m_tool );
139  std::vector<ZONE*> newZones;
140 
141  // Clear the selection before removing the old zone
142  auto toolMgr = m_tool.GetManager();
143  toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
144 
145  SHAPE_POLY_SET originalOutline( *aZone.Outline() );
146  originalOutline.BooleanSubtract( *aCutout.Outline(), SHAPE_POLY_SET::PM_FAST );
147 
148  // After substracting the hole, originalOutline can have more than one
149  // main outline.
150  // But a zone can have only one main outline, so create as many zones as
151  // originalOutline contains main outlines:
152  for( int outline = 0; outline < originalOutline.OutlineCount(); outline++ )
153  {
154  auto newZoneOutline = new SHAPE_POLY_SET;
155  newZoneOutline->AddOutline( originalOutline.Outline( outline ) );
156 
157  // Add holes (if any) to thez new zone outline:
158  for (int hole = 0; hole < originalOutline.HoleCount( outline ) ; hole++ )
159  newZoneOutline->AddHole( originalOutline.CHole( outline, hole ) );
160 
161  auto newZone = new ZONE( aZone );
162  newZone->SetOutline( newZoneOutline );
163  newZone->SetLocalFlags( 1 );
164  newZone->HatchBorder();
165  newZone->UnFill();
166  newZones.push_back( newZone );
167  commit.Add( newZone );
168  }
169 
170  commit.Remove( &aZone );
171 
172  // TODO Refill zones when KiCad supports auto re-fill
173 
174  commit.Push( _( "Add a zone cutout" ) );
175 
176  // Select the new zone and set it as the source for the next cutout
177  if( newZones.empty() )
178  {
179  m_params.m_sourceZone = nullptr;
180  }
181  else
182  {
183  m_params.m_sourceZone = newZones[0];
184  toolMgr->RunAction( PCB_ACTIONS::selectItem, true, newZones[0] );
185  }
186 
187 }
static TOOL_ACTION selectionClear
Clear the current selection.
Definition: pcb_actions.h:63
ZONE * m_sourceZone
Zone leader mode.
SHAPE_POLY_SET * Outline()
Definition: zone.h:317
DRAWING_TOOL & m_tool
Parameters of the zone to be drawn.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:141
TOOL_MANAGER * GetManager() const
Return the instance of TOOL_MANAGER that takes care of the tool.
Definition: tool_base.h:144
Represent a set of closed polygons.
Handle a list of polygons defining a copper zone.
Definition: zone.h:57
PARAMS & m_params
The preview item to display.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new hole to the given outline (default: last) and returns its index.
#define _(s)
Definition: 3d_actions.cpp:33
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
Definition: pcb_actions.h:66
void BooleanSubtract(const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
Perform boolean polyset intersection For aFastMode meaning, see function booleanOp.

References _, COMMIT::Add(), SHAPE_POLY_SET::AddOutline(), SHAPE_POLY_SET::BooleanSubtract(), TOOL_BASE::GetManager(), m_params, ZONE_CREATE_HELPER::PARAMS::m_sourceZone, m_tool, ZONE::Outline(), SHAPE_POLY_SET::PM_FAST, BOARD_COMMIT::Push(), COMMIT::Remove(), TOOL_MANAGER::RunAction(), PCB_ACTIONS::selectionClear, and PCB_ACTIONS::selectItem.

Referenced by commitZone().

Member Data Documentation

◆ m_params

PARAMS& ZONE_CREATE_HELPER::m_params
private

The preview item to display.

Definition at line 123 of file zone_create_helper.h.

Referenced by commitZone(), createNewZone(), OnFirstPoint(), and performZoneCutout().

◆ m_parentView

KIGFX::VIEW& ZONE_CREATE_HELPER::m_parentView
private

The zone-in-progress.

Definition at line 129 of file zone_create_helper.h.

Referenced by OnComplete(), OnFirstPoint(), OnGeometryChange(), ZONE_CREATE_HELPER(), and ~ZONE_CREATE_HELPER().

◆ m_previewItem

KIGFX::PREVIEW::POLYGON_ITEM ZONE_CREATE_HELPER::m_previewItem
private

view that show the preview item

Definition at line 126 of file zone_create_helper.h.

Referenced by OnComplete(), OnFirstPoint(), OnGeometryChange(), ZONE_CREATE_HELPER(), and ~ZONE_CREATE_HELPER().

◆ m_tool

DRAWING_TOOL& ZONE_CREATE_HELPER::m_tool
private

Parameters of the zone to be drawn.

Definition at line 120 of file zone_create_helper.h.

Referenced by commitZone(), createNewZone(), createZoneFromExisting(), OnFirstPoint(), and performZoneCutout().

◆ m_zone

std::unique_ptr<ZONE> ZONE_CREATE_HELPER::m_zone
private

Definition at line 132 of file zone_create_helper.h.

Referenced by GetZone(), OnComplete(), and OnFirstPoint().


The documentation for this class was generated from the following files: