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 (C) 1992-2022 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_shape.h>
36#include <pad.h>
37#include <zone.h>
39#include <tool/tool_manager.h>
40#include <tools/pcb_actions.h>
43#include <widgets/lib_tree.h>
45#include <pcb_dimension.h>
47
48using namespace std::placeholders;
49
50
52{
53 LoadFootprintFromBoard( nullptr );
54}
55
56
58{
59 bool is_last_fp_from_brd = IsCurrentFPFromBoard();
60
61 FOOTPRINT* footprint = LoadFootprint( aFPID );
62
63 if( !footprint )
64 return;
65
66 if( !Clear_Pcb( true ) )
67 return;
68
70 AddFootprintToBoard( footprint );
71
72 footprint->ClearFlags();
73
74 // if either reference or value are missing, reinstall them -
75 // otherwise you cannot see what you are doing on board
76 if( footprint->Reference().GetText().IsEmpty() )
77 footprint->SetReference( wxT( "Ref**" ) );
78
79 if( footprint->Value().GetText().IsEmpty() )
80 footprint->SetValue( wxT( "Val**" ) );
81
82 Zoom_Automatique( false );
83
84 Update3DView( true, true );
85
86 GetScreen()->SetContentModified( false );
87
88 UpdateView();
89 GetCanvas()->Refresh();
90
91 // Update the save items if needed.
92 if( is_last_fp_from_brd )
93 {
96 }
97
99
100 m_centerItemOnIdle = aFPID;
101 Bind( wxEVT_IDLE, &FOOTPRINT_EDIT_FRAME::centerItemIdleHandler, this );
102
103 m_treePane->GetLibTree()->RefreshLibTree(); // update highlighting
104}
105
106
108{
110 Unbind( wxEVT_IDLE, &FOOTPRINT_EDIT_FRAME::centerItemIdleHandler, this );
111}
112
113
114
115void FOOTPRINT_EDIT_FRAME::SelectLayer( wxCommandEvent& event )
116{
118
119 if( GetDisplayOptions().m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL )
120 GetCanvas()->Refresh();
121}
122
123
125{
126 SaveFootprintToBoard( true );
127}
128
129
131{
132public:
134 {
135 wxASSERT( aFootprint );
136
137 m_nickname = aFootprint->GetFPID().GetLibNickname().wx_str();
138 m_fpname = aFootprint->GetFPID().GetLibItemName().wx_str();
141 m_keywords = aFootprint->GetKeywords();
142 m_doc = aFootprint->GetLibDescription();
143 m_loaded = true;
144 }
145};
146
147
148void FOOTPRINT_EDIT_FRAME::UpdateLibraryTree( const wxDataViewItem& aTreeItem,
149 FOOTPRINT* aFootprint )
150{
151 wxCHECK( aFootprint, /* void */ );
152
153 BASIC_FOOTPRINT_INFO footprintInfo( aFootprint );
154
155 if( aTreeItem.IsOk() ) // Can be not found in tree if the current footprint is imported
156 // from file therefore not yet in tree.
157 {
158 static_cast<LIB_TREE_NODE_LIB_ID*>( aTreeItem.GetID() )->Update( &footprintInfo );
160 }
161}
162
163
165{
166 LIB_ID oldFPID = aFootprint->GetFPID();
167
168 DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR dialog( this, aFootprint );
169 dialog.ShowModal();
170
171 // Update library tree and title in case of a name change
172 wxDataViewItem treeItem = m_adapter->FindItem( oldFPID );
173 UpdateLibraryTree( treeItem, aFootprint );
174 UpdateTitle();
175
177}
178
179
181{
182 switch( aItem->Type() )
183 {
184 case PCB_BITMAP_T:
186 break;
187
188 case PCB_PAD_T:
189 ShowPadPropertiesDialog( static_cast<PAD*>( aItem ) );
190 break;
191
192 case PCB_FOOTPRINT_T:
193 editFootprintProperties( static_cast<FOOTPRINT*>( aItem ) );
194 GetCanvas()->Refresh();
195 break;
196
197 case PCB_FIELD_T:
198 case PCB_TEXT_T:
199 ShowTextPropertiesDialog( static_cast<PCB_TEXT*>( aItem ) );
200 break;
201
202 case PCB_TEXTBOX_T:
203 ShowTextBoxPropertiesDialog( static_cast<PCB_TEXTBOX*>( aItem ) );
204 break;
205
206 case PCB_SHAPE_T :
207 ShowGraphicItemPropertiesDialog( static_cast<PCB_SHAPE*>( aItem ) );
208 break;
209
211 case PCB_DIM_CENTER_T:
212 case PCB_DIM_RADIAL_T:
214 case PCB_DIM_LEADER_T:
215 {
216 DIALOG_DIMENSION_PROPERTIES dlg( this, static_cast<PCB_DIMENSION_BASE*>( aItem ) );
217 dlg.ShowQuasiModal();
218 break;
219 }
220
221 case PCB_ZONE_T:
222 {
223 ZONE* zone = static_cast<ZONE*>( aItem );
224 bool success = false;
225 ZONE_SETTINGS zoneSettings;
226
227 zoneSettings << *static_cast<ZONE*>( aItem );
228
229 if( zone->GetIsRuleArea() )
230 {
231 success = InvokeRuleAreaEditor( this, &zoneSettings ) == wxID_OK;
232 }
233 else if( zone->IsOnCopperLayer() )
234 {
235 success = InvokeCopperZonesEditor( this, &zoneSettings ) == wxID_OK;
236 }
237 else
238 {
239 success = InvokeNonCopperZonesEditor( this, &zoneSettings ) == wxID_OK;
240 }
241
242 if( success )
243 {
244 BOARD_COMMIT commit( this );
245 commit.Modify( zone );
246 commit.Push( _( "Edit Zone" ) );
247 zoneSettings.ExportSetting( *static_cast<ZONE*>( aItem ) );
248 }
249
250 break;
251 }
252
253 case PCB_GROUP_T:
255 static_cast<PCB_GROUP*>( aItem ) );
256 break;
257
258 case PCB_MARKER_T:
259 m_toolManager->GetTool<FOOTPRINT_EDITOR_CONTROL>()->CrossProbe( static_cast<PCB_MARKER*>( aItem ) );
260 break;
261
262 default:
263 wxFAIL_MSG( wxT( "FOOTPRINT_EDIT_FRAME::OnEditItemRequest: unsupported item type " )
264 + aItem->GetClass() );
265 break;
266 }
267}
268
269
271{
273}
274
275
277{
279
281
282 m_toolManager->PostAction( PCB_ACTIONS::layerChanged ); // notify other tools
283 GetCanvas()->SetFocus(); // allow capture of hotkeys
284 GetCanvas()->SetHighContrastLayer( aLayer );
285 GetCanvas()->Refresh();
286}
287
288
289bool FOOTPRINT_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
290{
291 if( !Clear_Pcb( true ) )
292 return false; // this command is aborted
293
295 ImportFootprint( aFileSet[ 0 ] );
296
297 if( GetBoard()->GetFirstFootprint() )
299
300 GetScreen()->SetContentModified( false );
301 Zoom_Automatique( false );
302 GetCanvas()->Refresh();
303
304 return true;
305}
306
307
309{
310 const std::string& payload = mail.GetPayload();
311
312 switch( mail.Command() )
313 {
314 case MAIL_FP_EDIT:
315 if( !payload.empty() )
316 {
317 wxFileName fpFileName( payload );
318 wxString libNickname;
319 wxString msg;
320
321 FP_LIB_TABLE* libTable = Prj().PcbFootprintLibs();
322 const LIB_TABLE_ROW* libTableRow = libTable->FindRowByURI( fpFileName.GetPath() );
323
324 if( !libTableRow )
325 {
326 msg.Printf( _( "The current configuration does not include a library named '%s'.\n"
327 "Use Manage Footprint Libraries to edit the configuration." ),
328 fpFileName.GetPath() );
329 DisplayErrorMessage( this, _( "Library not found in footprint library table." ),
330 msg );
331 break;
332 }
333
334 libNickname = libTableRow->GetNickName();
335
336 if( !libTable->HasLibrary( libNickname, true ) )
337 {
338 msg.Printf( _( "The library '%s' is not enabled in the current configuration.\n"
339 "Use Manage Footprint Libraries to edit the configuration." ),
340 libNickname );
341 DisplayErrorMessage( this, _( "Footprint library not enabled." ), msg );
342 break;
343 }
344
345 LIB_ID fpId( libNickname, fpFileName.GetName() );
346
347 if( m_treePane )
348 {
350 wxCommandEvent event( SYMBOL_SELECTED );
351 wxPostEvent( m_treePane, event );
352 }
353 }
354
355 break;
356
357 case MAIL_RELOAD_LIB:
358 SyncLibraryTree( true );
360 break;
361
362 default:
363 break;
364 }
365}
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
BASIC_FOOTPRINT_INFO(FOOTPRINT *aFootprint)
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:77
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
Definition: board.h:406
COLOR4D GetColor(int aLayer) const
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
Definition: commit.h:103
int ShowQuasiModal()
void ReCreateMenuBar()
Recreates the menu bar.
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
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:97
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: eda_item.h:125
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:95
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 SelectLayer(wxCommandEvent &event)
bool SaveFootprintToBoard(bool aAddNew)
void LoadFootprintFromLibrary(LIB_ID aFPID)
void OnLoadFootprintFromBoard(wxCommandEvent &event)
Called from the main toolbar to load a footprint from board mainly to edit it.
FOOTPRINT * ImportFootprint(const wxString &aName=wxT(""))
Read a file containing only one footprint.
void ReCreateHToolbar() override
Create the main horizontal toolbar for the footprint editor.
void OnSaveFootprintToBoard(wxCommandEvent &event)
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:103
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
PCB_LAYER_BOX_SELECTOR * m_selLayerBox
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.
bool LoadFootprintFromBoard(FOOTPRINT *aFootprint)
Load a footprint from the main board into the Footprint Editor.
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:236
unsigned GetPadCount(INCLUDE_NPTH_T aIncludeNPTH=INCLUDE_NPTH_T(INCLUDE_NPTH)) const
Return the number of pads.
Definition: footprint.cpp:1511
PCB_FIELD & Value()
read/write accessors:
Definition: footprint.h:589
const LIB_ID & GetFPID() const
Definition: footprint.h:230
void SetReference(const wxString &aReference)
Definition: footprint.h:559
unsigned GetUniquePadCount(INCLUDE_NPTH_T aIncludeNPTH=INCLUDE_NPTH_T(INCLUDE_NPTH)) const
Return the number of unique non-blank pads.
Definition: footprint.cpp:1530
void SetValue(const wxString &aValue)
Definition: footprint.h:580
PCB_FIELD & Reference()
Definition: footprint.h:590
wxString GetKeywords() const
Definition: footprint.h:239
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.
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition: kiway_express.h:39
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
Definition: kiway_express.h:57
MAIL_T Command()
Returns the MAIL_T associated with this mail.
Definition: kiway_express.h:49
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()
Refreshes the tree (mainly to update highlighting and asterisking)
Definition: lib_tree.cpp:369
void CenterLibId(const LIB_ID &aLibId)
Ensure that an item is visible (preferably centered).
Definition: lib_tree.cpp:292
void SelectLibId(const LIB_ID &aLibId)
Select an item in the tree widget.
Definition: lib_tree.cpp:286
void ExpandLibId(const LIB_ID &aLibId)
Expand and item i the tree widget.
Definition: lib_tree.cpp:304
Definition: pad.h:58
static TOOL_ACTION layerChanged
Definition: pcb_actions.h:351
static TOOL_ACTION groupProperties
Definition: pcb_actions.h:276
int ShowTextBoxPropertiesDialog(PCB_TEXTBOX *aTextBox)
APPEARANCE_CONTROLS * m_appearancePanel
void ShowBitmapPropertiesDialog(BOARD_ITEM *aBitmap)
Set the angle used for rotate operations.
void ShowGraphicItemPropertiesDialog(PCB_SHAPE *aShape)
void ShowPadPropertiesDialog(PAD *aPad)
const PCB_DISPLAY_OPTIONS & GetDisplayOptions() const
Display options control the way tracks, vias, outlines and other things are shown (for instance solid...
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 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:51
virtual FP_LIB_TABLE * PcbFootprintLibs(KIWAY &aKiway)
Return the table of footprint libraries.
Definition: project.cpp:341
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:165
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:145
bool PostAction(const std::string &aActionName, T aParam)
Run the specified action after the current action (coroutine) ends.
Definition: tool_manager.h:230
wxString wx_str() const
Definition: utf8.cpp:45
ZONE_SETTINGS handles zones parameters.
Definition: zone_settings.h:70
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:72
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
Definition: zone.h:710
bool IsOnCopperLayer() const override
Definition: zone.cpp:266
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:305
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, CONVERT_SETTINGS *aConvertSettings)
Function InvokeRuleAreaEditor invokes up a modal dialog window for copper zone editing.
#define _(s)
@ DO_NOT_INCLUDE_NPTH
Definition: footprint.h:61
PROJECT & Prj()
Definition: kicad.cpp:571
@ LAYER_GRID
Definition: layer_ids.h:206
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:932
@ MAIL_FP_EDIT
Definition: mail_type.h:55
@ MAIL_RELOAD_LIB
Definition: mail_type.h:56
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:102
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition: typeinfo.h:99
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:100
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition: typeinfo.h:107
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition: typeinfo.h:92
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition: typeinfo.h:104
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition: typeinfo.h:91
@ 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:96
@ 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:98
@ PCB_BITMAP_T
class PCB_BITMAP, bitmap on a layer
Definition: typeinfo.h:89
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition: typeinfo.h:87
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition: typeinfo.h:101
VECTOR2< double > VECTOR2D
Definition: vector2d.h:587