From baa0d7920a5d09bc5b5e3d99f70e93e31d8aa33c Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Tue, 7 Jun 2011 11:29:01 -0400 Subject: [PATCH] EESchema bug fixes and other minor changes (fixes lp:793373). * Fix debug build warning (lp:793373). * Changed sheet edit restore and undo to use object copy and replace method. * Add minimum width and height constraints when resizing sheets that have hierarchical pins. * Fix drag sheet hot key bug. * Change Doxygen configuration to extract private methods and members when creating documentation. * Fix a bunch of Doxygen comment warnings. --- Doxyfile | 2 +- common/base_struct.cpp | 28 ++-- common/common_plotGERBER_functions.cpp | 6 +- common/dsnlexer.cpp | 4 +- eeschema/dialogs/dialog_build_BOM.h | 2 +- .../dialog_edit_libentry_fields_in_lib.cpp | 1 - eeschema/hotkeys.cpp | 1 + eeschema/netform.cpp | 21 +-- eeschema/sch_collectors.cpp | 1 + eeschema/sch_sheet.cpp | 83 +++++++++-- eeschema/sch_sheet.h | 54 ++++++- eeschema/sch_sheet_pin.cpp | 19 ++- eeschema/sch_text.cpp | 2 +- eeschema/sheet.cpp | 141 ++++++++---------- include/dsnlexer.h | 6 +- include/wxEeschemaStruct.h | 31 +++- pcbnew/drc_stuff.h | 12 +- pcbnew/netlist.cpp | 2 +- pcbnew/specctra.h | 7 +- polygon/PolyLine.h | 2 +- polygon/math_for_graphics.cpp | 3 +- 21 files changed, 281 insertions(+), 147 deletions(-) diff --git a/Doxyfile b/Doxyfile index 959df7bd17..21e9ca8052 100644 --- a/Doxyfile +++ b/Doxyfile @@ -35,7 +35,7 @@ SUBGROUPING = YES # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES -EXTRACT_PRIVATE = NO +EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO diff --git a/common/base_struct.cpp b/common/base_struct.cpp index ee04f8c214..3be126e74a 100644 --- a/common/base_struct.cpp +++ b/common/base_struct.cpp @@ -1,8 +1,8 @@ -/****************************************/ -/* Basic classes for Kicad: */ -/* EDA_ITEM */ +/**********************************/ +/* Basic classes for Kicad: */ +/* EDA_ITEM */ /* EDA_TEXT */ -/****************************************/ +/**********************************/ #include "fctsys.h" #include "gr_basic.h" @@ -196,8 +196,8 @@ EDA_TEXT::EDA_TEXT( const wxString& text ) m_Orient = 0; // Rotation angle in 0.1 degrees. m_Attributs = 0; m_Mirror = false; // display mirror if true - m_HJustify = GR_TEXT_HJUSTIFY_CENTER; // Defualt horizontal justification is centered. - m_VJustify = GR_TEXT_VJUSTIFY_CENTER; // Defualt vertical justification is centered. + m_HJustify = GR_TEXT_HJUSTIFY_CENTER; // Default horizontal justification is centered. + m_VJustify = GR_TEXT_VJUSTIFY_CENTER; // Default vertical justification is centered. m_Thickness = 0; // thickness m_Italic = false; // true = italic shape. m_Bold = false; @@ -230,7 +230,7 @@ EDA_TEXT::~EDA_TEXT() int EDA_TEXT::LenSize( const wxString& aLine ) const { - return ReturnGraphicTextWidth(aLine, m_Size.x, m_Italic, m_Bold ) + m_Thickness; + return ReturnGraphicTextWidth( aLine, m_Size.x, m_Italic, m_Bold ) + m_Thickness; } @@ -356,8 +356,8 @@ bool EDA_TEXT::TextHitTest( const EDA_RECT& aRect, bool aContains, int aAccuracy void EDA_TEXT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, - EDA_Colors aColor, int aDrawMode, - GRTraceMode aFillMode, EDA_Colors aAnchor_color ) + EDA_Colors aColor, int aDrawMode, + GRTraceMode aFillMode, EDA_Colors aAnchor_color ) { if( m_MultilineAllowed ) { @@ -400,10 +400,10 @@ void EDA_TEXT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, void EDA_TEXT::DrawOneLineOfText( EDA_DRAW_PANEL* aPanel, wxDC* aDC, - const wxPoint& aOffset, EDA_Colors aColor, - int aDrawMode, GRTraceMode aFillMode, - EDA_Colors aAnchor_color, - wxString& aText, wxPoint aPos ) + const wxPoint& aOffset, EDA_Colors aColor, + int aDrawMode, GRTraceMode aFillMode, + EDA_Colors aAnchor_color, + wxString& aText, wxPoint aPos ) { int width = m_Thickness; @@ -443,6 +443,7 @@ void EDA_TEXT::DrawOneLineOfText( EDA_DRAW_PANEL* aPanel, wxDC* aDC, m_HJustify, m_VJustify, width, m_Italic, m_Bold ); } + wxString EDA_TEXT::GetTextStyleName() { int style = 0; @@ -510,6 +511,7 @@ bool EDA_RECT::Contains( const wxPoint& aPoint ) const return (rel_pos.x >= 0) && (rel_pos.y >= 0) && ( rel_pos.y <= size.y) && ( rel_pos.x <= size.x); } + /* * return true if aRect is inside me (or on boundaries) */ diff --git a/common/common_plotGERBER_functions.cpp b/common/common_plotGERBER_functions.cpp index 22112bfd37..b9958632d7 100644 --- a/common/common_plotGERBER_functions.cpp +++ b/common/common_plotGERBER_functions.cpp @@ -302,9 +302,9 @@ void GERBER_PLOTTER::circle( wxPoint aCentre, int aDiameter, FILL_T aFill, /* * Function PlotPoly * writes a filled or not filled polyline to output file - * param aCornerList = buffer of corners coordinates - * param aFill = plot option (NO_FILL, FILLED_SHAPE, FILLED_WITH_BG_BODYCOLOR) - * param aWidth = Width of the line to plot. + * @param aCornerList = buffer of corners coordinates + * @param aFill = plot option (NO_FILL, FILLED_SHAPE, FILLED_WITH_BG_BODYCOLOR) + * @param aWidth = Width of the line to plot. */ void GERBER_PLOTTER::PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth ) { diff --git a/common/dsnlexer.cpp b/common/dsnlexer.cpp index f775a3cc20..4e5a8b2749 100644 --- a/common/dsnlexer.cpp +++ b/common/dsnlexer.cpp @@ -366,8 +366,8 @@ int DSNLEXER::NeedNUMBER( const char* aExpectation ) throw( IO_ERROR ) /** - * Function isspace - * strips the upper bits of the int to ensure the value passed to ::isspace() is + * Function isSpace + * strips the upper bits of the int to ensure the value passed to C++ %isspace() is * in the range of 0-255 */ static inline bool isSpace( int cc ) diff --git a/eeschema/dialogs/dialog_build_BOM.h b/eeschema/dialogs/dialog_build_BOM.h index e6bf6e4372..abbc1d9619 100644 --- a/eeschema/dialogs/dialog_build_BOM.h +++ b/eeschema/dialogs/dialog_build_BOM.h @@ -41,7 +41,7 @@ private: * Function CreateParstList * prints a list of components, in a form which can be imported by a * spreadsheet. Form is: - * cmp value; number of components; ; ; ...; + * cmp value; number of components; \; \; ...; * list of references having the same value */ void CreatePartsList( const wxString& aFullFileName, bool aIncludeSubComponents ); diff --git a/eeschema/dialogs/dialog_edit_libentry_fields_in_lib.cpp b/eeschema/dialogs/dialog_edit_libentry_fields_in_lib.cpp index 48ff15aacf..cf7c2e5686 100644 --- a/eeschema/dialogs/dialog_edit_libentry_fields_in_lib.cpp +++ b/eeschema/dialogs/dialog_edit_libentry_fields_in_lib.cpp @@ -66,7 +66,6 @@ private: /** * Function InitBuffers * sets up to edit the given component. - * @param aComponent The component to edit. */ void InitBuffers(); diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index 04c07902a8..92e6280673 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -690,6 +690,7 @@ void SCH_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, case SCH_COMPONENT_T: case SCH_GLOBAL_LABEL_T: case SCH_HIERARCHICAL_LABEL_T: + case SCH_SHEET_T: cmd.SetId( HK_Descr->m_IdMenuEvent ); wxPostEvent( this, cmd ); break; diff --git a/eeschema/netform.cpp b/eeschema/netform.cpp index 04d2914cbc..f8f7201e35 100644 --- a/eeschema/netform.cpp +++ b/eeschema/netform.cpp @@ -168,8 +168,8 @@ class EXPORT_HELP * created by BuildNetList() in the table g_NetObjectslist. */ bool addPinToComponentPinList( SCH_COMPONENT* Component, - SCH_SHEET_PATH* sheet, - LIB_PIN* PinEntry ); + SCH_SHEET_PATH* sheet, + LIB_PIN* PinEntry ); /** * Function findAllInstancesOfComponent @@ -179,9 +179,9 @@ class EXPORT_HELP * matching reference designator, and for each part, add all its pins * to the temporary sorted pin list. */ - void findAllInstancesOfComponent( SCH_COMPONENT* aComponent, - LIB_COMPONENT* aEntry, - SCH_SHEET_PATH* aSheetPath ); + void findAllInstancesOfComponent( SCH_COMPONENT* aComponent, + LIB_COMPONENT* aEntry, + SCH_SHEET_PATH* aSheetPath ); /** * Function writeGENERICListOfNets @@ -192,12 +192,13 @@ class EXPORT_HELP /** * Function writeListOfNetsCADSTAR - * writes a net list (ranked by Netcode), and - * Pins connected to it + * writes a net list (ranked by Netcode), and pins connected to it. + *

* Format: - *. ADD_TER RR2 6 "$42" - *. B U1 100 - * 6 CA + * - ADD_TER RR2 6 \"$42\" + * - B U1 100 + * - 6 CA + *

*/ void writeListOfNetsCADSTAR( FILE* f, NETLIST_OBJECT_LIST& aObjectsList ); diff --git a/eeschema/sch_collectors.cpp b/eeschema/sch_collectors.cpp index 8e4ab512cb..f1a14a62fd 100644 --- a/eeschema/sch_collectors.cpp +++ b/eeschema/sch_collectors.cpp @@ -120,6 +120,7 @@ const KICAD_T SCH_COLLECTOR::RotatableItems[] = { SCH_HIERARCHICAL_LABEL_T, SCH_FIELD_T, SCH_COMPONENT_T, + SCH_SHEET_T, EOT }; diff --git a/eeschema/sch_sheet.cpp b/eeschema/sch_sheet.cpp index c56e7a017c..2b9f4e6936 100644 --- a/eeschema/sch_sheet.cpp +++ b/eeschema/sch_sheet.cpp @@ -33,6 +33,7 @@ SCH_SHEET::SCH_SHEET( const wxPoint& pos ) : { m_Layer = LAYER_SHEET; m_Pos = pos; + m_Size = wxSize( MIN_SHEET_WIDTH, MIN_SHEET_HEIGHT ); m_TimeStamp = GetTimeStamp(); m_SheetNameSize = m_FileNameSize = 60; m_AssociatedScreen = NULL; @@ -176,7 +177,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg ) { if( !aLine.ReadLine() ) { - aErrorMsg.Printf( wxT( "Read File Errror" ) ); + aErrorMsg.Printf( wxT( "Read File Error" ) ); return false; } } @@ -292,14 +293,20 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg ) } -void SCH_SHEET::SwapData( SCH_SHEET* copyitem ) +void SCH_SHEET::SwapData( SCH_ITEM* aItem ) { - EXCHG( m_Pos, copyitem->m_Pos ); - EXCHG( m_Size, copyitem->m_Size ); - EXCHG( m_SheetName, copyitem->m_SheetName ); - EXCHG( m_SheetNameSize, copyitem->m_SheetNameSize ); - EXCHG( m_FileNameSize, copyitem->m_FileNameSize ); - m_pins.swap( copyitem->m_pins ); + wxCHECK_RET( aItem->Type() == SCH_SHEET_T, + wxString::Format( wxT( "SCH_SHEET object cannot swap data with %s object." ), + GetChars( aItem->GetClass() ) ) ); + + SCH_SHEET* sheet = ( SCH_SHEET* ) aItem; + + EXCHG( m_Pos, sheet->m_Pos ); + EXCHG( m_Size, sheet->m_Size ); + EXCHG( m_SheetName, sheet->m_SheetName ); + EXCHG( m_SheetNameSize, sheet->m_SheetNameSize ); + EXCHG( m_FileNameSize, sheet->m_FileNameSize ); + m_pins.swap( sheet->m_pins ); // Ensure sheet labels have their .m_Parent member pointing really on their // parent, after swapping. @@ -308,9 +315,9 @@ void SCH_SHEET::SwapData( SCH_SHEET* copyitem ) sheetPin.SetParent( this ); } - BOOST_FOREACH( SCH_SHEET_PIN& sheetPin, copyitem->m_pins ) + BOOST_FOREACH( SCH_SHEET_PIN& sheetPin, sheet->m_pins ) { - sheetPin.SetParent( copyitem ); + sheetPin.SetParent( sheet ); } } @@ -399,6 +406,56 @@ bool SCH_SHEET::HasUndefinedPins() } +int SCH_SHEET::GetMinWidth() const +{ + int width = MIN_SHEET_WIDTH; + + for( size_t i = 0; i < m_pins.size(); i++ ) + { + int edge = m_pins[i].GetEdge(); + + // Make sure pin is on right or left side of sheet. + if( edge >= 2 ) + continue; + + EDA_RECT rect = m_pins[i].GetBoundingBox(); + + if( width < rect.GetWidth() ) + width = rect.GetWidth(); + + for( size_t j = 0; j < m_pins.size(); j++ ) + { + if( (i == j) || (m_pins[i].m_Pos.y != m_pins[j].m_Pos.y) ) + continue; + + if( width < rect.GetWidth() + m_pins[j].GetBoundingBox().GetWidth() ) + { + width = rect.GetWidth() + m_pins[j].GetBoundingBox().GetWidth(); + break; + } + } + } + + return width; +} + + +int SCH_SHEET::GetMinHeight() const +{ + int height = MIN_SHEET_HEIGHT; + + for( size_t i = 0; i < m_pins.size(); i++ ) + { + int pinY = m_pins[i].m_Pos.y - m_Pos.y; + + if( pinY > height ) + height = pinY; + } + + return height; +} + + void SCH_SHEET::Place( SCH_EDIT_FRAME* frame, wxDC* DC ) { /* Place list structures for new sheet. */ @@ -1013,6 +1070,12 @@ bool SCH_SHEET::doHitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy } +wxPoint SCH_SHEET::GetResizePosition() const +{ + return wxPoint( m_Pos.x + m_Size.GetWidth(), m_Pos.y + m_Size.GetHeight() ); +} + + #if defined(DEBUG) void SCH_SHEET::Show( int nestLevel, std::ostream& os ) diff --git a/eeschema/sch_sheet.h b/eeschema/sch_sheet.h index 103396677b..711c8d09c7 100644 --- a/eeschema/sch_sheet.h +++ b/eeschema/sch_sheet.h @@ -19,6 +19,10 @@ class DANGLING_END_ITEM; class SCH_EDIT_FRAME; +#define MIN_SHEET_WIDTH 500 +#define MIN_SHEET_HEIGHT 150 + + /** * Pin (label) used in sheets to create hierarchical schematics. * @@ -81,14 +85,14 @@ public: */ virtual void CreateGraphicShape( std::vector & aCorner_list, const wxPoint& aPos ); - void SwapData( SCH_SHEET_PIN* copyitem ); + virtual void SwapData( SCH_ITEM* aItem ); /** * Get the sheet label number. * * @return Number of the sheet label. */ - int GetNumber() { return m_Number; } + int GetNumber() const { return m_Number; } /** * Set the sheet label number. @@ -96,8 +100,10 @@ public: * @param aNumber - New sheet number label. */ void SetNumber( int aNumber ); + void SetEdge( int aEdge ); - int GetEdge(); + + int GetEdge() const; /** * Function ConstraintOnEdge @@ -345,6 +351,38 @@ public: */ bool HasUndefinedPins(); + /** + * Function GetMinWidth + * returns the minimum width of the sheet based on the widths of the sheet pin text. + * + *

+ * The minimum sheet width is determined by the width of the bounding box of each + * hierarchical sheet pin. If two pins are horizontally adjacent ( same Y position ) + * to each other, the sum of the bounding box widths is used. If at some point in + * the future sheet objects can be rotated or pins can be placed in the vertical + * orientation, this function will need to be changed. + *

+ * + * @return The minimum width the sheet can be resized. + */ + int GetMinWidth() const; + + /** + * Function GetMinHeight + * returns the minimum height that the sheet can be resized based on the sheet pin + * positions. + * + *

+ * The minimum width of a sheet is determined by the Y axis location of the bottom + * most sheet pin. If at some point in the future sheet objects can be rotated or + * pins can be placed in the vertical orientation, this function will need to be + * changed. + *

+ * + * @return The minimum height the sheet can be resized. + */ + int GetMinHeight() const; + /** * Function GetPenSize * @return the size of the "pen" that be used to draw or plot this item @@ -373,7 +411,15 @@ public: */ EDA_RECT GetBoundingBox() const; - void SwapData( SCH_SHEET* copyitem ); + /** + * Function GetResizePos + * returns the position of the lower right corner of the sheet in drawing units. + * + * @return A wxPoint containing lower right corner of the sheet in drawing units. + */ + wxPoint GetResizePosition() const; + + virtual void SwapData( SCH_ITEM* aItem ); /** * Function ComponentCount diff --git a/eeschema/sch_sheet_pin.cpp b/eeschema/sch_sheet_pin.cpp index 79887dfd95..89b7e41daa 100644 --- a/eeschema/sch_sheet_pin.cpp +++ b/eeschema/sch_sheet_pin.cpp @@ -80,15 +80,20 @@ void SCH_SHEET_PIN::Draw( EDA_DRAW_PANEL* aPanel, } -void SCH_SHEET_PIN::SwapData( SCH_SHEET_PIN* copyitem ) +void SCH_SHEET_PIN::SwapData( SCH_ITEM* aItem ) { - SCH_TEXT::SwapData( (SCH_TEXT*) copyitem ); + wxCHECK_RET( aItem->Type() == SCH_SHEET_PIN_T, + wxString::Format( wxT( "SCH_SHEET_PIN object cannot swap data with %s object." ), + GetChars( aItem->GetClass() ) ) ); + + SCH_SHEET_PIN* pin = ( SCH_SHEET_PIN* ) aItem; + SCH_TEXT::SwapData( (SCH_TEXT*) pin ); int tmp; - tmp = copyitem->GetNumber(); - copyitem->SetNumber( GetNumber() ); + tmp = pin->GetNumber(); + pin->SetNumber( GetNumber() ); SetNumber( tmp ); - tmp = copyitem->GetEdge(); - copyitem->SetEdge( GetEdge() ); + tmp = pin->GetEdge(); + pin->SetEdge( GetEdge() ); SetEdge( tmp ); } @@ -178,7 +183,7 @@ void SCH_SHEET_PIN::SetEdge( int aEdge ) } -int SCH_SHEET_PIN::GetEdge() +int SCH_SHEET_PIN::GetEdge() const { return m_Edge; } diff --git a/eeschema/sch_text.cpp b/eeschema/sch_text.cpp index 6ab0509946..95a261a9e5 100644 --- a/eeschema/sch_text.cpp +++ b/eeschema/sch_text.cpp @@ -1602,7 +1602,7 @@ wxPoint SCH_HIERLABEL::GetSchematicTextOffset() void SCH_HIERLABEL::Mirror_Y( int aYaxis_position ) { /* The hierarchical label is NOT really mirrored for an horizontal label, the schematic - * orientation is changed. For a vericalal label, the schematic orientation is not changed + * orientation is changed. For a vertical label, the schematic orientation is not changed * and the label is moved to a suitable position. */ diff --git a/eeschema/sheet.cpp b/eeschema/sheet.cpp index 67c7cdc60c..00e93d8c0f 100644 --- a/eeschema/sheet.cpp +++ b/eeschema/sheet.cpp @@ -28,34 +28,6 @@ #include -static int s_PreviousSheetWidth; -static int s_PreviousSheetHeight; -static wxPoint s_OldPos; /* Former position for cancellation or move ReSize */ - - -/** - * Function EditSheet - * is used to edit an existing sheet or add a new sheet to the schematic. - *

- * When \a aSheet is a new sheet: - *

    - *
  • 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.
  • - *
  • and the file name already exists on the system, then \a aSheet is loaded with the - * existing file.
  • - *
  • 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.
  • - *

- * When \a aSheet is an existing sheet: - *

    - *
  • and the file name already exists in the schematic hierarchy, the current associated screen - * is replace by the one found in the hierarchy.
  • - *
  • and the file name already exists on the system, the current associated screen file name - * is changed and the file is loaded.
  • - *
  • 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.
  • - *

- */ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, wxDC* aDC ) { if( aSheet == NULL ) @@ -231,11 +203,30 @@ static void MoveOrResizeSheet( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& if( aErase ) sheet->Draw( aPanel, aDC, wxPoint( 0, 0 ), g_XorMode ); - if( sheet->m_Flags & IS_RESIZED ) + if( sheet->GetFlags() & IS_RESIZED ) { - wxSize newSize( MAX( s_PreviousSheetWidth, screen->GetCrossHairPosition().x - sheet->m_Pos.x ), - MAX( s_PreviousSheetHeight, screen->GetCrossHairPosition().y - sheet->m_Pos.y ) ); - sheet->Resize( newSize ); + int width = screen->GetCrossHairPosition().x - sheet->m_Pos.x; + int height = screen->GetCrossHairPosition().y - sheet->m_Pos.y; + + // If the sheet doesn't have any pins, clamp the minimum size to the default values. + width = ( width < MIN_SHEET_WIDTH ) ? MIN_SHEET_WIDTH : width; + height = ( height < MIN_SHEET_HEIGHT ) ? MIN_SHEET_HEIGHT : height; + + if( sheet->HasPins() ) + { + int gridSizeX = wxRound( screen->GetGridSize().x ); + int gridSizeY = wxRound( screen->GetGridSize().y ); + + // If the sheet has pins, use the pin positions to clamp the minimum height. + height = ( height < sheet->GetMinHeight() + gridSizeY ) ? + sheet->GetMinHeight() + gridSizeY : height; + width = ( width < sheet->GetMinWidth() + gridSizeX ) ? + sheet->GetMinWidth() + gridSizeX : width; + } + + wxPoint grid = screen->GetNearestGridPosition( wxPoint( sheet->m_Pos.x + width, + sheet->m_Pos.y + height ) ); + sheet->Resize( wxSize( grid.x - sheet->m_Pos.x, grid.y - sheet->m_Pos.y ) ); } else /* Move Sheet */ { @@ -251,38 +242,47 @@ static void MoveOrResizeSheet( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& static void ExitSheet( EDA_DRAW_PANEL* aPanel, wxDC* aDC ) { SCH_SCREEN* screen = (SCH_SCREEN*) aPanel->GetScreen(); - SCH_SHEET* sheet = (SCH_SHEET*) screen->GetCurItem(); + SCH_ITEM* item = screen->GetCurItem(); + SCH_EDIT_FRAME* parent = ( SCH_EDIT_FRAME* ) aPanel->GetParent(); - if( sheet == NULL ) + if( (item == NULL) || (item->Type() != SCH_SHEET_T) || (parent == NULL) ) return; - if( sheet->IsNew() ) + parent->SetRepeatItem( NULL ); + + item->Draw( aPanel, aDC, wxPoint( 0, 0 ), g_XorMode ); + + if( item->IsNew() ) { - sheet->Draw( aPanel, aDC, wxPoint( 0, 0 ), g_XorMode ); - SAFE_DELETE( sheet ); + SAFE_DELETE( item ); } - else if( (sheet->m_Flags & (IS_RESIZED|IS_MOVED)) ) + else if( item->m_Flags & (IS_RESIZED | IS_MOVED) ) { - wxPoint curspos = screen->GetCrossHairPosition(); - aPanel->GetScreen()->SetCrossHairPosition( s_OldPos ); - MoveOrResizeSheet( aPanel, aDC, wxDefaultPosition, true ); - sheet->Draw( aPanel, aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); - sheet->m_Flags = 0; - screen->SetCrossHairPosition( curspos ); + screen->RemoveFromDrawList( item ); + delete item; + + item = parent->GetUndoItem(); + + wxCHECK_RET( item != NULL, wxT( "Cannot restore undefined last sheet item." ) ); + + screen->AddToDrawList( item ); + parent->SetUndoItem( NULL ); + item->Draw( aPanel, aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); + item->ClearFlags(); + SCH_SHEET* sheet = ( SCH_SHEET* ) item; + aPanel->CrossHairOff( aDC ); + screen->SetCrossHairPosition( sheet->GetResizePosition() ); + aPanel->CrossHairOn( aDC ); } else { - sheet->m_Flags = 0; + item->ClearFlags(); } screen->SetCurItem( NULL ); } -#define SHEET_MIN_WIDTH 500 -#define SHEET_MIN_HEIGHT 150 - - /* Create hierarchy sheet. */ SCH_SHEET* SCH_EDIT_FRAME::CreateSheet( wxDC* aDC ) { @@ -294,8 +294,6 @@ SCH_SHEET* SCH_EDIT_FRAME::CreateSheet( wxDC* aDC ) sheet->m_TimeStamp = GetTimeStamp(); sheet->SetParent( GetScreen() ); sheet->SetScreen( NULL ); - s_PreviousSheetWidth = SHEET_MIN_WIDTH; - s_PreviousSheetHeight = SHEET_MIN_HEIGHT; // need to check if this is being added to the GetDrawItems(). // also need to update the hierarchy, if we are adding @@ -303,6 +301,9 @@ SCH_SHEET* SCH_EDIT_FRAME::CreateSheet( wxDC* aDC ) GetScreen()->SetCurItem( sheet ); DrawPanel->SetMouseCapture( MoveOrResizeSheet, ExitSheet ); DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, wxDefaultPosition, false ); + DrawPanel->CrossHairOff( aDC ); + GetScreen()->SetCrossHairPosition( sheet->GetResizePosition() ); + DrawPanel->CrossHairOn( aDC ); return sheet; } @@ -313,33 +314,24 @@ void SCH_EDIT_FRAME::ReSizeSheet( SCH_SHEET* aSheet, wxDC* aDC ) if( aSheet == NULL || aSheet->IsNew() ) return; - if( aSheet->Type() != SCH_SHEET_T ) - { - DisplayError( this, wxT( "SCH_EDIT_FRAME::ReSizeSheet: Bad SructType" ) ); - return; - } + wxCHECK_RET( aSheet->Type() == SCH_SHEET_T, + wxString::Format( wxT( "Cannot perform sheet resize on %s object." ), + GetChars( aSheet->GetClass() ) ) ); - OnModify( ); - aSheet->m_Flags |= IS_RESIZED; + SetUndoItem( aSheet ); + OnModify(); + aSheet->SetFlags( IS_RESIZED ); - s_OldPos = aSheet->m_Pos + aSheet->m_Size; - - s_PreviousSheetWidth = SHEET_MIN_WIDTH; - s_PreviousSheetHeight = SHEET_MIN_HEIGHT; - - BOOST_FOREACH( SCH_SHEET_PIN sheetPin, aSheet->GetPins() ) - { - s_PreviousSheetWidth = MAX( s_PreviousSheetWidth, - ( sheetPin.GetLength() + 1 ) * sheetPin.m_Size.x ); - s_PreviousSheetHeight = MAX( s_PreviousSheetHeight, - sheetPin.m_Pos.y - aSheet->m_Pos.y ); - } DrawPanel->SetMouseCapture( MoveOrResizeSheet, ExitSheet ); DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, wxDefaultPosition, true ); if( aSheet->IsNew() ) // not already in edit, save a copy for undo/redo SetUndoItem( aSheet ); + + DrawPanel->CrossHairOff( aDC ); + GetScreen()->SetCrossHairPosition( aSheet->GetResizePosition() ); + DrawPanel->CrossHairOn( aDC ); } @@ -352,12 +344,11 @@ void SCH_EDIT_FRAME::StartMoveSheet( SCH_SHEET* aSheet, wxDC* aDC ) GetScreen()->SetCrossHairPosition( aSheet->m_Pos ); DrawPanel->MoveCursorToCrossHair(); - s_OldPos = aSheet->m_Pos; - aSheet->m_Flags |= IS_MOVED; + if( !aSheet->IsNew() ) + SetUndoItem( aSheet ); + + aSheet->SetFlags( IS_MOVED ); DrawPanel->SetMouseCapture( MoveOrResizeSheet, ExitSheet ); DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, wxDefaultPosition, true ); DrawPanel->CrossHairOn( aDC ); - - if( !aSheet->IsNew() ) // not already in edit, save a copy for undo/redo - SetUndoItem( aSheet ); } diff --git a/include/dsnlexer.h b/include/dsnlexer.h index 4590fe612f..c298c537d1 100644 --- a/include/dsnlexer.h +++ b/include/dsnlexer.h @@ -176,7 +176,7 @@ public: * * @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This * token table need not contain the lexer separators such as '(' ')', etc. - * @param aKeywordTable is the count of tokens in aKeywordTable. + * @param aKeywordCount is the count of tokens in aKeywordTable. * @param aFile is an open file, which will be closed when this is destructed. * @param aFileName is the name of the file */ @@ -189,7 +189,7 @@ public: * * @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This * token table need not contain the lexer separators such as '(' ')', etc. - * @param aKeywordTable is the count of tokens in aKeywordTable. + * @param aKeywordCount is the count of tokens in aKeywordTable. * @param aSExpression is text to feed through a STRING_LINE_READER * @param aSource is a description of aSExpression, used for error reporting. */ @@ -204,7 +204,7 @@ public: * * @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This * token table need not contain the lexer separators such as '(' ')', etc. - * @param aKeywordTable is the count of tokens in aKeywordTable. + * @param aKeywordCount is the count of tokens in aKeywordTable. * @param aLineReader is any subclassed instance of LINE_READER, such as * STRING_LINE_READER or FILE_LINE_READER. */ diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index e7a9585345..3382ff5e44 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -565,7 +565,30 @@ private: wxString SelectFromLibBrowser( void ); public: - bool EditSheet( SCH_SHEET* Sheet, wxDC* DC ); + /** + * Function EditSheet + * is used to edit an existing sheet or add a new sheet to the schematic. + *

+ * When \a aSheet is a new sheet: + *

    + *
  • 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.
  • + *
  • and the file name already exists on the system, then \a aSheet is loaded with the + * existing file.
  • + *
  • 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.
  • + *

+ * When \a aSheet is an existing sheet: + *

    + *
  • and the file name already exists in the schematic hierarchy, the current associated + * screen is replace by the one found in the hierarchy.
  • + *
  • and the file name already exists on the system, the current associated screen file + * name is changed and the file is loaded.
  • + *
  • 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.
  • + *

+ */ + bool EditSheet( SCH_SHEET* aSheet, wxDC* aDC ); wxPoint GetLastSheetPinPosition() const { return m_lastSheetPinPosition; } @@ -723,15 +746,15 @@ private: * Function copyBlockItems * copies the list of block item. * @sa m_blockItems - * @param aItemList List to copy the block select items into. + * @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. - * @params aMenu The menu to add the items to. - * @params aJunction The SCH_JUNCTION object selected. + * @param aMenu The menu to add the items to. + * @param aJunction The SCH_JUNCTION object selected. */ void addJunctionMenuEntries( wxMenu* aMenu, SCH_JUNCTION* aJunction ); diff --git a/pcbnew/drc_stuff.h b/pcbnew/drc_stuff.h index f929dd2646..d96be0e569 100644 --- a/pcbnew/drc_stuff.h +++ b/pcbnew/drc_stuff.h @@ -199,13 +199,13 @@ private: * but does not add it to the BOARD. Use this to report any kind of * DRC problem, or unconnected pad problem. * - * @param aTrack The reference track + * @param aTrack The reference track. * @param aItem Another item on the BOARD, such as a SEGVIA, SEGZONE, - * or TRACK. + * or TRACK. * @param aErrorCode A categorizing identifier for the particular type - * of error that is being reported. + * of error that is being reported. * @param fillMe A MARKER_PCB* which is to be filled in, or NULL if one is to - * first be allocated, then filled. + * first be allocated, then filled. */ MARKER_PCB* fillMarker( TRACK* aTrack, BOARD_ITEM* aItem, int aErrorCode, MARKER_PCB* fillMe ); @@ -219,11 +219,11 @@ private: * but does not add it to the BOARD. Use this to report any kind of * DRC problem, or unconnected pad problem. * - * @param aEdge edge zone to test + * @param aArea The zone to test * @param aPos position of error * @param aErrorCode Type of error * @param fillMe A MARKER_PCB* which is to be filled in, or NULL if one is to - * first be allocated, then filled. + * first be allocated, then filled. */ MARKER_PCB* fillMarker( const ZONE_CONTAINER* aArea, const wxPoint& aPos, diff --git a/pcbnew/netlist.cpp b/pcbnew/netlist.cpp index bf2ec5a7ec..f57d3c6a1b 100644 --- a/pcbnew/netlist.cpp +++ b/pcbnew/netlist.cpp @@ -144,7 +144,7 @@ private: /** * Function SetPadNetName * Update a pad netname using the current footprint - * from the netlist (line format: ( ) ) + * from the netlist (line format: ( \ \ ) ) * @param aText = current line read from netlist */ bool SetPadNetName( char* aText ); diff --git a/pcbnew/specctra.h b/pcbnew/specctra.h index d2766fca0a..03b1409042 100644 --- a/pcbnew/specctra.h +++ b/pcbnew/specctra.h @@ -1134,7 +1134,7 @@ class LAYER : public ELEM std::string name; DSN_T layer_type; ///< one of: T_signal, T_power, T_mixed, T_jumper int direction; - int cost; ///< [forbidden | high | medium | low | free | | -1] + int cost; ///< [forbidden | high | medium | low | free | \ | -1] int cost_type; ///< T_length | T_way RULE* rules; STRINGS use_net; @@ -2678,7 +2678,7 @@ class CLASS : public ELEM STRINGS net_ids; - /// list + /// circuit descriptor list STRINGS circuit; RULE* rules; @@ -3619,7 +3619,7 @@ class SPECCTRA_DB : public SPECCTRA_LEXER * pin_reference and it will be tested through CurTok(). * * @param component_id Where to put the text preceeding the '-' hyphen. - * @param pin_d Where to put the text which trails the '-'. + * @param pid_id Where to put the text which trails the '-'. * @throw IO_ERROR, if the next token or two do no make up a pin_reference, * or there is an error reading from the input stream. */ @@ -3719,6 +3719,7 @@ class SPECCTRA_DB : public SPECCTRA_LEXER * Function makePADSTACK * creates a PADSTACK which matches the given pad. Only pads which do not * satisfy the function isKeepout() should be passed to this function. + * @param aBoard The owner of the MODULE. * @param aPad The D_PAD which needs to be made into a PADSTACK. * @return PADSTACK* - The created padstack, including its padstack_id. */ diff --git a/polygon/PolyLine.h b/polygon/PolyLine.h index 5f608b07c2..62c3f777ee 100644 --- a/polygon/PolyLine.h +++ b/polygon/PolyLine.h @@ -143,7 +143,7 @@ public: /** * Function Fillet * returns a filleted version of a polygon. - * @param aDistance is the fillet radius. + * @param aRadius is the fillet radius. * @param aSegments is the number of segments / fillet. * @return CPolyLine* - Pointer to new polygon. */ diff --git a/polygon/math_for_graphics.cpp b/polygon/math_for_graphics.cpp index 34c3f129d6..2b1de17ded 100644 --- a/polygon/math_for_graphics.cpp +++ b/polygon/math_for_graphics.cpp @@ -955,7 +955,8 @@ double GetPointToLineSegmentDistance( int x, int y, int xi, int yi, int xf, int * Function GetPointToLineSegmentDistance * Get distance between line segment and point * @param x,y = point - * @param xi,yi and xf,yf = the end-points of the line segment + * @param xi,yi Start point of the line segament + * @param xf,yf End point of the line segment * @return the distance */ {