KiCad PCB EDA Suite
Loading...
Searching...
No Matches
footprint_editor_utils.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <board_commit.h>
25#include <confirm.h>
28#include <footprint_tree_pane.h>
29#include <fp_lib_table.h>
30#include <functional>
31#include <kiway_express.h>
32#include <pcb_group.h>
33#include <pcb_marker.h>
34#include <pcb_textbox.h>
35#include <pcb_table.h>
36#include <pcb_shape.h>
37#include <pad.h>
38#include <zone.h>
40#include <tool/tool_manager.h>
41#include <tools/pcb_actions.h>
44#include <widgets/lib_tree.h>
46#include <pcb_dimension.h>
47#include <project_pcb.h>
48#include <view/view_controls.h>
50#include <dialogs/dialog_table_properties.h>
51
52using namespace std::placeholders;
53
54
56{
57 bool is_last_fp_from_brd = IsCurrentFPFromBoard();
58
59 FOOTPRINT* footprint = LoadFootprint( aFPID );
60
61 if( !footprint )
62 return;
63
64 if( !Clear_Pcb( true ) )
65 return;
66
68 AddFootprintToBoard( footprint );
69
70 footprint->ClearFlags();
71
72 // if either reference or value are missing, reinstall them -
73 // otherwise you cannot see what you are doing on board
74 if( footprint->Reference().GetText().IsEmpty() )
75 footprint->SetReference( wxT( "Ref**" ) );
76
77 if( footprint->Value().GetText().IsEmpty() )
78 footprint->SetValue( wxT( "Val**" ) );
79
80 Zoom_Automatique( false );
81
82 Update3DView( true, true );
83
84 GetScreen()->SetContentModified( false );
85
86 UpdateView();
87 GetCanvas()->Refresh();
88
89 // Update the save items if needed.
90 if( is_last_fp_from_brd )
91 {
94 }
95
97
98 m_centerItemOnIdle = aFPID;
99 Bind( wxEVT_IDLE, &FOOTPRINT_EDIT_FRAME::centerItemIdleHandler, this );
100
101 m_treePane->GetLibTree()->RefreshLibTree(); // update highlighting
102}
103
104
106{
108 Unbind( wxEVT_IDLE, &FOOTPRINT_EDIT_FRAME::centerItemIdleHandler, this );
109}
110
111
113{
114public:
116 {
117 wxASSERT( aFootprint );
118
119 m_nickname = aFootprint->GetFPID().GetLibNickname().wx_str();
120 m_fpname = aFootprint->GetFPID().GetLibItemName().wx_str();
123 m_keywords = aFootprint->GetKeywords();
124 m_doc = aFootprint->GetLibDescription();
125 m_loaded = true;
126 }
127};
128
129
130void FOOTPRINT_EDIT_FRAME::UpdateLibraryTree( const wxDataViewItem& aTreeItem,
131 FOOTPRINT* aFootprint )
132{
133 wxCHECK( aFootprint, /* void */ );
134
135 BASIC_FOOTPRINT_INFO footprintInfo( aFootprint );
136
137 if( aTreeItem.IsOk() ) // Can be not found in tree if the current footprint is imported
138 // from file therefore not yet in tree.
139 {
140 static_cast<LIB_TREE_NODE_ITEM*>( aTreeItem.GetID() )->Update( &footprintInfo );
142 }
143}
144
145
147{
148 LIB_ID oldFPID = aFootprint->GetFPID();
149
150 DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR dialog( this, aFootprint );
151 dialog.ShowQuasiModal();
152
153 // Update library tree and title in case of a name change
154 wxDataViewItem treeItem = m_adapter->FindItem( oldFPID );
155 UpdateLibraryTree( treeItem, aFootprint );
156 UpdateTitle();
157
159}
160
161
163{
164 switch( aItem->Type() )
165 {
168 break;
169
170 case PCB_PAD_T:
171 ShowPadPropertiesDialog( static_cast<PAD*>( aItem ) );
172 break;
173
174 case PCB_FOOTPRINT_T:
175 editFootprintProperties( static_cast<FOOTPRINT*>( aItem ) );
176 GetCanvas()->Refresh();
177 break;
178
179 case PCB_FIELD_T:
180 case PCB_TEXT_T:
181 ShowTextPropertiesDialog( static_cast<PCB_TEXT*>( aItem ) );
182 break;
183
184 case PCB_TEXTBOX_T:
185 ShowTextBoxPropertiesDialog( static_cast<PCB_TEXTBOX*>( aItem ) );
186 break;
187
188 case PCB_TABLE_T:
189 {
190 DIALOG_TABLE_PROPERTIES dlg( this, static_cast<PCB_TABLE*>( aItem ) );
191
192 //QuasiModal required for Scintilla auto-complete
193 dlg.ShowQuasiModal();
194 break;
195 }
196
197 case PCB_SHAPE_T :
198 ShowGraphicItemPropertiesDialog( static_cast<PCB_SHAPE*>( aItem ) );
199 break;
200
202 case PCB_DIM_CENTER_T:
203 case PCB_DIM_RADIAL_T:
205 case PCB_DIM_LEADER_T:
206 {
207 DIALOG_DIMENSION_PROPERTIES dlg( this, static_cast<PCB_DIMENSION_BASE*>( aItem ) );
208
209 // TODO: why is this QuasiModal?
210 dlg.ShowQuasiModal();
211 break;
212 }
213
214 case PCB_ZONE_T:
215 {
216 ZONE* zone = static_cast<ZONE*>( aItem );
217 bool success = false;
218 ZONE_SETTINGS zoneSettings;
219
220 zoneSettings << *static_cast<ZONE*>( aItem );
221
222 if( zone->GetIsRuleArea() )
223 {
224 success = InvokeRuleAreaEditor( this, &zoneSettings ) == wxID_OK;
225 }
226 else if( zone->IsOnCopperLayer() )
227 {
228 success = InvokeCopperZonesEditor( this, &zoneSettings ) == wxID_OK;
229 }
230 else
231 {
232 success = InvokeNonCopperZonesEditor( this, &zoneSettings ) == wxID_OK;
233 }
234
235 if( success )
236 {
237 BOARD_COMMIT commit( this );
238 commit.Modify( zone );
239 commit.Push( _( "Edit Zone" ) );
240 zoneSettings.ExportSetting( *static_cast<ZONE*>( aItem ) );
241 }
242
243 break;
244 }
245
246 case PCB_GROUP_T:
248 static_cast<EDA_GROUP*>( static_cast<PCB_GROUP*>( aItem ) ) );
249 break;
250
251 case PCB_MARKER_T:
252 m_toolManager->GetTool<FOOTPRINT_EDITOR_CONTROL>()->CrossProbe( static_cast<PCB_MARKER*>( aItem ) );
253 break;
254
255 default:
256 wxFAIL_MSG( wxT( "FOOTPRINT_EDIT_FRAME::OnEditItemRequest: unsupported item type " )
257 + aItem->GetClass() );
258 break;
259 }
260}
261
262
264{
266}
267
268
270{
271 const PCB_LAYER_ID oldLayer = GetActiveLayer();
272
273 if( oldLayer == aLayer )
274 return;
275
277
278 /*
279 * Follow the PCB editor logic for showing/hiding clearance layers: show only for
280 * the active copper layer or a front/back non-copper layer.
281 */
282 const auto getClearanceLayerForActive = []( PCB_LAYER_ID aActiveLayer ) -> std::optional<int>
283 {
284 if( IsCopperLayer( aActiveLayer ) )
285 return CLEARANCE_LAYER_FOR( aActiveLayer );
286
287 return std::nullopt;
288 };
289
290 if( std::optional<int> oldClearanceLayer = getClearanceLayerForActive( oldLayer ) )
291 GetCanvas()->GetView()->SetLayerVisible( *oldClearanceLayer, false );
292
293 if( std::optional<int> newClearanceLayer = getClearanceLayerForActive( aLayer ) )
294 GetCanvas()->GetView()->SetLayerVisible( *newClearanceLayer, true );
295
297
298 m_toolManager->RunAction( PCB_ACTIONS::layerChanged ); // notify other tools
299 GetCanvas()->SetFocus(); // allow capture of hotkeys
300 GetCanvas()->SetHighContrastLayer( aLayer );
301 GetCanvas()->Refresh();
302}
303
304
305bool FOOTPRINT_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
306{
307 if( !Clear_Pcb( true ) )
308 return false; // this command is aborted
309
311 ImportFootprint( aFileSet[ 0 ] );
312
313 if( GetBoard()->GetFirstFootprint() )
315
316 GetScreen()->SetContentModified( false );
317 Zoom_Automatique( false );
318 GetCanvas()->Refresh();
319
320 return true;
321}
322
323
325{
326 const std::string& payload = mail.GetPayload();
327
328 switch( mail.Command() )
329 {
330 case MAIL_FP_EDIT:
331 if( !payload.empty() )
332 {
333 wxFileName fpFileName( payload );
334 wxString libNickname;
335 wxString msg;
336
338 const LIB_TABLE_ROW* libTableRow = libTable->FindRowByURI( fpFileName.GetPath() );
339
340 if( !libTableRow )
341 {
342 msg.Printf( _( "The current configuration does not include the footprint library '%s'." ),
343 fpFileName.GetPath() );
344 msg += wxS( "\n" ) + _( "Use Manage Footprint Libraries to edit the configuration." );
345 DisplayErrorMessage( this, _( "Library not found in footprint library table." ),
346 msg );
347 break;
348 }
349
350 libNickname = libTableRow->GetNickName();
351
352 if( !libTable->HasLibrary( libNickname, true ) )
353 {
354 msg.Printf( _( "The footprint library '%s' is not enabled in the current configuration." ),
355 libNickname );
356 msg += wxS( "\n" ) + _( "Use Manage Footprint Libraries to edit the configuration." );
357 DisplayErrorMessage( this, _( "Footprint library not enabled." ), msg );
358 break;
359 }
360
361 LIB_ID fpId( libNickname, fpFileName.GetName() );
362
363 if( m_treePane )
364 {
366 wxCommandEvent event( EVT_LIBITEM_CHOSEN );
367 wxPostEvent( m_treePane, event );
368 }
369 }
370
371 break;
372
373 case MAIL_RELOAD_LIB:
374 SyncLibraryTree( true );
376 break;
377
378 default:
379 break;
380 }
381}
static TOOL_ACTION groupProperties
Definition: actions.h:240
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
BASIC_FOOTPRINT_INFO(FOOTPRINT *aFootprint)
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:79
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
Definition: board.h:487
COLOR4D GetColor(int aLayer) const
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
Definition: commit.h:107
int ShowQuasiModal()
void ReCreateMenuBar()
Recreate the menu bar.
virtual void ReCreateHToolbar()
virtual void Zoom_Automatique(bool aWarpPointer)
Redraw the screen with best zoom level and the best centering that shows all the page or the board.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
void SetFocus() override
A set of EDA_ITEMs (i.e., without duplicates).
Definition: eda_group.h:46
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:109
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: eda_item.h:143
virtual wxString GetClass() const =0
Return the class name.
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:97
Module editor specific tools.
void editFootprintProperties(FOOTPRINT *aFootprint)
Run the Footprint Properties dialog and handle changes made in it.
void UpdateLibraryTree(const wxDataViewItem &treeItem, FOOTPRINT *aFootprint)
Update a single node in the library tree.
void SyncLibraryTree(bool aProgress)
Synchronize the footprint library tree to the current state of the footprint library table.
void UpdateMsgPanel() override
Redraw the message panel.
void KiwayMailIn(KIWAY_EXPRESS &mail) override
Receive KIWAY_EXPRESS messages from other players.
void LoadFootprintFromLibrary(LIB_ID aFPID)
FOOTPRINT * ImportFootprint(const wxString &aName=wxT(""))
Read a file containing only one footprint.
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > m_adapter
void centerItemIdleHandler(wxIdleEvent &aEvent)
bool Clear_Pcb(bool doAskAboutUnsavedChanges)
Delete all and reinitialize the current board.
Definition: initpcb.cpp:108
void OnEditItemRequest(BOARD_ITEM *aItem) override
Install the corresponding dialog editor for the given item.
void SetActiveLayer(PCB_LAYER_ID aLayer) override
void AddFootprintToBoard(FOOTPRINT *aFootprint) override
Override from PCB_BASE_EDIT_FRAME which adds a footprint to the editor's dummy board,...
FOOTPRINT_TREE_PANE * m_treePane
COLOR4D GetGridColor() override
void RefreshLibraryTree()
Redisplay the library tree.
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl=0) override
Load a KiCad board (.kicad_pcb) from aFileName.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
wxString m_doc
Footprint description.
wxString m_fpname
Module name.
wxString m_keywords
Footprint keywords.
unsigned m_unique_pad_count
Number of unique pads.
unsigned m_pad_count
Number of pads.
wxString m_nickname
library as known in FP_LIB_TABLE
LIB_TREE * GetLibTree() const
wxString GetLibDescription() const
Definition: footprint.h:260
unsigned GetPadCount(INCLUDE_NPTH_T aIncludeNPTH=INCLUDE_NPTH_T(INCLUDE_NPTH)) const
Return the number of pads.
Definition: footprint.cpp:2005
PCB_FIELD & Value()
read/write accessors:
Definition: footprint.h:661
const LIB_ID & GetFPID() const
Definition: footprint.h:251
void SetReference(const wxString &aReference)
Definition: footprint.h:631
unsigned GetUniquePadCount(INCLUDE_NPTH_T aIncludeNPTH=INCLUDE_NPTH_T(INCLUDE_NPTH)) const
Return the number of unique non-blank pads.
Definition: footprint.cpp:2055
void SetValue(const wxString &aValue)
Definition: footprint.h:652
PCB_FIELD & Reference()
Definition: footprint.h:662
wxString GetKeywords() const
Definition: footprint.h:263
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
virtual void SetCrossHairCursorPosition(const VECTOR2D &aPosition, bool aWarpView=true)=0
Move the graphic crosshair cursor to the requested position expressed in world coordinates.
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:396
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition: kiway_express.h:40
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
Definition: kiway_express.h:58
MAIL_T Command()
Returns the MAIL_T associated with this mail.
Definition: kiway_express.h:50
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
const UTF8 & GetLibItemName() const
Definition: lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:87
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
const wxString & GetNickName() const
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
const LIB_TABLE_ROW * FindRowByURI(const wxString &aURI)
Node type: LIB_ID.
void RefreshLibTree()
Refresh the tree (mainly to update highlighting and asterisking)
Definition: lib_tree.cpp:456
void CenterLibId(const LIB_ID &aLibId)
Ensure that an item is visible (preferably centered).
Definition: lib_tree.cpp:365
void SelectLibId(const LIB_ID &aLibId)
Select an item in the tree widget.
Definition: lib_tree.cpp:359
void ExpandLibId(const LIB_ID &aLibId)
Expand and item i the tree widget.
Definition: lib_tree.cpp:379
Definition: pad.h:54
static TOOL_ACTION layerChanged
Definition: pcb_actions.h:372
int ShowTextBoxPropertiesDialog(PCB_TEXTBOX *aTextBox)
APPEARANCE_CONTROLS * m_appearancePanel
void ShowReferenceImagePropertiesDialog(BOARD_ITEM *aBitmap)
Set the angle used for rotate operations.
void ShowGraphicItemPropertiesDialog(PCB_SHAPE *aShape)
void ShowPadPropertiesDialog(PAD *aPad)
virtual PCB_LAYER_ID GetActiveLayer() const
FOOTPRINT * LoadFootprint(const LIB_ID &aFootprintId)
Attempt to load aFootprintId from the footprint library table.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
BOARD * GetBoard() const
virtual void SetActiveLayer(PCB_LAYER_ID aLayer)
virtual void Update3DView(bool aMarkDirty, bool aRefresh, const wxString *aTitle=nullptr)
Update the 3D view, if the viewer is opened by this frame.
Abstract dimension API.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
virtual void SetHighContrastLayer(int aLayer) override
SetHighContrastLayer(), with some extra smarts for PCB.
A set of BOARD_ITEMs (i.e., without duplicates).
Definition: pcb_group.h:53
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
Definition: project_pcb.cpp:37
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:171
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:150
wxString wx_str() const
Definition: utf8.cpp:45
ZONE_SETTINGS handles zones parameters.
Definition: zone_settings.h:88
void ExportSetting(ZONE &aTarget, bool aFullExport=true) const
Function ExportSetting copy settings to a given zone.
Handle a list of polygons defining a copper zone.
Definition: zone.h:74
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
Definition: zone.h:699
bool IsOnCopperLayer() const override
Definition: zone.cpp:500
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:203
This file is part of the common library.
int InvokeCopperZonesEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aSettings, CONVERT_SETTINGS *aConvertSettings)
Function InvokeCopperZonesEditor invokes up a modal dialog window for copper zone editing.
int InvokeNonCopperZonesEditor(PCB_BASE_FRAME *aParent, ZONE_SETTINGS *aSettings, CONVERT_SETTINGS *aConvertSettings)
Function InvokeNonCopperZonesEditor invokes up a modal dialog window for non-copper zone editing.
int InvokeRuleAreaEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aZoneSettings, BOARD *aBoard, CONVERT_SETTINGS *aConvertSettings)
Function InvokeRuleAreaEditor invokes up a modal dialog window for copper zone editing.
#define _(s)
@ DO_NOT_INCLUDE_NPTH
Definition: footprint.h:69
PROJECT & Prj()
Definition: kicad.cpp:597
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition: layer_ids.h:664
@ LAYER_GRID
Definition: layer_ids.h:253
#define CLEARANCE_LAYER_FOR(boardLayer)
Definition: layer_ids.h:362
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ MAIL_FP_EDIT
Definition: mail_type.h:56
@ MAIL_RELOAD_LIB
Definition: mail_type.h:57
Class to handle a set of BOARD_ITEMs.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:88
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition: typeinfo.h:105
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition: typeinfo.h:102
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:103
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition: typeinfo.h:110
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition: typeinfo.h:93
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition: typeinfo.h:107
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition: typeinfo.h:92
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
Definition: typeinfo.h:89
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition: typeinfo.h:90
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
Definition: typeinfo.h:99
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition: typeinfo.h:86
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition: typeinfo.h:101
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition: typeinfo.h:87
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
Definition: typeinfo.h:94
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition: typeinfo.h:104
VECTOR2< double > VECTOR2D
Definition: vector2d.h:694