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 () override
 Called before the first point is added - clients can do initialisation here, and can veto the start of the process (eg if user cancels a dialog) 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 35 of file zone_create_helper.cpp.

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

36  :
37  m_tool( aTool ),
38  m_params( aParams ),
39  m_parentView( *aTool.getView() )
40 {
42 }
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:30
const PARAMS & m_params
Parameters of the zone to be drawn
void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:311
ZONE_CREATE_HELPER::~ZONE_CREATE_HELPER ( )

Definition at line 45 of file zone_create_helper.cpp.

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

46 {
47  // remove the preview from the view
50 }
void Remove(VIEW_ITEM *aItem)
Function Remove() Removes a VIEW_ITEM from the view.
Definition: view.cpp:341
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:1335

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

References DRAWING_TOOL::CUTOUT, TOOL_BASE::getEditFrame(), ZONE_CONTAINER::Hatch(), ZONE_CREATE_HELPER::PARAMS::m_keepout, ZONE_CREATE_HELPER::PARAMS::m_mode, m_params, ZONE_CREATE_HELPER::PARAMS::m_sourceZone, m_tool, and performZoneCutout().

Referenced by OnComplete().

135 {
136  auto& frame = *m_tool.getEditFrame<PCB_EDIT_FRAME>();
137 
138  BOARD_COMMIT bCommit( &m_tool );
139 
141  {
142  // For cutouts, subtract from the source
143  bCommit.Modify( m_params.m_sourceZone );
145  bCommit.Push( _( "Add a zone cutout" ) );
147  }
148  else
149  {
150  // Add the zone as a new board item
151  aZone->Hatch();
152 
153  if( !m_params.m_keepout )
154  frame.Fill_Zone( aZone.get() );
155 
156  bCommit.Add( aZone.release() );
157  bCommit.Push( _( "Add a zone" ) );
158  }
159 };
void performZoneCutout(ZONE_CONTAINER &aExistingZone, ZONE_CONTAINER &aCutout)
Function performZoneCutout()
ZONE_CONTAINER * m_sourceZone
Zone settings source (for similar and cutout zones)
DRAWING_TOOL::ZONE_MODE m_mode
The zone mode to operate in
const PARAMS & m_params
Parameters of the zone to be drawn
void Hatch()
Function Hatch computes the hatch lines depending on the hatch parameters and stores it in the zone's...
Definition: class_zone.cpp:951
bool m_keepout
Should create a keepout zone?
Make a cutout to an existing zone.
T * getEditFrame() const
Function getEditFrame()
Definition: tool_base.h:193
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 53 of file zone_create_helper.cpp.

References TOOL_BASE::getEditFrame(), TOOL_BASE::getModel(), InvokeCopperZonesEditor(), InvokeKeepoutAreaEditor(), InvokeNonCopperZonesEditor(), IsCopperLayer(), ZONE_SETTINGS::m_CurrentZone_Layer, ZONE_CREATE_HELPER::PARAMS::m_keepout, m_params, m_tool, and ZONE_ABORT.

Referenced by OnFirstPoint().

54 {
55  auto& frame = *m_tool.getEditFrame<PCB_BASE_EDIT_FRAME>();
56  auto& board = *m_tool.getModel<BOARD>();
57 
58  // Get the current default settings for zones
59  ZONE_SETTINGS zoneInfo = frame.GetZoneSettings();
60  zoneInfo.m_CurrentZone_Layer = frame.GetScreen()->m_Active_Layer;
61  zoneInfo.m_NetcodeSelection = board.GetHighLightNetCode();
62  zoneInfo.SetIsKeepout( m_params.m_keepout );
63 
64  // Show options dialog
65  ZONE_EDIT_T dialogResult;
66 
67  if( m_params.m_keepout )
68  dialogResult = InvokeKeepoutAreaEditor( &frame, &zoneInfo );
69  else
70  {
71  if( IsCopperLayer( zoneInfo.m_CurrentZone_Layer ) )
72  dialogResult = InvokeCopperZonesEditor( &frame, &zoneInfo );
73  else
74  dialogResult = InvokeNonCopperZonesEditor( &frame, nullptr, &zoneInfo );
75  }
76 
77  if( dialogResult == ZONE_ABORT )
78  {
79  return nullptr;
80  }
81 
82  auto newZone = std::make_unique<ZONE_CONTAINER>( &board );
83 
84  // Apply the selected settings
85  zoneInfo.ExportSetting( *newZone );
86 
87  return newZone;
88 }
ZONE_EDIT_T
Exit codes for zone editing dialogs.
Definition: zones.h:47
T * getModel() const
Function getModel()
Definition: tool_base.h:204
if no change
Definition: zones.h:48
ZONE_EDIT_T InvokeNonCopperZonesEditor(PCB_BASE_FRAME *aParent, ZONE_CONTAINER *aZone, ZONE_SETTINGS *aSettings)
Function InvokeNonCopperZonesEditor invokes up a modal dialog window for non-copper zone editing...
Class ZONE_SETTINGS handles zones parameters.
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...
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?
PCB_LAYER_ID m_CurrentZone_Layer
Layer used to create the current zone.
T * getEditFrame() const
Function getEditFrame()
Definition: tool_base.h:193
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 91 of file zone_create_helper.cpp.

References TOOL_BASE::getModel(), and m_tool.

Referenced by OnFirstPoint().

93 {
94  auto& board = *m_tool.getModel<BOARD>();
95 
96  auto newZone = std::make_unique<ZONE_CONTAINER>( &board );
97 
98  ZONE_SETTINGS zoneSettings;
99  zoneSettings << aSrcZone;
100 
101  zoneSettings.ExportSetting( *newZone );
102 
103  return newZone;
104 }
T * getModel() const
Function getModel()
Definition: tool_base.h:204
Class ZONE_SETTINGS handles zones parameters.
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 204 of file zone_create_helper.cpp.

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

205 {
206  auto& finalPoints = aMgr.GetLockedInPoints();
207 
208  if( finalPoints.size() < 3 )
209  {
210  // just scrap the zone in progress
211  m_zone = nullptr;
212  }
213  else
214  {
215  // if m_params.m_mode == DRAWING_TOOL::ZONE_MODE::CUTOUT, m_zone
216  // will be merged to the existing zone as a new hole.
217  m_zone->Outline()->NewOutline();
218 
219  for( const auto& pt : finalPoints )
220  {
221  m_zone->Outline()->Append( pt );
222  }
223 
224  m_zone->Outline()->Outline( 0 ).SetClosed( true );
225  m_zone->Outline()->RemoveNullSegments();
226 
227  // hand the zone over to the committer
228  commitZone( std::move( m_zone ) );
229  }
230 
232 }
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
const std::vector< VECTOR2I > & GetLockedInPoints() const
Get the "locked-in" points that describe the polygon itself.
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:1335
bool ZONE_CREATE_HELPER::OnFirstPoint ( )
overridevirtual

Called before the first point is added - clients can do initialisation here, and can veto the start of the process (eg if user cancels a dialog)

Returns
false to veto start of new polygon

Implements POLYGON_GEOM_MANAGER::CLIENT.

Definition at line 162 of file zone_create_helper.cpp.

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

163 {
164  // if we don't have a zone, create one
165  // the user's choice here can affect things like the colour
166  // of the preview
167  if( !m_zone )
168  {
169  if( m_params.m_sourceZone )
171  else
173 
174  if( m_zone )
175  {
176  // set up poperties from zone
177  const auto& settings = *m_parentView.GetPainter()->GetSettings();
178  COLOR4D color = settings.GetColor( nullptr, m_zone->GetLayer() );
179 
180  m_previewItem.SetStrokeColor( color );
181  m_previewItem.SetFillColor( color.WithAlpha( 0.2 ) );
182 
184  }
185  }
186 
187  if( !m_zone )
188  {
189  return false;
190  }
191 
192  return true;
193 }
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
std::unique_ptr< ZONE_CONTAINER > m_zone
The zone-in-progress
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
The preview item to display
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:232
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:1335
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 196 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().

197 {
198  // send the points to the preview item
201 }
KIGFX::PREVIEW::POLYGON_ITEM m_previewItem
The preview item to display
void SetPoints(const std::vector< VECTOR2I > &aLockedInPts, const std::vector< VECTOR2I > &aLeaderPts)
Set the polygon points.
const std::vector< VECTOR2I > & GetLeaderLinePoints() const
Get the points comprising the leader line (the line from the last locked-in point to the current curs...
const std::vector< VECTOR2I > & GetLockedInPoints() const
Get the "locked-in" points that describe the polygon itself.
KIGFX::VIEW & m_parentView
view that show the preview item
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:1389
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 107 of file zone_create_helper.cpp.

References SHAPE_POLY_SET::Append(), PCB_EDIT_FRAME::Fill_Zone(), ZONE_CONTAINER::GetCornerPosition(), TOOL_BASE::getEditFrame(), 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().

109 {
110  BOARD* board = m_tool.getModel<BOARD>();
111  int curr_hole = aExistingZone.Outline()->NewHole( 0 );
112 
113  // Copy cutout corners into existing zone, in the new hole
114  for( int ii = 0; ii < aCutout.GetNumCorners(); ii++ )
115  {
116  aExistingZone.Outline()->Append( aCutout.GetCornerPosition( ii ), 0, curr_hole );
117  }
118 
119  // Be sure the current corner list is closed
120  aExistingZone.Outline()->Hole( 0, curr_hole ).SetClosed( true );
121 
122  // Combine holes and simplify the new outline:
123  board->OnAreaPolygonModified( nullptr, &aExistingZone );
124 
125  // Re-fill if needed
126  if( aExistingZone.IsFilled() )
127  {
129  frame->Fill_Zone( &aExistingZone );
130  }
131 }
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:465
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:200
SHAPE_POLY_SET * Outline()
Definition: class_zone.h:247
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:505
void SetClosed(bool aClosed)
Function SetClosed()
T * getModel() const
Function getModel()
Definition: tool_base.h:204
int Fill_Zone(ZONE_CONTAINER *aZone)
Function Fill_Zone Calculate the zone filling for the outline zone_container The zone outline is a fr...
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:169
T * getEditFrame() const
Function getEditFrame()
Definition: tool_base.h:193
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: