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.
This commit is contained in:
Wayne Stambaugh 2011-06-07 11:29:01 -04:00
parent 864426fb71
commit baa0d7920a
21 changed files with 281 additions and 147 deletions

View File

@ -35,7 +35,7 @@ SUBGROUPING = YES
# Build related configuration options # Build related configuration options
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
EXTRACT_ALL = YES EXTRACT_ALL = YES
EXTRACT_PRIVATE = NO EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO EXTRACT_LOCAL_METHODS = NO

View File

@ -1,8 +1,8 @@
/****************************************/ /**********************************/
/* Basic classes for Kicad: */ /* Basic classes for Kicad: */
/* EDA_ITEM */ /* EDA_ITEM */
/* EDA_TEXT */ /* EDA_TEXT */
/****************************************/ /**********************************/
#include "fctsys.h" #include "fctsys.h"
#include "gr_basic.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_Orient = 0; // Rotation angle in 0.1 degrees.
m_Attributs = 0; m_Attributs = 0;
m_Mirror = false; // display mirror if true m_Mirror = false; // display mirror if true
m_HJustify = GR_TEXT_HJUSTIFY_CENTER; // Defualt horizontal justification is centered. m_HJustify = GR_TEXT_HJUSTIFY_CENTER; // Default horizontal justification is centered.
m_VJustify = GR_TEXT_VJUSTIFY_CENTER; // Defualt vertical justification is centered. m_VJustify = GR_TEXT_VJUSTIFY_CENTER; // Default vertical justification is centered.
m_Thickness = 0; // thickness m_Thickness = 0; // thickness
m_Italic = false; // true = italic shape. m_Italic = false; // true = italic shape.
m_Bold = false; m_Bold = false;
@ -230,7 +230,7 @@ EDA_TEXT::~EDA_TEXT()
int EDA_TEXT::LenSize( const wxString& aLine ) const 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, void EDA_TEXT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset,
EDA_Colors aColor, int aDrawMode, EDA_Colors aColor, int aDrawMode,
GRTraceMode aFillMode, EDA_Colors aAnchor_color ) GRTraceMode aFillMode, EDA_Colors aAnchor_color )
{ {
if( m_MultilineAllowed ) 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, void EDA_TEXT::DrawOneLineOfText( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
const wxPoint& aOffset, EDA_Colors aColor, const wxPoint& aOffset, EDA_Colors aColor,
int aDrawMode, GRTraceMode aFillMode, int aDrawMode, GRTraceMode aFillMode,
EDA_Colors aAnchor_color, EDA_Colors aAnchor_color,
wxString& aText, wxPoint aPos ) wxString& aText, wxPoint aPos )
{ {
int width = m_Thickness; 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 ); m_HJustify, m_VJustify, width, m_Italic, m_Bold );
} }
wxString EDA_TEXT::GetTextStyleName() wxString EDA_TEXT::GetTextStyleName()
{ {
int style = 0; 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 (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) * return true if aRect is inside me (or on boundaries)
*/ */

View File

@ -302,9 +302,9 @@ void GERBER_PLOTTER::circle( wxPoint aCentre, int aDiameter, FILL_T aFill,
/* /*
* Function PlotPoly * Function PlotPoly
* writes a filled or not filled polyline to output file * writes a filled or not filled polyline to output file
* param aCornerList = buffer of corners coordinates * @param aCornerList = buffer of corners coordinates
* param aFill = plot option (NO_FILL, FILLED_SHAPE, FILLED_WITH_BG_BODYCOLOR) * @param aFill = plot option (NO_FILL, FILLED_SHAPE, FILLED_WITH_BG_BODYCOLOR)
* param aWidth = Width of the line to plot. * @param aWidth = Width of the line to plot.
*/ */
void GERBER_PLOTTER::PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth ) void GERBER_PLOTTER::PlotPoly( std::vector< wxPoint >& aCornerList, FILL_T aFill, int aWidth )
{ {

View File

@ -366,8 +366,8 @@ int DSNLEXER::NeedNUMBER( const char* aExpectation ) throw( IO_ERROR )
/** /**
* Function isspace * Function isSpace
* strips the upper bits of the int to ensure the value passed to ::isspace() is * strips the upper bits of the int to ensure the value passed to C++ %isspace() is
* in the range of 0-255 * in the range of 0-255
*/ */
static inline bool isSpace( int cc ) static inline bool isSpace( int cc )

View File

@ -41,7 +41,7 @@ private:
* Function CreateParstList * Function CreateParstList
* prints a list of components, in a form which can be imported by a * prints a list of components, in a form which can be imported by a
* spreadsheet. Form is: * spreadsheet. Form is:
* cmp value; number of components; <footprint>; <field1>; ...; * cmp value; number of components; \<footprint\>; \<field1\>; ...;
* list of references having the same value * list of references having the same value
*/ */
void CreatePartsList( const wxString& aFullFileName, bool aIncludeSubComponents ); void CreatePartsList( const wxString& aFullFileName, bool aIncludeSubComponents );

View File

@ -66,7 +66,6 @@ private:
/** /**
* Function InitBuffers * Function InitBuffers
* sets up to edit the given component. * sets up to edit the given component.
* @param aComponent The component to edit.
*/ */
void InitBuffers(); void InitBuffers();

View File

@ -690,6 +690,7 @@ void SCH_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
case SCH_COMPONENT_T: case SCH_COMPONENT_T:
case SCH_GLOBAL_LABEL_T: case SCH_GLOBAL_LABEL_T:
case SCH_HIERARCHICAL_LABEL_T: case SCH_HIERARCHICAL_LABEL_T:
case SCH_SHEET_T:
cmd.SetId( HK_Descr->m_IdMenuEvent ); cmd.SetId( HK_Descr->m_IdMenuEvent );
wxPostEvent( this, cmd ); wxPostEvent( this, cmd );
break; break;

View File

@ -168,8 +168,8 @@ class EXPORT_HELP
* created by BuildNetList() in the table g_NetObjectslist. * created by BuildNetList() in the table g_NetObjectslist.
*/ */
bool addPinToComponentPinList( SCH_COMPONENT* Component, bool addPinToComponentPinList( SCH_COMPONENT* Component,
SCH_SHEET_PATH* sheet, SCH_SHEET_PATH* sheet,
LIB_PIN* PinEntry ); LIB_PIN* PinEntry );
/** /**
* Function findAllInstancesOfComponent * Function findAllInstancesOfComponent
@ -179,9 +179,9 @@ class EXPORT_HELP
* matching reference designator, and for each part, add all its pins * matching reference designator, and for each part, add all its pins
* to the temporary sorted pin list. * to the temporary sorted pin list.
*/ */
void findAllInstancesOfComponent( SCH_COMPONENT* aComponent, void findAllInstancesOfComponent( SCH_COMPONENT* aComponent,
LIB_COMPONENT* aEntry, LIB_COMPONENT* aEntry,
SCH_SHEET_PATH* aSheetPath ); SCH_SHEET_PATH* aSheetPath );
/** /**
* Function writeGENERICListOfNets * Function writeGENERICListOfNets
@ -192,12 +192,13 @@ class EXPORT_HELP
/** /**
* Function writeListOfNetsCADSTAR * Function writeListOfNetsCADSTAR
* writes a net list (ranked by Netcode), and * writes a net list (ranked by Netcode), and pins connected to it.
* Pins connected to it * <p>
* Format: * Format:
*. ADD_TER RR2 6 "$42" * - ADD_TER RR2 6 \"$42\"
*. B U1 100 * - B U1 100
* 6 CA * - 6 CA
* </p>
*/ */
void writeListOfNetsCADSTAR( FILE* f, NETLIST_OBJECT_LIST& aObjectsList ); void writeListOfNetsCADSTAR( FILE* f, NETLIST_OBJECT_LIST& aObjectsList );

View File

@ -120,6 +120,7 @@ const KICAD_T SCH_COLLECTOR::RotatableItems[] = {
SCH_HIERARCHICAL_LABEL_T, SCH_HIERARCHICAL_LABEL_T,
SCH_FIELD_T, SCH_FIELD_T,
SCH_COMPONENT_T, SCH_COMPONENT_T,
SCH_SHEET_T,
EOT EOT
}; };

View File

@ -33,6 +33,7 @@ SCH_SHEET::SCH_SHEET( const wxPoint& pos ) :
{ {
m_Layer = LAYER_SHEET; m_Layer = LAYER_SHEET;
m_Pos = pos; m_Pos = pos;
m_Size = wxSize( MIN_SHEET_WIDTH, MIN_SHEET_HEIGHT );
m_TimeStamp = GetTimeStamp(); m_TimeStamp = GetTimeStamp();
m_SheetNameSize = m_FileNameSize = 60; m_SheetNameSize = m_FileNameSize = 60;
m_AssociatedScreen = NULL; m_AssociatedScreen = NULL;
@ -176,7 +177,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg )
{ {
if( !aLine.ReadLine() ) if( !aLine.ReadLine() )
{ {
aErrorMsg.Printf( wxT( "Read File Errror" ) ); aErrorMsg.Printf( wxT( "Read File Error" ) );
return false; 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 ); wxCHECK_RET( aItem->Type() == SCH_SHEET_T,
EXCHG( m_Size, copyitem->m_Size ); wxString::Format( wxT( "SCH_SHEET object cannot swap data with %s object." ),
EXCHG( m_SheetName, copyitem->m_SheetName ); GetChars( aItem->GetClass() ) ) );
EXCHG( m_SheetNameSize, copyitem->m_SheetNameSize );
EXCHG( m_FileNameSize, copyitem->m_FileNameSize ); SCH_SHEET* sheet = ( SCH_SHEET* ) aItem;
m_pins.swap( copyitem->m_pins );
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 // Ensure sheet labels have their .m_Parent member pointing really on their
// parent, after swapping. // parent, after swapping.
@ -308,9 +315,9 @@ void SCH_SHEET::SwapData( SCH_SHEET* copyitem )
sheetPin.SetParent( this ); 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 ) void SCH_SHEET::Place( SCH_EDIT_FRAME* frame, wxDC* DC )
{ {
/* Place list structures for new sheet. */ /* 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) #if defined(DEBUG)
void SCH_SHEET::Show( int nestLevel, std::ostream& os ) void SCH_SHEET::Show( int nestLevel, std::ostream& os )

View File

@ -19,6 +19,10 @@ class DANGLING_END_ITEM;
class SCH_EDIT_FRAME; class SCH_EDIT_FRAME;
#define MIN_SHEET_WIDTH 500
#define MIN_SHEET_HEIGHT 150
/** /**
* Pin (label) used in sheets to create hierarchical schematics. * Pin (label) used in sheets to create hierarchical schematics.
* *
@ -81,14 +85,14 @@ public:
*/ */
virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list, const wxPoint& aPos ); virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list, const wxPoint& aPos );
void SwapData( SCH_SHEET_PIN* copyitem ); virtual void SwapData( SCH_ITEM* aItem );
/** /**
* Get the sheet label number. * Get the sheet label number.
* *
* @return Number of the sheet label. * @return Number of the sheet label.
*/ */
int GetNumber() { return m_Number; } int GetNumber() const { return m_Number; }
/** /**
* Set the sheet label number. * Set the sheet label number.
@ -96,8 +100,10 @@ public:
* @param aNumber - New sheet number label. * @param aNumber - New sheet number label.
*/ */
void SetNumber( int aNumber ); void SetNumber( int aNumber );
void SetEdge( int aEdge ); void SetEdge( int aEdge );
int GetEdge();
int GetEdge() const;
/** /**
* Function ConstraintOnEdge * Function ConstraintOnEdge
@ -345,6 +351,38 @@ public:
*/ */
bool HasUndefinedPins(); bool HasUndefinedPins();
/**
* Function GetMinWidth
* returns the minimum width of the sheet based on the widths of the sheet pin text.
*
* <p>
* 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.
* </p>
*
* @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.
*
* <p>
* 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.
* </p>
*
* @return The minimum height the sheet can be resized.
*/
int GetMinHeight() const;
/** /**
* Function GetPenSize * Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item * @return the size of the "pen" that be used to draw or plot this item
@ -373,7 +411,15 @@ public:
*/ */
EDA_RECT GetBoundingBox() const; 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 * Function ComponentCount

View File

@ -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; int tmp;
tmp = copyitem->GetNumber(); tmp = pin->GetNumber();
copyitem->SetNumber( GetNumber() ); pin->SetNumber( GetNumber() );
SetNumber( tmp ); SetNumber( tmp );
tmp = copyitem->GetEdge(); tmp = pin->GetEdge();
copyitem->SetEdge( GetEdge() ); pin->SetEdge( GetEdge() );
SetEdge( tmp ); 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; return m_Edge;
} }

View File

@ -1602,7 +1602,7 @@ wxPoint SCH_HIERLABEL::GetSchematicTextOffset()
void SCH_HIERLABEL::Mirror_Y( int aYaxis_position ) void SCH_HIERLABEL::Mirror_Y( int aYaxis_position )
{ {
/* The hierarchical label is NOT really mirrored for an horizontal label, the schematic /* 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. * and the label is moved to a suitable position.
*/ */

View File

@ -28,34 +28,6 @@
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
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.
* <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>
*/
bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, wxDC* aDC ) bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, wxDC* aDC )
{ {
if( aSheet == NULL ) if( aSheet == NULL )
@ -231,11 +203,30 @@ static void MoveOrResizeSheet( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint&
if( aErase ) if( aErase )
sheet->Draw( aPanel, aDC, wxPoint( 0, 0 ), g_XorMode ); 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 ), int width = screen->GetCrossHairPosition().x - sheet->m_Pos.x;
MAX( s_PreviousSheetHeight, screen->GetCrossHairPosition().y - sheet->m_Pos.y ) ); int height = screen->GetCrossHairPosition().y - sheet->m_Pos.y;
sheet->Resize( newSize );
// 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 */ 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 ) static void ExitSheet( EDA_DRAW_PANEL* aPanel, wxDC* aDC )
{ {
SCH_SCREEN* screen = (SCH_SCREEN*) aPanel->GetScreen(); 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; 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( item );
SAFE_DELETE( sheet );
} }
else if( (sheet->m_Flags & (IS_RESIZED|IS_MOVED)) ) else if( item->m_Flags & (IS_RESIZED | IS_MOVED) )
{ {
wxPoint curspos = screen->GetCrossHairPosition(); screen->RemoveFromDrawList( item );
aPanel->GetScreen()->SetCrossHairPosition( s_OldPos ); delete item;
MoveOrResizeSheet( aPanel, aDC, wxDefaultPosition, true );
sheet->Draw( aPanel, aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); item = parent->GetUndoItem();
sheet->m_Flags = 0;
screen->SetCrossHairPosition( curspos ); 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 else
{ {
sheet->m_Flags = 0; item->ClearFlags();
} }
screen->SetCurItem( NULL ); screen->SetCurItem( NULL );
} }
#define SHEET_MIN_WIDTH 500
#define SHEET_MIN_HEIGHT 150
/* Create hierarchy sheet. */ /* Create hierarchy sheet. */
SCH_SHEET* SCH_EDIT_FRAME::CreateSheet( wxDC* aDC ) 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->m_TimeStamp = GetTimeStamp();
sheet->SetParent( GetScreen() ); sheet->SetParent( GetScreen() );
sheet->SetScreen( NULL ); sheet->SetScreen( NULL );
s_PreviousSheetWidth = SHEET_MIN_WIDTH;
s_PreviousSheetHeight = SHEET_MIN_HEIGHT;
// need to check if this is being added to the GetDrawItems(). // need to check if this is being added to the GetDrawItems().
// also need to update the hierarchy, if we are adding // 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 ); GetScreen()->SetCurItem( sheet );
DrawPanel->SetMouseCapture( MoveOrResizeSheet, ExitSheet ); DrawPanel->SetMouseCapture( MoveOrResizeSheet, ExitSheet );
DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, wxDefaultPosition, false ); DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, wxDefaultPosition, false );
DrawPanel->CrossHairOff( aDC );
GetScreen()->SetCrossHairPosition( sheet->GetResizePosition() );
DrawPanel->CrossHairOn( aDC );
return sheet; return sheet;
} }
@ -313,33 +314,24 @@ void SCH_EDIT_FRAME::ReSizeSheet( SCH_SHEET* aSheet, wxDC* aDC )
if( aSheet == NULL || aSheet->IsNew() ) if( aSheet == NULL || aSheet->IsNew() )
return; return;
if( aSheet->Type() != SCH_SHEET_T ) wxCHECK_RET( aSheet->Type() == SCH_SHEET_T,
{ wxString::Format( wxT( "Cannot perform sheet resize on %s object." ),
DisplayError( this, wxT( "SCH_EDIT_FRAME::ReSizeSheet: Bad SructType" ) ); GetChars( aSheet->GetClass() ) ) );
return;
}
OnModify( ); SetUndoItem( aSheet );
aSheet->m_Flags |= IS_RESIZED; 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->SetMouseCapture( MoveOrResizeSheet, ExitSheet );
DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, wxDefaultPosition, true ); DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, wxDefaultPosition, true );
if( aSheet->IsNew() ) // not already in edit, save a copy for undo/redo if( aSheet->IsNew() ) // not already in edit, save a copy for undo/redo
SetUndoItem( aSheet ); 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 ); GetScreen()->SetCrossHairPosition( aSheet->m_Pos );
DrawPanel->MoveCursorToCrossHair(); DrawPanel->MoveCursorToCrossHair();
s_OldPos = aSheet->m_Pos; if( !aSheet->IsNew() )
aSheet->m_Flags |= IS_MOVED; SetUndoItem( aSheet );
aSheet->SetFlags( IS_MOVED );
DrawPanel->SetMouseCapture( MoveOrResizeSheet, ExitSheet ); DrawPanel->SetMouseCapture( MoveOrResizeSheet, ExitSheet );
DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, wxDefaultPosition, true ); DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, wxDefaultPosition, true );
DrawPanel->CrossHairOn( aDC ); DrawPanel->CrossHairOn( aDC );
if( !aSheet->IsNew() ) // not already in edit, save a copy for undo/redo
SetUndoItem( aSheet );
} }

View File

@ -176,7 +176,7 @@ public:
* *
* @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This * @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This
* token table need not contain the lexer separators such as '(' ')', etc. * 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 aFile is an open file, which will be closed when this is destructed.
* @param aFileName is the name of the file * @param aFileName is the name of the file
*/ */
@ -189,7 +189,7 @@ public:
* *
* @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This * @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This
* token table need not contain the lexer separators such as '(' ')', etc. * 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 aSExpression is text to feed through a STRING_LINE_READER
* @param aSource is a description of aSExpression, used for error reporting. * @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 * @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This
* token table need not contain the lexer separators such as '(' ')', etc. * 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 * @param aLineReader is any subclassed instance of LINE_READER, such as
* STRING_LINE_READER or FILE_LINE_READER. * STRING_LINE_READER or FILE_LINE_READER.
*/ */

View File

@ -565,7 +565,30 @@ private:
wxString SelectFromLibBrowser( void ); wxString SelectFromLibBrowser( void );
public: 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.
* <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>
*/
bool EditSheet( SCH_SHEET* aSheet, wxDC* aDC );
wxPoint GetLastSheetPinPosition() const { return m_lastSheetPinPosition; } wxPoint GetLastSheetPinPosition() const { return m_lastSheetPinPosition; }
@ -723,15 +746,15 @@ private:
* Function copyBlockItems * Function copyBlockItems
* copies the list of block item. * copies the list of block item.
* @sa m_blockItems * @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 ); void copyBlockItems( PICKED_ITEMS_LIST& aItemsList );
/** /**
* Function addJunctionMenuEntries * Function addJunctionMenuEntries
* adds the context menu items to \a aMenu for \a aJunction. * adds the context menu items to \a aMenu for \a aJunction.
* @params aMenu The menu to add the items to. * @param aMenu The menu to add the items to.
* @params aJunction The SCH_JUNCTION object selected. * @param aJunction The SCH_JUNCTION object selected.
*/ */
void addJunctionMenuEntries( wxMenu* aMenu, SCH_JUNCTION* aJunction ); void addJunctionMenuEntries( wxMenu* aMenu, SCH_JUNCTION* aJunction );

View File

@ -199,13 +199,13 @@ private:
* but does not add it to the BOARD. Use this to report any kind of * but does not add it to the BOARD. Use this to report any kind of
* DRC problem, or unconnected pad problem. * 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, * @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 * @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 * @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 ); 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 * but does not add it to the BOARD. Use this to report any kind of
* DRC problem, or unconnected pad problem. * DRC problem, or unconnected pad problem.
* *
* @param aEdge edge zone to test * @param aArea The zone to test
* @param aPos position of error * @param aPos position of error
* @param aErrorCode Type of error * @param aErrorCode Type of error
* @param fillMe A MARKER_PCB* which is to be filled in, or NULL if one is to * @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, MARKER_PCB* fillMarker( const ZONE_CONTAINER* aArea,
const wxPoint& aPos, const wxPoint& aPos,

View File

@ -144,7 +144,7 @@ private:
/** /**
* Function SetPadNetName * Function SetPadNetName
* Update a pad netname using the current footprint * Update a pad netname using the current footprint
* from the netlist (line format: ( <pad number> <net name> ) ) * from the netlist (line format: ( \<pad number\> \<net name\> ) )
* @param aText = current line read from netlist * @param aText = current line read from netlist
*/ */
bool SetPadNetName( char* aText ); bool SetPadNetName( char* aText );

View File

@ -1134,7 +1134,7 @@ class LAYER : public ELEM
std::string name; std::string name;
DSN_T layer_type; ///< one of: T_signal, T_power, T_mixed, T_jumper DSN_T layer_type; ///< one of: T_signal, T_power, T_mixed, T_jumper
int direction; int direction;
int cost; ///< [forbidden | high | medium | low | free | <positive_integer > | -1] int cost; ///< [forbidden | high | medium | low | free | \<positive_integer\> | -1]
int cost_type; ///< T_length | T_way int cost_type; ///< T_length | T_way
RULE* rules; RULE* rules;
STRINGS use_net; STRINGS use_net;
@ -2678,7 +2678,7 @@ class CLASS : public ELEM
STRINGS net_ids; STRINGS net_ids;
/// <circuit_descriptor> list /// circuit descriptor list
STRINGS circuit; STRINGS circuit;
RULE* rules; RULE* rules;
@ -3619,7 +3619,7 @@ class SPECCTRA_DB : public SPECCTRA_LEXER
* pin_reference and it will be tested through CurTok(). * pin_reference and it will be tested through CurTok().
* *
* @param component_id Where to put the text preceeding the '-' hyphen. * @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, * @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. * or there is an error reading from the input stream.
*/ */
@ -3719,6 +3719,7 @@ class SPECCTRA_DB : public SPECCTRA_LEXER
* Function makePADSTACK * Function makePADSTACK
* creates a PADSTACK which matches the given pad. Only pads which do not * creates a PADSTACK which matches the given pad. Only pads which do not
* satisfy the function isKeepout() should be passed to this function. * 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. * @param aPad The D_PAD which needs to be made into a PADSTACK.
* @return PADSTACK* - The created padstack, including its padstack_id. * @return PADSTACK* - The created padstack, including its padstack_id.
*/ */

View File

@ -143,7 +143,7 @@ public:
/** /**
* Function Fillet * Function Fillet
* returns a filleted version of a polygon. * 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. * @param aSegments is the number of segments / fillet.
* @return CPolyLine* - Pointer to new polygon. * @return CPolyLine* - Pointer to new polygon.
*/ */

View File

@ -955,7 +955,8 @@ double GetPointToLineSegmentDistance( int x, int y, int xi, int yi, int xf, int
* Function GetPointToLineSegmentDistance * Function GetPointToLineSegmentDistance
* Get distance between line segment and point * Get distance between line segment and point
* @param x,y = 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 * @return the distance
*/ */
{ {