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 40 of file zone_create_helper.cpp.

40  :
41  m_tool( aTool ),
42  m_params( aParams ),
43  m_parentView( *aTool.getView() )
44 {
46 }
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:321

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

◆ ~ZONE_CREATE_HELPER()

ZONE_CREATE_HELPER::~ZONE_CREATE_HELPER ( )
virtual

Definition at line 49 of file zone_create_helper.cpp.

50 {
51  // remove the preview from the view
54 }
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition: view.cpp:351
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 192 of file zone_create_helper.cpp.

193 {
194  switch ( m_params.m_mode )
195  {
196  case ZONE_MODE::CUTOUT:
197  // For cutouts, subtract from the source
199  break;
200 
201  case ZONE_MODE::ADD:
202  case ZONE_MODE::SIMILAR:
203  {
204  BOARD_COMMIT commit( &m_tool );
205  BOARD* board = m_tool.getModel<BOARD>();
206 
207  aZone->HatchBorder();
208 
209  // TODO Refill zones when KiCad supports auto re-fill
210 
211  commit.Add( aZone.get() );
212 
213  std::lock_guard<KISPINLOCK> lock( board->GetConnectivity()->GetLock() );
214 
215  commit.Push( _( "Add a zone" ) );
216  m_tool.GetManager()->RunAction( PCB_ACTIONS::selectItem, true, aZone.release() );
217  break;
218  }
219 
221  {
222  BOARD_COMMIT commit( &m_tool );
223  BOARD* board = m_tool.getModel<BOARD>();
224  PCB_LAYER_ID layer = m_params.m_layer;
225  PCB_SHAPE* poly;
226 
228  poly = new FP_SHAPE( static_cast<FOOTPRINT*>( m_tool.m_frame->GetModel() ) );
229  else
230  poly = new PCB_SHAPE();
231 
232  poly->SetShape( SHAPE_T::POLY );
233 
234  if( layer == Edge_Cuts || layer == F_CrtYd || layer == B_CrtYd )
235  poly->SetFilled( false );
236  else
237  poly->SetFilled( true );
238 
240  poly->SetLayer( layer );
241  poly->SetPolyShape( *aZone->Outline() );
242 
243  commit.Add( poly );
245 
246  commit.Push( _( "Add a graphical polygon" ) );
247 
248  break;
249  }
250  }
251 }
Add a new zone with the same settings as an existing one.
void SetShape(SHAPE_T aShape)
Definition: pcb_shape.h:109
polygon (not yet used for tracks, but could be in microwave apps)
T * getModel() const
Return the model object if it matches the requested type.
Definition: tool_base.h:196
ZONE * m_sourceZone
Zone leader mode.
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:192
void SetFilled(bool aFlag)
Definition: pcb_shape.h:73
DRAWING_TOOL & m_tool
Parameters of the zone to be drawn.
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:143
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:588
TOOL_MANAGER * GetManager() const
Return the instance of TOOL_MANAGER that takes care of the tool.
Definition: tool_base.h:143
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:606
PCB_LAYER_ID
A quick note on layer IDs:
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition: board.h:344
#define _(s)
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
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
Definition: pcb_actions.h:62
void SetWidth(int aWidth)
Definition: pcb_shape.h:96
void SetPolyShape(const SHAPE_POLY_SET &aShape)
Definition: pcb_shape.h:248
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(), POLY, BOARD_COMMIT::Push(), TOOL_MANAGER::RunAction(), 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 57 of file zone_create_helper.cpp.

58 {
60  BOARD* board = frame->GetBoard();
63  std::set<int> highlightedNets = board->GetHighLightNetCodes();
64 
65  // Get the current default settings for zones
66  ZONE_SETTINGS zoneInfo = frame->GetZoneSettings();
67  zoneInfo.m_Layers.reset().set( m_params.m_layer ); // TODO(JE) multilayer defaults?
68  zoneInfo.m_NetcodeSelection = highlightedNets.empty() ? -1 : *highlightedNets.begin();
69  zoneInfo.SetIsRuleArea( m_params.m_keepout );
71 
72  // If we don't have a net from highlighting, maybe we can get one from the selection
74 
75  if( selectionTool && !selectionTool->GetSelection().Empty()
76  && zoneInfo.m_NetcodeSelection == -1 )
77  {
78  EDA_ITEM* item = *selectionTool->GetSelection().GetItems().begin();
79 
80  if( BOARD_CONNECTED_ITEM* bci = dynamic_cast<BOARD_CONNECTED_ITEM*>( item ) )
81  zoneInfo.m_NetcodeSelection = bci->GetNetCode();
82  }
83 
85  {
86  // Get the current default settings for zones
87 
88  // Show options dialog
89  int dialogResult;
90 
91  if( m_params.m_keepout )
92  dialogResult = InvokeRuleAreaEditor( frame, &zoneInfo );
93  else
94  {
95  // TODO(JE) combine these dialogs?
96  if( ( zoneInfo.m_Layers & LSET::AllCuMask() ).any() )
97  dialogResult = InvokeCopperZonesEditor( frame, &zoneInfo );
98  else
99  dialogResult = InvokeNonCopperZonesEditor( frame, &zoneInfo );
100  }
101 
102  if( dialogResult == wxID_CANCEL )
103  return nullptr;
104 
105  controls->WarpCursor( controls->GetCursorPosition(), true );
106  }
107 
108  // The new zone is a ZONE if created in the board editor and a FP_ZONE if created in the
109  // footprint editor
110  wxASSERT( !m_tool.m_isFootprintEditor || ( parent->Type() == PCB_FOOTPRINT_T ) );
111 
112  std::unique_ptr<ZONE> newZone = m_tool.m_isFootprintEditor ?
113  std::make_unique<FP_ZONE>( parent ) :
114  std::make_unique<ZONE>( parent );
115 
116  // Apply the selected settings
117  zoneInfo.ExportSetting( *newZone );
118 
119  return newZone;
120 }
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:64
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:143
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:108
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:97
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:285
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:100
T * getEditFrame() const
Return the application window object, casted to requested user type.
Definition: tool_base.h:184
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:113

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 123 of file zone_create_helper.cpp.

124 {
125  BOARD* board = m_tool.getModel<BOARD>();
126 
127  std::unique_ptr<ZONE> newZone = std::make_unique<ZONE>( board );
128 
129  ZONE_SETTINGS zoneSettings;
130  zoneSettings << aSrcZone;
131 
132  zoneSettings.ExportSetting( *newZone );
133 
134  return newZone;
135 }
T * getModel() const
Return the model object if it matches the requested type.
Definition: tool_base.h:196
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 295 of file zone_create_helper.cpp.

296 {
297  auto& finalPoints = aMgr.GetLockedInPoints();
298 
299  if( finalPoints.PointCount() < 3 )
300  {
301  // just scrap the zone in progress
302  m_zone = nullptr;
303  }
304  else
305  {
306  // if m_params.m_mode == DRAWING_TOOL::ZONE_MODE::CUTOUT, m_zone
307  // will be merged to the existing zone as a new hole.
308  m_zone->Outline()->NewOutline();
309  auto* outline = m_zone->Outline();
310 
311  for( int i = 0; i < finalPoints.PointCount(); ++i )
312  outline->Append( finalPoints.CPoint( i ) );
313 
314  // In DEG45 mode, we may have intermediate points in the leader that should be
315  // included as they are shown in the preview. These typically maintain the
316  // 45 constraint
318  {
319  const auto& pts = aMgr.GetLeaderLinePoints();
320  for( int i = 1; i < pts.PointCount(); i++ )
321  outline->Append( pts.CPoint( i ) );
322  }
323 
324  outline->Outline( 0 ).SetClosed( true );
325  outline->RemoveNullSegments();
326  outline->Simplify( SHAPE_POLY_SET::PM_FAST );
327 
328  // hand the zone over to the committer
329  commitZone( std::move( m_zone ) );
330  m_zone = nullptr;
331  }
332 
334 }
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)
Append a new point at the end of the line chain.
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 254 of file zone_create_helper.cpp.

255 {
256  // if we don't have a zone, create one
257  // the user's choice here can affect things like the colour of the preview
258  if( !m_zone )
259  {
260  if( m_params.m_sourceZone )
262  else
264 
265  if( m_zone )
266  {
268 
269  // set up properties from zone
270  const auto& settings = *m_parentView.GetPainter()->GetSettings();
271  COLOR4D color = settings.GetColor( nullptr, m_zone->GetLayer() );
272 
274  m_previewItem.SetFillColor( color.WithAlpha( 0.2 ) );
275 
277 
280  }
281  }
282 
283  return m_zone != nullptr;
284 }
static TOOL_ACTION selectionClear
Clear the current selection.
Definition: pcb_actions.h:59
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:143
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:143
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:103

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 287 of file zone_create_helper.cpp.

288 {
289  // send the points to the preview item
292 }
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 138 of file zone_create_helper.cpp.

139 {
140  BOARD_COMMIT commit( &m_tool );
141  std::vector<ZONE*> newZones;
142 
143  // Clear the selection before removing the old zone
144  auto toolMgr = m_tool.GetManager();
145  toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
146 
147  SHAPE_POLY_SET originalOutline( *aZone.Outline() );
148  originalOutline.BooleanSubtract( *aCutout.Outline(), SHAPE_POLY_SET::PM_FAST );
149 
150  // After substracting the hole, originalOutline can have more than one
151  // main outline.
152  // But a zone can have only one main outline, so create as many zones as
153  // originalOutline contains main outlines:
154  for( int outline = 0; outline < originalOutline.OutlineCount(); outline++ )
155  {
156  auto newZoneOutline = new SHAPE_POLY_SET;
157  newZoneOutline->AddOutline( originalOutline.Outline( outline ) );
158 
159  // Add holes (if any) to thez new zone outline:
160  for (int hole = 0; hole < originalOutline.HoleCount( outline ) ; hole++ )
161  newZoneOutline->AddHole( originalOutline.CHole( outline, hole ) );
162 
163  auto newZone = new ZONE( aZone );
164  newZone->SetOutline( newZoneOutline );
165  newZone->SetLocalFlags( 1 );
166  newZone->HatchBorder();
167  newZone->UnFill();
168  newZones.push_back( newZone );
169  commit.Add( newZone );
170  }
171 
172  commit.Remove( &aZone );
173 
174  // TODO Refill zones when KiCad supports auto re-fill
175 
176  commit.Push( _( "Add a zone cutout" ) );
177 
178  // Select the new zone and set it as the source for the next cutout
179  if( newZones.empty() )
180  {
181  m_params.m_sourceZone = nullptr;
182  }
183  else
184  {
185  m_params.m_sourceZone = newZones[0];
186  toolMgr->RunAction( PCB_ACTIONS::selectItem, true, newZones[0] );
187  }
188 
189 }
static TOOL_ACTION selectionClear
Clear the current selection.
Definition: pcb_actions.h:59
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:143
TOOL_MANAGER * GetManager() const
Return the instance of TOOL_MANAGER that takes care of the tool.
Definition: tool_base.h:143
Represent a set of closed polygons.
#define _(s)
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.
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
Definition: pcb_actions.h:62
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: