diff options
Diffstat (limited to 'include/wxPcbStruct.h')
-rw-r--r-- | include/wxPcbStruct.h | 1740 |
1 files changed, 1740 insertions, 0 deletions
diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h new file mode 100644 index 0000000..f47625c --- /dev/null +++ b/include/wxPcbStruct.h @@ -0,0 +1,1740 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2010 Jean-Pierre Charras, jp.charras@wanadoo.fr + * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file wxPcbStruct.h + */ + +#ifndef WXPCB_STRUCT_H_ +#define WXPCB_STRUCT_H_ + + +#include <pcb_base_edit_frame.h> +#include <config_params.h> +#include <class_macros_record.h> +#include <class_undoredo_container.h> +#include <zones.h> + + +/* Forward declarations of classes. */ +class PCB_SCREEN; +class BOARD; +class TEXTE_PCB; +class MODULE; +class TRACK; +class SEGZONE; +class VIA; +class D_PAD; +class TEXTE_MODULE; +class PCB_TARGET; +class DIMENSION; +class EDGE_MODULE; +class DRC; +class ZONE_CONTAINER; +class DRAWSEGMENT; +class GENERAL_COLLECTOR; +class GENERAL_COLLECTORS_GUIDE; +class PCB_LAYER_WIDGET; +class MARKER_PCB; +class BOARD_ITEM; +class PCB_LAYER_BOX_SELECTOR; +class NETLIST; +class REPORTER; +struct PARSE_ERROR; +struct IO_ERROR; +class FP_LIB_TABLE; + +namespace PCB { struct IFACE; } // KIFACE_I is in pcbnew.cpp + +/** + * Class PCB_EDIT_FRAME + * is the main frame for Pcbnew. + * + * See also class PCB_BASE_FRAME(): Basic class for Pcbnew and GerbView. + */ +#define PCB_EDIT_FRAME_NAME wxT( "PcbFrame" ) + + +class PCB_EDIT_FRAME : public PCB_BASE_EDIT_FRAME +{ + friend struct PCB::IFACE; + friend class PCB_LAYER_WIDGET; + + void updateTraceWidthSelectBox(); + void updateViaSizeSelectBox(); + + int m_RecordingMacros; + MACROS_RECORDED m_Macros[10]; + + /// The auxiliary right vertical tool bar used to access the microwave tools. + wxAuiToolBar* m_microWaveToolBar; + + /** + * Function loadFootprints + * loads the footprints for each #COMPONENT in \a aNetlist from the list of libraries. + * + * @param aNetlist is the netlist of components to load the footprints into. + * @param aReporter is the #REPORTER object to report to. + * @throw IO_ERROR if an I/O error occurs or a #PARSE_ERROR if a file parsing error + * occurs while reading footprint library files. + */ + void loadFootprints( NETLIST& aNetlist, REPORTER* aReporter ) + throw( IO_ERROR, PARSE_ERROR ); + +protected: + PCB_LAYER_WIDGET* m_Layers; + + DRC* m_drc; ///< the DRC controller, see drc.cpp + + PARAM_CFG_ARRAY m_configSettings; ///< List of Pcbnew configuration settings. + + wxString m_lastNetListRead; ///< Last net list read with relative path. + + // The Tool Framework initalization + void setupTools(); + + // we'll use lower case function names for private member functions. + void createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu* aPopMenu ); + void createPopUpMenuForFootprints( MODULE* aModule, wxMenu* aPopMenu ); + void createPopUpMenuForFpTexts( TEXTE_MODULE* aText, wxMenu* aPopMenu ); + void createPopUpMenuForFpPads( D_PAD* aPad, wxMenu* aPopMenu ); + void createPopupMenuForTracks( TRACK* aTrack, wxMenu* aPopMenu ); + void createPopUpMenuForTexts( TEXTE_PCB* Text, wxMenu* menu ); + void createPopUpBlockMenu( wxMenu* menu ); + void createPopUpMenuForMarkers( MARKER_PCB* aMarker, wxMenu* aPopMenu ); + + /** + * an helper function to enable some menus only active when the display + * is switched to GAL mode and which do nothing in legacy mode + */ + void enableGALSpecificMenus(); + + + // Has meaning only if DKICAD_SCRIPTING_WXPYTHON option is on + /** + * @return the frame name identifier for the python console frame + */ + static const wxChar * pythonConsoleNameId() + { + return wxT( "PythonConsole" ); + } + + /** + * @return a pointer to the python console frame, or NULL if not exist + */ + static wxWindow * findPythonConsole() + { + return FindWindowByName( pythonConsoleNameId() ); + } + + /** + * Function syncLayerWidgetLayer + * updates the currently layer "selection" within the PCB_LAYER_WIDGET. + * The currently selected layer is defined by the return value of GetActiveLayer(). + * <p> + * This function cannot be inline without including layer_widget.h in + * here and we do not want to do that. + * </p> + */ + void syncLayerWidgetLayer(); + + /** + * Function syncRenderStates + * updates the "Render" checkboxes in the layer widget according + * to current toggle values determined by IsElementVisible(), and is helpful + * immediately after loading a BOARD which may have state information in it. + */ + void syncRenderStates(); + + /** + * Function syncLayerVisibilities + * updates each "Layer" checkbox in the layer widget according + * to each layer's current visibility determined by IsLayerVisible(), and is + * helpful immediately after loading a BOARD which may have state information in it. + */ + void syncLayerVisibilities(); + + virtual void unitsChangeRefresh(); + + /** + * Function doAutoSave + * performs auto save when the board has been modified and not saved within the + * auto save interval. + * + * @return true if the auto save was successful. + */ + virtual bool doAutoSave(); + + /** + * Function isautoSaveRequired + * returns true if the board has been modified. + */ + virtual bool isAutoSaveRequired() const; + + /** + * Function duplicateZone + * duplicates the given zone. + * @param aDC is the current Device Context. + * @param aZone is the zone to duplicate + */ + void duplicateZone( wxDC* aDC, ZONE_CONTAINER* aZone ); + + /** + * Function moveExact + * Move the selected item exactly + */ + void moveExact(); + + /** + * Function duplicateItems + * Duplicate selected item if possible and start a move + * @param aIncrement increment the item number if appropriate + */ + void duplicateItems( bool aIncrement ); //override + + // protected so that PCB::IFACE::CreateWindow() is the only factory. + PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ); + +public: + PCB_LAYER_BOX_SELECTOR* m_SelLayerBox; // a combo box to display and select active layer + wxChoice* m_SelTrackWidthBox; // a choice box to display and select current track width + wxChoice* m_SelViaSizeBox; // a choice box to display and select current via diameter + + bool m_show_microwave_tools; + bool m_show_layer_manager_tools; + + virtual ~PCB_EDIT_FRAME(); + + void OnQuit( wxCommandEvent& event ); + + /** + * Function GetAutoSaveFilePrefix + * + * @return the string to prepend to a file name for automatic save. + */ + static wxString GetAutoSaveFilePrefix(); + + /** + * Execute a remote command send by Eeschema via a socket, + * port KICAD_PCB_PORT_SERVICE_NUMBER (currently 4242) + * this is a virtual function called by EDA_DRAW_FRAME::OnSockRequest(). + * @param cmdline = received command from socket + */ + virtual void ExecuteRemoteCommand( const char* cmdline ); + + void KiwayMailIn( KIWAY_EXPRESS& aEvent ); // virtual overload from KIWAY_PLAYER + + /** + * Function ToPlotter + * Open a dialog frame to create plot and drill files + * relative to the current board + */ + void ToPlotter( wxCommandEvent& event ); + + /** + * Function ToPrinter + * Install the print dialog + */ + void ToPrinter( wxCommandEvent& event ); + + /** + * Function SVG_Print + * shows the print SVG file dialog. + */ + void SVG_Print( wxCommandEvent& event ); + + // User interface update command event handlers. + void OnUpdateSave( wxUpdateUIEvent& aEvent ); + void OnUpdateLayerPair( wxUpdateUIEvent& aEvent ); + void OnUpdateLayerSelectBox( wxUpdateUIEvent& aEvent ); + void OnUpdateDrcEnable( wxUpdateUIEvent& aEvent ); + void OnUpdateShowBoardRatsnest( wxUpdateUIEvent& aEvent ); + void OnUpdateShowModuleRatsnest( wxUpdateUIEvent& aEvent ); + void OnUpdateAutoDeleteTrack( wxUpdateUIEvent& aEvent ); + void OnUpdateViaDrawMode( wxUpdateUIEvent& aEvent ); + void OnUpdateTraceDrawMode( wxUpdateUIEvent& aEvent ); + void OnUpdateHighContrastDisplayMode( wxUpdateUIEvent& aEvent ); + void OnUpdateShowLayerManager( wxUpdateUIEvent& aEvent ); + void OnUpdateShowMicrowaveToolbar( wxUpdateUIEvent& aEvent ); + void OnUpdateVerticalToolbar( wxUpdateUIEvent& aEvent ); + void OnUpdateSelectViaSize( wxUpdateUIEvent& aEvent ); + void OnUpdateZoneDisplayStyle( wxUpdateUIEvent& aEvent ); + void OnUpdateSelectTrackWidth( wxUpdateUIEvent& aEvent ); + void OnUpdateSelectAutoTrackWidth( wxUpdateUIEvent& aEvent ); + void OnUpdateSelectCustomTrackWidth( wxUpdateUIEvent& aEvent ); + void OnUpdateAutoPlaceModulesMode( wxUpdateUIEvent& aEvent ); + void OnUpdateAutoPlaceTracksMode( wxUpdateUIEvent& aEvent ); + void OnUpdateMuWaveToolbar( wxUpdateUIEvent& aEvent ); + void OnLayerColorChange( wxCommandEvent& aEvent ); + void OnConfigurePaths( wxCommandEvent& aEvent ); + + /** + * Function RecordMacros. + * records sequence of hotkeys and cursor positions to a macro. + * @param aDC = current device context + * @param aNumber The current number macros. + */ + void RecordMacros( wxDC* aDC, int aNumber ); + + /** + * Function CallMacros + * play hotkeys and cursor position from a recorded macro. + * @param aDC = current device context + * @param aPosition The current cursor position in logical (drawing) units. + * @param aNumber The current number macros. + */ + void CallMacros( wxDC* aDC, const wxPoint& aPosition, int aNumber ); + + void SaveMacros(); + + void ReadMacros(); + + /** + * Function PrintPage , virtual + * used to print a page + * Print the page pointed by the current screen, set by the calling print function + * @param aDC = wxDC given by the calling print function + * @param aPrintMaskLayer = a 32 bits mask: bit n = 1 -> layer n is printed + * @param aPrintMirrorMode = true to plot mirrored + * @param aData = a pointer on an auxiliary data (NULL if not used) + */ + virtual void PrintPage( wxDC* aDC, LSET aPrintMaskLayer, bool aPrintMirrorMode, + void* aData = NULL ); + + void GetKicadAbout( wxCommandEvent& event ); + + /** + * Function IsGridVisible() , virtual + * @return true if the grid must be shown + */ + virtual bool IsGridVisible() const; + + /** + * Function SetGridVisibility() , virtual + * It may be overloaded by derived classes + * if you want to store/retrieve the grid visibility in configuration. + * @param aVisible = true if the grid must be shown + */ + virtual void SetGridVisibility( bool aVisible ); + + /** + * Function GetGridColor() , virtual + * @return the color of the grid + */ + virtual EDA_COLOR_T GetGridColor() const; + + /** + * Function SetGridColor() , virtual + * @param aColor = the new color of the grid + */ + virtual void SetGridColor( EDA_COLOR_T aColor ); + + ///> @copydoc EDA_DRAW_FRAME::SetCursorShape() + virtual void SetCursorShape( int aCursorShape ); + + // Configurations: + void Process_Config( wxCommandEvent& event ); + + /** + * Function GetProjectFileParameters + * returns a project file parameter list for Pcbnew. + * <p> + * Populate a project file parameter array specific to Pcbnew. + * Creating the parameter list at run time has the advantage of being able + * to define local variables. The old method of statically building the array + * at compile time requiring global variable definitions by design. + * </p> + * @return PARAM_CFG_ARRAY - it is only good until SetBoard() is called, so + * don't keep it around past that event. + */ + PARAM_CFG_ARRAY GetProjectFileParameters(); + + /** + * Function SaveProjectSettings + * saves changes to the project settings to the project (.pro) file. + * @param aAskForSave = true to open a dialog before saving the settings + */ + void SaveProjectSettings( bool aAskForSave ); + + /** + * Load the current project's file configuration settings which are pertinent + * to this PCB_EDIT_FRAME instance. + * + * @return always returns true. + */ + bool LoadProjectSettings(); + + /** + * Function GetConfigurationSettings + * returns the Pcbnew applications settings list. + * + * This replaces the old statically defined list that had the project + * file settings and the application settings mixed together. This + * was confusing and caused some settings to get saved and loaded + * incorrectly. Currently, only the settings that are needed at start + * up by the main window are defined here. There are other locally used + * settings that are scattered throughout the Pcbnew source code. If you need + * to define a configuration setting that needs to be loaded at run time, + * this is the place to define it. + * + * @return - Reference to the list of applications settings. + */ + PARAM_CFG_ARRAY& GetConfigurationSettings(); + + void LoadSettings( wxConfigBase* aCfg ); // override virtual + + void SaveSettings( wxConfigBase* aCfg ); // override virtual + + wxConfigBase* GetSettings() { return config(); }; + + /** + * Get the last net list read with the net list dialog box. + * + * @return - Absolute path and file name of the last net list file successfully read. + */ + wxString GetLastNetListRead(); + + /** + * Set the last net list successfully read by the net list dialog box. + * + * Note: the file path is converted to a path relative to the project file path. If + * the path cannot be made relative, than m_lastNetListRead is set to and empty + * string. This could happen when the net list file is on a different drive than + * the project file. The advantage of relative paths is that is more likely to + * work when opening the same project from both Windows and Linux. + * + * @param aNetListFile - The last net list file with full path successfully read. + */ + void SetLastNetListRead( const wxString& aNetListFile ); + + ///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription() + EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const; + + /** + * Function OnHotKey. + * ** Commands are case insensitive ** + * Some commands are relatives to the item under the mouse cursor + * @param aDC = current device context + * @param aHotkeyCode = hotkey code (ascii or wxWidget code for special keys) + * @param aPosition The cursor position in logical (drawing) units. + * @param aItem = NULL or pointer on a EDA_ITEM under the mouse cursor + */ + bool OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition, EDA_ITEM* aItem = NULL ); + + /** + * Function OnHotkeyDeleteItem + * Delete the item found under the mouse cursor + * Depending on the current active tool:: + * Tool track + * if a track is in progress: Delete the last segment + * else delete the entire track + * Tool module (footprint): + * Delete the module. + * @param aDC = current device context + * @return true if an item was deleted + */ + bool OnHotkeyDeleteItem( wxDC* aDC ); + + /** + * Function OnHotkeyPlaceItem + * Place the item (footprint, track, text .. ) found under the mouse cursor + * An item can be placed only if there is this item currently edited + * Only a footprint, a pad or a track can be placed + * @param aDC = current device context + * @return true if an item was placed + */ + bool OnHotkeyPlaceItem( wxDC* aDC ); + + bool OnHotkeyEditItem( int aIdCommand ); + + /** + * Function OnHotkeyCopyItem + * returns the copy event id for copyable items. + * @return Event id of a suitable copy event, zero when no copyable item found. + */ + int OnHotkeyCopyItem(); + + /** + * Function OnHotkeyDuplicateOrArrayItem + * Duplicate an item (optionally incrementing if necessary and possible) + * or invoke array dialog and create an array + * @param aIdCommand = the hotkey command id + * @return true if item duplicated or arrayed + */ + bool OnHotkeyDuplicateOrArrayItem( int aIdCommand ); + + /** + * Function OnHotkeyMoveItem + * Moves or drag the item (footprint, track, text .. ) found under the mouse cursor + * Only a footprint or a track can be dragged + * @param aIdCommand = the hotkey command id + * @return true if an item was moved + */ + bool OnHotkeyMoveItem( int aIdCommand ); + + /** + * Function OnHotkeyRotateItem + * Rotate the item (text or footprint) found under the mouse cursor + * @note This command can be used with an item currently in edit. + * Only some items can be rotated (footprints and texts). + * @param aIdCommand = the hotkey command id + * @return true if an item was moved + */ + bool OnHotkeyRotateItem( int aIdCommand ); + + /** + * Function OnHotkeyFlipItem + * Flip the item (text or footprint) found under the mouse cursor + * @note This command can be used with an item currently in edit. + * Only some items can be rotated (footprints and texts). + * @param aIdCommand = the hotkey command id + * @return true if an item was moved + */ + bool OnHotkeyFlipItem( int aIdCommand ); + + /** + * Function OnHotkeyBeginRoute + * If the current active layer is a copper layer, + * and if no item currently edited, start a new track segmenton + * the current copper layer. + * If a new track is in progress, terminate the current segment and + * start a new one. + * @param aDC = current device context + * @return a reference to the track if a track is created, or NULL + */ + TRACK * OnHotkeyBeginRoute( wxDC* aDC ); + + void OnCloseWindow( wxCloseEvent& Event ); + void Process_Special_Functions( wxCommandEvent& event ); + void Tracks_and_Vias_Size_Event( wxCommandEvent& event ); + void OnSelectTool( wxCommandEvent& aEvent ); + + /** + * Function OnResetModuleTextSizes + * resets text size and width of all module text fields of given field + * type to current settings in Preferences + */ + void OnResetModuleTextSizes( wxCommandEvent& event ); + + void ProcessMuWaveFunctions( wxCommandEvent& event ); + void MuWaveCommand( wxDC* DC, const wxPoint& MousePos ); + + void RedrawActiveWindow( wxDC* DC, bool EraseBg ); + void ReCreateHToolbar(); + void ReCreateAuxiliaryToolbar(); + void ReCreateVToolbar(); + void ReCreateMicrowaveVToolbar(); + void ReCreateOptToolbar(); + void ReCreateMenuBar(); + + /** + * Re create the layer Box by clearing the old list, and building + * le new one, from the new layers names and cole layers + * @param aForceResizeToolbar = true to resize the parent toolbar + * false if not needed (mainly in parent toolbar creation, + * or when the layers names are not modified) + */ + void ReCreateLayerBox( bool aForceResizeToolbar = true ); + + + /** + * Function SetCurrentNetClass + * Must be called after a netclass selection (or after a netclass parameter change + * calls BOARD_DESIGN_SETTINGS::SetCurrentNetClass() and update trace width and via size + * combo boxes on main toolbar + * Initialize vias and tracks values displayed in comb boxes of the auxiliary toolbar + * and some others parameters (netclass name ....) + * @param aNetClassName = the new netclass name + * @return true if lists of tracks and vias sizes are modified + */ + bool SetCurrentNetClass( const wxString& aNetClassName ); + + /** + * Function OnModify + * must be called after a board change to set the modified flag. + * <p> + * Reloads the 3D view if required and calls the base PCB_BASE_FRAME::OnModify function + * to update auxiliary information. + * </p> + */ + virtual void OnModify(); + + /** + * Function SetActiveLayer + * will change the currently active layer to \a aLayer and also + * update the PCB_LAYER_WIDGET. + */ + virtual void SetActiveLayer( LAYER_ID aLayer ); + + /** + * Function IsElementVisible + * tests whether a given element category is visible. Keep this as an + * inline function. + * @param aElement is from the enum by the same name + * @return bool - true if the element is visible. + * @see enum PCB_VISIBLE + */ + bool IsElementVisible( int aElement ) const; + + /** + * Function SetElementVisibility + * changes the visibility of an element category + * @param aElement is from the enum by the same name + * @param aNewState = The new visibility state of the element category + * @see enum PCB_VISIBLE + */ + void SetElementVisibility( int aElement, bool aNewState ); + + /** + * Function SetVisibleAlls + * Set the status of all visible element categories and layers to VISIBLE + */ + void SetVisibleAlls(); + + /** + * Function ReFillLayerWidget + * changes out all the layers in m_Layers and may be called upon + * loading a new BOARD. + */ + void ReFillLayerWidget(); + + /** + * Function Show3D_Frame + * displays the 3D view of current printed circuit board. + */ + void Show3D_Frame( wxCommandEvent& event ); + + ///> @copydoc EDA_DRAW_FRAME::UseGalCanvas() + void UseGalCanvas( bool aEnable ); + + bool GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey = 0 ); + + /** + * Function ShowDesignRulesEditor + * displays the Design Rules Editor. + */ + void ShowDesignRulesEditor( wxCommandEvent& event ); + + /* toolbars update UI functions: */ + + void PrepareLayerIndicator(); + + /* mouse functions events: */ + void OnLeftClick( wxDC* DC, const wxPoint& MousePos ); + void OnLeftDClick( wxDC* DC, const wxPoint& MousePos ); + + /** + * Function OnRightClick + * populates a popup menu with the choices appropriate for the current context. + * The caller will add the ZOOM menu choices afterward. + * @param aMousePos The current mouse position + * @param aPopMenu The menu to add to. + */ + bool OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ); + + void OnSelectOptionToolbar( wxCommandEvent& event ); + void ToolOnRightClick( wxCommandEvent& event ); + + /** + * Function SaveCopyInUndoList. + * Creates a new entry in undo list of commands. + * add a picker to handle aItemToCopy + * @param aItemToCopy = the board item modified by the command to undo + * @param aTypeCommand = command type (see enum UNDO_REDO_T) + * @param aTransformPoint = the reference point of the transformation, for + * commands like move + */ + virtual void SaveCopyInUndoList( BOARD_ITEM* aItemToCopy, + UNDO_REDO_T aTypeCommand, + const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ); + + /** + * Function SaveCopyInUndoList (overloaded). + * Creates a new entry in undo list of commands. + * add a list of pickers to handle a list of items + * @param aItemsList = the list of items modified by the command to undo + * @param aTypeCommand = command type (see enum UNDO_REDO_T) + * @param aTransformPoint = the reference point of the transformation, for + * commands like move + */ + virtual void SaveCopyInUndoList( const PICKED_ITEMS_LIST& aItemsList, + UNDO_REDO_T aTypeCommand, + const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ); + + /** + * Function PutDataInPreviousState + * Used in undo or redo command. + * Put data pointed by List in the previous state, i.e. the state memorized by List + * @param aList = a PICKED_ITEMS_LIST pointer to the list of items to undo/redo + * @param aRedoCommand = a bool: true for redo, false for undo + * @param aRebuildRatsnet = a bool: true to rebuild ratsnest (normal use), false + * to just retrieve last state (used in abort commands that do not need to + * rebuild ratsnest) + */ + void PutDataInPreviousState( PICKED_ITEMS_LIST* aList, + bool aRedoCommand, + bool aRebuildRatsnet = true ); + + /** + * Function RestoreCopyFromRedoList + * Redo the last edition: + * - Save the current board in Undo list + * - Get an old version of the board from Redo list + * @return none + */ + void RestoreCopyFromRedoList( wxCommandEvent& aEvent ); + + /** + * Function RestoreCopyFromUndoList + * Undo the last edition: + * - Save the current board in Redo list + * - Get an old version of the board from Undo list + * @return none + */ + void RestoreCopyFromUndoList( wxCommandEvent& aEvent ); + + /* Block operations: */ + + /** + * Function BlockCommand + * Returns the block command internat code (BLOCK_MOVE, BLOCK_COPY...) + * corresponding to the keys pressed (ALT, SHIFT, SHIFT ALT ..) when + * block command is started by dragging the mouse. + * @param aKey = the key modifiers (Alt, Shift ...) + * @return the block command id (BLOCK_MOVE, BLOCK_COPY...) + */ + virtual int BlockCommand( int aKey ); + + /** + * Function HandleBlockPlace() + * Called after HandleBlockEnd, when a block command needs to be + * executed after the block is moved to its new place + * (bloc move, drag, copy .. ) + * Parameters must be initialized in GetScreen()->m_BlockLocate + */ + virtual void HandleBlockPlace( wxDC* DC ); + + /** + * Function HandleBlockEnd() + * Handle the "end" of a block command, + * i.e. is called at the end of the definition of the area of a block. + * depending on the current block command, this command is executed + * or parameters are initialized to prepare a call to HandleBlockPlace + * in GetScreen()->m_BlockLocate + * @return false if no item selected, or command finished, + * true if some items found and HandleBlockPlace must be called later + */ + virtual bool HandleBlockEnd( wxDC* DC ); + + /** + * Function Block_SelectItems + * Uses GetScreen()->m_BlockLocate + * select items within the selected block. + * selected items are put in the pick list + */ + void Block_SelectItems(); + + /** + * Function Block_Delete + * deletes all items within the selected block. + */ + void Block_Delete(); + + /** + * Function Block_Rotate + * Rotate all items within the selected block. + * The rotation center is the center of the block + */ + void Block_Rotate(); + + /** + * Function Block_Flip + * Flip items within the selected block. + * The flip center is the center of the block + */ + void Block_Flip(); + + /** + * Function Block_Move + * move all items within the selected block. + * New location is determined by the current offset from the selected + * block's original location. + */ + void Block_Move(); + + /** + * Function Block_Mirror_X + * mirrors all items within the currently selected block in the X axis. + */ + void Block_Mirror_X(); + + /** + * Function Block_Duplicate + * Duplicate all items within the selected block. + * New location is determined by the current offset from the selected + * block's original location. + */ + void Block_Duplicate( bool aIncrement ); + + void Process_Settings( wxCommandEvent& event ); + void OnConfigurePcbOptions( wxCommandEvent& aEvent ); + void InstallDisplayOptionsDialog( wxCommandEvent& aEvent ); + void InstallPcbGlobalDeleteFrame( const wxPoint& pos ); + + /** + * Function GenFootprintsPositionFile + * Calls DoGenFootprintsPositionFile to create a footprint position file + * See DoGenFootprintsPositionFile for options and file format + */ + void GenFootprintsPositionFile( wxCommandEvent& event ); + + /** + * Function DoGenFootprintsPositionFile + * Creates an ascii footprint position file + * @param aFullFileName = the full file name of the file to create + * @param aUnitsMM = false to use inches, true to use mm in coordinates + * @param aForceSmdItems = true to force all footprints with smd pads in list + * = false to put only footprints with option "INSERT" in list + * @param aSide = 0 to list footprints on BACK side, + * 1 to list footprints on FRONT side + * 2 to list footprints on both sides + * @return the number of footprints found on aSide side, + * or -1 if the file could not be created + */ + int DoGenFootprintsPositionFile( const wxString& aFullFileName, bool aUnitsMM, + bool aForceSmdItems, int aSide ); + + /** + * Function GenFootprintsReport + * Calls DoGenFootprintsReport to create a footprint reprot file + * See DoGenFootprintsReport for file format + */ + void GenFootprintsReport( wxCommandEvent& event ); + + /** + * Function DoGenFootprintsReport + * Creates an ascii footprint report file giving some infos on footprints + * and board outlines + * @param aFullFilename = the full file name of the file to create + * @param aUnitsMM = false to use inches, true to use mm in coordinates + * @return true if OK, false if error + */ + bool DoGenFootprintsReport( const wxString& aFullFilename, bool aUnitsMM ); + + void InstallDrillFrame( wxCommandEvent& event ); + void GenD356File( wxCommandEvent& event ); + void ToPostProcess( wxCommandEvent& event ); + + void OnFileHistory( wxCommandEvent& event ); + + /** + * Function Files_io + * @param event is the command event handler. + * do nothing else than call Files_io_from_id with the + * wxCommandEvent id + */ + void Files_io( wxCommandEvent& event ); + + /** + * Function Files_io_from_id + * Read and write board files + * @param aId is an event ID ciming from file command events: + * ID_LOAD_FILE + * ID_MENU_READ_BOARD_BACKUP_FILE + * ID_MENU_RECOVER_BOARD_AUTOSAVE + * ID_APPEND_FILE + * ID_NEW_BOARD + * ID_SAVE_BOARD + * ID_COPY_BOARD_AS + * ID_SAVE_BOARD_AS + * Files_io_from_id prepare parameters and calls the specialized function + */ + void Files_io_from_id( int aId ); + + /** + * Function OpenProjectFiles (was LoadOnePcbFile) + * loads a KiCad board (.kicad_pcb) from \a aFileName. + * + * @param aFileSet - hold the BOARD file to load, a vector of one element. + * + * @param aCtl - KICTL_ bits, one to indicate that an append of the board file + * aFileName to the currently loaded file is desired. + * @see #KIWAY_PLAYER for bit defines. + * + * @return bool - false if file load fails, otherwise true. + bool LoadOnePcbFile( const wxString& aFileName, bool aAppend = false, + bool aForceFileDialog = false ); + */ + bool OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl = 0 ); + + /** + * Function AppendBoardFile + * appends a board file onto the current one, creating God knows what. + * the main purpose is only to allow panelizing boards. + */ + bool AppendBoardFile( const wxString& aFullFileName, int aCtl ); + + /** + * Function SavePcbFile + * writes the board data structures to \a a aFileName + * Creates backup when requested and update flags (modified and saved flgs) + * + * @param aFileName The file name to write or wxEmptyString to prompt user for + * file name. + * @param aCreateBackupFile Creates a back of \a aFileName if true. Helper + * definitions #CREATE_BACKUP_FILE and #NO_BACKUP_FILE + * are defined for improved code readability. + * @return True if file was saved successfully. + */ + bool SavePcbFile( const wxString& aFileName, bool aCreateBackupFile = CREATE_BACKUP_FILE ); + + /** + * Function SavePcbCopy + * writes the board data structures to \a a aFileName + * but unlike SavePcbFile, does not make anything else + * (no backup, borad fliename change, no flag changes ...) + * Used under a project mgr to save under a new name the current board + * + * When not under a project mgr, the full SavePcbFile is used. + * @param aFileName The file name to write. + * @return True if file was saved successfully. + */ + bool SavePcbCopy( const wxString& aFileName ); + + // BOARD handling + + /** + * Function Clear_Pcb + * delete all and reinitialize the current board + * @param aQuery = true to prompt user for confirmation, false to initialize silently + */ + bool Clear_Pcb( bool aQuery ); + + ///> @copydoc PCB_BASE_FRAME::SetBoard() + void SetBoard( BOARD* aBoard ); + + ///> @copydoc PCB_BASE_FRAME::SetPageSettings() + void SetPageSettings( const PAGE_INFO& aPageSettings ); // overload + + // Drc control + + /* function GetDrcController + * @return the DRC controller + */ + DRC* GetDrcController() { return m_drc; } + + /** + * Function RecreateBOMFileFromBoard + * Recreates a .cmp file from the current loaded board + * this is the same as created by CvPcb. + * can be used if this file is lost + */ + void RecreateCmpFileFromBoard( wxCommandEvent& aEvent ); + + /** + * Function ArchiveModulesOnBoard + * Save modules in a library: + * @param aStoreInNewLib: + * true : save modules in a existing lib. Existing footprints will be kept + * or updated. + * This lib should be in fp lib table, and is type is .pretty + * false: save modules in a new lib. It it is an existing lib, + * previous footprints will be removed + */ + void ArchiveModulesOnBoard( bool aStoreInNewLib ); + + /** + * Function RecreateBOMFileFromBoard + * Creates a BOM file from the current loaded board + */ + void RecreateBOMFileFromBoard( wxCommandEvent& aEvent ); + + /** + * Function ExportToGenCAD + * creates a file in GenCAD 1.4 format from the current board. + */ + void ExportToGenCAD( wxCommandEvent& event ); + + /** + * Function OnExportVRML + * will export the current BOARD to a VRML file. + */ + void OnExportVRML( wxCommandEvent& event ); + + /** + * Function ExportVRML_File + * Creates the file(s) exporting current BOARD to a VRML file. + * + * @note When copying 3D shapes files, the new filename is build from the full path + * name, changing the separators by underscore. This is needed because files + * with the same shortname can exist in different directories + * @note ExportVRML_File generates coordinates in board units (BIU) inside the file. + * @todo Use mm inside the file. A general scale transform is applied to the whole + * file (1.0 to have the actual WRML unit im mm, 0.001 to have the actual WRML + * unit in meters. + * @note For 3D models built by a 3D modeler, the unit is 0,1 inches. A specific scale + * is applied to 3D models to convert them to internal units. + * + * @param aFullFileName = the full filename of the file to create + * @param aMMtoWRMLunit = the VRML scaling factor: + * 1.0 to export in mm. 0.001 for meters + * @param aExport3DFiles = true to copy 3D shapes in the subir a3D_Subdir + * @param aUseRelativePaths set to true to use relative paths instead of absolute paths + * in the board VRML file URLs. + * @param aUsePlainPCB set to true to export a board with no copper or silkskreen; + * this is useful for generating a VRML file which can be + * converted to a STEP model. + * @param a3D_Subdir = sub directory where 3D shapes files are copied. This is only used + * when aExport3DFiles == true + * @param aXRef = X value of PCB (0,0) reference point + * @param aYRef = Y value of PCB (0,0) reference point + * @return true if Ok. + */ + bool ExportVRML_File( const wxString & aFullFileName, double aMMtoWRMLunit, + bool aExport3DFiles, bool aUseRelativePaths, + bool aUsePlainPCB, const wxString & a3D_Subdir, + double aXRef, double aYRef ); + + /** + * Function ExportToIDF3 + * will export the current BOARD to a IDFv3 board and lib files. + */ + void ExportToIDF3( wxCommandEvent& event ); + + /** + * Function ExporttoSPECCTRA + * Ask for a filename and call ExportSpecctraFile to export the current BOARD + * to a specctra dsn file. + */ + void ExportToSpecctra( wxCommandEvent& event ); + + /** + * Function ExportSpecctraFile + * will export the current BOARD to a specctra dsn file. + * See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the + * specification. + * @return true if OK + */ + bool ExportSpecctraFile( const wxString& aFullFilename ); + + /** + * Function ImportSpecctraSession + * will import a specctra *.ses file and use it to relocate MODULEs and + * to replace all vias and tracks in an existing and loaded BOARD. + * See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the + * specification. + */ + void ImportSpecctraSession( wxCommandEvent& event ); + + /** + * Function ImportSpecctraDesign + * will import a specctra *.dsn file and use it to replace an entire BOARD. + * The new board will not have any graphics, only components, tracks and + * vias. + * See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the + * specification. + */ + void ImportSpecctraDesign( wxCommandEvent& event ); + + /** + * Function Access_to_External_Tool + * Run an external tool (like freeroute ) + */ + void Access_to_External_Tool( wxCommandEvent& event ); + + /** + * Function ListAndSelectModuleName + * builds and shows a list of existing modules on board that the user can select. + * @return a pointer to the selected module or NULL. + */ + MODULE* ListAndSelectModuleName(); + + /** + * Function ListNetsAndSelect + * called by a command event + * displays the sorted list of nets in a dialog frame + * If a net is selected, it is highlighted + */ + void ListNetsAndSelect( wxCommandEvent& event ); + + void Swap_Layers( wxCommandEvent& event ); + + // Handling texts on the board + void Rotate_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC ); + void FlipTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC ); + TEXTE_PCB* CreateTextePcb( wxDC* aDC, TEXTE_PCB* aText = NULL ); + void Delete_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC ); + void StartMoveTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC, bool aErase = true ); + void Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC ); + void InstallTextPCBOptionsFrame( TEXTE_PCB* TextPCB, wxDC* DC ); + + // Graphic Segments type DRAWSEGMENT + void Start_Move_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC ); + void Place_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC ); + void InstallGraphicItemPropertiesDialog( DRAWSEGMENT* aItem, wxDC* aDC ); + + // Footprint edition (see also PCB_BASE_FRAME) + void InstallModuleOptionsFrame( MODULE* Module, wxDC* DC ); + + /** + * Function StartMoveModule + * Initialize a drag or move pad command + * @param aModule = the module to move or drag + * @param aDC = the current device context + * @param aDragConnectedTracks = true to drag connected tracks, + * false to just move the module + */ + void StartMoveModule( MODULE* aModule, wxDC* aDC, bool aDragConnectedTracks ); + + /** + * Function DlgGlobalChange_PadSettings + * Function to change pad caracteristics for the given footprint + * or all footprints which look like the given footprint + * Options are set by the opened dialog. + * @param aPad is the pattern. The given footprint is the parent of this pad + * @param aRedraw: if true: redraws the footprint + */ + void DlgGlobalChange_PadSettings( D_PAD* aPad, bool aRedraw ); + + /** + * Function Delete Module + * Remove a footprint from m_Modules linked list and put it in undelete buffer + * The ratsnest and pad list are recalculated + * @param aModule = footprint to delete + * @param aDC = currentDevice Context. if NULL: do not redraw new ratsnest + */ + bool Delete_Module( MODULE* aModule, wxDC* aDC ); + + /** + * Function Change_Side_Module + * Flip a footprint (switch layer from component or component to copper) + * The mirroring is made from X axis + * if a footprint is not on copper or component layer it is not flipped + * (it could be on an adhesive layer, not supported at this time) + * @param Module the footprint to flip + * @param DC Current Device Context. if NULL, no redraw + */ + void Change_Side_Module( MODULE* Module, wxDC* DC ); + + int InstallExchangeModuleFrame( MODULE* ExchangeModuleModule ); + + /** + * Function Exchange_Module + * Replaces OldModule by NewModule, using OldModule settings: + * position, orientation, pad netnames ...) + * OldModule is deleted or put in undo list. + * @param aOldModule = footprint to replace + * @param aNewModule = footprint to put + * @param aUndoPickList = the undo list used to save OldModule. If null, + * OldModule is deleted + */ + void Exchange_Module( MODULE* aOldModule, MODULE* aNewModule, + PICKED_ITEMS_LIST* aUndoPickList ); + + // loading modules: see PCB_BASE_FRAME + + // Board handling + void RemoveStruct( BOARD_ITEM* Item, wxDC* DC ); + + /** + * Function OnEditItemRequest + * Install the corresponding dialog editor for the given item + * @param aDC = the current device context + * @param aItem = a pointer to the BOARD_ITEM to edit + */ + void OnEditItemRequest( wxDC* aDC, BOARD_ITEM* aItem ); + + /** + * Locate track or pad and highlight the corresponding net. + * @return The Netcode, or -1 if no net located. + */ + int SelectHighLight( wxDC* DC ); + + /** + * Function HighLight. + * highlights the net at the current cursor position. + */ + void HighLight( wxDC* DC ); + + // Track and via edition: + void Via_Edit_Control( wxCommandEvent& event ); + + /** + * Function IsMicroViaAcceptable + * return true if a microvia can be placed on the board. + * <p> + * A microvia is a small via restricted to 2 near neighbor layers + * because its is hole is made by laser which can penetrate only one layer + * It is mainly used to connect BGA to the first inner layer + * And it is allowed from an external layer to the first inner layer + * </p> + */ + bool IsMicroViaAcceptable( void ); + + /** + * Function Other_Layer_Route + * operates in one of two ways. If argument track is NULL, then swap the + * active layer between m_Route_Layer_TOP and m_Route_Layer_BOTTOM. If a + * track is in progress (track is not NULL), and if DRC allows it, place + * a via on the end of the current track, and then swap the current active + * layer and start a new segment on the new layer. + * @param track A TRACK* to append the via to or NULL. + * @param DC A device context to draw on. + * @return bool - true if the operation was successful, else false such as + * the case where DRC would not allow a via. + */ + bool Other_Layer_Route( TRACK* track, wxDC* DC ); + void HighlightUnconnectedPads( wxDC* DC ); + + /** + * Function Delete_Segment + * removes a track segment. + * If a new track is in progress: delete the current new segment. + * Otherwise, delete segment under the mouse cursor. + */ + TRACK* Delete_Segment( wxDC* DC, TRACK* Track ); + + void Delete_Track( wxDC* DC, TRACK* Track ); + void Delete_net( wxDC* DC, TRACK* Track ); + + /** + * Function Remove_One_Track + * removes 1 track/ + * The leading segment is removed and all adjacent segments + * until a pad or a junction point of more than 2 segments is found + */ + void Remove_One_Track( wxDC* DC, TRACK* pt_segm ); + + /** + * Function Reset_All_Tracks_And_Vias_To_Netclass_Values + * Reset all tracks width and/or vias diameters and drill + * to their default Netclass value + * @param aTrack : bool true to modify tracks + * @param aVia : bool true to modify vias + */ + bool Reset_All_Tracks_And_Vias_To_Netclass_Values( bool aTrack, bool aVia ); + + /** + * Function Change_Net_Tracks_And_Vias_Sizes + * Reset all tracks width and vias diameters and drill + * to their default Netclass value or current values + * @param aNetcode : the netcode of the net to edit + * @param aUseNetclassValue : bool. True to use netclass values, false to + * use current values + */ + bool Change_Net_Tracks_And_Vias_Sizes( int aNetcode, bool aUseNetclassValue ); + + /** + * Function Edit_Track_Width + * Modify a full track width (using DRC control). + * a full track is the set of track segments between 2 ends: pads or a + * point that has more than 2 segments ends connected + * @param aDC = the curred device context (can be NULL) + * @param aTrackSegment = a segment or via on the track to change + */ + void Edit_Track_Width( wxDC* aDC, TRACK* aTrackSegment ); + + /** + * Function Edit_TrackSegm_Width + * Modify one track segment width or one via diameter (using DRC control). + * @param aDC = the current device context (can be NULL) + * @param aTrackItem = the track segment or via to modify + */ + void Edit_TrackSegm_Width( wxDC* aDC, TRACK* aTrackItem ); + + /** + * Function Begin_Route + * Starts a new track and/or establish of a new track point. + * + * For a new track: + * - Search the netname of the new track from the starting point + * if it is on a pad or an existing track + * - Highlight all this net + * If a track is in progress: + * - Call DRC + * - If DRC is OK: finish the track segment and starts a new one. + * @param aTrack = the current track segment, or NULL to start a new track + * @param aDC = the current device context + * @return a pointer to the new track segment or null if not created (DRC error) + */ + TRACK* Begin_Route( TRACK* aTrack, wxDC* aDC ); + + /** + * Function End_Route + * Terminates a track currently being created + * @param aTrack = the current track segment in progress + * @param aDC = the current device context + * @return true if the track was created, false if not (due to a DRC error) + */ + bool End_Route( TRACK* aTrack, wxDC* aDC ); + + void Attribut_Segment( TRACK* track, wxDC* DC, bool Flag_On ); + void Attribut_Track( TRACK* track, wxDC* DC, bool Flag_On ); + void Attribut_net( wxDC* DC, int net_code, bool Flag_On ); + + /** + * Function StartMoveOneNodeOrSegment + * initializes the parameters to move one via or/and a terminal point of a track segment + * The terminal point of other connected segments (if any) are moved too. + */ + void StartMoveOneNodeOrSegment( TRACK* aTrack, wxDC* aDC, int aCommand ); + + bool PlaceDraggedOrMovedTrackSegment( TRACK* Track, wxDC* DC ); + + /** + * @todo This function is broken, because it merge segments having different + * widths or without any connectivity test. + * 2 collinear segments can be merged only if no other segment or via is + * connected to the common point and if they have the same width. See + * cleanup.cpp for merge functions and consider MarkTrace() to locate segments + * that can be merged + */ + bool MergeCollinearTracks( TRACK* track, wxDC* DC, int end ); + + void Start_DragTrackSegmentAndKeepSlope( TRACK* track, wxDC* DC ); + void SwitchLayer( wxDC* DC, LAYER_ID layer ); + + /** + * Function Add45DegreeSegment + * adds a track segment between 2 tracks segments if these 2 segments + * make a 90 deg angle, in order to have 45 deg track segments + * Its only works on horizontal or vertical segments. + * + * @param aDC The wxDC device context to draw on. + * @return A bool value true if ok or false if not. + */ + bool Add45DegreeSegment( wxDC* aDC ); + + /** + * Function EraseRedundantTrack + * Called after creating a track + * Remove (if exists) the old track that have the same starting and the + * same ending point as the new created track + * (this is the redunding track) + * @param aDC = the current device context (can be NULL) + * @param aNewTrack = the new created track (a pointer to a segment of the + * track list) + * @param aNewTrackSegmentsCount = number of segments in this new track + * @param aItemsListPicker = the list picker to use for an undo command + * (can be NULL) + */ + int EraseRedundantTrack( wxDC* aDC, + TRACK* aNewTrack, + int aNewTrackSegmentsCount, + PICKED_ITEMS_LIST* aItemsListPicker ); + + /** + * Function SetTrackSegmentWidth + * Modify one track segment width or one via diameter (using DRC control). + * Basic routine used by other routines when editing tracks or vias + * @param aTrackItem = the track segment or via to modify + * @param aItemsListPicker = the list picker to use for an undo command + * (can be NULL) + * @param aUseNetclassValue = true to use NetClass value, false to use + * current designSettings value + * @return true if done, false if no not change (because DRC error) + */ + bool SetTrackSegmentWidth( TRACK* aTrackItem, + PICKED_ITEMS_LIST* aItemsListPicker, + bool aUseNetclassValue ); + + + // zone handling + + /** + * Function Delete_OldZone_Fill (obsolete) + * Used for compatibility with old boards + * Remove the zone filling which include the segment aZone, or the zone + * which have the given time stamp. + * For old boards, a zone is a group of SEGZONE segments which have the same TimeStamp + * @param aZone = zone segment within the zone to delete. Can be NULL + * @param aTimestamp = Timestamp for the zone to delete, used if aZone == + * NULL + */ + void Delete_OldZone_Fill( SEGZONE* aZone, time_t aTimestamp = 0 ); + + /** + * Function Delete_LastCreatedCorner + * Used only while creating a new zone outline + * Remove and delete the current outline segment in progress + * @return 0 if no corner in list, or corner number + */ + int Delete_LastCreatedCorner( wxDC* DC ); + + /** + * Function Begin_Zone + * either initializes the first segment of a new zone, or adds an + * intermediate segment. + * A new zone can be: + * created from scratch: the user will be prompted to define parameters (layer, clearence ...) + * created from a similar zone (s_CurrentZone is used): parameters are copied from + * s_CurrentZone + * created as a cutout (an hole) inside s_CurrentZone + */ + int Begin_Zone( wxDC* DC ); + + /** + * Function End_Zone + * terminates (if no DRC error ) the zone edge creation process + * @param DC = current Device Context + * @return true if Ok, false if DRC error + */ + bool End_Zone( wxDC* DC ); + + /** + * Function Fill_Zone + * Calculate the zone filling for the outline zone_container + * The zone outline is a frontier, and can be complex (with holes) + * The filling starts from starting points like pads, tracks. + * If exists the old filling is removed + * @param aZone = zone to fill + * @return error level (0 = no error) + */ + int Fill_Zone( ZONE_CONTAINER* aZone ); + + /** + * Function Fill_All_Zones + * Fill all zones on the board + * The old fillings are removed + * @param aActiveWindow = the current active window, if a progress bar is shown + * = NULL to do not display a progress bar + * @param aVerbose = true to show error messages + */ + int Fill_All_Zones( wxWindow * aActiveWindow, bool aVerbose = true ); + + + /** + * Function Add_Zone_Cutout + * Add a cutout zone to a given zone outline + * @param DC = current Device Context + * @param zone_container = parent zone outline + */ + void Add_Zone_Cutout( wxDC* DC, ZONE_CONTAINER* zone_container ); + + /** + * Function Add_Similar_Zone + * Add a zone to a given zone outline. + * if the zones are overlapping they will be merged + * @param DC = current Device Context + * @param zone_container = parent zone outline + */ + void Add_Similar_Zone( wxDC* DC, ZONE_CONTAINER* zone_container ); + + /** + * Function Edit_Zone_Params + * Edit params (layer, clearance, ...) for a zone outline + */ + void Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* zone_container ); + + /** + * Function Start_Move_Zone_Corner + * Prepares a move corner in a zone outline, + * called from a move corner command (IsNewCorner = false), + * or a create new cornet command (IsNewCorner = true ) + */ + void Start_Move_Zone_Corner( wxDC* DC, + ZONE_CONTAINER* zone_container, + int corner_id, + bool IsNewCorner ); + + /** + * Function Start_Move_Zone_Corner + * Prepares a drag edge in an existing zone outline, + */ + void Start_Move_Zone_Drag_Outline_Edge( wxDC* DC, + ZONE_CONTAINER* zone_container, + int corner_id ); + + /** + * Function End_Move_Zone_Corner_Or_Outlines + * Terminates a move corner in a zone outline, or a move zone outlines + * @param DC = current Device Context (can be NULL) + * @param zone_container: the given zone + */ + void End_Move_Zone_Corner_Or_Outlines( wxDC* DC, ZONE_CONTAINER* zone_container ); + + /** + * Function End_Move_Zone_Corner_Or_Outlines + * Remove the currently selected corner in a zone outline + * the .m_CornerSelection is used as corner selection + */ + void Remove_Zone_Corner( wxDC* DC, ZONE_CONTAINER* zone_container ); + + /** + * Function Delete_Zone + * Remove the zone which include the segment aZone, or the zone which have + * the given time stamp. A zone is a group of segments which have the + * same TimeStamp + * @param DC = current Device Context (can be NULL) + * @param zone_container = zone to modify + * the member .m_CornerSelection is used to find the outline to remove. + * if the outline is the main outline, all the zone is removed + * otherwise, the hole is deleted + */ + void Delete_Zone_Contour( wxDC* DC, ZONE_CONTAINER* zone_container ); + + /** + * Function Start_Move_Zone_Outlines + * Initialize parameters to move an existing zone outlines. + * @param DC = current Device Context (can be NULL) + * @param zone_container: the given zone to move + */ + void Start_Move_Zone_Outlines( wxDC* DC, ZONE_CONTAINER* zone_container ); + + // Target handling + PCB_TARGET* CreateTarget( wxDC* DC ); + void DeleteTarget( PCB_TARGET* aTarget, wxDC* DC ); + void BeginMoveTarget( PCB_TARGET* aTarget, wxDC* DC ); + void PlaceTarget( PCB_TARGET* aTarget, wxDC* DC ); + void ShowTargetOptionsDialog( PCB_TARGET* aTarget, wxDC* DC ); + + // Graphic segments type DRAWSEGMENT handling: + DRAWSEGMENT* Begin_DrawSegment( DRAWSEGMENT* Segment, STROKE_T shape, wxDC* DC ); + void End_Edge( DRAWSEGMENT* Segment, wxDC* DC ); + void Delete_Segment_Edge( DRAWSEGMENT* Segment, wxDC* DC ); + void Delete_Drawings_All_Layer( LAYER_ID aLayer ); + + // Dimension handling: + void ShowDimensionPropertyDialog( DIMENSION* aDimension, wxDC* aDC ); + DIMENSION* EditDimension( DIMENSION* aDimension, wxDC* aDC ); + void DeleteDimension( DIMENSION* aDimension, wxDC* aDC ); + void BeginMoveDimensionText( DIMENSION* aItem, wxDC* DC ); + void PlaceDimensionText( DIMENSION* aItem, wxDC* DC ); + + + // netlist handling: + void InstallNetlistFrame( wxDC* DC ); + + /** + * Function ReadPcbNetlist + * reads \a aNetlistFileName and updates the footprints (load missing footprints and + * delete on demand extra footprints) on the board. + * Update connectivity info, references, values and "TIME STAMP" + * + * @param aNetlistFileName = netlist file name (*.net) + * @param aCmpFileName = cmp/footprint link file name (*.cmp). + * if not found or empty, only the netlist will be used + * @param aReporter is a pointer to a #REPORTER object to write display messages. + * can be NULL. + * @param aChangeFootprint if true, footprints that have changed in netlist will be changed + * @param aDeleteBadTracks if true, erroneous tracks will be deleted + * @param aDeleteExtraFootprints if true, remove unlocked footprints that are not in netlist + * @param aSelectByTimestamp if true, use timestamp instead of reference to identify + * footprints from components (use after reannotation of the + * schematic) + * @param aDeleteSinglePadNets if true, remove nets counting only one pad + * and set net code to 0 for these pads + * @param aIsDryRun performs a dry run without making any changes if true. + */ + void ReadPcbNetlist( const wxString& aNetlistFileName, + const wxString& aCmpFileName, + REPORTER* aReporter, + bool aChangeFootprint, + bool aDeleteBadTracks, + bool aDeleteExtraFootprints, + bool aSelectByTimestamp, + bool aDeleteSinglePadNets, + bool aIsDryRun ); + + /** + * Function RemoveMisConnectedTracks + * finds all track segments which are mis-connected (to more than one net). + * When such a bad segment is found, it is flagged to be removed. + * All tracks having at least one flagged segment are removed. + * @return true if any change is made + */ + bool RemoveMisConnectedTracks(); + + + // Autoplacement: + void OnPlaceOrRouteFootprints( wxCommandEvent& event ); + + /** + * Function ScriptingConsoleEnableDisable + * enables or disabled the scripting console + */ + void ScriptingConsoleEnableDisable( wxCommandEvent& aEvent ); + + void OnUpdateScriptingConsoleState( wxUpdateUIEvent& aEvent ); + + void OnSelectAutoPlaceMode( wxCommandEvent& aEvent ); + + /** + * Function OnOrientFootprints + * install the dialog box for the common Orient Footprints + */ + void OnOrientFootprints( wxCommandEvent& event ); + + /** + * Function ReOrientModules + * Set the orientation of footprints + * @param ModuleMask = mask (wildcard allowed) selection + * @param Orient = new orientation + * @param include_fixe = true to orient locked footprints + * @return true if some footprints modified, false if no change + */ + bool ReOrientModules( const wxString& ModuleMask, double Orient, bool include_fixe ); + void LockModule( MODULE* aModule, bool aLocked ); + + /** + * Function SpreadFootprints + * Footprints (after loaded by reading a netlist for instance) are moved + * to be in a small free area (outside the current board) without overlapping. + * @param aFootprintsOutsideBoardOnly: true to move only + * footprints outside the board outlines + * (they are outside if the position of a footprint is outside + * the board outlines bounding box + */ + void SpreadFootprints( bool aFootprintsOutsideBoardOnly ); + + /** + * Function AutoPlaceModule + * automatically places footprints within the confines of the PCB edges. + * The components with the FIXED status are not moved. If the menu is + * calling the placement of 1 module, it will be replaced. + */ + void AutoPlaceModule( MODULE* Module, int place_mode, wxDC* DC ); + + // Autorouting: + int Solve( wxDC* DC, int two_sides ); + void Reset_Noroutable( wxDC* DC ); + void Autoroute( wxDC* DC, int mode ); + void ReadAutoroutedTracks( wxDC* DC ); + void GlobalRoute( wxDC* DC ); + + /** + * Function Show_1_Ratsnest + * draw ratsnest. + * + * The net edge pad with mouse or module locates the mouse. + * Delete the ratsnest if no module or pad is selected. + */ + void Show_1_Ratsnest( EDA_ITEM* item, wxDC* DC ); + + /** + * Function Clean_Pcb + * Clean up the board (remove redundant vias, not connected tracks + * and merges collinear track segments) + * Install the cleanup dialog frame to know what should be cleaned + * and run the cleanup function + */ + void Clean_Pcb(); + + void InstallFindFrame(); + + /** + * Function SendMessageToEESCHEMA + * sends a message to the schematic editor so that it may move its cursor + * to a part with the same reference as the objectToSync + * @param objectToSync The object whose reference is used to synchronize Eeschema. + */ + void SendMessageToEESCHEMA( BOARD_ITEM* objectToSync ); + + /** + * Function Edit_Gap + * edits the GAP module if it has changed the position and/or size of the pads that + * form the gap get a new value. + */ + void Edit_Gap( wxDC* DC, MODULE* Module ); + + /** + * Function CreateMuWaveBaseFootprint + * create a basic footprint for micro wave applications. + * @param aValue = the text value + * @param aTextSize = the size of ref and value texts ( <= 0 to use board default values ) + * @param aPadCount = number of pads + * Pads settings are: + * PAD_ATTRIB_SMD, rectangular, H size = V size = current track width. + */ + MODULE* CreateMuWaveBaseFootprint( const wxString& aValue, int aTextSize, int aPadCount ); + + /** + * Create_MuWaveComponent + * creates a module "GAP" or "STUB" used in micro wave designs. + * This module has 2 pads: + * PAD_ATTRIB_SMD, rectangular, H size = V size = current track width. + * the "gap" is isolation created between this 2 pads + */ + MODULE* Create_MuWaveComponent( int shape_type ); + + MODULE* Create_MuWavePolygonShape(); + + void Begin_Self( wxDC* DC ); + + /** + * Function Genre_Self + * creates a self-shaped coil for microwave applications. + * - Length Mself.lng + * - Extremities Mself.m_Start and Mself.m_End + * + * We must determine: + * Mself.nbrin = number of segments perpendicular to the direction + * (The coil nbrin will demicercles + 1 + 2 1 / 4 circle) + * Mself.lbrin = length of a strand + * Mself.radius = radius of rounded parts of the coil + * Mself.delta = segments extremities connection between him and the coil even + * + * The equations are + * Mself.m_Size.x = 2 * Mself.radius + Mself.lbrin + * Mself.m_Size.y * Mself.delta = 2 + 2 * Mself.nbrin * Mself.radius + * Mself.lng = 2 * Mself.delta / / connections to the coil + + (Mself.nbrin-2) * Mself.lbrin / / length of the strands except 1st and last + + (Mself.nbrin 1) * (PI * Mself.radius) / / length of rounded + * Mself.lbrin + / 2 - Melf.radius * 2) / / length of 1st and last bit + * + * The constraints are: + * Nbrin >= 2 + * Mself.radius < Mself.m_Size.x + * Mself.m_Size.y = Mself.radius * 4 + 2 * Mself.raccord + * Mself.lbrin> Mself.radius * 2 + * + * The calculation is conducted in the following way: + * Initially: + * Nbrin = 2 + * Radius = 4 * m_Size.x (arbitrarily fixed value) + * Then: + * Increasing the number of segments to the desired length + * (Radius decreases if necessary) + * + */ + MODULE* Genere_Self( wxDC* DC ); + + void ShowChangedLanguage(); // override EDA_BASE_FRAME virtual + + /** + * Function UpdateTitle + * sets the main window title bar text. + * <p> + * If file name defined by PCB_SCREEN::m_FileName is not set, the title is set to the + * application name appended with no file. Otherwise, the title is set to the full path + * and file name and read only is appended to the title if the user does not have write + * access to the file. + * </p> + */ + void UpdateTitle(); + + DECLARE_EVENT_TABLE() +}; + +#endif // WXPCB_STRUCT_H_ |