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
*/
{