diff options
Diffstat (limited to 'eeschema/schframe.h')
-rw-r--r-- | eeschema/schframe.h | 1351 |
1 files changed, 1351 insertions, 0 deletions
diff --git a/eeschema/schframe.h b/eeschema/schframe.h new file mode 100644 index 0000000..0db8ea8 --- /dev/null +++ b/eeschema/schframe.h @@ -0,0 +1,1351 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2015 Jean-Pierre Charras, jp.charras wanadoo.fr + * Copyright (C) 2008-2015 Wayne Stambaugh <stambaughw@verizon.net> + * Copyright (C) 2004-2015 KiCad Developers, see change_log.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 wxEeschemaStruct.h + */ + +#ifndef WX_EESCHEMA_STRUCT_H +#define WX_EESCHEMA_STRUCT_H + +#include <sch_base_frame.h> +#include <config_params.h> +#include <class_undoredo_container.h> +#include <template_fieldnames.h> +#include <block_commande.h> +#include <class_sch_screen.h> +#include <sch_collectors.h> + + +class LIB_EDIT_FRAME; +class LIB_VIEW_FRAME; +class DRAWSEGMENT; +class SCH_ITEM; +class SCH_NO_CONNECT; +class EDA_ITEM; +class SCH_BUS_ENTRY_BASE; +class SCH_BUS_WIRE_ENTRY; +class SCH_BUS_BUS_ENTRY; +class SCH_GLOBALLABEL; +class SCH_TEXT; +class SCH_BITMAP; +class SCH_SHEET; +class SCH_SHEET_PATH; +class SCH_SHEET_PIN; +class SCH_COMPONENT; +class SCH_FIELD; +class LIB_PIN; +class SCH_JUNCTION; +class DIALOG_SCH_FIND; +class wxFindDialogEvent; +class wxFindReplaceData; +class SCHLIB_FILTER; + + +/// enum used in RotationMiroir() +enum COMPONENT_ORIENTATION_T { + CMP_NORMAL, // Normal orientation, no rotation or mirror + CMP_ROTATE_CLOCKWISE, // Rotate -90 + CMP_ROTATE_COUNTERCLOCKWISE, // Rotate +90 + CMP_ORIENT_0, // No rotation and no mirror id CMP_NORMAL + CMP_ORIENT_90, // Rotate 90, no mirror + CMP_ORIENT_180, // Rotate 180, no mirror + CMP_ORIENT_270, // Rotate -90, no mirror + CMP_MIRROR_X = 0x100, // Mirror around X axis + CMP_MIRROR_Y = 0x200 // Mirror around Y axis +}; + + +/** Schematic annotation order options. */ +enum ANNOTATE_ORDER_T { + SORT_BY_X_POSITION, ///< Annotate by X position from left to right. + SORT_BY_Y_POSITION, ///< Annotate by Y position from top to bottom. + UNSORTED, ///< Annotate by position of component in the schematic sheet + ///< object list. +}; + + +/** Schematic annotation type options. */ +enum ANNOTATE_OPTION_T { + INCREMENTAL_BY_REF, ///< Annotate incrementally using the first free reference number. + SHEET_NUMBER_X_100, ///< Annotate using the first free reference number starting at + ///< the sheet number * 100. + SHEET_NUMBER_X_1000, ///< Annotate using the first free reference number starting at + ///< the sheet number * 1000. +}; + + +/// Schematic search type used by the socket link with Pcbnew +enum SCH_SEARCH_T { + FIND_COMPONENT_ONLY, ///< Find a component in the schematic. + FIND_PIN, ///< Find a component pin in the schematic. + FIND_REFERENCE, ///< Find an item by it's reference designator. + FIND_VALUE, ///< Find an item by it's value field. + FIND_FIELD ///< Find a component field. +}; + + +#define SCH_EDIT_FRAME_NAME wxT( "SchematicFrame" ) + +/** + * Schematic editor (Eeschema) main window. + */ +class SCH_EDIT_FRAME : public SCH_BASE_FRAME +{ +private: + SCH_SHEET_PATH* m_CurrentSheet; ///< which sheet we are presently working on. + wxString m_DefaultSchematicFileName; + + PARAM_CFG_ARRAY m_projectFileParams; + PARAM_CFG_ARRAY m_configSettings; + wxPageSetupDialogData m_pageSetupData; + wxFindReplaceData* m_findReplaceData; + wxPoint m_previewPosition; + wxSize m_previewSize; + wxPoint m_printDialogPosition; + wxSize m_printDialogSize; + bool m_printMonochrome; ///< Print monochrome instead of grey scale. + bool m_printSheetReference; + DIALOG_SCH_FIND* m_dlgFindReplace; + wxPoint m_findDialogPosition; + wxSize m_findDialogSize; + wxArrayString m_findStringHistoryList; + wxArrayString m_replaceStringHistoryList; + BLOCK_SELECTOR m_blockItems; ///< List of selected items. + SCH_ITEM* m_item_to_repeat; ///< Last item to insert by the repeat command. + int m_repeatLabelDelta; ///< Repeat label number increment step. + SCH_COLLECTOR m_collectedItems; ///< List of collected items. + SCH_FIND_COLLECTOR m_foundItems; ///< List of find/replace items. + SCH_ITEM* m_undoItem; ///< Copy of the current item being edited. + wxString m_simulatorCommand; ///< Command line used to call the circuit + ///< simulator (gnucap, spice, ...) + wxString m_netListerCommand; ///< Command line to call a custom net list + ///< generator. + + bool m_forceHVLines; ///< force H or V directions for wires, bus, line + + /// An index to the last find item in the found items list #m_foundItems. + int m_foundItemIndex; + + /// Flag to indicate show hidden pins. + bool m_showAllPins; + + /// The name of the destination directory to use when generating plot files. + wxString m_plotDirectoryName; + + /// The name of the format to use when generating a net list. + wxString m_netListFormat; + + /// Add X prefix to component references when generating spice net lists. + bool m_spiceNetlistAddReferencePrefix; + + /// Use netcodes (net number) as net names when generating spice net lists. + bool m_spiceNetlistUseNetcodeAsNetname; + + /* these are PROJECT specific, not schematic editor specific + wxString m_userLibraryPath; + wxArrayString m_componentLibFiles; + */ + + static int m_lastSheetPinType; ///< Last sheet pin type. + static wxSize m_lastSheetPinTextSize; ///< Last sheet pin text size. + static wxPoint m_lastSheetPinPosition; ///< Last sheet pin position. + +protected: + TEMPLATES m_TemplateFieldNames; + + /** + * Initializing accessor for the pin text size + */ + const wxSize &GetLastSheetPinTextSize(); + + /** + * Function doAutoSave + * saves the schematic files that have been modified and not yet saved. + * + * @return true if the auto save was successful otherwise false. + */ + virtual bool doAutoSave(); + + /** + * Function autoSaveRequired + * returns true if the schematic has been modified. + */ + virtual bool isAutoSaveRequired() const; + + /** + * Function addCurrentItemToList + * adds the item currently being edited to the schematic and adds the changes to + * the undo/redo container. + * + * @param aRedraw = true (default) to redrw -the screen after adding the item. + */ + void addCurrentItemToList( bool aRedraw = true ); + + void updateFindReplaceView( wxFindDialogEvent& aEvent ); + + void backAnnotateFootprints( const std::string& aChangedSetOfReferences ) + throw( IO_ERROR, boost::bad_pointer ); + + /** + * Function prepareForNetlist + * verifies that annotation is complete so that a proper netlist is even + * possible. If not, asks the user if annotation should be done. + * @return bool - true if annotation is complete, else false. + */ + bool prepareForNetlist(); + + /** + * Function sendNetlist + * sends the kicad netlist over to CVPCB. + */ + void sendNetlist(); + +public: + SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ); + ~SCH_EDIT_FRAME(); + + SCH_SCREEN* GetScreen() const; // overload SCH_BASE_FRAME + + void OnCloseWindow( wxCloseEvent& Event ); + + bool GetForceHVLines() const { return m_forceHVLines; } + void SetForceHVLines( bool aForceHVdirection ) { m_forceHVLines = aForceHVdirection; } + + bool GetShowAllPins() const { return m_showAllPins; } + + void SetShowAllPins( bool aEnable ) { m_showAllPins = aEnable; } + + const wxString GetNetListFormatName() const { return m_netListFormat; } + + void SetNetListFormatName( const wxString& aFormat ) { m_netListFormat = aFormat; } + + bool GetSpiceAddReferencePrefix() const { return m_spiceNetlistAddReferencePrefix; } + + void SetSpiceAddReferencePrefix( bool aEnable ) { m_spiceNetlistAddReferencePrefix = aEnable; } + + bool GetSpiceUseNetcodeAsNetname() const { return m_spiceNetlistUseNetcodeAsNetname; } + + void SetSpiceUseNetcodeAsNetname( bool aEnable ) { m_spiceNetlistUseNetcodeAsNetname = aEnable; } + + /* These are PROJECT specific, not schematic editor specific + wxString GetUserLibraryPath() const { return m_userLibraryPath; } + void SetUserLibraryPath( const wxString& aPath ) { m_userLibraryPath = aPath; } + const wxArrayString& GetComponentLibraries() const { return m_componentLibFiles; } + void SetComponentLibraries( const wxArrayString& aList ) { m_componentLibFiles = aList; } + */ + + /// accessor to the destination directory to use when generating plot files. + const wxString& GetPlotDirectoryName() const { return m_plotDirectoryName; } + void SetPlotDirectoryName( const wxString& aDirName ) { m_plotDirectoryName = aDirName; } + + void Process_Special_Functions( wxCommandEvent& event ); + void OnColorConfig( wxCommandEvent& aEvent ); + void Process_Config( wxCommandEvent& event ); + void OnSelectTool( wxCommandEvent& aEvent ); + + bool GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey = 0 ); + + /** + * Function GetProjectFileParametersList + * returns the project file parameter list for Eeschema. + * + *<p> + * Populate the project file parameter array specific to Eeschema if it hasn't + * already been populated and return a reference to the array to the caller. + * </p> + */ + PARAM_CFG_ARRAY& GetProjectFileParametersList(); + + /** + * 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 ); + + /** + * Function LoadProjectFile + * loads the KiCad project file (*.pro) settings specific to Eeschema. + * + * @return True if the project file was loaded correctly. + */ + bool LoadProjectFile(); + + /** + * Function GetDefaultFieldName + * returns a default symbol field name for field \a aFieldNdx for all components. + * These field names are not modifiable, but template field names are. + * @param aFieldNdx The field number index + */ + static wxString GetDefaultFieldName( int aFieldNdx ); + + /** + * Function AddTemplateFieldName + * inserts or appends a wanted symbol field name into the field names + * template. Should be used for any symbol property editor. If the name + * already exists, it overwrites the same name. + * + * @param aFieldName is a full description of the wanted field, and it must not match + * any of the default field names. + * @return int - the index within the config container at which aFieldName was + * added, or -1 if the name is illegal because it matches a default field name. + */ + int AddTemplateFieldName( const TEMPLATE_FIELDNAME& aFieldName ) + { + return m_TemplateFieldNames.AddTemplateFieldName( aFieldName ); + } + + + /** + * Function GetTemplateFieldName + * returns a template field names list for read only access. + */ + const TEMPLATE_FIELDNAMES& GetTemplateFieldNames() + { + return m_TemplateFieldNames.GetTemplateFieldNames(); + } + + + /** + * Function GetTemplates + * returns the field names template for read only access. + */ + const TEMPLATES& GetTemplates() + { + return m_TemplateFieldNames; + } + + /** + * Function DeleteAllTemplateFieldNames + * removes all template field names. + */ + void DeleteAllTemplateFieldNames() + { + m_TemplateFieldNames.DeleteAllTemplateFieldNames(); + } + + /** + * Function GetConfigurationSettings + * returns the Eeschema applications settings. + * <p> + * This replaces the old statically define 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 + * scattered throughout the Eeschema source code. If you need to define a configuration + * setting that need to be loaded at run time, this is the place to define it. + * </p> + */ + PARAM_CFG_ARRAY& GetConfigurationSettings(); + + void LoadSettings( wxConfigBase* aCfg ); + void SaveSettings( wxConfigBase* aCfg ); + + void RedrawActiveWindow( wxDC* DC, bool EraseBg ); + + void CreateScreens(); + void ReCreateHToolbar(); + void ReCreateVToolbar(); + void ReCreateOptToolbar(); + void ReCreateMenuBar(); + + ///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription() + EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const; + + bool OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem = NULL ); + + /** + * Function OnModify + * Must be called after a schematic change + * in order to set the "modify" flag of the current screen + * and update the date in frame reference + */ + void OnModify(); + + virtual wxString GetScreenDesc() const; + + void InstallConfigFrame( wxCommandEvent& event ); + + /** + * Execute a remote command send by Pcbnew via a socket, + * port KICAD_SCH_PORT_SERVICE_NUMBER (currently 4243) + * 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 ); // override virtual from KIWAY_PLAYER + + void OnLeftClick( wxDC* aDC, const wxPoint& aPosition ); + void OnLeftDClick( wxDC* aDC, const wxPoint& aPosition ); + bool OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu ); + void OnSelectOptionToolbar( wxCommandEvent& event ); + double BestZoom(); + + /** + * Function LocateAndShowItem + * checks the schematic at \a aPosition in logical (drawing) units for a item + * matching the types in \a aFilterList. + * <p> + * The search is first performed at the nearest grid position to \a aPosition. If no + * item if found on grid, then \a aPosition is tested for any items. If the item found + * can be cross probed, a message is send to Pcbnew and the selected item is highlighted + * in PCB editor. + * </p> + * @param aPosition The wxPoint on the schematic to search. + * @param aFilterList A list of #KICAD_T types to to filter. + * @param aHotKeyCommandId A hot key command ID for performing additional tests when + * multiple items are found at \a aPosition. + * @return A SCH_ITEM pointer of the item found or NULL if no item found + */ + SCH_ITEM* LocateAndShowItem( const wxPoint& aPosition, + const KICAD_T aFilterList[] = SCH_COLLECTOR::AllItems, + int aHotKeyCommandId = 0 ); + + /** + * Function LocateItem + * checks for items at \a aPosition matching the types in \a aFilterList. + * <p> + * If multiple items are located at \a aPosition, a context menu is displayed to clarify + * which item the user intended to select. If the user aborts the context menu, NULL is + * returned and the abort request flag will be set to true. Make sure to clear this flag + * before attempting to display any other context menus. + * </p> + * + * @param aPosition The wxPoint location where to search. + * @param aFilterList A list of #KICAD_T types to to filter. + * @param aHotKeyCommandId A hot key command ID for performing additional tests when + * multiple items are found at \a aPosition. + * @return The SCH_ITEM pointer of the item found or NULL if no item found. + */ + SCH_ITEM* LocateItem( const wxPoint& aPosition, + const KICAD_T aFilterList[] = SCH_COLLECTOR::AllItems, + int aHotKeyCommandId = 0 ); + + /** + * Function DeleteItemAtCrossHair + * delete the item found under the cross hair. If multiple items are found at the + * cross hair position, a context menu is displayed to clarify which item to delete. + * See LocateItem() for more information on locating multiple items. + * + * @param aDC The device context to update if and item is deleted. + * @return True if an item was deleted. + */ + bool DeleteItemAtCrossHair( wxDC* aDC ); + + /** + * Function FindComponentAndItem + * finds a component in the schematic and an item in this component. + * @param aReference The component reference designator to find. + * @param aSearchHierarchy If false, search the current sheet only. Otherwise, + * the entire hierarchy + * @param aSearchType A #SCH_SEARCH_T value used to determine what to search for. + * @param aSearchText The text to search for, either in value, reference or elsewhere. + * @param aWarpMouse If true, then move the mouse cursor to the item. + */ + SCH_ITEM* FindComponentAndItem( const wxString& aReference, + bool aSearchHierarchy, + SCH_SEARCH_T aSearchType, + const wxString& aSearchText, + bool aWarpMouse ); + + /** + * Function SendMessageToPcbnew + * send a remote to Pcbnew via a socket connection. + * @param objectToSync Item to be located on board (footprint, pad or text) + * @param LibItem Component in library if objectToSync is a sub item of a component + * <p> + * Commands are + * $PART: reference put cursor on footprint anchor + * $PIN: number $PART: reference put cursor on the footprint pad + * </p> + */ + void SendMessageToPCBNEW( EDA_ITEM* objectToSync, SCH_COMPONENT* LibItem ); + + /** + * BuildNetListBase + * netlist generation: + * Creates a flat list which stores all connected objects, and mainly + * pins and labels. + * @return NETLIST_OBJECT_LIST* - caller owns the object. + */ + NETLIST_OBJECT_LIST* BuildNetListBase(); + + /** + * Function CreateNetlist + * <ul> + * <li> test for some issues (missing or duplicate references and sheet names) + * <li> build netlist info + * <li> create the netlist file (different formats) + * </ul> + * @param aFormat = netlist format (NET_TYPE_PCBNEW ...) + * @param aFullFileName = full netlist file name + * @param aNetlistOptions = netlist options using OR'ed bits. + * <p> + * For SPICE netlist only: + * if NET_USE_NETNAMES is set, use net names from labels in schematic + * else use net numbers (net codes) + * if NET_USE_X_PREFIX is set : change "U" and "IC" refernce prefix to "X" + * </p> + * @param aReporter = a REPORTER to report error messages, + * mainly if a command line must be run (can be NULL + * @return true if success. + */ + bool CreateNetlist( int aFormat, + const wxString& aFullFileName, + unsigned aNetlistOptions, + REPORTER* aReporter = NULL ); + + /** + * Function WriteNetListFile + * Create the netlist file. Netlist info must be existing + * (BuildNetListBase() creates this info) + * @param aConnectedItemsList = the initialized list of connected items, take ownership. + * @param aFormat = netlist format (NET_TYPE_PCBNEW ...) + * @param aFullFileName = full netlist file name + * @param aNetlistOptions = netlist options using OR'ed bits. + * <p> + * For SPICE netlist only: + * if NET_USE_NETNAMES is set, use net names from labels in schematic + * else use net numbers (net codes) + * if NET_USE_X_PREFIX is set : change "U" and "IC" refernce prefix to "X" + * </p> + * @param aReporter = a REPORTER to report error messages, + * mainly if a command line must be run (can be NULL + * @return true if success. + */ + bool WriteNetListFile( NETLIST_OBJECT_LIST* aConnectedItemsList, + int aFormat, + const wxString& aFullFileName, + unsigned aNetlistOptions, + REPORTER* aReporter = NULL ); + + /** + * Function DeleteAnnotation + * clears the current component annotation. + * @param aCurrentSheetOnly Clear only the annotation for the current sheet if true. + * Otherwise clear the entire schematic annotation. + */ + void DeleteAnnotation( bool aCurrentSheetOnly ); + + /** + * Function AnnotateComponents + * + * annotates the components in the schematic that are not currently annotated. + * + * @param aAnnotateSchematic Annotate the entire schematic if true. Otherwise annotate + * the current sheet only. + * @param aSortOption Define the annotation order. See #ANNOTATE_ORDER_T. + * @param aAlgoOption Define the annotation style. See #ANNOTATE_OPTION_T. + * @param aResetAnnotation Clear any previous annotation if true. Otherwise, keep the + * existing component annotation. + * @param aRepairTimestamps Test for and repair any duplicate time stamps if true. + * Otherwise, keep the existing time stamps. This option + * could change previous annotation because time stamps are + * used to handle annotation in complex hierarchies. + * @param aLockUnits When both aLockUnits and aResetAnnotation are true, all unit + * associations should be kept when reannotating. That is, if + * two components were R8A and R8B, they may become R3A and R3B, + * but not R3A and R3C or R3C and R4D. + * When aResetAnnotation is true but aLockUnits is false, the + * usual behavior of annotating each part individually is + * performed. + * When aResetAnnotation is false, this option has no effect. + * + * When the sheet number is used in annotation, each sheet annotation starts from sheet + * number * 100. In other words the first sheet uses 100 to 199, the second sheet uses + * 200 to 299, and so on. + */ + void AnnotateComponents( bool aAnnotateSchematic, ANNOTATE_ORDER_T aSortOption, + ANNOTATE_OPTION_T aAlgoOption, bool aResetAnnotation, + bool aRepairTimestamps, bool aLockUnits ); + + /** + * Function CheckAnnotate + * checks for annotation errors. + * + * <p> + * The following list of items are checked: + * <ul> + * <li> Components that are not annotated. + * <li> Duplicate component references. + * <li> Multiple part per package components where the part\n + * number is greater number of parts in the package. + * <li> Multiple part per package components where the reference\n + * designator is different between parts. + * </ul> + * </p> + * + * @return Number of annotation errors found. + * @param aMessageList A wxArrayString to store error messages. + * @param aOneSheetOnly Check the current sheet only if true. Otherwise check + * the entire schematic. + */ + int CheckAnnotate( wxArrayString* aMessageList, bool aOneSheetOnly ); + + // Functions used for hierarchy handling + SCH_SHEET_PATH& GetCurrentSheet(); + + void SetCurrentSheet( const SCH_SHEET_PATH& aSheet ); + + /** + * Function DisplayCurrentSheet + * draws the current sheet on the display. + */ + void DisplayCurrentSheet(); + + /** + * Function GetUniqueFilenameForCurrentSheet + * @return a filename that can be used in plot and print functions + * for the current screen and sheet path. + * This filename is unique and must be used instead of the screen filename + * (or screen filename) when one must creates file for each sheet in the + * hierarchy. because in complex hierarchies a sheet and a SCH_SCREEN is + * used more than once + * Name is <root sheet filename>-<sheet path> and has no extension. + * However if filename is too long name is <sheet filename>-<sheet number> + */ + wxString GetUniqueFilenameForCurrentSheet(); + + /** + * Function SetSheetNumberAndCount + * Set the m_ScreenNumber and m_NumberOfScreens members for screens + * must be called after a delete or add sheet command, and when entering + * a sheet + */ + void SetSheetNumberAndCount(); + + /** + * Show the print dialog + */ + void OnPrint( wxCommandEvent& event ); + + wxPageSetupDialogData& GetPageSetupData() { return m_pageSetupData; } + + void SetPreviewPosition( const wxPoint& aPoint ) { m_previewPosition = aPoint; } + void SetPreviewSize( const wxSize& aSize ) { m_previewSize = aSize; } + const wxPoint& GetPreviewPosition() { return m_previewPosition; } + const wxSize& GetPreviewSize() { return m_previewSize; } + + void SetPrintDialogPosition( const wxPoint& aPoint ) + { + m_printDialogPosition = aPoint; + } + + + void SetPrintDialogSize( const wxSize& aSize ) { m_printDialogSize = aSize; } + const wxPoint& GetPrintDialogPosition() { return m_printDialogPosition; } + const wxSize& GetPrintDialogSize() { return m_printDialogSize; } + + bool GetPrintMonochrome() { return m_printMonochrome; } + void SetPrintMonochrome( bool aMonochrome ) { m_printMonochrome = aMonochrome; } + bool GetPrintSheetReference() { return m_printSheetReference; } + void SetPrintSheetReference( bool aShow ) { m_printSheetReference = aShow; } + + // Plot functions: +// void ToPostProcess( wxCommandEvent& event ); + void PlotSchematic( wxCommandEvent& event ); + + // read and save files + void Save_File( wxCommandEvent& event ); + + /** + * Function OnSaveProject + * is the command event handler to save the entire project and create a component library + * archive. + * + * The component library archive name is <root_name>-cache.lib + */ + void OnSaveProject( wxCommandEvent& aEvent ); + + bool OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl = 0 ); // virtual from KIWAY_PLAYER + + /** + * Function AppendOneEEProject + * read an entire project and loads it into the schematic editor *without* + * replacing the existing contents. + * @return True if the project was imported properly. + */ + bool AppendOneEEProject(); + + /** + * Function LoadOneEEFile + * loads the schematic (.sch) file \a aFullFileName into \a aScreen. + * + * @param aScreen Pointer to the associated SCH_SCREEN object in which to load + * \a aFullFileName. + * @param aFullFileName A reference to a wxString object containing the absolute path + * and file name to load. + * @param append True if loaded file is being appended to the currently open file instead + * of replacing it. + * @return True if \a aFullFileName has been loaded (at least partially.) + */ + bool LoadOneEEFile( SCH_SCREEN* aScreen, const wxString& aFullFileName, bool append = false ); + + /** + * Function ReadCmpToFootprintLinkFile + * Loads a .cmp file from CvPcb and update the footprin field + * of components + * Prepares parameters and calls ProcessCmpToFootprintLinkFile + * to actually read the file and update Fp fields + */ + bool LoadCmpToFootprintLinkFile(); + + /** + * Function ProcessStuffFile + * gets footprint info from each line in the Stuff File by Ref Desg + * + * Read a Cmp To Footprint Link file created by CvPcb (the .cmp file). + * That file has lines like: + * BeginCmp + * TimeStamp = /32307DE2/AA450F67; + * Reference = C1; + * ValeurCmp = 47uF; + * IdModule = CP6; + * EndCmp + * + * @param aFullFilename = the full filename to read + * @param aForceVisibilityState = Set to true to change the footprint field visibility + * state to \a aVisibilityState. False retains the + * current footprint field visibility state. + * @param aVisibilityState True to show the footprint field or false to hide the footprint + * field if \a aForceVisibilityState is true. + * @return bool = true if success. + */ + bool ProcessCmpToFootprintLinkFile( const wxString& aFullFilename, + bool aForceVisibilityState, + bool aVisibilityState ); + + /** + * Function SaveEEFile + * saves \a aScreen to a schematic file. + * + * @param aScreen A pointer to the SCH_SCREEN object to save. A NULL pointer saves + * the current screen. + * @param aSaveUnderNewName Controls how the file is to be saved;: using previous name + * or under a new name . + * @param aCreateBackupFile Creates a back of the file associated with \a aScreen + * if true. + * Helper definitions #CREATE_BACKUP_FILE and + * #NO_BACKUP_FILE are defined for improved code readability. + * @return True if the file has been saved. + */ + bool SaveEEFile( SCH_SCREEN* aScreen, + bool aSaveUnderNewName = false, + bool aCreateBackupFile = CREATE_BACKUP_FILE ); + + // General search: + + bool IsSearchCacheObsolete( const SCH_FIND_REPLACE_DATA& aSearchCriteria ); + + +private: + + /** + * Function OnMoveItem + * handles the #ID_SCH_MOVE_ITEM event used to move schematic itams. + */ + void OnMoveItem( wxCommandEvent& aEvent ); + + /** + * Function OnRotate + * handles the #ID_SCH_ROTATE_CLOCKWISE and #ID_SCH_ROTATE_COUNTERCLOCKWISE events + * used to rotate schematic itams and blocks. + */ + void OnRotate( wxCommandEvent& aEvent ); + + /** + * Function OnEditItem + * handles the #ID_SCH_EDIT_ITEM event used to edit schematic itams. + */ + void OnEditItem( wxCommandEvent& aEvent ); + + /** + * Function OnDragItem + * handles the #ID_SCH_DRAG_ITEM event used to drag schematic itams. + */ + void OnDragItem( wxCommandEvent& aEvent ); + + /** + * Function OnOrient + * handles the #ID_SCH_MIRROR_X, #ID_SCH_MIRROR_Y, and #ID_SCH_ORIENT_NORMAL events + * used to orient schematic itams and blocks. + */ + void OnOrient( wxCommandEvent& aEvent ); + + void OnExit( wxCommandEvent& event ); + void OnAnnotate( wxCommandEvent& event ); + void OnErc( wxCommandEvent& event ); + void OnCreateNetlist( wxCommandEvent& event ); + void OnCreateBillOfMaterials( wxCommandEvent& event ); + void OnFindItems( wxCommandEvent& event ); + void OnFindDialogClose( wxFindDialogEvent& event ); + void OnFindDrcMarker( wxFindDialogEvent& event ); + void OnFindCompnentInLib( wxFindDialogEvent& event ); + + /** + * Function OnFindSchematicItem + * finds an item in the schematic matching the search criteria in \a aEvent. + * + * @param aEvent - Find dialog event containing the find parameters. + */ + void OnFindSchematicItem( wxFindDialogEvent& aEvent ); + + /** + * Function OnReplace + * performs a search and replace of text in an item in the schematic matching the + * search and replace criteria in \a aEvent. + * + * @param aEvent - Find dialog event containing the search and replace parameters. + */ + void OnFindReplace( wxFindDialogEvent& aEvent ); + + void OnLoadFile( wxCommandEvent& event ); + void OnLoadCmpToFootprintLinkFile( wxCommandEvent& event ); + void OnNewProject( wxCommandEvent& event ); + void OnLoadProject( wxCommandEvent& event ); + void OnAppendProject( wxCommandEvent& event ); + void OnOpenPcbnew( wxCommandEvent& event ); + void OnOpenPcbModuleEditor( wxCommandEvent& event ); + void OnOpenCvpcb( wxCommandEvent& event ); + void OnOpenLibraryEditor( wxCommandEvent& event ); + void OnRescueProject( wxCommandEvent& event ); + void OnPreferencesOptions( wxCommandEvent& event ); + void OnCancelCurrentCommand( wxCommandEvent& aEvent ); + + void OnSelectItem( wxCommandEvent& aEvent ); + + /** + * Function OnCopySchematicItemRequest + * is the command event handler for duplicating the item at the current location. + */ + void OnCopySchematicItemRequest( wxCommandEvent& event ); + + /* User interface update event handlers. */ + void OnUpdateBlockSelected( wxUpdateUIEvent& event ); + void OnUpdatePaste( wxUpdateUIEvent& event ); + void OnUpdateHiddenPins( wxUpdateUIEvent& event ); + void OnUpdateBusOrientation( wxUpdateUIEvent& event ); + void OnUpdateSelectTool( wxUpdateUIEvent& aEvent ); + void OnUpdateSave( wxUpdateUIEvent& aEvent ); + void OnUpdateSaveSheet( wxUpdateUIEvent& aEvent ); + void OnUpdateHierarchySheet( wxUpdateUIEvent& aEvent ); + + /** + * Function UpdateTitle + * sets the main window title bar text. + * <p> + * If file name defined by SCH_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 hierarchical sheet path and the full file name, + * and read only is appended to the title if the user does not have write + * access to the file. + * </p> + */ + void UpdateTitle(); + + // Bus Entry + SCH_BUS_WIRE_ENTRY* CreateBusWireEntry(); + SCH_BUS_BUS_ENTRY* CreateBusBusEntry(); + void SetBusEntryShape( wxDC* DC, SCH_BUS_ENTRY_BASE* BusEntry, char entry_shape ); + + /** + * Function AddNoConnect + * add a no connect item to the current schematic sheet at \a aPosition. + * @param aDC The device context to draw the no connect to. + * @param aPosition The position in logical (drawing) units to add the no connect. + * @return The no connect item added. + */ + SCH_NO_CONNECT* AddNoConnect( wxDC* aDC, const wxPoint& aPosition ); + + /** + * Function AddJunction + * adds a new junction at \a aPosition. + */ + SCH_JUNCTION* AddJunction( wxDC* aDC, const wxPoint& aPosition, bool aPutInUndoList = false ); + + /** + * Function PrepareMoveItem + * start moving \a aItem using the mouse. + * + * @param aItem A pointer to an SCH_ITEM to move. + * @param aDC The device context to draw \a aItem. + */ + void PrepareMoveItem( SCH_ITEM* aItem, wxDC* aDC ); + + // Text, label, glabel + SCH_TEXT* CreateNewText( wxDC* aDC, int aType ); + void EditSchematicText( SCH_TEXT* TextStruct ); + void ChangeTextOrient( SCH_TEXT* aTextItem, wxDC* aDC ); + + /** + * Function OnCovertTextType + * is a command event handler to change a text type to an other one. The new text, + * label, hierarchical label, or global label is created from the old text and the + * old text is deleted. + */ + void OnConvertTextType( wxCommandEvent& aEvent ); + + /** + * Function BeginSegment + * creates a new segment ( WIRE, BUS ) or terminates the current segment in progress. + * + * If the end of the current segment is on an other segment, place a junction if needed + * and terminates the command. If the end of the current segment is on a pin, terminate + * the command. In all other cases starts a new segment. + */ + void BeginSegment( wxDC* DC, int type ); + + /** + * Function EndSegment + * called to terminate a bus, wire, or line creation + */ + void EndSegment( wxDC* DC ); + + /** + * Function DeleteCurrentSegment + * erases the last segment at the current mouse position. + */ + void DeleteCurrentSegment( wxDC* DC ); + void DeleteConnection( bool DeleteFullConnection ); + + // graphic lines + void Edge( DRAWSEGMENT* Segment, wxDC* DC ); + void SetNewWidth( DRAWSEGMENT* DrawSegm, wxDC* DC ); + void Layer( DRAWSEGMENT* Segment, wxDC* DC ); + DRAWSEGMENT* Begin_Edge( DRAWSEGMENT* Segment, wxDC* DC ); + + // Images: + SCH_BITMAP* CreateNewImage( wxDC* aDC ); + void MoveImage( SCH_BITMAP* aItem, wxDC* aDC ); + void RotateImage( SCH_BITMAP* aItem ); + /** + * Function MirrorImage + * Mirror a bitmap + * @param aItem = the SCH_BITMAP item to mirror + * @param Is_X_axis = true to mirror relative to Horizontal axis + * false to mirror relative to vertical axis + */ + void MirrorImage( SCH_BITMAP* aItem, bool Is_X_axis ); + void EditImage( SCH_BITMAP* aItem ); + + // Hierarchical Sheet & PinSheet + void InstallHierarchyFrame( wxPoint& pos ); + SCH_SHEET* CreateSheet( wxDC* DC ); + void ReSizeSheet( SCH_SHEET* Sheet, wxDC* DC ); + + /** + * Rotate a sheet on itself. Sheets do not have a anchor point. + * Because rotating it from its origin or its end is not friendly, + * Rotation is made around its centre + * @param aSheet the hierarchical sheet to rotate + * @param aRotCCW = true to rotate CCW, false to rotate CW + */ + void RotateHierarchicalSheet( SCH_SHEET* aSheet, bool aRotCCW ); + + /** + * Function MirrorSheet + * Mirror a hierarchical sheet + * Mirroring is made around its centre + * @param aSheet = the SCH_SHEET to mirror + * @param aFromXaxis = true to mirror relative to Horizontal axis + * false to mirror relative to vertical axis + */ + void MirrorSheet( SCH_SHEET* aSheet, bool aFromXaxis ); + + /// Loads the cache library associated to the aFileName + bool LoadCacheLibrary( const wxString& aFileName ); + +public: + /** + * Function EditSheet + * is used to edit an existing sheet or add a new sheet to the schematic. + * <p> + * When \a aSheet is a new sheet: + * <ul> + * <li>and the file name already exists in the schematic hierarchy, the screen associated + * with the sheet found in the hierarchy is associated with \a aSheet.</li> + * <li>and the file name already exists on the system, then \a aSheet is loaded with the + * existing file.</li> + * <li>and the file name does not exist in the schematic hierarchy or on the file system, + * then a new screen is created and associated with \a aSheet.</li> + * </ul> </p> <p> + * When \a aSheet is an existing sheet: + * <ul> + * <li>and the file name already exists in the schematic hierarchy, the current associated + * screen is replace by the one found in the hierarchy.</li> + * <li>and the file name already exists on the system, the current associated screen file + * name is changed and the file is loaded.</li> + * <li>and the file name does not exist in the schematic hierarchy or on the file system, + * the current associated screen file name is changed and saved to disk.</li> + * </ul> </p> + * + * Note: the screen is not refresh. The caller is responsible to do that + */ + bool EditSheet( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHierarchy ); + + wxPoint GetLastSheetPinPosition() const { return m_lastSheetPinPosition; } + +private: + /** + * Function CreateSheetPin + * creates a new SCH_SHEET_PIN object and add it to \a aSheet at the current cursor position. + * @param aSheet The sheet to add the new sheet pin to. + * @param aDC The device context to draw on. + * @return The new sheet pin object created or NULL if the task was aborted by the user. + */ + SCH_SHEET_PIN* CreateSheetPin( SCH_SHEET* aSheet, wxDC* aDC ); + + /** + * Function EditSheetPin + * displays the dialog for editing the parameters of \a aSheetPin. + * @param aSheetPin The sheet pin item to edit. + * @param aRedraw = true to refresh the screen + * @return The user response from the edit dialog. + */ + int EditSheetPin( SCH_SHEET_PIN* aSheetPin, bool aRedraw ); + + /** + * Function ImportSheetPin + * automatically creates a sheet pin from the hierarchical labels in the schematic + * referenced by \a aSheet. + * @param aSheet The sheet to import the new sheet pin to. + * @param aDC The device context to draw on. + * @return The new sheet pin object importd or NULL if the task was aborted by the user. + */ + SCH_SHEET_PIN* ImportSheetPin( SCH_SHEET* aSheet, wxDC* aDC ); + +public: + /** + * Function DeleteItem + * removes \a aItem from the current screen and saves it in the undo list. + * @param aItem The item to remove from the current screen. + */ + void DeleteItem( SCH_ITEM* aItem ); + + int GetLabelIncrement() const { return m_repeatLabelDelta; } + +private: + + /** + * Function Load_Component + * loads from a library and places a component. + * if libname != "", search in lib "libname" + * else search in all loaded libs + * + * @param aDC is the device context to draw upon. + * @param aFilters is a filter to pass the allowed lib names list, or library name + * to load the component from and/or some other filters + * if NULL, no filtering. + * @param aHistoryList list remembering recently used component names. + * @param aHistoryLastUnit remembering last unit in last component. + * @param aUseLibBrowser is the flag to determine if the library browser should be launched. + * @return a pointer the SCH_COMPONENT object selected or NULL if no component was selected. + * (TODO(hzeller): This really should be a class doing history, but didn't + * want to change too much while other refactoring is going on) + */ + SCH_COMPONENT* Load_Component( wxDC* aDC, + const SCHLIB_FILTER* aFilter, + wxArrayString& aHistoryList, + int& aHistoryLastUnit, + bool aUseLibBrowser ); + + /** + * Function EditComponent + * displays the edit component dialog to edit the parameters of \a aComponent. + * + * @param aComponent is a pointer to the SCH_COMPONENT object to be edited. + */ + void EditComponent( SCH_COMPONENT* aComponent ); + +public: + + /** + * Function OrientComponent + * rotates and mirrors a component. + */ + void OrientComponent( COMPONENT_ORIENTATION_T aOrientation = CMP_NORMAL ); + +private: + void OnSelectUnit( wxCommandEvent& aEvent ); + void ConvertPart( SCH_COMPONENT* DrawComponent, wxDC* DC ); + void SetInitCmp( SCH_COMPONENT* DrawComponent, wxDC* DC ); + + /** + * Function EditComponentFieldText + * displays the edit field dialog to edit the parameters of \a aField. + * + * @param aField is a pointer to the SCH_FIELD object to be edited. + */ + void EditComponentFieldText( SCH_FIELD* aField ); + + void RotateField( SCH_FIELD* aField, wxDC* aDC ); + + /** + * Function PastListOfItems + * pastes a list of items from the block stack. + */ + void PasteListOfItems( wxDC* DC ); + + /* Undo - redo */ +public: + + /** + * Function SaveCopyInUndoList. + * Create a copy of the current schematic item, and put it in the undo list. + * + * flag_type_command = + * UR_CHANGED + * UR_NEW + * UR_DELETED + * UR_WIRE_IMAGE + * UR_MOVED + * + * If it is a delete command, items are put on list with the .Flags member + * set to UR_DELETED. When it will be really deleted, the GetDrawItems() and the + * sub-hierarchy will be deleted. If it is only a copy, the GetDrawItems() and the + * sub-hierarchy must NOT be deleted. + * + * @note + * Edit wires and buses is a bit complex. + * because when a new wire is added, a lot of modifications in wire list is made + * (wire concatenation): modified items, deleted items and new items + * so flag_type_command is UR_WIRE_IMAGE: the struct ItemToCopy is a list of + * wires saved in Undo List (for Undo or Redo commands, saved wires will be + * exchanged with current wire list + * @param aItemToCopy = the schematic 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 + */ + void SaveCopyInUndoList( SCH_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 + */ + void SaveCopyInUndoList( const PICKED_ITEMS_LIST& aItemsList, + UNDO_REDO_T aTypeCommand, + const wxPoint& aTransformPoint = wxPoint( 0, 0 ) ); + +private: + + /** + * Function PutDataInPreviousState + * is used in undo or redo command to put data pointed by List in the previous state, i.e. + * the state stored in \a aList + * @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 + */ + void PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRedoCommand ); + + /** + * Function GetSchematicFromRedoList + * Redo the last edition: + * - Save the current schematic in Undo list + * - Get an old version of the schematic from Redo list + * @return none + */ + void GetSchematicFromRedoList( wxCommandEvent& event ); + + /** + * Function GetSchematicFromUndoList + * performs an undo the last edition: + * - Save the current schematic in Redo list + * - Get an old version of the schematic from Undo list + */ + void GetSchematicFromUndoList( wxCommandEvent& event ); + + /** + * Function copyBlockItems + * copies the list of block item. + * @sa m_blockItems + * @param aItemsList List to copy the block select items into. + */ + void copyBlockItems( PICKED_ITEMS_LIST& aItemsList ); + + /** + * Function addJunctionMenuEntries + * adds the context menu items to \a aMenu for \a aJunction. + * @param aMenu The menu to add the items to. + * @param aJunction The SCH_JUNCTION object selected. + */ + void addJunctionMenuEntries( wxMenu* aMenu, SCH_JUNCTION* aJunction ); + +public: + void Key( wxDC* DC, int hotkey, EDA_ITEM* DrawStruct ); + + /** + * Function InitBlockPasteInfos + * initializes the parameters used by the block paste command. + */ + void InitBlockPasteInfos(); + + /** + * 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 + * + * @param aDC is a device context to draw on. + * @return false if no item selected, or command finished, + * true if some items found and HandleBlockPlace must be called later + */ + virtual bool HandleBlockEnd( wxDC* aDC ); + + /** + * Function RepeatDrawItem + * repeats the last item placement if the last item was a bus, bus entry, + * label, or component. + * + * Labels that end with a number will be incremented. + */ + void RepeatDrawItem( wxDC* DC ); + + /** + * Function SetRepeatItem + * clones aItem and owns that clone in this container. + */ + void SetRepeatItem( SCH_ITEM* aItem ); + + /** + * Function GetRepeatItem + * returns the item which is to be repeated with the insert key. Such object + * is owned by this container, and must be cloned. + */ + SCH_ITEM* GetRepeatItem() const { return m_item_to_repeat; } + + /** + * Function SetUndoItem + * clones \a aItem which can be used to restore the state of the item being edited + * when the user cancels the editing in progress. + * + * @param aItem The item to make a clone of for undoing the last change. Set to + * NULL to free the current undo item. + */ + void SetUndoItem( const SCH_ITEM* aItem ); + + SCH_ITEM* GetUndoItem() const { return m_undoItem; } + + /** + * Function SaveUndoItemInUndoList + * swaps the cloned item in member variable m_undoItem with \a aItem and saves it to + * the undo list then swap the data back. This swaps the internal structure of the + * item with the cloned item. It does not swap the actual item pointers themselves. + * + * @param aItem The item to swap with the current undo item. + */ + void SaveUndoItemInUndoList( SCH_ITEM* aItem ); + + /** + * Function CreateArchiveLibraryCacheFile + * creates a library file with the name of the root document plus the '-cache' suffix, + * That file will contain all components used in the current schematic. + * + * @param aUseCurrentSheetFilename = false to use the root shhet filename + * (default) or true to use the currently opened sheet. + * @return true if the file was written successfully. + */ + bool CreateArchiveLibraryCacheFile( bool aUseCurrentSheetFilename = false ); + + /** + * Function CreateArchiveLibrary + * creates a library \a aFileName that contains all components used in the current schematic. + * + * @param aFileName The full path and file name of the archive library. + * @return True if \a aFileName was written successfully. + */ + bool CreateArchiveLibrary( const wxString& aFileName ); + + /** + * Function RescueProject + * performs rescue operations to recover old projects from before certain + * changes were made. + * + * - Exports cached symbols that conflict with new symbols to a separate + * library + * - Renames symbols named before libraries were case sensitive + * + * @param aRunningOnDemand - indicates whether the tool has been called up by the user + * (as opposed to being run automatically). If true, an information dialog is + * displayed if there are no components to rescue. If false, the tool is silent + * if there are no components to rescue, and a "Never Show Again" button is + * displayed. + */ + bool RescueProject( bool aRunningOnDemand ); + + /** + * Function PrintPage + * plots or prints the current sheet to the clipboard. + * @param aDC = wxDC given by the calling print function + * @param aPrintMask = not used here + * @param aPrintMirrorMode = not used here (Set when printing in mirror mode) + * @param aData = a pointer on an auxiliary data (not always used, NULL if not used) + */ + virtual void PrintPage( wxDC* aDC, LSET aPrintMask, + bool aPrintMirrorMode, void* aData = NULL ); + + void SetSimulatorCommand( const wxString& aCommand ) { m_simulatorCommand = aCommand; } + + wxString GetSimulatorCommand() const { return m_simulatorCommand; } + + void SetNetListerCommand( const wxString& aCommand ) { m_netListerCommand = aCommand; } + + wxString GetNetListerCommand() const { return m_netListerCommand; } + + DECLARE_EVENT_TABLE() +}; + + +#endif // WX_EESCHEMA_STRUCT_H |