KiCad PCB EDA Suite
ZONE_CREATE_HELPER Class Reference

This class is an adjuct helper to the DRAWING_TOOL interactive tool, which handles incoming geometry changes from a POLYGON_GEOM_MANAGER and translates that into a ZONE_CONTAINER 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, const PARAMS &aParams)
 
 ~ZONE_CREATE_HELPER ()
 
void OnGeometryChange (const POLYGON_GEOM_MANAGER &aMgr) override
 

Sent when the polygon geometry changes

More...
 
bool OnFirstPoint (POLYGON_GEOM_MANAGER &aMgr) override
 Called before the first point is added - clients can do initialisation here, and can veto the start of the process (e.g. More...
 
void OnComplete (const POLYGON_GEOM_MANAGER &aMgr) override
 

Called when the polygon is complete

More...
 
std::unique_ptr< ZONE_CONTAINERcreateNewZone (bool aKeepout)
 Function createNewZone() More...
 
std::unique_ptr< ZONE_CONTAINERcreateZoneFromExisting (const ZONE_CONTAINER &aSrcZone)
 Function createZoneFromExisting. More...
 
void performZoneCutout (ZONE_CONTAINER &aExistingZone, ZONE_CONTAINER &aCutout)
 Function performZoneCutout() More...
 
void commitZone (std::unique_ptr< ZONE_CONTAINER > aZone)
 Commit the current zone-in-progress to the BOARD. More...
 

Private Attributes

DRAWING_TOOLm_tool
 
const PARAMSm_params
 

Parameters of the zone to be drawn

More...
 
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
 

The preview item to display

More...
 
KIGFX::VIEWm_parentView
 

view that show the preview item

More...
 
std::unique_ptr< ZONE_CONTAINERm_zone
 

The zone-in-progress

More...
 

Detailed Description

This class is an adjuct helper to the DRAWING_TOOL interactive tool, which handles incoming geometry changes from a POLYGON_GEOM_MANAGER and translates that into a ZONE_CONTAINER based on given parameters.

Definition at line 43 of file zone_create_helper.h.

Constructor & Destructor Documentation

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

Definition at line 39 of file zone_create_helper.cpp.

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

40  :
41  m_tool( aTool ),
42  m_params( aParams ),
43  m_parentView( *aTool.getView() )
44 {
46 }
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
The preview item to display
KIGFX::VIEW & m_parentView
view that show the preview item
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:35
const PARAMS & m_params
Parameters of the zone to be drawn
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:309
ZONE_CREATE_HELPER::~ZONE_CREATE_HELPER ( )

Definition at line 49 of file zone_create_helper.cpp.

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

50 {
51  // remove the preview from the view
54 }
virtual void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:339
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
The preview item to display
KIGFX::VIEW & m_parentView
view that show the preview item
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1328

Member Function Documentation

void ZONE_CREATE_HELPER::commitZone ( std::unique_ptr< ZONE_CONTAINER 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
aZone- the drawn zone outline to commit

Definition at line 139 of file zone_create_helper.cpp.

References DRAWING_TOOL::ADD, DRAWING_TOOL::CUTOUT, ZONE_FILLER::Fill(), TOOL_BASE::getEditFrame(), TOOL_BASE::getModel(), DRAWING_TOOL::GRAPHIC_POLYGON, ZONE_CONTAINER::Hatch(), PCB_TOOL::m_editModules, ZONE_CREATE_HELPER::PARAMS::m_keepout, ZONE_CREATE_HELPER::PARAMS::m_mode, m_params, ZONE_CREATE_HELPER::PARAMS::m_sourceZone, m_tool, performZoneCutout(), S_POLYGON, and DRAWING_TOOL::SIMILAR.

Referenced by OnComplete().

140 {
141  auto& frame = *m_tool.getEditFrame<PCB_EDIT_FRAME>();
142  auto board = m_tool.getModel<BOARD>();
143 
144  BOARD_COMMIT bCommit( &m_tool );
145 
146  switch ( m_params.m_mode )
147  {
149  // For cutouts, subtract from the source
150  bCommit.Modify( m_params.m_sourceZone );
152  bCommit.Push( _( "Add a zone cutout" ) );
154  break;
155 
158  aZone->Hatch();
159 
160  if( !m_params.m_keepout )
161  {
162  ZONE_FILLER filler( board );
163  filler.Fill( { aZone.get() } );
164  }
165 
166  bCommit.Add( aZone.release() );
167  bCommit.Push( _( "Add a zone" ) );
168  break;
169 
171  {
172  BOARD_ITEM_CONTAINER* parent = frame.GetModel();
173  auto poly = m_tool.m_editModules ? new EDGE_MODULE( (MODULE *) parent ) : new DRAWSEGMENT();
174 
175  poly->SetShape ( S_POLYGON );
176  poly->SetLayer( aZone->GetLayer() );
177  poly->SetPolyShape ( *aZone->Outline() );
178 
179  bCommit.Add( poly );
180  bCommit.Push( _( "Add a graphical polygon" ) );
181 
182  break;
183  }
184  }
185 }
void SetShape(STROKE_T aShape)
polygon (not yet used for tracks, but could be in microwave apps)
void performZoneCutout(ZONE_CONTAINER &aExistingZone, ZONE_CONTAINER &aCutout)
Function performZoneCutout()
Add a new zone with the same settings as an existing one.
T * getModel() const
Function getModel()
Definition: tool_base.h:199
ZONE_CONTAINER * m_sourceZone
Zone settings source (for similar and cutout zones)
DRAWING_TOOL::ZONE_MODE m_mode
The zone mode to operate in
bool m_editModules
Definition: pcb_tool.h:142
const PARAMS & m_params
Parameters of the zone to be drawn
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:169
void Hatch()
Function Hatch computes the hatch lines depending on the hatch parameters and stores it in the zone&#39;s...
Abstract interface for BOARD_ITEMs capable of storing other items inside.
bool m_keepout
Should create a keepout zone?
Add a new zone/keepout with fresh settings.
Make a cutout to an existing zone.
T * getEditFrame() const
Function getEditFrame()
Definition: tool_base.h:188
std::unique_ptr< ZONE_CONTAINER > ZONE_CREATE_HELPER::createNewZone ( bool  aKeepout)

Function createNewZone()

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.

References F_Cu, TOOL_BASE::getEditFrame(), TOOL_BASE::getModel(), PCB_BASE_FRAME::GetScreen(), DRAWING_TOOL::GRAPHIC_POLYGON, InvokeCopperZonesEditor(), InvokeKeepoutAreaEditor(), IsCopperLayer(), PCB_SCREEN::m_Active_Layer, ZONE_CREATE_HELPER::PARAMS::m_keepout, ZONE_CREATE_HELPER::PARAMS::m_mode, ZONE_SETTINGS::m_NetcodeSelection, m_params, m_tool, and ZONE_ABORT.

Referenced by OnFirstPoint().

58 {
59  auto& frame = *m_tool.getEditFrame<PCB_BASE_EDIT_FRAME>();
60  auto& board = *m_tool.getModel<BOARD>();
61 
62  // Get the current default settings for zones
63  ZONE_SETTINGS zoneInfo = frame.GetZoneSettings();
64  zoneInfo.m_NetcodeSelection = board.GetHighLightNetCode();
65  zoneInfo.SetIsKeepout( m_params.m_keepout );
66  zoneInfo.m_CurrentZone_Layer = frame.GetScreen()->m_Active_Layer;
67 
68  if( !IsCopperLayer( zoneInfo.m_CurrentZone_Layer ) )
69  zoneInfo.m_CurrentZone_Layer = F_Cu;
70 
72  {
73  // Get the current default settings for zones
74 
75  // Show options dialog
76  ZONE_EDIT_T dialogResult;
77 
78  if( m_params.m_keepout )
79  dialogResult = InvokeKeepoutAreaEditor( &frame, &zoneInfo );
80  else
81  dialogResult = InvokeCopperZonesEditor( &frame, &zoneInfo );
82 
83  if( dialogResult == ZONE_ABORT )
84  return nullptr;
85  }
86 
87  auto newZone = std::make_unique<ZONE_CONTAINER>( &board );
88 
89  // Apply the selected settings
90  zoneInfo.ExportSetting( *newZone );
91 
92  return newZone;
93 }
ZONE_EDIT_T
Exit codes for zone editing dialogs.
Definition: zones.h:47
PCB_LAYER_ID m_Active_Layer
Definition: pcb_screen.h:44
int m_NetcodeSelection
Net code selection for the current zone.
Definition: zone_settings.h:65
T * getModel() const
Function getModel()
Definition: tool_base.h:199
if no change
Definition: zones.h:48
DRAWING_TOOL::ZONE_MODE m_mode
The zone mode to operate in
Class ZONE_SETTINGS handles zones parameters.
Definition: zone_settings.h:49
const PARAMS & m_params
Parameters of the zone to be drawn
Common, abstract interface for edit frames.
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:169
ZONE_EDIT_T InvokeCopperZonesEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aSettings)
Function InvokeCopperZonesEditor invokes up a modal dialog window for copper zone editing...
PCB_SCREEN * GetScreen() const override
Function GetScreen returns a pointer to a BASE_SCREEN or one of its derivatives.
bool IsCopperLayer(LAYER_NUM aLayerId)
Function IsCopperLayer tests whether a layer is a copper layer.
ZONE_EDIT_T InvokeKeepoutAreaEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aSettings)
Function InvokeKeepoutAreaEditor invokes up a modal dialog window for copper zone editing...
bool m_keepout
Should create a keepout zone?
T * getEditFrame() const
Function getEditFrame()
Definition: tool_base.h:188
std::unique_ptr< ZONE_CONTAINER > ZONE_CREATE_HELPER::createZoneFromExisting ( const ZONE_CONTAINER aSrcZone)

Function createZoneFromExisting.

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

References TOOL_BASE::getModel(), and m_tool.

Referenced by OnFirstPoint().

98 {
99  auto& board = *m_tool.getModel<BOARD>();
100 
101  auto newZone = std::make_unique<ZONE_CONTAINER>( &board );
102 
103  ZONE_SETTINGS zoneSettings;
104  zoneSettings << aSrcZone;
105 
106  zoneSettings.ExportSetting( *newZone );
107 
108  return newZone;
109 }
T * getModel() const
Function getModel()
Definition: tool_base.h:199
Class ZONE_SETTINGS handles zones parameters.
Definition: zone_settings.h:49
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:169
void ZONE_CREATE_HELPER::OnComplete ( const POLYGON_GEOM_MANAGER aMgr)
overridevirtual

Called when the polygon is complete

Implements POLYGON_GEOM_MANAGER::CLIENT.

Definition at line 234 of file zone_create_helper.cpp.

References commitZone(), POLYGON_GEOM_MANAGER::GetLockedInPoints(), m_parentView, m_previewItem, m_zone, and KIGFX::VIEW::SetVisible().

235 {
236  auto& finalPoints = aMgr.GetLockedInPoints();
237 
238  if( finalPoints.PointCount() < 3 )
239  {
240  // just scrap the zone in progress
241  m_zone = nullptr;
242  }
243  else
244  {
245  // if m_params.m_mode == DRAWING_TOOL::ZONE_MODE::CUTOUT, m_zone
246  // will be merged to the existing zone as a new hole.
247  m_zone->Outline()->NewOutline();
248 
249  for( int i = 0; i < finalPoints.PointCount(); ++i )
250  {
251  m_zone->Outline()->Append( finalPoints.CPoint( i ) );
252  }
253 
254  m_zone->Outline()->Outline( 0 ).SetClosed( true );
255  m_zone->Outline()->RemoveNullSegments();
256 
257  // hand the zone over to the committer
258  commitZone( std::move( m_zone ) );
259  }
260 
262 }
const SHAPE_LINE_CHAIN & GetLockedInPoints() const
Get the "locked-in" points that describe the polygon itself.
void commitZone(std::unique_ptr< ZONE_CONTAINER > aZone)
Commit the current zone-in-progress to the BOARD.
std::unique_ptr< ZONE_CONTAINER > m_zone
The zone-in-progress
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
The preview item to display
KIGFX::VIEW & m_parentView
view that show the preview item
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1328
bool ZONE_CREATE_HELPER::OnFirstPoint ( POLYGON_GEOM_MANAGER aMgr)
overridevirtual

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

if user cancels a dialog)

Returns
false to veto start of new polygon

Implements POLYGON_GEOM_MANAGER::CLIENT.

Definition at line 188 of file zone_create_helper.cpp.

References color, createNewZone(), createZoneFromExisting(), POLYGON_GEOM_MANAGER::DEG45, POLYGON_GEOM_MANAGER::DIRECT, 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_zone, KIGFX::PREVIEW::SIMPLE_OVERLAY_ITEM::SetFillColor(), POLYGON_GEOM_MANAGER::SetLeaderMode(), KIGFX::PREVIEW::SIMPLE_OVERLAY_ITEM::SetStrokeColor(), KIGFX::VIEW::SetVisible(), and KIGFX::COLOR4D::WithAlpha().

189 {
190  // if we don't have a zone, create one
191  // the user's choice here can affect things like the colour
192  // of the preview
193  if( !m_zone )
194  {
195  if( m_params.m_sourceZone )
197  else
199 
200  if( m_zone )
201  {
202  // set up poperties from zone
203  const auto& settings = *m_parentView.GetPainter()->GetSettings();
204  COLOR4D color = settings.GetColor( nullptr, m_zone->GetLayer() );
205 
206  m_previewItem.SetStrokeColor( color );
207  m_previewItem.SetFillColor( color.WithAlpha( 0.2 ) );
208 
210 
211  aMgr.SetLeaderMode( m_zone.get()->GetHV45()
214  }
215  }
216 
217  if( !m_zone )
218  {
219  return false;
220  }
221 
222  return true;
223 }
std::unique_ptr< ZONE_CONTAINER > createZoneFromExisting(const ZONE_CONTAINER &aSrcZone)
Function createZoneFromExisting.
void SetStrokeColor(const COLOR4D &aNewColor)
Set the stroke colour to set before drawing preview
int color
Definition: DXF_plotter.cpp:62
std::unique_ptr< ZONE_CONTAINER > m_zone
The zone-in-progress
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
The preview item to display
void SetLeaderMode(LEADER_MODE aMode)
Set the leader mode to use when calculating the leader/returner lines.
Unconstrained point-to-point
ZONE_CONTAINER * m_sourceZone
Zone settings source (for similar and cutout zones)
KIGFX::VIEW & m_parentView
view that show the preview item
COLOR4D WithAlpha(double aAlpha) const
Function WithAlpha Returns a colour with the same colour, but the given alpha.
Definition: color4d.h:237
PAINTER * GetPainter() const
Function GetPainter() Returns the painter object used by the view for drawing VIEW_ITEMS.
Definition: view.h:196
void SetFillColor(const COLOR4D &aNewColor)
Set the fill colour to set before drawing preview
const PARAMS & m_params
Parameters of the zone to be drawn
virtual RENDER_SETTINGS * GetSettings()=0
Function GetSettings Returns pointer to current settings that are going to be used when drawing items...
std::unique_ptr< ZONE_CONTAINER > createNewZone(bool aKeepout)
Function createNewZone()
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1328
bool m_keepout
Should create a keepout zone?
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39
void ZONE_CREATE_HELPER::OnGeometryChange ( const POLYGON_GEOM_MANAGER aMgr)
overridevirtual

Sent when the polygon geometry changes

Implements POLYGON_GEOM_MANAGER::CLIENT.

Definition at line 226 of file zone_create_helper.cpp.

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

227 {
228  // send the points to the preview item
231 }
const SHAPE_LINE_CHAIN & GetLockedInPoints() const
Get the "locked-in" points that describe the polygon itself.
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
The preview item to display
KIGFX::VIEW & m_parentView
view that show the preview item
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...
virtual void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1382
void SetPoints(const SHAPE_LINE_CHAIN &aLockedInPts, const SHAPE_LINE_CHAIN &aLeaderPts)
Set the polygon points.
Color has changed.
Definition: view_item.h:57
void ZONE_CREATE_HELPER::performZoneCutout ( ZONE_CONTAINER aExistingZone,
ZONE_CONTAINER aCutout 
)

Function performZoneCutout()

Cut one zone out of another one (i.e. subtraction) and update the zone.

Parameters
aExistingZonethe zone to removed area from
aCutoutthe area to remove

Definition at line 112 of file zone_create_helper.cpp.

References SHAPE_POLY_SET::Append(), ZONE_FILLER::Fill(), ZONE_CONTAINER::GetCornerPosition(), TOOL_BASE::getModel(), ZONE_CONTAINER::GetNumCorners(), SHAPE_POLY_SET::Hole(), ZONE_CONTAINER::IsFilled(), m_tool, SHAPE_POLY_SET::NewHole(), BOARD::OnAreaPolygonModified(), ZONE_CONTAINER::Outline(), and SHAPE_LINE_CHAIN::SetClosed().

Referenced by commitZone().

114 {
115  BOARD* board = m_tool.getModel<BOARD>();
116  int curr_hole = aExistingZone.Outline()->NewHole( 0 );
117 
118  // Copy cutout corners into existing zone, in the new hole
119  for( int ii = 0; ii < aCutout.GetNumCorners(); ii++ )
120  {
121  aExistingZone.Outline()->Append( aCutout.GetCornerPosition( ii ), 0, curr_hole );
122  }
123 
124  // Be sure the current corner list is closed
125  aExistingZone.Outline()->Hole( 0, curr_hole ).SetClosed( true );
126 
127  // Combine holes and simplify the new outline:
128  board->OnAreaPolygonModified( nullptr, &aExistingZone );
129 
130  // Re-fill if needed
131  if( aExistingZone.IsFilled() )
132  {
133  ZONE_FILLER filler( board );
134  filler.Fill( { &aExistingZone } );
135  }
136 }
int NewHole(int aOutline=-1)
Creates a new hole in a given outline
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: class_zone.h:414
bool OnAreaPolygonModified(PICKED_ITEMS_LIST *aModifiedZonesList, ZONE_CONTAINER *modified_area)
Function OnAreaPolygonModified Process an area that has been modified, by normalizing its polygon and...
bool IsFilled() const
Definition: class_zone.h:189
SHAPE_POLY_SET * Outline()
Definition: class_zone.h:236
SHAPE_LINE_CHAIN & Hole(int aOutline, int aHole)
Returns the reference to aHole-th hole in the aIndex-th outline
const VECTOR2I & GetCornerPosition(int aCornerIndex) const
Definition: class_zone.h:454
void SetClosed(bool aClosed)
Function SetClosed()
T * getModel() const
Function getModel()
Definition: tool_base.h:199
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:169
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) ...

Member Data Documentation

const PARAMS& ZONE_CREATE_HELPER::m_params
private

Parameters of the zone to be drawn

Definition at line 126 of file zone_create_helper.h.

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

KIGFX::VIEW& ZONE_CREATE_HELPER::m_parentView
private

view that show the preview item

Definition at line 132 of file zone_create_helper.h.

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

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

The preview item to display

Definition at line 129 of file zone_create_helper.h.

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

DRAWING_TOOL& ZONE_CREATE_HELPER::m_tool
private
std::unique_ptr<ZONE_CONTAINER> ZONE_CREATE_HELPER::m_zone
private

The zone-in-progress

Definition at line 135 of file zone_create_helper.h.

Referenced by OnComplete(), and OnFirstPoint().


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