Commit b98538ec authored by Wayne Stambaugh's avatar Wayne Stambaugh

Add copy constructors and cloning to schematic objects and other minor fixes.

parent c699c726
......@@ -4,6 +4,20 @@ KiCad ChangeLog 2010
Please add newer entries at the top, list the date and your name with
email address.
2010-dec-21 UPDATE Wayne Stambaugh <stambaughw@verizon.net>
================================================================================
++all
* Doxygen comment warning fixes.
* Coding policy fixes.
++common
* Add clone method to EDA_ITEM object.
++EESchema
* Replace GenCopy() method with Clone() in all items derived from SCH_ITEM.
* Simplify repeat last schematic item with new Clone() method.
* Simplify duplicate schematic item method with new Clone() method.
* Separate objects in sch_items.h/cpp into separate files per object.
2010-dec-20, UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
================================================================================
common:
......
......@@ -37,6 +37,7 @@ EDA_ITEM::EDA_ITEM( KICAD_T idType )
EDA_ITEM::EDA_ITEM( const EDA_ITEM& base )
{
InitVars();
m_StructType = base.m_StructType;
m_Parent = base.m_Parent;
m_Son = base.m_Son;
......@@ -73,6 +74,13 @@ void EDA_ITEM::SetModified()
}
EDA_ITEM* EDA_ITEM::doClone() const
{
wxCHECK_MSG( false, NULL, wxT( "doClone not implemented in derived class " ) + GetClass() +
wxT( ". Bad programmer." ) );
}
// see base_struct.h
SEARCH_RESULT EDA_ITEM::IterateForward( EDA_ITEM* listStart,
INSPECTOR* inspector,
......@@ -117,9 +125,9 @@ SEARCH_RESULT EDA_ITEM::Visit( INSPECTOR* inspector, const void* testData,
return SEARCH_CONTINUE;
}
#if defined(DEBUG)
// A function that should have been in wxWidgets
std::ostream& operator<<( std::ostream& out, const wxSize& size )
{
......@@ -136,13 +144,6 @@ std::ostream& operator<<( std::ostream& out, const wxPoint& pt )
}
/**
* Function Show
* is used to output the object tree, currently for debugging only.
* @param nestLevel An aid to prettier tree indenting, and is the level
* of nesting of this object within the overall tree.
* @param os The ostream& to output to.
*/
void EDA_ITEM::Show( int nestLevel, std::ostream& os ) const
{
// XML output:
......@@ -154,13 +155,6 @@ void EDA_ITEM::Show( int nestLevel, std::ostream& os ) const
}
/**
* Function NestedSpace
* outputs nested space for pretty indenting.
* @param nestLevel The nest count
* @param os The ostream&, where to output
* @return std::ostream& - for continuation.
**/
std::ostream& EDA_ITEM::NestedSpace( int nestLevel, std::ostream& os )
{
for( int i = 0; i<nestLevel; ++i )
......@@ -180,31 +174,42 @@ std::ostream& EDA_ITEM::NestedSpace( int nestLevel, std::ostream& os )
/**************************************************/
EDA_TextStruct::EDA_TextStruct( const wxString& text )
{
m_Size.x = m_Size.y = DEFAULT_SIZE_TEXT; /* XY size of font */
m_Orient = 0; /* Orient in 0.1 degrees */
m_Size.x = m_Size.y = DEFAULT_SIZE_TEXT; // Width and height of font.
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;
m_VJustify = GR_TEXT_VJUSTIFY_CENTER; /* Justifications Horiz et Vert du texte */
m_Thickness = 0; /* thickness */
m_Italic = false; /* true = italic shape */
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_Thickness = 0; // thickness
m_Italic = false; // true = italic shape.
m_Bold = false;
m_MultilineAllowed = false; // Set to true only for texts that can use multiline.
m_MultilineAllowed = false; // Set to true for multiline text.
m_Text = text;
}
EDA_TextStruct::EDA_TextStruct( const EDA_TextStruct& aText )
{
m_Pos = aText.m_Pos;
m_Size = aText.m_Size;
m_Orient = aText.m_Orient;
m_Attributs = aText.m_Attributs;
m_Mirror = aText.m_Mirror;
m_HJustify = aText.m_HJustify;
m_VJustify = aText.m_VJustify;
m_Thickness = aText.m_Thickness;
m_Italic = aText.m_Italic;
m_Bold = aText.m_Bold;
m_MultilineAllowed = aText.m_MultilineAllowed;
m_Text = aText.m_Text;
}
EDA_TextStruct::~EDA_TextStruct()
{
}
/**
* Function LenSize
* @return the text lenght in internal units
* @param aLine : the line of text to consider.
* For single line text, this parameter is always m_Text
*/
int EDA_TextStruct::LenSize( const wxString& aLine ) const
{
return ReturnGraphicTextWidth(aLine, m_Size.x, m_Italic, m_Bold ) + m_Thickness;
......@@ -332,25 +337,9 @@ bool EDA_TextStruct::TextHitTest( const EDA_Rect& aRect, bool aContains, int aAc
}
/***************************************************************/
void EDA_TextStruct::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC,
const wxPoint& aOffset, EDA_Colors aColor,
int aDrawMode,
void EDA_TextStruct::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
EDA_Colors aColor, int aDrawMode,
GRTraceMode aFillMode, EDA_Colors aAnchor_color )
/***************************************************************/
/**
* Function Draw
* Draws this, that can be a multiline text
* @param aPanel = the current DrawPanel
* @param aDC = the current Device Context
* @param aOffset = draw offset (usually (0,0))
* @param EDA_Colors aColor = text color
* @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode.
* @param aFillMode = FILAIRE, FILLED or SKETCH
* @param EDA_Colors aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do not draw anchor ).
*/
{
if( m_MultilineAllowed )
{
......@@ -361,6 +350,7 @@ void EDA_TextStruct::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC,
offset.y = GetInterline();
RotatePoint( &offset, m_Orient );
for( unsigned i = 0; i<list->Count(); i++ )
{
wxString txt = list->Item( i );
......@@ -391,24 +381,10 @@ void EDA_TextStruct::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC,
}
/**
* Function DrawOneLineOfText
* Draw a single text line.
* Used to draw each line of this EDA_TextStruct, that can be multiline
* @param aPanel = the current DrawPanel
* @param aDC = the current Device Context
* @param aOffset = draw offset (usually (0,0))
* @param EDA_Colors aColor = text color
* @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode.
* @param aFillMode = FILAIRE, FILLED or SKETCH
* @param EDA_Colors aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do not draw anchor ).
* @param EDA_Colors aText = the single line of text to draw.
* @param EDA_Colors aPos = the position of this line ).
*/
void EDA_TextStruct::DrawOneLineOfText( WinEDA_DrawPanel* aPanel, wxDC* aDC,
const wxPoint& aOffset, EDA_Colors aColor,
int aDrawMode,
GRTraceMode aFillMode, EDA_Colors aAnchor_color,
int aDrawMode, GRTraceMode aFillMode,
EDA_Colors aAnchor_color,
wxString& aText, wxPoint aPos )
{
int width = m_Thickness;
......@@ -449,23 +425,20 @@ void EDA_TextStruct::DrawOneLineOfText( WinEDA_DrawPanel* aPanel, wxDC* aDC,
if( m_Mirror )
size.x = -size.x;
DrawGraphicText( aPanel, aDC,
aOffset + aPos, aColor, aText,
m_Orient, size,
DrawGraphicText( aPanel, aDC, aOffset + aPos, aColor, aText, m_Orient, size,
m_HJustify, m_VJustify, width, m_Italic, m_Bold );
}
/**
* Function GetStyleName
* @return a wwString withe the style name( Normal, Italic, Bold, Bold+Italic)
*/
wxString EDA_TextStruct::GetTextStyleName()
{
int style = 0;
if( m_Italic )
style = 1;
if( m_Bold )
style += 2;
wxString stylemsg[4] = {
_("Normal"),
_("Italic"),
......@@ -481,17 +454,14 @@ wxString EDA_TextStruct::GetTextStyleName()
/* Class EDA_Rect */
/******************/
/******************************/
void EDA_Rect::Normalize()
/******************************/
// Ensure the height ant width are >= 0
{
if( m_Size.y < 0 )
{
m_Size.y = -m_Size.y;
m_Pos.y -= m_Size.y;
}
if( m_Size.x < 0 )
{
m_Size.x = -m_Size.x;
......@@ -500,21 +470,12 @@ void EDA_Rect::Normalize()
}
/**
* Function Move
* Move this rectangle by the aMoveVector value (this is a relative move)
* @param aMoveVector = a wxPoint that is the value to move this rectangle
*/
void EDA_Rect::Move( const wxPoint& aMoveVector )
{
m_Pos += aMoveVector;
}
/* Return TRUE if point is in Rect
* Accept rect size < 0
*/
bool EDA_Rect::Contains( const wxPoint& aPoint ) const
{
wxPoint rel_pos = aPoint - m_Pos;
......@@ -540,7 +501,7 @@ bool EDA_Rect::Contains( const wxPoint& aPoint ) const
*/
bool EDA_Rect::Contains( const EDA_Rect& aRect ) const
{
return Contains(aRect.GetOrigin() ) && Contains(aRect.GetEnd() );
return Contains( aRect.GetOrigin() ) && Contains( aRect.GetEnd() );
}
......@@ -576,35 +537,14 @@ bool EDA_Rect::Intersects( const EDA_Rect& aRect ) const
}
/**************************************************/
EDA_Rect& EDA_Rect::Inflate( int aDelta )
/**************************************************/
/**
* Function Inflate
* Inflate "this": move each horizontal edgeand each vertical edge by aDelta
* toward rect outside
* if aDelta is negative, move toward rect inside (deflate)
* Works for positive and negative rect size
*
*/
{
Inflate( aDelta, aDelta );
return *this;
}
/**************************************************/
EDA_Rect& EDA_Rect::Inflate( wxCoord dx, wxCoord dy )
/**************************************************/
/**
* Function Inflate
* Inflate "this": move each horizontal edge by dx and each vertical edge by dy
* toward rect outside
* if dx and/or dy is negative, move toward rect inside (deflate)
* Works for positive and negative rect size
*
*/
EDA_Rect& EDA_Rect::Inflate( wxCoord dx, wxCoord dy )
{
if( m_Size.x >= 0 )
{
......@@ -637,7 +577,6 @@ EDA_Rect& EDA_Rect::Inflate( wxCoord dx, wxCoord dy )
}
}
if( m_Size.y >= 0 )
{
if( m_Size.y < -2 * dy )
......@@ -673,12 +612,6 @@ EDA_Rect& EDA_Rect::Inflate( wxCoord dx, wxCoord dy )
}
/**
* Function Merge
* modifies Position and Size of this in order to contain the given rect
* mainly used to calculate bounding boxes
* @param aRect = given rect to merge with this
*/
void EDA_Rect::Merge( const EDA_Rect& aRect )
{
Normalize(); // ensure width and height >= 0
......@@ -695,12 +628,7 @@ void EDA_Rect::Merge( const EDA_Rect& aRect )
SetEnd( end );
}
/**
* Function Merge
* modifies Position and Size of this in order to contain the given point
* mainly used to calculate bounding boxes
* @param aPoint = given point to merge with this
*/
void EDA_Rect::Merge( const wxPoint& aPoint )
{
Normalize(); // ensure width and height >= 0
......
......@@ -282,7 +282,7 @@ void WinEDA_BasicFrame::GetKicadHelp( wxCommandEvent& event )
/*
*
*/
void WinEDA_BasicFrame::GetKicadAbout( wxCommandEvent& WXUNUSED(event) )
void WinEDA_BasicFrame::GetKicadAbout( wxCommandEvent& event )
{
bool ShowAboutDialog(wxWindow * parent);
ShowAboutDialog(this);
......@@ -364,7 +364,7 @@ static inline const char* KICAD_BUILD_OPTIONS_SIGNATURE()
#endif
void WinEDA_BasicFrame::CopyVersionInfoToClipboard( wxCommandEvent& WXUNUSED( event ) )
void WinEDA_BasicFrame::CopyVersionInfoToClipboard( wxCommandEvent& event )
{
if( !wxTheClipboard->Open() )
{
......
......@@ -59,6 +59,17 @@ void MARKER_BASE::init()
}
MARKER_BASE::MARKER_BASE( const MARKER_BASE& aMarker )
{
m_Pos = aMarker.m_Pos;
m_Corners = aMarker.m_Corners;
m_MarkerType = aMarker.m_MarkerType;
m_Color = aMarker.m_Color;
m_ShapeBoundingBox = aMarker.m_ShapeBoundingBox;
m_ScalingFactor = aMarker.m_ScalingFactor;
}
MARKER_BASE::MARKER_BASE()
{
m_ScalingFactor = M_SHAPE_SCALE;
......@@ -122,13 +133,6 @@ bool MARKER_BASE::HitTestMarker( const wxPoint& refPos ) const
}
/**
* Function GetBoundingBoxMarker
* returns the orthogonal, bounding box of this object for display purposes.
* This box should be an enclosing perimeter for visible components of this
* object, and the units should be in the pcb or schematic coordinate system.
* It is OK to overestimate the size by a few counts.
*/
EDA_Rect MARKER_BASE::GetBoundingBoxMarker() const
{
wxSize realsize = m_ShapeBoundingBox.GetSize();
......@@ -141,15 +145,8 @@ EDA_Rect MARKER_BASE::GetBoundingBoxMarker() const
return EDA_Rect( m_Pos, realsize );
}
/**********************************************************************/
void MARKER_BASE::DrawMarker( WinEDA_DrawPanel* aPanel, wxDC* aDC, int aDrawMode,
const wxPoint& aOffset )
/**********************************************************************/
/**
* Function DrawMarker
* The shape is the polygon defined in m_Corners (array of wxPoints)
*/
{
wxPoint corners[CORNERS_COUNT];
......@@ -172,16 +169,11 @@ void MARKER_BASE::DrawMarker( WinEDA_DrawPanel* aPanel, wxDC* aDC, int aDrawMode
}
/**
* Function DisplayMarkerInfo
* Displays the full info of this marker, within an HTML window
*/
void MARKER_BASE::DisplayMarkerInfo( WinEDA_DrawFrame* aFrame )
{
wxString msg = m_drc.ShowHtml();
DIALOG_DISPLAY_HTML_TEXT_BASE
infodisplay( (wxWindow*)aFrame, wxID_ANY, _("Marker Info"),
wxGetMousePosition(), wxSize( 550, 140 ) );
DIALOG_DISPLAY_HTML_TEXT_BASE infodisplay( (wxWindow*)aFrame, wxID_ANY, _( "Marker Info" ),
wxGetMousePosition(), wxSize( 550, 140 ) );
infodisplay.m_htmlWindow->SetPage( msg );
infodisplay.ShowModal();
......
......@@ -879,7 +879,7 @@ void wxSVGFileDC::DoDrawIcon( const class wxIcon& myIcon, wxCoord x, wxCoord y )
void wxSVGFileDC::DoDrawBitmap( const class wxBitmap& bmp,
wxCoord x,
wxCoord y,
bool WXUNUSED ( bTransparent) /*=0*/ )
bool bTransparent /*=0*/ )
{
if( m_graphics_changed )
NewGraphics();
......
......@@ -29,6 +29,13 @@ SCH_ITEM::SCH_ITEM( EDA_ITEM* aParent, KICAD_T aType ) :
}
SCH_ITEM::SCH_ITEM( const SCH_ITEM& aItem ) :
EDA_ITEM( aItem )
{
m_Layer = aItem.m_Layer;
}
SCH_ITEM::~SCH_ITEM()
{
// Do not let the connections container go out of scope with any ojbects or they
......@@ -101,5 +108,5 @@ bool SCH_ITEM::IsConnected( const wxPoint& aPosition ) const
if( m_Flags & STRUCT_DELETED || m_Flags & SKIP_STRUCT )
return false;
return DoIsConnected( aPosition );
return doIsConnected( aPosition );
}
......@@ -115,10 +115,14 @@ set(EESCHEMA_SRCS
operations_on_items_lists.cpp
pinedit.cpp
plot.cpp
sch_bus_entry.cpp
sch_component.cpp
sch_field.cpp
sch_items.cpp
sch_line.cpp
sch_marker.cpp
sch_no_connect.cpp
sch_polyline.cpp
sch_screen.cpp
sch_sheet.cpp
sch_sheet_path.cpp
......
......@@ -16,8 +16,11 @@
#include "class_library.h"
#include "lib_pin.h"
#include "protos.h"
#include "sch_bus_entry.h"
#include "sch_marker.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_text.h"
#include "sch_component.h"
#include "sch_sheet.h"
......
......@@ -14,16 +14,18 @@
#include "lib_pin.h"
#include "general.h"
#include "protos.h"
#include "sch_bus_entry.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_polyline.h"
#include "sch_text.h"
#include "sch_component.h"
#include "sch_sheet.h"
/* Routines Locales */
static void Show_Polyline_in_Ghost( WinEDA_DrawPanel* panel,
wxDC* DC,
bool erase );
static void Show_Polyline_in_Ghost( WinEDA_DrawPanel* panel, wxDC* DC, bool erase );
static void AbortCreateNewLine( WinEDA_DrawPanel* Panel, wxDC* DC );
static bool IsTerminalPoint( SCH_SCREEN* screen, const wxPoint& pos, int layer );
static bool IsJunctionNeeded( SCH_EDIT_FRAME* frame, wxPoint& pos );
......@@ -172,7 +174,7 @@ void SCH_EDIT_FRAME::BeginSegment( wxDC* DC, int type )
if( g_HVLines ) // We need 2 segments to go from a given start pin to an end point
{
nextsegment = newsegment->GenCopy();
nextsegment = new SCH_LINE( *newsegment );
nextsegment->m_Flags = IS_NEW;
newsegment->SetNext( nextsegment );
nextsegment->SetBack( newsegment );
......@@ -220,7 +222,7 @@ void SCH_EDIT_FRAME::BeginSegment( wxDC* DC, int type )
/* Create a new segment, and chain it after the current new segment */
if( nextsegment )
{
newsegment = nextsegment->GenCopy();
newsegment = new SCH_LINE( *nextsegment );
nextsegment->m_Start = newsegment->m_End;
nextsegment->SetNext( NULL );
nextsegment->SetBack( newsegment );
......@@ -229,7 +231,7 @@ void SCH_EDIT_FRAME::BeginSegment( wxDC* DC, int type )
}
else
{
newsegment = oldsegment->GenCopy();
newsegment = new SCH_LINE( *oldsegment );
newsegment->m_Start = oldsegment->m_End;
}
......@@ -332,6 +334,7 @@ void SCH_EDIT_FRAME::EndSegment( wxDC* DC )
if( !g_ItemToRepeat )
g_ItemToRepeat = segment;
}
segment->m_Flags = 0;
segment = segment->Next();
}
......@@ -372,7 +375,6 @@ void SCH_EDIT_FRAME::EndSegment( wxDC* DC )
item = item->Next();
}
DrawPanel->CursorOn( DC ); // Display schematic cursor
SaveCopyInUndoList( s_OldWiresList, UR_WIRE_IMAGE );
......@@ -442,6 +444,7 @@ static void Show_Polyline_in_Ghost( WinEDA_DrawPanel* panel, wxDC* DC, bool eras
GRSetDrawMode( DC, g_XorMode );
int idx = NewPoly->GetCornerCount() - 1;
if( g_HVLines )
{
/* Coerce the line to vertical or horizontal one: */
......@@ -571,111 +574,30 @@ static void AbortCreateNewLine( WinEDA_DrawPanel* Panel, wxDC* DC )
*/
void SCH_EDIT_FRAME::RepeatDrawItem( wxDC* DC )
{
wxPoint new_pos;
if( g_ItemToRepeat == NULL )
return;
switch( g_ItemToRepeat->Type() )
{
case SCH_JUNCTION_T:
#undef STRUCT
#define STRUCT ( (SCH_JUNCTION*) g_ItemToRepeat )
g_ItemToRepeat = STRUCT->GenCopy();
STRUCT->m_Pos += g_RepeatStep;
new_pos = STRUCT->m_Pos;
break;
case SCH_NO_CONNECT_T:
#undef STRUCT
#define STRUCT ( (SCH_NO_CONNECT*) g_ItemToRepeat )
g_ItemToRepeat = STRUCT->GenCopy();
STRUCT->m_Pos += g_RepeatStep;
new_pos = STRUCT->m_Pos;
break;
case SCH_TEXT_T:
#undef STRUCT
#define STRUCT ( (SCH_TEXT*) g_ItemToRepeat )
g_ItemToRepeat = STRUCT->GenCopy();
STRUCT->m_Pos += g_RepeatStep;
new_pos = STRUCT->m_Pos;
IncrementLabelMember( STRUCT->m_Text );
break;
case SCH_LABEL_T:
#undef STRUCT
#define STRUCT ( (SCH_LABEL*) g_ItemToRepeat )
g_ItemToRepeat = STRUCT->GenCopy();
STRUCT->m_Pos += g_RepeatStep;
new_pos = STRUCT->m_Pos;
IncrementLabelMember( STRUCT->m_Text );
break;
case SCH_HIERARCHICAL_LABEL_T:
#undef STRUCT
#define STRUCT ( (SCH_HIERLABEL*) g_ItemToRepeat )
g_ItemToRepeat = STRUCT->GenCopy();
STRUCT->m_Pos += g_RepeatStep;
new_pos = STRUCT->m_Pos;
IncrementLabelMember( STRUCT->m_Text );
break;
case SCH_GLOBAL_LABEL_T:
#undef STRUCT
#define STRUCT ( (SCH_GLOBALLABEL*) g_ItemToRepeat )
g_ItemToRepeat = STRUCT->GenCopy();
STRUCT->m_Pos += g_RepeatStep;
new_pos = STRUCT->m_Pos;
IncrementLabelMember( STRUCT->m_Text );
break;
case SCH_LINE_T:
#undef STRUCT
#define STRUCT ( (SCH_LINE*) g_ItemToRepeat )
g_ItemToRepeat = STRUCT->GenCopy();
STRUCT->m_Start += g_RepeatStep;
new_pos = STRUCT->m_Start;
STRUCT->m_End += g_RepeatStep;
break;
case SCH_BUS_ENTRY_T:
#undef STRUCT
#define STRUCT ( (SCH_BUS_ENTRY*) g_ItemToRepeat )
g_ItemToRepeat = STRUCT->GenCopy();
STRUCT->m_Pos += g_RepeatStep;
new_pos = STRUCT->m_Pos;
break;
case SCH_COMPONENT_T: // In repeat command the new component is put
// in move mode
#undef STRUCT
#define STRUCT ( (SCH_COMPONENT*) g_ItemToRepeat )
// Create the duplicate component, position = mouse cursor
g_ItemToRepeat = STRUCT->GenCopy();
new_pos.x = GetScreen()->m_Curseur.x - STRUCT->m_Pos.x;
new_pos.y = GetScreen()->m_Curseur.y - STRUCT->m_Pos.y;
STRUCT->m_Pos = GetScreen()->m_Curseur;
STRUCT->m_Flags = IS_NEW;
STRUCT->m_TimeStamp = GetTimeStamp();
for( int ii = 0; ii < STRUCT->GetFieldCount(); ii++ )
{
STRUCT->GetField( ii )->m_Pos += new_pos;
}
g_ItemToRepeat = g_ItemToRepeat->Clone();
RedrawOneStruct( DrawPanel, DC, STRUCT, g_XorMode );
StartMovePart( STRUCT, DC );
if( g_ItemToRepeat->Type() == SCH_COMPONENT_T ) // If repeat component then put in move mode
{
wxPoint pos = GetScreen()->m_Curseur - ( (SCH_COMPONENT*) g_ItemToRepeat )->m_Pos;
g_ItemToRepeat->m_Flags = IS_NEW;
( (SCH_COMPONENT*) g_ItemToRepeat )->m_TimeStamp = GetTimeStamp();
g_ItemToRepeat->Move( pos );
RedrawOneStruct( DrawPanel, DC, g_ItemToRepeat, g_XorMode );
StartMovePart( (SCH_COMPONENT*) g_ItemToRepeat, DC );
return;
break;
}
default:
g_ItemToRepeat = NULL;
DisplayError( this, wxT( "Repeat Type Error" ), 10 );
break;
g_ItemToRepeat->Move( wxPoint( g_RepeatStep.GetWidth(), g_RepeatStep.GetHeight() ) );
if( g_ItemToRepeat->Type() == SCH_TEXT_T
|| g_ItemToRepeat->Type() == SCH_LABEL_T
|| g_ItemToRepeat->Type() == SCH_HIERARCHICAL_LABEL_T
|| g_ItemToRepeat->Type() == SCH_GLOBAL_LABEL_T )
{
( (SCH_TEXT*) g_ItemToRepeat )->IncrementLabel();
}
if( g_ItemToRepeat )
......@@ -686,9 +608,6 @@ void SCH_EDIT_FRAME::RepeatDrawItem( wxDC* DC )
RedrawOneStruct( DrawPanel, DC, g_ItemToRepeat, GR_DEFAULT_DRAWMODE );
SaveCopyInUndoList( g_ItemToRepeat, UR_NEW );
g_ItemToRepeat->m_Flags = 0;
// GetScreen()->Curseur = new_pos;
// DrawPanel->MouseTo( DrawPanel->CursorScreenPosition() );
}
}
......@@ -702,6 +621,7 @@ void IncrementLabelMember( wxString& name )
long number = 0;
ii = name.Len() - 1; nn = 0;
if( !isdigit( name.GetChar( ii ) ) )
return;
......@@ -712,6 +632,7 @@ void IncrementLabelMember( wxString& name )
ii++; /* digits are starting at ii position */
wxString litt_number = name.Right( nn );
if( litt_number.ToLong( &number ) )
{
number += g_RepeatDeltaLabel;
......@@ -778,11 +699,13 @@ static bool IsTerminalPoint( SCH_SCREEN* screen, const wxPoint& pos, int layer )
itempos = LibItem->GetScreenCoord( pin->GetPosition() );
itempos.x += LibItem->m_Pos.x;
itempos.y += LibItem->m_Pos.y;
if( ( itempos.x == pos.x ) && ( itempos.y == pos.y ) )
return TRUE;
}
item = PickStruct( pos, screen, WIREITEM );
if( item )
return TRUE;
......
......@@ -13,7 +13,7 @@
#include "general.h"
#include "protos.h"
#include "sch_items.h"
#include "sch_bus_entry.h"
static int s_LastShape = '\\';
......@@ -85,7 +85,7 @@ void SCH_EDIT_FRAME::StartMoveBusEntry( SCH_BUS_ENTRY* BusEntry, wxDC* DC )
if( (BusEntry->m_Flags & IS_NEW) == 0 ) // not already in edit, save shape
{
delete g_ItemToUndoCopy;
g_ItemToUndoCopy = BusEntry->GenCopy();
g_ItemToUndoCopy = BusEntry->Clone();
}
BusEntry->m_Flags |= IS_MOVED;
......
......@@ -12,7 +12,9 @@
#include "general.h"
#include "protos.h"
#include "netlist.h"
#include "sch_bus_entry.h"
#include "sch_items.h"
#include "sch_line.h"
/* Routine to start/end segment (BUS or wires) on junctions.
......@@ -91,11 +93,11 @@ void BreakSegment( SCH_SCREEN* aScreen, wxPoint aBreakpoint )
* Segment connecte: doit etre coupe en 2 si px,py
* n'est
* pas une extremite */
if( ( segment->m_Start == aBreakpoint )
|| ( segment->m_End == aBreakpoint ) )
if( ( segment->m_Start == aBreakpoint ) || ( segment->m_End == aBreakpoint ) )
continue;
/* Here we must cut the segment into 2. */
NewSegment = segment->GenCopy();
NewSegment = new SCH_LINE( *segment );
NewSegment->m_Start = aBreakpoint;
segment->m_End = NewSegment->m_Start;
NewSegment->SetNext( segment->Next() );
......
......@@ -12,6 +12,7 @@
#include "protos.h"
#include "sch_marker.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_sheet.h"
#include "sch_text.h"
......
......@@ -297,7 +297,7 @@ void DIALOG_COLOR_CONFIG::UpdateLayerSettings()
}
void DIALOG_COLOR_CONFIG::OnOkClick( wxCommandEvent& WXUNUSED( event ) )
void DIALOG_COLOR_CONFIG::OnOkClick( wxCommandEvent& event )
{
UpdateLayerSettings();
m_Parent->DrawPanel->Refresh();
......@@ -305,13 +305,13 @@ void DIALOG_COLOR_CONFIG::OnOkClick( wxCommandEvent& WXUNUSED( event ) )
}
void DIALOG_COLOR_CONFIG::OnCancelClick( wxCommandEvent& WXUNUSED( event ) )
void DIALOG_COLOR_CONFIG::OnCancelClick( wxCommandEvent& event )
{
EndModal( -1 );
}
void DIALOG_COLOR_CONFIG::OnApplyClick( wxCommandEvent& WXUNUSED( event ) )
void DIALOG_COLOR_CONFIG::OnApplyClick( wxCommandEvent& event )
{
UpdateLayerSettings();
m_Parent->DrawPanel->Refresh();
......
......@@ -239,7 +239,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnOkClick( wxCommandEvent& event )
}
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::CopyDocToAlias( wxCommandEvent& WXUNUSED (event) )
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::CopyDocToAlias( wxCommandEvent& event )
{
if( m_Parent == NULL )
return;
......@@ -261,7 +261,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::CopyDocToAlias( wxCommandEvent& WXUNUSED
}
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllAliasOfPart( wxCommandEvent& WXUNUSED (event) )
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllAliasOfPart( wxCommandEvent& event )
{
if( m_PartAliasListCtrl->FindString( m_Parent->GetAliasName() ) != wxNOT_FOUND )
{
......@@ -284,7 +284,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllAliasOfPart( wxCommandEvent& WXU
/* Add a new name to the alias list box
* New name cannot be the root name, and must not exists
*/
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddAliasOfPart( wxCommandEvent& WXUNUSED (event) )
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddAliasOfPart( wxCommandEvent& event )
{
wxString aliasname;
LIB_COMPONENT* component = m_Parent->GetComponent();
......@@ -324,7 +324,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddAliasOfPart( wxCommandEvent& WXUNUSED
}
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAliasOfPart( wxCommandEvent& WXUNUSED (event) )
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAliasOfPart( wxCommandEvent& event )
{
wxString aliasname = m_PartAliasListCtrl->GetStringSelection();
......@@ -444,7 +444,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::BrowseAndSelectDocFile( wxCommandEvent& e
}
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllFootprintFilter( wxCommandEvent& WXUNUSED (event) )
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllFootprintFilter( wxCommandEvent& event )
{
if( IsOK( this, _( "Ok to Delete FootprintFilter LIST" ) ) )
{
......@@ -458,7 +458,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllFootprintFilter( wxCommandEvent&
/* Add a new name to the footprint filter list box
* Obvioulsy, cannot be void
*/
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddFootprintFilter( wxCommandEvent& WXUNUSED (event) )
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddFootprintFilter( wxCommandEvent& event )
{
wxString Line;
LIB_COMPONENT* component = m_Parent->GetComponent();
......@@ -494,7 +494,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddFootprintFilter( wxCommandEvent& WXUNU
}
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteOneFootprintFilter( wxCommandEvent& WXUNUSED( event ) )
void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteOneFootprintFilter( wxCommandEvent& event )
{
LIB_COMPONENT* component = m_Parent->GetComponent();
int ii = m_FootprintFilterListBox->GetSelection();
......
......@@ -42,7 +42,7 @@ void SCH_EDIT_FRAME::StartMoveCmpField( SCH_FIELD* aField, wxDC* DC )
SCH_COMPONENT* comp = (SCH_COMPONENT*) aField->GetParent();
SAFE_DELETE( g_ItemToUndoCopy );
g_ItemToUndoCopy = comp->GenCopy();
g_ItemToUndoCopy = new SCH_COMPONENT( *comp );
pos = comp->m_Pos;
......
......@@ -41,7 +41,7 @@ void SCH_EDIT_FRAME::StartMoveTexte( SCH_TEXT* TextStruct, wxDC* DC )
if( (TextStruct->m_Flags & IS_NEW) == 0 )
{
delete g_ItemToUndoCopy;
g_ItemToUndoCopy = TextStruct->GenCopy();
g_ItemToUndoCopy = TextStruct->Clone();
}
TextStruct->m_Flags |= IS_MOVED;
......
......@@ -14,10 +14,14 @@
#include "general.h"
#include "protos.h"
#include "class_library.h"
#include "sch_sheet.h"
#include "sch_sheet_path.h"
#include "sch_bus_entry.h"
#include "sch_component.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_polyline.h"
#include "sch_sheet.h"
#include "sch_sheet_path.h"
#include "build_version.h"
......@@ -185,8 +189,8 @@ void DrawStructsInGhost( WinEDA_DrawPanel* aPanel,
case SCH_POLYLINE_T:
{
SCH_POLYLINE* Struct = (SCH_POLYLINE*) aItem;
GRMoveTo( Struct->m_PolyPoints[0].x + aOffset.x,
Struct->m_PolyPoints[0].y + aOffset.y );
GRMoveTo( Struct->m_PolyPoints[0].x + aOffset.x, Struct->m_PolyPoints[0].y + aOffset.y );
for( unsigned ii = 1; ii < Struct->GetCornerCount(); ii++ )
GRLineTo( &aPanel->m_ClipBox,
aDC,
......@@ -202,15 +206,16 @@ void DrawStructsInGhost( WinEDA_DrawPanel* aPanel,
{
SCH_LINE* Struct;
Struct = (SCH_LINE*) aItem;
if( (Struct->m_Flags & STARTPOINT) == 0 )
{
GRMoveTo( Struct->m_Start.x + aOffset.x,
Struct->m_Start.y + aOffset.y );
GRMoveTo( Struct->m_Start.x + aOffset.x, Struct->m_Start.y + aOffset.y );
}
else
{
GRMoveTo( Struct->m_Start.x, Struct->m_Start.y );
}
if( (Struct->m_Flags & ENDPOINT) == 0 )
{
GRLineTo( &aPanel->m_ClipBox, aDC, Struct->m_End.x + aOffset.x,
......
......@@ -34,7 +34,7 @@ void SCH_EDIT_FRAME::OnCopySchematicItemRequest( wxCommandEvent& event )
case SCH_COMPONENT_T:
{
SCH_COMPONENT* newitem;
newitem = ((SCH_COMPONENT*) curr_item)->GenCopy();
newitem = new SCH_COMPONENT( *( (SCH_COMPONENT*) curr_item ) );
newitem->m_TimeStamp = GetTimeStamp();
newitem->ClearAnnotation( NULL );
newitem->m_Flags = IS_NEW;
......@@ -51,7 +51,7 @@ void SCH_EDIT_FRAME::OnCopySchematicItemRequest( wxCommandEvent& event )
case SCH_GLOBAL_LABEL_T:
case SCH_HIERARCHICAL_LABEL_T:
{
SCH_TEXT* newitem = ((SCH_TEXT*) curr_item)->GenCopy();
SCH_TEXT* newitem = (SCH_TEXT*) curr_item->Clone();
newitem->m_Flags = IS_NEW;
StartMoveTexte( newitem, &dc );
/* Redraw the original part in XOR mode */
......
......@@ -420,7 +420,8 @@ void SCH_EDIT_FRAME::StartMovePart( SCH_COMPONENT* Component, wxDC* DC )
{
SAFE_DELETE( g_ItemToUndoCopy );
}
g_ItemToUndoCopy = Component->GenCopy();
g_ItemToUndoCopy = Component->Clone();
}
DrawPanel->CursorOff( DC );
......
......@@ -13,6 +13,7 @@
#include "libeditframe.h"
#include "class_libentry.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_component.h"
#include "sch_sheet.h"
......@@ -510,8 +511,10 @@ void SCH_EDIT_FRAME::OnHotKey( wxDC* DC, int hotkey, EDA_ITEM* DrawStruct )
if( DrawStruct->Type() == SCH_LINE_T )
{
SCH_LINE* segment = (SCH_LINE*) DrawStruct;
if( segment->GetLayer() != LAYER_BUS )
break;
// Bus in progress:
OnLeftClick( DC, MousePos );
}
......
......@@ -11,9 +11,13 @@
#include "general.h"
#include "protos.h"
#include "sch_bus_entry.h"
#include "sch_marker.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_component.h"
#include "sch_polyline.h"
#include "sch_text.h"
#include "sch_sheet.h"
......
......@@ -11,9 +11,13 @@
#include "general.h"
#include "protos.h"
#include "class_library.h"
#include "sch_bus_entry.h"
#include "sch_marker.h"
#include "sch_items.h"
#include "sch_component.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_polyline.h"
#include "sch_sheet.h"
#include "lib_pin.h"
#include "template_fieldnames.h"
......
......@@ -14,6 +14,8 @@
#include "lib_pin.h"
#include "sch_items.h"
#include "sch_component.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_text.h"
#include "sch_sheet.h"
......
......@@ -12,9 +12,12 @@
#include "general.h"
#include "protos.h"
#include "sch_bus_entry.h"
#include "sch_text.h"
#include "sch_marker.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_component.h"
#include "sch_sheet.h"
......
......@@ -15,10 +15,13 @@
#include "protos.h"
#include "hotkeys.h"
#include "class_library.h"
#include "sch_bus_entry.h"
#include "sch_marker.h"
#include "sch_text.h"
#include "sch_items.h"
#include "sch_component.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_sheet.h"
#include "sch_sheet_path.h"
......
......@@ -13,7 +13,11 @@
#include "general.h"
#include "protos.h"
#include "sch_bus_entry.h"
#include "sch_marker.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_polyline.h"
#include "sch_sheet.h"
#include "sch_component.h"
#include "sch_items.h"
......@@ -30,8 +34,7 @@ void RotateListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& rotationPoint )
}
void DeleteItemsInList( WinEDA_DrawPanel* panel,
PICKED_ITEMS_LIST& aItemsList );
void DeleteItemsInList( WinEDA_DrawPanel* panel, PICKED_ITEMS_LIST& aItemsList );
void DuplicateItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList,
const wxPoint aMoveVector );
......@@ -95,8 +98,7 @@ void DeleteItemsInList( WinEDA_DrawPanel* panel, PICKED_ITEMS_LIST& aItemsList )
if( item->Type() == SCH_SHEET_LABEL_T )
{
/* this item is depending on a sheet, and is not in global list */
wxMessageBox( wxT("DeleteItemsInList() err: unexpected \
SCH_SHEET_LABEL_T" ) );
wxMessageBox( wxT( "DeleteItemsInList() err: unexpected SCH_SHEET_LABEL_T" ) );
}
else
{
......@@ -218,82 +220,15 @@ void DuplicateItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList,
*/
SCH_ITEM* DuplicateStruct( SCH_ITEM* aDrawStruct, bool aClone )
{
SCH_ITEM* NewDrawStruct = NULL;
wxCHECK_MSG( aDrawStruct != NULL, NULL,
wxT( "Cannot duplicate NULL schematic item! Bad programmer." ) );
if( aDrawStruct == NULL )
{
wxMessageBox( wxT( "DuplicateStruct error: NULL struct" ) );
return NULL;
}
switch( aDrawStruct->Type() )
{
case SCH_POLYLINE_T:
NewDrawStruct = ( (SCH_POLYLINE*) aDrawStruct )->GenCopy();
break;
case SCH_LINE_T:
NewDrawStruct = ( (SCH_LINE*) aDrawStruct )->GenCopy();
break;
case SCH_BUS_ENTRY_T:
NewDrawStruct = ( (SCH_BUS_ENTRY*) aDrawStruct )->GenCopy();
break;
case SCH_JUNCTION_T:
NewDrawStruct = ( (SCH_JUNCTION*) aDrawStruct )->GenCopy();
break;
case SCH_MARKER_T:
NewDrawStruct = ( (SCH_MARKER*) aDrawStruct )->GenCopy();
break;
case SCH_NO_CONNECT_T:
NewDrawStruct = ( (SCH_NO_CONNECT*) aDrawStruct )->GenCopy();
break;
case SCH_TEXT_T:
NewDrawStruct = ( (SCH_TEXT*) aDrawStruct )->GenCopy();
break;
case SCH_LABEL_T:
NewDrawStruct = ( (SCH_LABEL*) aDrawStruct )->GenCopy();
break;
case SCH_HIERARCHICAL_LABEL_T:
NewDrawStruct = ( (SCH_HIERLABEL*) aDrawStruct )->GenCopy();
break;
case SCH_GLOBAL_LABEL_T:
NewDrawStruct = ( (SCH_GLOBALLABEL*) aDrawStruct )->GenCopy();
break;
case SCH_COMPONENT_T:
NewDrawStruct = ( (SCH_COMPONENT*) aDrawStruct )->GenCopy();
break;
case SCH_SHEET_T:
NewDrawStruct = ( (SCH_SHEET*) aDrawStruct )->GenCopy();
if( aClone )
{
( (SCH_SHEET*) NewDrawStruct )->m_SheetName =
( (SCH_SHEET*) aDrawStruct )->m_SheetName;
}
break;
default:
{
wxString msg;
msg << wxT( "DuplicateStruct error: unexpected StructType " )
<< aDrawStruct->Type() << wxT( " " ) << aDrawStruct->GetClass();
wxMessageBox( msg );
}
break;
}
SCH_ITEM* NewDrawStruct = aDrawStruct->Clone();
if( aClone )
NewDrawStruct->m_TimeStamp = aDrawStruct->m_TimeStamp;
NewDrawStruct->m_Image = aDrawStruct;
return NewDrawStruct;
}
......@@ -14,7 +14,10 @@
#include "protos.h"
#include "class_library.h"
#include "lib_pin.h"
#include "sch_bus_entry.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_component.h"
#include "sch_sheet.h"
#include "sch_text.h"
......
/***********************/
/* class SCH_BUS_ENTRY */
/***********************/
#include "fctsys.h"
#include "gr_basic.h"
#include "macros.h"
#include "class_drawpanel.h"
#include "trigo.h"
#include "common.h"
#include "richio.h"
#include "general.h"
#include "protos.h"
#include "sch_bus_entry.h"
SCH_BUS_ENTRY::SCH_BUS_ENTRY( const wxPoint& pos, int shape, int id ) :
SCH_ITEM( NULL, SCH_BUS_ENTRY_T )
{
m_Pos = pos;
m_Size.x = 100;
m_Size.y = 100;
m_Layer = LAYER_WIRE;
m_Width = 0;
if( id == BUS_TO_BUS )
{
m_Layer = LAYER_BUS;
}
if( shape == '/' )
m_Size.y = -100;
}
SCH_BUS_ENTRY::SCH_BUS_ENTRY( const SCH_BUS_ENTRY& aBusEntry ) :
SCH_ITEM( aBusEntry )
{
m_Pos = aBusEntry.m_Pos;
m_Size = aBusEntry.m_Size;
m_Width = aBusEntry.m_Width;
}
EDA_ITEM* SCH_BUS_ENTRY::doClone() const
{
return new SCH_BUS_ENTRY( *this );
}
wxPoint SCH_BUS_ENTRY::m_End() const
{
return wxPoint( m_Pos.x + m_Size.x, m_Pos.y + m_Size.y );
}
bool SCH_BUS_ENTRY::Save( FILE* aFile ) const
{
bool success = true;
const char* layer = "Wire";
const char* width = "Line";
if( GetLayer() == LAYER_BUS )
{
layer = "Bus"; width = "Bus";
}
if( fprintf( aFile, "Entry %s %s\n", layer, width ) == EOF )
{
success = false;
}
if( fprintf( aFile, "\t%-4d %-4d %-4d %-4d\n",
m_Pos.x, m_Pos.y, m_End().x, m_End().y ) == EOF )
{
success = false;
}
return success;
}
bool SCH_BUS_ENTRY::Load( LINE_READER& aLine, wxString& aErrorMsg )
{
char Name1[256];
char Name2[256];
char* line = (char*) aLine;
while( (*line != ' ' ) && *line )
line++;
if( sscanf( line, "%s %s", Name1, Name2 ) != 2 )
{
aErrorMsg.Printf( wxT( "EESchema file bus entry load error at line %d" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
m_Layer = LAYER_WIRE;
if( Name1[0] == 'B' )
m_Layer = LAYER_BUS;
if( !aLine.ReadLine() || sscanf( (char*) aLine, "%d %d %d %d ", &m_Pos.x, &m_Pos.y,
&m_Size.x, &m_Size.y ) != 4 )
{
aErrorMsg.Printf( wxT( "EESchema file bus entry load error at line %d" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
m_Size.x -= m_Pos.x;
m_Size.y -= m_Pos.y;
return true;
}
EDA_Rect SCH_BUS_ENTRY::GetBoundingBox() const
{
EDA_Rect box;
box.SetOrigin( m_Pos );
box.SetEnd( m_End() );
box.Normalize();
int width = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width;
box.Inflate( width / 2 );
return box;
}
int SCH_BUS_ENTRY::GetPenSize() const
{
int pensize = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width;
if( m_Layer == LAYER_BUS && m_Width == 0 )
{
pensize = wxRound( g_DrawDefaultLineThickness * BUS_WIDTH_EXPAND );
pensize = MAX( pensize, 3 );
}
return pensize;
}
void SCH_BUS_ENTRY::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor )
{
int color;
if( aColor >= 0 )
color = aColor;
else
color = ReturnLayerColor( m_Layer );
GRSetDrawMode( aDC, aDrawMode );
GRLine( &aPanel->m_ClipBox, aDC, m_Pos.x + aOffset.x, m_Pos.y + aOffset.y,
m_End().x + aOffset.x, m_End().y + aOffset.y, GetPenSize(), color );
}
void SCH_BUS_ENTRY::Mirror_X( int aXaxis_position )
{
m_Pos.y -= aXaxis_position;
NEGATE( m_Pos.y );
m_Pos.y += aXaxis_position;
NEGATE( m_Size.y );
}
void SCH_BUS_ENTRY::Mirror_Y( int aYaxis_position )
{
m_Pos.x -= aYaxis_position;
NEGATE( m_Pos.x );
m_Pos.x += aYaxis_position;
NEGATE( m_Size.x );
}
void SCH_BUS_ENTRY::Rotate( wxPoint rotationPoint )
{
RotatePoint( &m_Pos, rotationPoint, 900 );
RotatePoint( &m_Size.x, &m_Size.y, 900 );
}
void SCH_BUS_ENTRY::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList )
{
DANGLING_END_ITEM item( ENTRY_END, this );
item.m_Pos = m_Pos;
DANGLING_END_ITEM item1( ENTRY_END, this );
item1.m_Pos = m_End();
aItemList.push_back( item );
aItemList.push_back( item1 );
}
bool SCH_BUS_ENTRY::IsSelectStateChanged( const wxRect& aRect )
{
bool previousState = IsSelected();
// If either end of the bus entry is inside the selection rectangle, the entire
// bus entry is selected. Bus entries have a fixed length and angle.
if( aRect.Contains( m_Pos ) || aRect.Contains( m_End() ) )
m_Flags |= SELECTED;
else
m_Flags &= ~SELECTED;
return previousState != IsSelected();
}
void SCH_BUS_ENTRY::GetConnectionPoints( vector< wxPoint >& aPoints ) const
{
aPoints.push_back( m_Pos );
aPoints.push_back( m_End() );
}
bool SCH_BUS_ENTRY::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & BUS_ENTRY_T ) )
return false;
return TestSegmentHit( aPoint, m_Pos, m_End(), aAccuracy );
}
bool SCH_BUS_ENTRY::doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
rect.Inflate( aAccuracy );
if( aContained )
return rect.Contains( GetBoundingBox() );
return rect.Intersects( GetBoundingBox() );
}
/**
* @file sch_bus_entry.h
*
*/
#ifndef _SCH_BUS_ENTRY_H_
#define _SCH_BUS_ENTRY_H_
#include "sch_item_struct.h"
/* Flags for BUS ENTRY (bus to bus or wire to bus */
#define WIRE_TO_BUS 0
#define BUS_TO_BUS 1
/**
* Class SCH_BUS_ENTRY
*
* Defines a bus or wire entry.
*/
class SCH_BUS_ENTRY : public SCH_ITEM
{
public:
int m_Width;
wxPoint m_Pos;
wxSize m_Size;
public:
SCH_BUS_ENTRY( const wxPoint& pos = wxPoint( 0, 0 ), int shape = '\\', int id = WIRE_TO_BUS );
SCH_BUS_ENTRY( const SCH_BUS_ENTRY& aBusEntry );
~SCH_BUS_ENTRY() { }
virtual wxString GetClass() const
{
return wxT( "SCH_BUS_ENTRY" );
}
wxPoint m_End() const;
virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor = -1 );
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch"
* format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool Save( FILE* aFile ) const;
/**
* Load schematic bus entry from \a aLine in a .sch file.
*
* @param aLine - Essentially this is file to read schematic bus entry from.
* @param aErrorMsg - Description of the error if an error occurs while loading the
* schematic bus entry.
* @return True if the schematic bus entry loaded successfully.
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function GetBoundingBox
* returns the orthogonal, bounding box of this object for display
* purposes. This box should be an enclosing perimeter for visible
* components of this object, and the units should be in the pcb or
* schematic coordinate system. It is OK to overestimate the size
* by a few counts.
*/
EDA_Rect GetBoundingBox() const;
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
virtual int GetPenSize() const;
/**
* Function Move
* moves and item to a new position by \a aMoveVector.
* @param aMoveVector The displacement vector.
*/
virtual void Move( const wxPoint& aMoveVector )
{
m_Pos += aMoveVector;
}
/**
* Function Mirror_Y
* mirrors the item relative to \a aYaxis_position.
* @param aYaxis_position The Y axis coordinate to mirror around.
*/
virtual void Mirror_Y( int aYaxis_position );
virtual void Mirror_X( int aXaxis_position );
virtual void Rotate( wxPoint rotationPoint );
virtual void GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList );
virtual bool IsSelectStateChanged( const wxRect& aRect );
virtual void GetConnectionPoints( vector< wxPoint >& aPoints ) const;
private:
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual EDA_ITEM* doClone() const;
};
#endif // _SCH_BUS_ENTRY_H_
......@@ -130,20 +130,21 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_COMPONENT& libComponent, SCH_SHEET_PATH* sheet
}
SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aTemplate ) :
SCH_ITEM( NULL, SCH_COMPONENT_T )
SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aComponent ) :
SCH_ITEM( aComponent )
{
/* assignment of all fields, including field vector elements, and linked
* list pointers */
*this = aTemplate;
/* set linked list pointers to null, before this they were copies of
* aTemplate's */
Pback = NULL;
Pnext = NULL;
m_Son = NULL;
// Re-parent the fields, which before this had aTemplate as parent
m_Parent = aComponent.m_Parent;
m_Pos = aComponent.m_Pos;
m_unit = aComponent.m_unit;
m_convert = aComponent.m_convert;
m_ChipName = aComponent.m_ChipName;
m_TimeStamp = aComponent.m_TimeStamp;
m_transform = aComponent.m_transform;
m_prefix = aComponent.m_prefix;
m_PathsAndReferences = aComponent.m_PathsAndReferences;
m_Fields = aComponent.m_Fields;
// Re-parent the fields, which before this had aComponent as parent
for( int i = 0; i<GetFieldCount(); ++i )
{
GetField( i )->SetParent( this );
......@@ -180,6 +181,12 @@ void SCH_COMPONENT::Init( const wxPoint& pos )
}
EDA_ITEM* SCH_COMPONENT::doClone() const
{
return new SCH_COMPONENT( *this );
}
void SCH_COMPONENT::SetLibName( const wxString& aName )
{
if( m_ChipName != aName )
......@@ -273,18 +280,18 @@ void SCH_COMPONENT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offs
{
EDA_Rect BoundaryBox;
BoundaryBox = GetBoundingBox();
GRRect( &panel->m_ClipBox, DC, BoundaryBox, BROWN );
GRRect( &panel->m_ClipBox, DC, BoundaryBox, 0, BROWN );
#if 1
if( GetField( REFERENCE )->IsVisible() )
{
BoundaryBox = GetField( REFERENCE )->GetBoundingBox();
GRRect( &panel->m_ClipBox, DC, BoundaryBox, BROWN );
GRRect( &panel->m_ClipBox, DC, BoundaryBox, 0, BROWN );
}
if( GetField( VALUE )->IsVisible() )
{
BoundaryBox = GetField( VALUE )->GetBoundingBox();
GRRect( &panel->m_ClipBox, DC, BoundaryBox, BROWN );
GRRect( &panel->m_ClipBox, DC, BoundaryBox, 0, BROWN );
}
#endif
}
......@@ -1367,6 +1374,7 @@ EDA_Rect SCH_COMPONENT::GetBodyBoundingBox() const
// H and W must be > 0:
if( x2 < x1 )
EXCHG( x2, x1 );
if( y2 < y1 )
EXCHG( y2, y1 );
......@@ -1649,7 +1657,7 @@ LIB_DRAW_ITEM* SCH_COMPONENT::GetDrawItem( const wxPoint& aPosition, KICAD_T aTy
}
bool SCH_COMPONENT::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
bool SCH_COMPONENT::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
EDA_Rect bBox;
......@@ -1682,7 +1690,7 @@ bool SCH_COMPONENT::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_
}
bool SCH_COMPONENT::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
bool SCH_COMPONENT::doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
......@@ -1695,7 +1703,7 @@ bool SCH_COMPONENT::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccu
}
bool SCH_COMPONENT::DoIsConnected( const wxPoint& aPosition ) const
bool SCH_COMPONENT::doIsConnected( const wxPoint& aPosition ) const
{
vector< wxPoint > pts;
......
......@@ -60,14 +60,11 @@ class SCH_COMPONENT : public SCH_ITEM
TRANSFORM m_transform; ///< The rotation/mirror transformation matrix.
SCH_FIELDS m_Fields; ///< Variable length list of fields.
/* Hierarchical references.
* format is
* path reference multi
* with:
* path = /<timestamp1>/<timestamp2> (subsheet path, = / for the root sheet)
* reference = reference for this path (C23, R5, U78 ... )
* multi = part selection in multi parts per package (0 or 1 for one part
* per package)
/**
* Defines the hierarchical path and reference of the component. This allowa support
* for hierarchical sheets that reference the same schematic. The foramt for the path
* is /&ltsheet time stamp&gt/&ltsheet time stamp&gt/... A single / denotes the root
* sheet.
*/
wxArrayString m_PathsAndReferences;
......@@ -103,12 +100,12 @@ public:
/**
* Copy Constructor
* clones \a aTemplate into this object. All fields are copied as is except
* clones \a aComponent into a new object. All fields are copied as is except
* for the linked list management pointers which are set to NULL, and the
* SCH_FIELD's m_Parent pointers which are set to the new parent,
* i.e. this new object.
*/
SCH_COMPONENT( const SCH_COMPONENT& aTemplate );
SCH_COMPONENT( const SCH_COMPONENT& aComponent );
~SCH_COMPONENT() { }
......@@ -152,16 +149,6 @@ public:
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function GenCopy
* returns a copy of this object but with the linked list pointers set to NULL.
* @return SCH_COMPONENT* - a copy of me.
*/
SCH_COMPONENT* GenCopy() const
{
return new SCH_COMPONENT( *this );
}
/**
* Function SetOrientation
* computes the new transform matrix based on \a aOrientation for the component which is
......@@ -260,7 +247,6 @@ public:
m_Fields = aFields; // vector copying, length is changed possibly
}
//-----</Fields>----------------------------------------------------------
/**
......@@ -409,9 +395,10 @@ public:
#endif
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual bool DoIsConnected( const wxPoint& aPosition ) const;
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual bool doIsConnected( const wxPoint& aPosition ) const;
virtual EDA_ITEM* doClone() const;
};
......
......@@ -29,8 +29,7 @@
#include "template_fieldnames.h"
SCH_FIELD::SCH_FIELD( const wxPoint& aPos, int aFieldId,
SCH_COMPONENT* aParent, wxString aName ) :
SCH_FIELD::SCH_FIELD( const wxPoint& aPos, int aFieldId, SCH_COMPONENT* aParent, wxString aName ) :
SCH_ITEM( aParent, SCH_FIELD_T ),
EDA_TextStruct()
{
......@@ -44,15 +43,27 @@ SCH_FIELD::SCH_FIELD( const wxPoint& aPos, int aFieldId,
}
SCH_FIELD::SCH_FIELD( const SCH_FIELD& aField ) :
SCH_ITEM( aField ),
EDA_TextStruct( aField )
{
m_FieldId = aField.m_FieldId;
m_Name = aField.m_Name;
m_AddExtraText = aField.m_AddExtraText;
}
SCH_FIELD::~SCH_FIELD()
{
}
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
EDA_ITEM* SCH_FIELD::doClone() const
{
return new SCH_FIELD( *this );
}
int SCH_FIELD::GetPenSize() const
{
int pensize = m_Thickness;
......@@ -71,9 +82,6 @@ int SCH_FIELD::GetPenSize() const
}
/**
* Draw schematic component fields.
*/
void SCH_FIELD::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
const wxPoint& offset, int DrawMode, int Color )
{
......@@ -103,6 +111,7 @@ void SCH_FIELD::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
/* Calculate the text orientation, according to the component
* orientation/mirror */
orient = m_Orient;
if( parentComponent->GetTransform().y1 ) // Rotate component 90 degrees.
{
if( orient == TEXT_ORIENT_HORIZ )
......@@ -136,9 +145,7 @@ void SCH_FIELD::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
if( !m_AddExtraText || ( m_FieldId != REFERENCE ) )
{
DrawGraphicText( panel, DC, textpos, color, m_Text,
orient,
m_Size, hjustify, vjustify,
DrawGraphicText( panel, DC, textpos, color, m_Text, orient, m_Size, hjustify, vjustify,
LineWidth, m_Italic, m_Bold );
}
else
......@@ -148,9 +155,7 @@ void SCH_FIELD::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
wxString fulltext = m_Text;
fulltext << LIB_COMPONENT::ReturnSubReference( parentComponent->GetUnit() );
DrawGraphicText( panel, DC, textpos, color, fulltext,
orient,
m_Size, hjustify, vjustify,
DrawGraphicText( panel, DC, textpos, color, fulltext, orient, m_Size, hjustify, vjustify,
LineWidth, m_Italic, m_Bold );
}
......@@ -182,13 +187,6 @@ void SCH_FIELD::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
}
/**
* Function ImportValues
* copy parameters from a source.
* Pointers and specific values (position, texts) are not copied
* used to init a field from the model read from a lib entry
* @param aSource = the LIB_FIELD to read
*/
void SCH_FIELD::ImportValues( const LIB_FIELD& aSource )
{
m_Orient = aSource.m_Orient;
......@@ -197,38 +195,29 @@ void SCH_FIELD::ImportValues( const LIB_FIELD& aSource )
m_VJustify = aSource.m_VJustify;
m_Italic = aSource.m_Italic;
m_Bold = aSource.m_Bold;
m_Thickness = aSource.m_Thickness;
m_Thickness = aSource.m_Thickness;
m_Attributs = aSource.m_Attributs;
m_Mirror = aSource.m_Mirror;
}
/**
* Used if undo / redo command:
* swap data between this and copyitem
*/
void SCH_FIELD::SwapData( SCH_FIELD* copyitem )
void SCH_FIELD::SwapData( SCH_FIELD* aField )
{
EXCHG( m_Text, copyitem->m_Text );
EXCHG( m_Layer, copyitem->m_Layer );
EXCHG( m_Pos, copyitem->m_Pos );
EXCHG( m_Size, copyitem->m_Size );
EXCHG( m_Thickness, copyitem->m_Thickness );
EXCHG( m_Orient, copyitem->m_Orient );
EXCHG( m_Mirror, copyitem->m_Mirror );
EXCHG( m_Attributs, copyitem->m_Attributs );
EXCHG( m_Italic, copyitem->m_Italic );
EXCHG( m_Bold, copyitem->m_Bold );
EXCHG( m_HJustify, copyitem->m_HJustify );
EXCHG( m_VJustify, copyitem->m_VJustify );
EXCHG( m_Text, aField->m_Text );
EXCHG( m_Layer, aField->m_Layer );
EXCHG( m_Pos, aField->m_Pos );
EXCHG( m_Size, aField->m_Size );
EXCHG( m_Thickness, aField->m_Thickness );
EXCHG( m_Orient, aField->m_Orient );
EXCHG( m_Mirror, aField->m_Mirror );
EXCHG( m_Attributs, aField->m_Attributs );
EXCHG( m_Italic, aField->m_Italic );
EXCHG( m_Bold, aField->m_Bold );
EXCHG( m_HJustify, aField->m_HJustify );
EXCHG( m_VJustify, aField->m_VJustify );
}
/**
* Function GetBoundaryBox
* @return an EDA_Rect contains the real (user coordinates) boundary box for a text field.
* according to the component position, rotation, mirror ...
*/
EDA_Rect SCH_FIELD::GetBoundingBox() const
{
EDA_Rect BoundaryBox;
......@@ -459,7 +448,7 @@ void SCH_FIELD::Rotate( wxPoint rotationPoint )
}
bool SCH_FIELD::DoHitTest( const wxPoint& aPoint, int aAccuracy ) const
bool SCH_FIELD::doHitTest( const wxPoint& aPoint, int aAccuracy ) const
{
// Do not hit test hidden fields.
if( !IsVisible() )
......@@ -473,7 +462,7 @@ bool SCH_FIELD::DoHitTest( const wxPoint& aPoint, int aAccuracy ) const
}
bool SCH_FIELD::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
bool SCH_FIELD::doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
// Do not hit test hidden fields.
if( !IsVisible() )
......
......@@ -5,14 +5,6 @@
#ifndef CLASS_SCH_FIELD_H
#define CLASS_SCH_FIELD_H
/* Fields are texts attached to a component, having a special meaning
* Fields 0 and 1 are very important: reference and value
* Field 2 is used as default footprint name.
* Field 3 is reserved (not currently used
* Fields 4 and more are user fields.
* They can be renamed and can appear in reports
*/
#include "sch_item_struct.h"
#include "general.h"
......@@ -25,11 +17,16 @@ class LIB_FIELD;
/**
* Class SCH_FIELD
* instances are attached to a component and provide a place for the
* component's value,
* reference designator, footprint, and user definable name-value pairs of
* arbitrary purpose.
* instances are attached to a component and provide a place for the component's value,
* reference designator, footprint, and user definable name-value pairs of arbitrary purpose.
*
* <ul> <li>Field 0 is reserved for the component reference.</li>
* <li>Field 1 is reserved for the component value.</li>
* <li>Field 2 is reserved for the component footprint.</li>
* <li>Field 3 is reserved for the component data sheet file.</li>
* <li>Fields 4 and higher are user defineable.</li></ul>
*/
class SCH_FIELD : public SCH_ITEM, public EDA_TextStruct
{
public:
......@@ -44,6 +41,8 @@ public:
SCH_FIELD( const wxPoint& aPos, int aFieldId, SCH_COMPONENT* aParent,
wxString aName = wxEmptyString );
SCH_FIELD( const SCH_FIELD& aField );
~SCH_FIELD();
virtual wxString GetClass() const
......@@ -66,8 +65,13 @@ public:
return len == 0 || ( len == 1 && m_Text[0] == wxChar( '~' ) );
}
void SwapData( SCH_FIELD* copyitem );
/**
* Function SwapData
* exchanges the date between the field and \a aField.
*
* @param aField The field to exchange data with.
*/
void SwapData( SCH_FIELD* aField );
/**
* Function ImportValues
......@@ -160,8 +164,9 @@ public:
void* aAuxData, wxPoint * aFindLocation );
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy ) const;
virtual bool DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy ) const;
virtual bool doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual EDA_ITEM* doClone() const;
};
......
......@@ -14,265 +14,13 @@
#include "protos.h"
#include "sch_items.h"
#include <boost/foreach.hpp>
/* used to calculate the pen size from default value
* the actual pen size is default value * BUS_WIDTH_EXPAND
*/
#if defined(KICAD_GOST)
#define BUS_WIDTH_EXPAND 3.6
#else
#define BUS_WIDTH_EXPAND 1.4
#endif
/***********************/
/* class SCH_BUS_ENTRY */
/***********************/
SCH_BUS_ENTRY::SCH_BUS_ENTRY( const wxPoint& pos, int shape, int id ) :
SCH_ITEM( NULL, SCH_BUS_ENTRY_T )
{
m_Pos = pos;
m_Size.x = 100;
m_Size.y = 100;
m_Layer = LAYER_WIRE;
m_Width = 0;
if( id == BUS_TO_BUS )
{
m_Layer = LAYER_BUS;
}
if( shape == '/' )
m_Size.y = -100;
}
wxPoint SCH_BUS_ENTRY::m_End() const
{
return wxPoint( m_Pos.x + m_Size.x, m_Pos.y + m_Size.y );
}
SCH_BUS_ENTRY* SCH_BUS_ENTRY::GenCopy()
{
SCH_BUS_ENTRY* newitem = new SCH_BUS_ENTRY( m_Pos, 0, 0 );
newitem->m_Layer = m_Layer;
newitem->m_Width = m_Width;
newitem->m_Size = m_Size;
newitem->m_Flags = m_Flags;
return newitem;
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool SCH_BUS_ENTRY::Save( FILE* aFile ) const
{
bool success = true;
const char* layer = "Wire";
const char* width = "Line";
if( GetLayer() == LAYER_BUS )
{
layer = "Bus"; width = "Bus";
}
if( fprintf( aFile, "Entry %s %s\n", layer, width ) == EOF )
{
success = false;
}
if( fprintf( aFile, "\t%-4d %-4d %-4d %-4d\n",
m_Pos.x, m_Pos.y, m_End().x, m_End().y ) == EOF )
{
success = false;
}
return success;
}
bool SCH_BUS_ENTRY::Load( LINE_READER& aLine, wxString& aErrorMsg )
{
char Name1[256];
char Name2[256];
char* line = (char*) aLine;
while( (*line != ' ' ) && *line )
line++;
if( sscanf( line, "%s %s", Name1, Name2 ) != 2 )
{
aErrorMsg.Printf( wxT( "EESchema file bus entry load error at line %d" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
m_Layer = LAYER_WIRE;
if( Name1[0] == 'B' )
m_Layer = LAYER_BUS;
if( !aLine.ReadLine() || sscanf( (char*) aLine, "%d %d %d %d ", &m_Pos.x, &m_Pos.y,
&m_Size.x, &m_Size.y ) != 4 )
{
aErrorMsg.Printf( wxT( "EESchema file bus entry load error at line %d" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
m_Size.x -= m_Pos.x;
m_Size.y -= m_Pos.y;
return true;
}
EDA_Rect SCH_BUS_ENTRY::GetBoundingBox() const
{
EDA_Rect box;
box.SetOrigin( m_Pos );
box.SetEnd( m_End() );
box.Normalize();
int width = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width;
box.Inflate( width / 2 );
return box;
}
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
int SCH_BUS_ENTRY::GetPenSize() const
{
int pensize = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width;
if( m_Layer == LAYER_BUS && m_Width == 0 )
{
pensize = wxRound( g_DrawDefaultLineThickness * BUS_WIDTH_EXPAND );
pensize = MAX( pensize, 3 );
}
return pensize;
}
void SCH_BUS_ENTRY::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
const wxPoint& offset, int DrawMode, int Color )
{
int color;
if( Color >= 0 )
color = Color;
else
color = ReturnLayerColor( m_Layer );
GRSetDrawMode( DC, DrawMode );
GRLine( &panel->m_ClipBox, DC, m_Pos.x + offset.x, m_Pos.y + offset.y,
m_End().x + offset.x, m_End().y + offset.y, GetPenSize(), color );
}
void SCH_BUS_ENTRY::Mirror_X( int aXaxis_position )
{
m_Pos.y -= aXaxis_position;
NEGATE( m_Pos.y );
m_Pos.y += aXaxis_position;
NEGATE( m_Size.y );
}
void SCH_BUS_ENTRY::Mirror_Y( int aYaxis_position )
{
m_Pos.x -= aYaxis_position;
NEGATE( m_Pos.x );
m_Pos.x += aYaxis_position;
NEGATE( m_Size.x );
}
void SCH_BUS_ENTRY::Rotate( wxPoint rotationPoint )
{
RotatePoint( &m_Pos, rotationPoint, 900 );
RotatePoint( &m_Size.x, &m_Size.y, 900 );
}
void SCH_BUS_ENTRY::GetEndPoints( std::vector< DANGLING_END_ITEM >& aItemList )
{
DANGLING_END_ITEM item( ENTRY_END, this );
item.m_Pos = m_Pos;
DANGLING_END_ITEM item1( ENTRY_END, this );
item1.m_Pos = m_End();
aItemList.push_back( item );
aItemList.push_back( item1 );
}
bool SCH_BUS_ENTRY::IsSelectStateChanged( const wxRect& aRect )
{
bool previousState = IsSelected();
// If either end of the bus entry is inside the selection rectangle, the entire
// bus entry is selected. Bus entries have a fixed length and angle.
if( aRect.Contains( m_Pos ) || aRect.Contains( m_End() ) )
m_Flags |= SELECTED;
else
m_Flags &= ~SELECTED;
return previousState != IsSelected();
}
void SCH_BUS_ENTRY::GetConnectionPoints( vector< wxPoint >& aPoints ) const
{
aPoints.push_back( m_Pos );
aPoints.push_back( m_End() );
}
bool SCH_BUS_ENTRY::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & BUS_ENTRY_T ) )
return false;
return TestSegmentHit( aPoint, m_Pos, m_End(), aAccuracy );
}
bool SCH_BUS_ENTRY::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
rect.Inflate( aAccuracy );
if( aContained )
return rect.Contains( GetBoundingBox() );
return rect.Intersects( GetBoundingBox() );
}
/**********************/
/* class SCH_JUNCTION */
/**********************/
SCH_JUNCTION::SCH_JUNCTION( const wxPoint& pos ) : SCH_ITEM( NULL, SCH_JUNCTION_T )
SCH_JUNCTION::SCH_JUNCTION( const wxPoint& pos ) :
SCH_ITEM( NULL, SCH_JUNCTION_T )
{
#define DRAWJUNCTION_DIAMETER 32 /* Diameter of junction symbol between wires */
m_Pos = pos;
......@@ -282,6 +30,14 @@ SCH_JUNCTION::SCH_JUNCTION( const wxPoint& pos ) : SCH_ITEM( NULL, SCH_JUNCTION_
}
SCH_JUNCTION::SCH_JUNCTION( const SCH_JUNCTION& aJunction ) :
SCH_ITEM( aJunction )
{
m_Pos = aJunction.m_Pos;
m_Size = aJunction.m_Size;
}
SCH_JUNCTION* SCH_JUNCTION::GenCopy()
{
SCH_JUNCTION* newitem = new SCH_JUNCTION( m_Pos );
......@@ -294,12 +50,6 @@ SCH_JUNCTION* SCH_JUNCTION::GenCopy()
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool SCH_JUNCTION::Save( FILE* aFile ) const
{
bool success = true;
......@@ -313,6 +63,12 @@ bool SCH_JUNCTION::Save( FILE* aFile ) const
}
EDA_ITEM* SCH_JUNCTION::doClone() const
{
return new SCH_JUNCTION( *this );
}
bool SCH_JUNCTION::Load( LINE_READER& aLine, wxString& aErrorMsg )
{
char name[256];
......@@ -344,23 +100,20 @@ EDA_Rect SCH_JUNCTION::GetBoundingBox() const
}
/*****************************************************************************
* Routine to redraw connection struct. *
*****************************************************************************/
void SCH_JUNCTION::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
const wxPoint& offset, int DrawMode, int Color )
void SCH_JUNCTION::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor )
{
int color;
if( Color >= 0 )
color = Color;
if( aColor >= 0 )
color = aColor;
else
color = ReturnLayerColor( m_Layer );
GRSetDrawMode( DC, DrawMode );
GRFilledCircle( &panel->m_ClipBox, DC, m_Pos.x + offset.x,
m_Pos.y + offset.y, (m_Size.x / 2), 0, color,
color );
GRSetDrawMode( aDC, aDrawMode );
GRFilledCircle( &aPanel->m_ClipBox, aDC, m_Pos.x + aOffset.x, m_Pos.y + aOffset.y,
( m_Size.x / 2 ), 0, color, color );
}
......@@ -424,7 +177,7 @@ void SCH_JUNCTION::Show( int nestLevel, std::ostream& os )
#endif
bool SCH_JUNCTION::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
bool SCH_JUNCTION::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & JUNCTION_T ) )
return false;
......@@ -437,7 +190,7 @@ bool SCH_JUNCTION::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T
}
bool SCH_JUNCTION::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
bool SCH_JUNCTION::doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
......@@ -450,835 +203,7 @@ bool SCH_JUNCTION::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccur
}
bool SCH_JUNCTION::DoIsConnected( const wxPoint& aPosition ) const
bool SCH_JUNCTION::doIsConnected( const wxPoint& aPosition ) const
{
return m_Pos == aPosition;
}
/************************/
/* class SCH_NO_CONNECT */
/************************/
SCH_NO_CONNECT::SCH_NO_CONNECT( const wxPoint& pos ) : SCH_ITEM( NULL, SCH_NO_CONNECT_T )
{
#define DRAWNOCONNECT_SIZE 48 /* No symbol connection range. */
m_Pos = pos;
m_Size.x = m_Size.y = DRAWNOCONNECT_SIZE;
#undef DRAWNOCONNECT_SIZE
}
SCH_NO_CONNECT* SCH_NO_CONNECT::GenCopy()
{
SCH_NO_CONNECT* newitem = new SCH_NO_CONNECT( m_Pos );
newitem->m_Size = m_Size;
newitem->m_Flags = m_Flags;
return newitem;
}
EDA_Rect SCH_NO_CONNECT::GetBoundingBox() const
{
int delta = ( GetPenSize() + m_Size.x ) / 2;
EDA_Rect box;
box.SetOrigin( m_Pos );
box.Inflate( delta );
return box;
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool SCH_NO_CONNECT::Save( FILE* aFile ) const
{
bool success = true;
if( fprintf( aFile, "NoConn ~ %-4d %-4d\n", m_Pos.x, m_Pos.y ) == EOF )
{
success = false;
}
return success;
}
bool SCH_NO_CONNECT::Load( LINE_READER& aLine, wxString& aErrorMsg )
{
char name[256];
char* line = (char*) aLine;
while( (*line != ' ' ) && *line )
line++;
if( sscanf( line, "%s %d %d", name, &m_Pos.x, &m_Pos.y ) != 3 )
{
aErrorMsg.Printf( wxT( "EESchema file No Connect load error at line %d" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( ((char*)aLine) );
return false;
}
return true;
}
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
int SCH_NO_CONNECT::GetPenSize() const
{
return g_DrawDefaultLineThickness;
}
void SCH_NO_CONNECT::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
const wxPoint& offset, int DrawMode, int Color )
{
int pX, pY, color;
int delta = m_Size.x / 2;
int width = g_DrawDefaultLineThickness;
pX = m_Pos.x + offset.x;
pY = m_Pos.y + offset.y;
if( Color >= 0 )
color = Color;
else
color = ReturnLayerColor( LAYER_NOCONNECT );
GRSetDrawMode( DC, DrawMode );
GRLine( &panel->m_ClipBox, DC, pX - delta, pY - delta, pX + delta,
pY + delta, width, color );
GRLine( &panel->m_ClipBox, DC, pX + delta, pY - delta, pX - delta,
pY + delta, width, color );
}
void SCH_NO_CONNECT::Mirror_X( int aXaxis_position )
{
m_Pos.y -= aXaxis_position;
NEGATE( m_Pos.y );
m_Pos.y += aXaxis_position;
}
void SCH_NO_CONNECT::Mirror_Y( int aYaxis_position )
{
m_Pos.x -= aYaxis_position;
NEGATE( m_Pos.x );
m_Pos.x += aYaxis_position;
}
void SCH_NO_CONNECT::Rotate( wxPoint rotationPoint )
{
RotatePoint( &m_Pos, rotationPoint, 900 );
}
bool SCH_NO_CONNECT::IsSelectStateChanged( const wxRect& aRect )
{
bool previousState = IsSelected();
if( aRect.Contains( m_Pos ) )
m_Flags |= SELECTED;
else
m_Flags &= ~SELECTED;
return previousState != IsSelected();
}
void SCH_NO_CONNECT::GetConnectionPoints( vector< wxPoint >& aPoints ) const
{
aPoints.push_back( m_Pos );
}
bool SCH_NO_CONNECT::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & NO_CONNECT_T ) )
return false;
int delta = ( ( m_Size.x + g_DrawDefaultLineThickness ) / 2 ) + aAccuracy;
wxPoint dist = aPoint - m_Pos;
if( ( ABS( dist.x ) <= delta ) && ( ABS( dist.y ) <= delta ) )
return true;
return false;
}
bool SCH_NO_CONNECT::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
rect.Inflate( aAccuracy );
if( aContained )
return rect.Contains( GetBoundingBox() );
return rect.Intersects( GetBoundingBox() );
}
/******************/
/* Class SCH_LINE */
/******************/
SCH_LINE::SCH_LINE( const wxPoint& pos, int layer ) :
SCH_ITEM( NULL, SCH_LINE_T )
{
m_Start = pos;
m_End = pos;
m_Width = 0; // Default thickness used
m_StartIsDangling = m_EndIsDangling = FALSE;
switch( layer )
{
default:
m_Layer = LAYER_NOTES;
break;
case LAYER_WIRE:
m_Layer = LAYER_WIRE;
break;
case LAYER_BUS:
m_Layer = LAYER_BUS;
break;
}
}
SCH_LINE* SCH_LINE::GenCopy()
{
SCH_LINE* newitem = new SCH_LINE( m_Start, m_Layer );
newitem->m_End = m_End;
return newitem;
}
void SCH_LINE::Move( const wxPoint& aOffset )
{
if( (m_Flags & STARTPOINT) == 0 && aOffset != wxPoint( 0, 0 ) )
{
m_Start += aOffset;
SetModified();
}
if( (m_Flags & ENDPOINT) == 0 && aOffset != wxPoint( 0, 0 ) )
{
m_End += aOffset;
SetModified();
}
}
#if defined(DEBUG)
/**
* Function Show
* is used to output the object tree, currently for debugging only.
* @param nestLevel An aid to prettier tree indenting, and is the level
* of nesting of this object within the overall tree.
* @param os The ostream& to output to.
*/
void SCH_LINE::Show( int nestLevel, std::ostream& os ) const
{
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str()
<< " layer=\"" << m_Layer << '"'
<< " width=\"" << m_Width << '"'
<< " startIsDangling=\"" << m_StartIsDangling
<< '"' << " endIsDangling=\""
<< m_EndIsDangling << '"' << ">"
<< " <start" << m_Start << "/>"
<< " <end" << m_End << "/>" << "</"
<< GetClass().Lower().mb_str() << ">\n";
}
#endif
EDA_Rect SCH_LINE::GetBoundingBox() const
{
int width = 25;
int xmin = MIN( m_Start.x, m_End.x ) - width;
int ymin = MIN( m_Start.y, m_End.y ) - width;
int xmax = MAX( m_Start.x, m_End.x ) + width;
int ymax = MAX( m_Start.y, m_End.y ) + width;
// return a rectangle which is [pos,dim) in nature. therefore the +1
EDA_Rect ret( wxPoint( xmin, ymin ), wxSize( xmax - xmin + 1, ymax - ymin + 1 ) );
return ret;
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool SCH_LINE::Save( FILE* aFile ) const
{
bool success = true;
const char* layer = "Notes";
const char* width = "Line";
if( GetLayer() == LAYER_WIRE )
layer = "Wire";
if( GetLayer() == LAYER_BUS )
layer = "Bus";
if( fprintf( aFile, "Wire %s %s\n", layer, width ) == EOF )
{
success = false;
}
if( fprintf( aFile, "\t%-4d %-4d %-4d %-4d\n", m_Start.x, m_Start.y,
m_End.x, m_End.y ) == EOF )
{
success = false;
}
return success;
}
bool SCH_LINE::Load( LINE_READER& aLine, wxString& aErrorMsg )
{
char Name1[256];
char Name2[256];
char* line = (char*) aLine;
while( (*line != ' ' ) && *line )
line++;
if( sscanf( line, "%s %s", Name1, Name2 ) != 2 )
{
aErrorMsg.Printf( wxT( "EESchema file segment error at line %d, aborted" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
m_Layer = LAYER_NOTES;
if( Name1[0] == 'W' )
m_Layer = LAYER_WIRE;
if( Name1[0] == 'B' )
m_Layer = LAYER_BUS;
if( !aLine.ReadLine() || sscanf( (char*) aLine, "%d %d %d %d ",
&m_Start.x, &m_Start.y, &m_End.x, &m_End.y ) != 4 )
{
aErrorMsg.Printf( wxT( "EESchema file Segment struct error at line %d, aborted" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
return true;
}
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
int SCH_LINE::GetPenSize() const
{
int pensize = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width;
if( m_Layer == LAYER_BUS && m_Width == 0 )
{
pensize = wxRound( g_DrawDefaultLineThickness * BUS_WIDTH_EXPAND );
pensize = MAX( pensize, 3 );
}
return pensize;
}
void SCH_LINE::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
int DrawMode, int Color )
{
int color;
int width = GetPenSize();
if( Color >= 0 )
color = Color;
else
color = ReturnLayerColor( m_Layer );
GRSetDrawMode( DC, DrawMode );
if( m_Layer == LAYER_NOTES )
GRDashedLine( &panel->m_ClipBox, DC, m_Start.x + offset.x,
m_Start.y + offset.y, m_End.x + offset.x,
m_End.y + offset.y, width, color );
else
GRLine( &panel->m_ClipBox, DC, m_Start.x + offset.x,
m_Start.y + offset.y, m_End.x + offset.x, m_End.y + offset.y,
width, color );
if( m_StartIsDangling )
DrawDanglingSymbol( panel, DC, m_Start + offset, color );
if( m_EndIsDangling )
DrawDanglingSymbol( panel, DC, m_End + offset, color );
}
void SCH_LINE::Mirror_X( int aXaxis_position )
{
m_Start.y -= aXaxis_position;
NEGATE( m_Start.y );
m_Start.y += aXaxis_position;
m_End.y -= aXaxis_position;
NEGATE( m_End.y );
m_End.y += aXaxis_position;
}
void SCH_LINE::Mirror_Y( int aYaxis_position )
{
m_Start.x -= aYaxis_position;
NEGATE( m_Start.x );
m_Start.x += aYaxis_position;
m_End.x -= aYaxis_position;
NEGATE( m_End.x );
m_End.x += aYaxis_position;
}
void SCH_LINE::Rotate( wxPoint rotationPoint )
{
RotatePoint( &m_Start, rotationPoint, 900 );
RotatePoint( &m_End, rotationPoint, 900 );
}
bool SCH_LINE::MergeOverlap( SCH_LINE* aLine )
{
wxCHECK_MSG( aLine != NULL && aLine->Type() == SCH_LINE_T, false,
wxT( "Cannot test line segment for overlap." ) );
if( this == aLine || GetLayer() != aLine->GetLayer() )
return false;
// Search for a common end, and modify coordinates to ensure RefSegm->m_End
// == TstSegm->m_Start
if( m_Start == aLine->m_Start )
{
if( m_End == aLine->m_End )
return true;
EXCHG( m_Start, m_End );
}
else if( m_Start == aLine->m_End )
{
EXCHG( m_Start, m_End );
EXCHG( aLine->m_Start, aLine->m_End );
}
else if( m_End == aLine->m_End )
{
EXCHG( aLine->m_Start, aLine->m_End );
}
else if( m_End != aLine->m_Start )
{
// No common end point, segments cannot be merged.
return false;
}
/* Test alignment: */
if( m_Start.y == m_End.y ) // Horizontal segment
{
if( aLine->m_Start.y == aLine->m_End.y )
{
m_End = aLine->m_End;
return true;
}
}
else if( m_Start.x == m_End.x ) // Vertical segment
{
if( aLine->m_Start.x == aLine->m_End.x )
{
m_End = aLine->m_End;
return true;
}
}
else
{
if( atan2( (double) ( m_Start.x - m_End.x ), (double) ( m_Start.y - m_End.y ) )
== atan2( (double) ( aLine->m_Start.x - aLine->m_End.x ),
(double) ( aLine->m_Start.y - aLine->m_End.y ) ) )
{
m_End = aLine->m_End;
return true;
}
}
return false;
}
void SCH_LINE::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
{
if( GetLayer() == LAYER_NOTES )
return;
if( ( GetLayer() == LAYER_BUS ) || ( GetLayer() == LAYER_WIRE ) )
{
DANGLING_END_ITEM item( (GetLayer() == LAYER_BUS) ? BUS_START_END : WIRE_START_END, this );
item.m_Pos = m_Start;
DANGLING_END_ITEM item1( (GetLayer() == LAYER_BUS) ? BUS_END_END : WIRE_END_END, this );
item1.m_Pos = m_End;
aItemList.push_back( item );
aItemList.push_back( item1 );
}
}
bool SCH_LINE::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemList )
{
bool previousStartState = m_StartIsDangling;
bool previousEndState = m_EndIsDangling;
m_StartIsDangling = m_EndIsDangling = true;
if( GetLayer() == LAYER_WIRE )
{
BOOST_FOREACH( DANGLING_END_ITEM item, aItemList )
{
if( item.m_Item == this )
continue;
if( m_Start == item.m_Pos )
m_StartIsDangling = false;
if( m_End == item.m_Pos )
m_EndIsDangling = false;
if( (m_StartIsDangling == false) && (m_EndIsDangling == false) )
break;
}
}
else if( GetLayer() == LAYER_BUS || GetLayer() == LAYER_NOTES )
{
// Lines on the notes layer and the bus layer cannot be tested for dangling ends.
previousStartState = previousEndState = m_StartIsDangling = m_EndIsDangling = false;
}
return ( previousStartState != m_StartIsDangling ) || ( previousEndState != m_EndIsDangling );
}
bool SCH_LINE::IsSelectStateChanged( const wxRect& aRect )
{
bool previousState = IsSelected();
if( aRect.Contains( m_Start ) )
m_Flags |= STARTPOINT | SELECTED;
else
m_Flags &= ~( STARTPOINT | SELECTED );
if( aRect.Contains( m_End ) )
m_Flags |= ENDPOINT | SELECTED;
else
m_Flags &= ~( ENDPOINT | SELECTED );
return previousState != IsSelected();
}
void SCH_LINE::GetConnectionPoints( vector< wxPoint >& aPoints ) const
{
aPoints.push_back( m_Start );
aPoints.push_back( m_End );
}
bool SCH_LINE::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & ( DRAW_ITEM_T | WIRE_T | BUS_T ) ) )
return false;
if( ( ( aFilter & DRAW_ITEM_T ) && ( m_Layer == LAYER_NOTES ) )
|| ( ( aFilter & WIRE_T ) && ( m_Layer == LAYER_WIRE ) )
|| ( ( aFilter & BUS_T ) && ( m_Layer == LAYER_BUS ) ) )
{
if( ( aFilter & EXCLUDE_WIRE_BUS_ENDPOINTS && IsEndPoint( aPoint ) )
|| ( aFilter & WIRE_BUS_ENDPOINTS_ONLY && !IsEndPoint( aPoint ) )
|| ( TestSegmentHit( aPoint, m_Start, m_End, aAccuracy ) ) )
return true;
}
return false;
}
bool SCH_LINE::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
rect.Inflate( aAccuracy );
if( aContained )
return rect.Contains( GetBoundingBox() );
return rect.Intersects( GetBoundingBox() );
}
bool SCH_LINE::DoIsConnected( const wxPoint& aPosition ) const
{
if( m_Layer != LAYER_WIRE && m_Layer != LAYER_BUS )
return false;
return IsEndPoint( aPosition );
}
/**********************/
/* Class SCH_POLYLINE */
/**********************/
SCH_POLYLINE::SCH_POLYLINE( int layer ) : SCH_ITEM( NULL, SCH_POLYLINE_T )
{
m_Width = 0;
switch( layer )
{
default:
m_Layer = LAYER_NOTES;
break;
case LAYER_WIRE:
case LAYER_NOTES:
case LAYER_BUS:
m_Layer = layer;
break;
}
}
SCH_POLYLINE::~SCH_POLYLINE()
{
}
SCH_POLYLINE* SCH_POLYLINE::GenCopy()
{
SCH_POLYLINE* newitem = new SCH_POLYLINE( m_Layer );
newitem->m_PolyPoints = m_PolyPoints; // std::vector copy
return newitem;
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool SCH_POLYLINE::Save( FILE* aFile ) const
{
bool success = true;
const char* layer = "Notes";
const char* width = "Line";
if( GetLayer() == LAYER_WIRE )
layer = "Wire";
if( GetLayer() == LAYER_BUS )
layer = "Bus";
if( fprintf( aFile, "Poly %s %s %d\n", width, layer, GetCornerCount() ) == EOF )
{
return false;
}
for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
{
if( fprintf( aFile, "\t%-4d %-4d\n", m_PolyPoints[ii ].x, m_PolyPoints[ii].y ) == EOF )
{
success = false;
break;
}
}
return success;
}
bool SCH_POLYLINE::Load( LINE_READER& aLine, wxString& aErrorMsg )
{
char Name1[256];
char Name2[256];
wxPoint pt;
int ii;
char* line = (char*) aLine;
while( (*line != ' ' ) && *line )
line++;
if( sscanf( line, "%s %s %d", Name1, Name2, &ii ) != 3 )
{
aErrorMsg.Printf( wxT( "EESchema file polyline struct error at line %d, aborted" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
m_Layer = LAYER_NOTES;
if( Name2[0] == 'W' )
m_Layer = LAYER_WIRE;
if( Name2[0] == 'B' )
m_Layer = LAYER_BUS;
for( unsigned jj = 0; jj < (unsigned)ii; jj++ )
{
wxPoint point;
if( !aLine.ReadLine() || sscanf( ((char*) aLine), "%d %d", &pt.x, &pt.y ) != 2 )
{
aErrorMsg.Printf( wxT( "EESchema file polyline struct error at line %d, aborted" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
AddPoint( pt );
}
return true;
}
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
int SCH_POLYLINE::GetPenSize() const
{
int pensize = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width;
return pensize;
}
void SCH_POLYLINE::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor )
{
int color;
int width = GetPenSize();
if( aColor >= 0 )
color = aColor;
else
color = ReturnLayerColor( m_Layer );
GRSetDrawMode( aDC, aDrawMode );
if( m_Layer == LAYER_BUS )
{
width *= 3;
}
GRMoveTo( m_PolyPoints[0].x, m_PolyPoints[0].y );
if( m_Layer == LAYER_NOTES )
{
for( unsigned i = 1; i < GetCornerCount(); i++ )
GRDashedLineTo( &aPanel->m_ClipBox, aDC, m_PolyPoints[i].x + aOffset.x,
m_PolyPoints[i].y + aOffset.y, width, color );
}
else
{
for( unsigned i = 1; i < GetCornerCount(); i++ )
GRLineTo( &aPanel->m_ClipBox, aDC, m_PolyPoints[i].x + aOffset.x,
m_PolyPoints[i].y + aOffset.y, width, color );
}
}
void SCH_POLYLINE::Mirror_X( int aXaxis_position )
{
for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
{
m_PolyPoints[ii].y -= aXaxis_position;
NEGATE( m_PolyPoints[ii].y );
m_PolyPoints[ii].y = aXaxis_position;
}
}
void SCH_POLYLINE::Mirror_Y( int aYaxis_position )
{
for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
{
m_PolyPoints[ii].x -= aYaxis_position;
NEGATE( m_PolyPoints[ii].x );
m_PolyPoints[ii].x = aYaxis_position;
}
}
void SCH_POLYLINE::Rotate( wxPoint rotationPoint )
{
for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
{
RotatePoint( &m_PolyPoints[ii], rotationPoint, 900 );
}
}
bool SCH_POLYLINE::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & ( DRAW_ITEM_T | WIRE_T | BUS_T ) ) )
return false;
for( size_t i = 0; i < m_PolyPoints.size() - 1; i++ )
{
if( TestSegmentHit( aPoint, m_PolyPoints[i], m_PolyPoints[i + 1], aAccuracy ) )
return true;
}
return false;
}
bool SCH_POLYLINE::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
rect.Inflate( aAccuracy );
if( aContained )
return rect.Contains( GetBoundingBox() );
return rect.Intersects( GetBoundingBox() );
}
/************************************************************************/
/* classes to handle items used in schematic: wires, bus, junctions ... */
/************************************************************************/
#ifndef CLASS_SCHEMATIC_ITEMS_H
#define CLASS_SCHEMATIC_ITEMS_H
#include "sch_item_struct.h"
#include "general.h"
/* Flags for BUS ENTRY (bus to bus or wire to bus */
#define WIRE_TO_BUS 0
#define BUS_TO_BUS 1
/**
* Class SCH_LINE
* is a segment description base class to describe items which have 2 end
* points (track, wire, draw line ...)
*/
class SCH_LINE : public SCH_ITEM
{
public:
int m_Width; // 0 = line, > 0 = tracks, bus ...
wxPoint m_Start; // Line start point
wxPoint m_End; // Line end point
bool m_StartIsDangling;
bool m_EndIsDangling; // TRUE if not connected (wires, tracks...)
public:
SCH_LINE( const wxPoint& pos = wxPoint( 0, 0 ), int layer = LAYER_NOTES );
~SCH_LINE() { }
SCH_LINE* Next() const { return (SCH_LINE*) Pnext; }
SCH_LINE* Back() const { return (SCH_LINE*) Pback; }
virtual wxString GetClass() const
{
return wxT( "SCH_LINE" );
}
bool IsEndPoint( const wxPoint& aPoint ) const
{
return aPoint == m_Start || aPoint == m_End;
}
SCH_LINE* GenCopy();
bool IsNull() const { return m_Start == m_End; }
/**
* Function GetBoundingBox
* returns the orthogonal, bounding box of this object for display purposes.
* This box should be an enclosing perimeter for visible components of this
* object, and the units should be in the pcb or schematic coordinate system.
* It is OK to overestimate the size by a few counts.
*/
EDA_Rect GetBoundingBox() const;
virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor = -1 );
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool Save( FILE* aFile ) const;
/**
* Load schematic line from \a aLine in a .sch file.
*
* @param aLine - Essentially this is file to read schematic line from.
* @param aErrorMsg - Description of the error if an error occurs while loading the
* schematic line.
* @return True if the schematic line loaded successfully.
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
virtual int GetPenSize() const;
// Geometric transforms (used in block operations):
/** virtual function Move
* move item to a new position.
* @param aMoveVector = the displacement vector
*/
virtual void Move( const wxPoint& aMoveVector );
virtual void Mirror_X( int aXaxis_position );
/** virtual function Mirror_Y
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
*/
virtual void Mirror_Y( int aYaxis_position );
virtual void Rotate( wxPoint rotationPoint );
/**
* Check line against \a aLine to see if it overlaps and merge if it does.
*
* This method will change the line to be equivalent of the line and \a aLine if the
* two lines overlap. This method is used to merge multple line segments into a single
* line.
*
* @param aLine - Line to compare.
* @return True if lines overlap and the line was merged with \a aLine.
*/
bool MergeOverlap( SCH_LINE* aLine );
virtual void GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList );
virtual bool IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemList );
virtual bool IsDangling() const { return m_StartIsDangling || m_EndIsDangling; }
virtual bool IsSelectStateChanged( const wxRect& aRect );
virtual void GetConnectionPoints( vector< wxPoint >& aPoints ) const;
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const;
#endif
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual bool DoIsConnected( const wxPoint& aPosition ) const;
};
class SCH_NO_CONNECT : public SCH_ITEM
{
public:
wxPoint m_Pos; /* XY coordinates of NoConnect. */
wxSize m_Size; // size of this symbol
public:
SCH_NO_CONNECT( const wxPoint& pos = wxPoint( 0, 0 ) );
~SCH_NO_CONNECT() { }
virtual wxString GetClass() const
{
return wxT( "SCH_NO_CONNECT" );
}
SCH_NO_CONNECT* GenCopy();
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
virtual int GetPenSize() const;
virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& affset,
int aDrawMode, int aColor = -1 );
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch"
* format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool Save( FILE* aFile ) const;
/**
* Load schematic no connect entry from \a aLine in a .sch file.
*
* @param aLine - Essentially this is file to read schematic no connect from.
* @param aErrorMsg - Description of the error if an error occurs while loading the
* schematic no connect.
* @return True if the schematic no connect loaded successfully.
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function GetBoundingBox
* returns the orthogonal, bounding box of this object for display
* purposes. This box should be an enclosing perimeter for visible
* components of this object, and the units should be in the pcb or
* schematic coordinate system. It is OK to overestimate the size
* by a few counts.
*/
EDA_Rect GetBoundingBox() const;
// Geometric transforms (used in block operations):
/** virtual function Move
* move item to a new position.
* @param aMoveVector = the displacement vector
*/
virtual void Move( const wxPoint& aMoveVector )
{
m_Pos += aMoveVector;
}
/** virtual function Mirror_Y
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
*/
virtual void Mirror_Y( int aYaxis_position );
virtual void Mirror_X( int aXaxis_position );
virtual void Rotate( wxPoint rotationPoint );
virtual bool IsSelectStateChanged( const wxRect& aRect );
virtual void GetConnectionPoints( vector< wxPoint >& aPoints ) const;
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
};
/**
* Class SCH_BUS_ENTRY
* @file sch_item.h
*
* Defines a bus or wire entry.
*/
class SCH_BUS_ENTRY : public SCH_ITEM
{
public:
int m_Width;
wxPoint m_Pos;
wxSize m_Size;
public:
SCH_BUS_ENTRY( const wxPoint& pos = wxPoint( 0, 0 ), int shape = '\\', int id = WIRE_TO_BUS );
~SCH_BUS_ENTRY() { }
virtual wxString GetClass() const
{
return wxT( "SCH_BUS_ENTRY" );
}
#ifndef _SCH_ITEMS_H_
#define _SCH_ITEMS_H_
SCH_BUS_ENTRY* GenCopy();
wxPoint m_End() const;
virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor = -1 );
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch"
* format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool Save( FILE* aFile ) const;
/**
* Load schematic bus entry from \a aLine in a .sch file.
*
* @param aLine - Essentially this is file to read schematic bus entry from.
* @param aErrorMsg - Description of the error if an error occurs while loading the
* schematic bus entry.
* @return True if the schematic bus entry loaded successfully.
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function GetBoundingBox
* returns the orthogonal, bounding box of this object for display
* purposes. This box should be an enclosing perimeter for visible
* components of this object, and the units should be in the pcb or
* schematic coordinate system. It is OK to overestimate the size
* by a few counts.
*/
EDA_Rect GetBoundingBox() const;
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
virtual int GetPenSize() const;
// Geometric transforms (used in block operations):
/** virtual function Move
* move item to a new position.
* @param aMoveVector = the displacement vector
*/
virtual void Move( const wxPoint& aMoveVector )
{
m_Pos += aMoveVector;
}
/** virtual function Mirror_Y
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
*/
virtual void Mirror_Y( int aYaxis_position );
virtual void Mirror_X( int aXaxis_position );
virtual void Rotate( wxPoint rotationPoint );
virtual void GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList );
virtual bool IsSelectStateChanged( const wxRect& aRect );
virtual void GetConnectionPoints( vector< wxPoint >& aPoints ) const;
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
};
class SCH_POLYLINE : public SCH_ITEM
{
public:
int m_Width; /* Thickness */
std::vector<wxPoint> m_PolyPoints; // list of points (>= 2)
public:
SCH_POLYLINE( int layer = LAYER_NOTES );
~SCH_POLYLINE();
virtual wxString GetClass() const
{
return wxT( "SCH_POLYLINE" );
}
SCH_POLYLINE* GenCopy();
virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor = -1 );
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch"
* format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool Save( FILE* aFile ) const;
/**
* Load schematic poly line entry from \a aLine in a .sch file.
*
* @param aLine - Essentially this is file to read schematic poly line from.
* @param aErrorMsg - Description of the error if an error occurs while loading the
* schematic poly line.
* @return True if the schematic poly line loaded successfully.
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function AddPoint
* add a corner to m_PolyPoints
*/
void AddPoint( const wxPoint& point )
{
m_PolyPoints.push_back( point );
}
/**
* Function GetCornerCount
* @return the number of corners
*/
unsigned GetCornerCount() const { return m_PolyPoints.size(); }
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
virtual int GetPenSize() const;
// Geometric transforms (used in block operations):
/** virtual function Move
* move item to a new position.
* @param aMoveVector = the displacement vector
*/
virtual void Move( const wxPoint& aMoveVector )
{
for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
m_PolyPoints[ii] += aMoveVector;
}
/** virtual function Mirror_Y
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
*/
virtual void Mirror_Y( int aYaxis_position );
virtual void Mirror_X( int aXaxis_position );
virtual void Rotate( wxPoint rotationPoint );
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
};
#include "sch_item_struct.h"
class SCH_JUNCTION : public SCH_ITEM
......@@ -416,6 +18,9 @@ public:
public:
SCH_JUNCTION( const wxPoint& pos = wxPoint( 0, 0 ) );
SCH_JUNCTION( const SCH_JUNCTION& aJunction );
~SCH_JUNCTION() { }
virtual wxString GetClass() const
......@@ -457,24 +62,25 @@ public:
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
// Geometric transforms (used in block operations):
/** virtual function Move
* move item to a new position.
* @param aMoveVector = the displacement vector
/**
* Function Move
* moves then item to a new position by \a aMoveVector.
* @param aMoveVector The displacement vector.
*/
virtual void Move( const wxPoint& aMoveVector )
{
m_Pos += aMoveVector;
}
/** virtual function Mirror_Y
* mirror item relative to an Y axis
/**
* Function Mirror_Y
* mirrors the item relative to \a aYaxis_position.
* @param aYaxis_position = the y axis position
*/
virtual void Mirror_Y( int aYaxis_position );
virtual void Mirror_X( int aXaxis_position );
virtual void Rotate( wxPoint rotationPoint );
virtual void GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList );
......@@ -485,14 +91,14 @@ public:
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os );
#endif
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual bool DoIsConnected( const wxPoint& aPosition ) const;
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual bool doIsConnected( const wxPoint& aPosition ) const;
virtual EDA_ITEM* doClone() const;
};
#endif /* CLASS_SCHEMATIC_ITEMS_H */
#endif // _SCH_ITEMS_H_
/******************/
/* Class SCH_LINE */
/******************/
#include "fctsys.h"
#include "gr_basic.h"
#include "macros.h"
#include "class_drawpanel.h"
#include "trigo.h"
#include "richio.h"
#include "general.h"
#include "protos.h"
#include "sch_line.h"
#include <boost/foreach.hpp>
SCH_LINE::SCH_LINE( const wxPoint& pos, int layer ) :
SCH_ITEM( NULL, SCH_LINE_T )
{
m_Start = pos;
m_End = pos;
m_Width = 0; // Default thickness used
m_StartIsDangling = m_EndIsDangling = FALSE;
switch( layer )
{
default:
m_Layer = LAYER_NOTES;
break;
case LAYER_WIRE:
m_Layer = LAYER_WIRE;
break;
case LAYER_BUS:
m_Layer = LAYER_BUS;
break;
}
}
SCH_LINE::SCH_LINE( const SCH_LINE& aLine ) :
SCH_ITEM( aLine )
{
m_Start = aLine.m_Start;
m_End = aLine.m_End;
m_Width = aLine.m_Width;
m_StartIsDangling = m_EndIsDangling = false;
}
EDA_ITEM* SCH_LINE::doClone() const
{
return new SCH_LINE( *this );
}
void SCH_LINE::Move( const wxPoint& aOffset )
{
if( (m_Flags & STARTPOINT) == 0 && aOffset != wxPoint( 0, 0 ) )
{
m_Start += aOffset;
SetModified();
}
if( (m_Flags & ENDPOINT) == 0 && aOffset != wxPoint( 0, 0 ) )
{
m_End += aOffset;
SetModified();
}
}
#if defined(DEBUG)
void SCH_LINE::Show( int nestLevel, std::ostream& os ) const
{
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str()
<< " layer=\"" << m_Layer << '"'
<< " width=\"" << m_Width << '"'
<< " startIsDangling=\"" << m_StartIsDangling
<< '"' << " endIsDangling=\""
<< m_EndIsDangling << '"' << ">"
<< " <start" << m_Start << "/>"
<< " <end" << m_End << "/>" << "</"
<< GetClass().Lower().mb_str() << ">\n";
}
#endif
EDA_Rect SCH_LINE::GetBoundingBox() const
{
int width = 25;
int xmin = MIN( m_Start.x, m_End.x ) - width;
int ymin = MIN( m_Start.y, m_End.y ) - width;
int xmax = MAX( m_Start.x, m_End.x ) + width;
int ymax = MAX( m_Start.y, m_End.y ) + width;
// return a rectangle which is [pos,dim) in nature. therefore the +1
EDA_Rect ret( wxPoint( xmin, ymin ), wxSize( xmax - xmin + 1, ymax - ymin + 1 ) );
return ret;
}
bool SCH_LINE::Save( FILE* aFile ) const
{
bool success = true;
const char* layer = "Notes";
const char* width = "Line";
if( GetLayer() == LAYER_WIRE )
layer = "Wire";
if( GetLayer() == LAYER_BUS )
layer = "Bus";
if( fprintf( aFile, "Wire %s %s\n", layer, width ) == EOF )
{
success = false;
}
if( fprintf( aFile, "\t%-4d %-4d %-4d %-4d\n", m_Start.x, m_Start.y,
m_End.x, m_End.y ) == EOF )
{
success = false;
}
return success;
}
bool SCH_LINE::Load( LINE_READER& aLine, wxString& aErrorMsg )
{
char Name1[256];
char Name2[256];
char* line = (char*) aLine;
while( (*line != ' ' ) && *line )
line++;
if( sscanf( line, "%s %s", Name1, Name2 ) != 2 )
{
aErrorMsg.Printf( wxT( "EESchema file segment error at line %d, aborted" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
m_Layer = LAYER_NOTES;
if( Name1[0] == 'W' )
m_Layer = LAYER_WIRE;
if( Name1[0] == 'B' )
m_Layer = LAYER_BUS;
if( !aLine.ReadLine() || sscanf( (char*) aLine, "%d %d %d %d ",
&m_Start.x, &m_Start.y, &m_End.x, &m_End.y ) != 4 )
{
aErrorMsg.Printf( wxT( "EESchema file Segment struct error at line %d, aborted" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
return true;
}
int SCH_LINE::GetPenSize() const
{
int pensize = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width;
if( m_Layer == LAYER_BUS && m_Width == 0 )
{
pensize = wxRound( g_DrawDefaultLineThickness * BUS_WIDTH_EXPAND );
pensize = MAX( pensize, 3 );
}
return pensize;
}
void SCH_LINE::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
int DrawMode, int Color )
{
int color;
int width = GetPenSize();
if( Color >= 0 )
color = Color;
else
color = ReturnLayerColor( m_Layer );
GRSetDrawMode( DC, DrawMode );
if( m_Layer == LAYER_NOTES )
GRDashedLine( &panel->m_ClipBox, DC, m_Start.x + offset.x,
m_Start.y + offset.y, m_End.x + offset.x,
m_End.y + offset.y, width, color );
else
GRLine( &panel->m_ClipBox, DC, m_Start.x + offset.x,
m_Start.y + offset.y, m_End.x + offset.x, m_End.y + offset.y,
width, color );
if( m_StartIsDangling )
DrawDanglingSymbol( panel, DC, m_Start + offset, color );
if( m_EndIsDangling )
DrawDanglingSymbol( panel, DC, m_End + offset, color );
}
void SCH_LINE::Mirror_X( int aXaxis_position )
{
m_Start.y -= aXaxis_position;
NEGATE( m_Start.y );
m_Start.y += aXaxis_position;
m_End.y -= aXaxis_position;
NEGATE( m_End.y );
m_End.y += aXaxis_position;
}
void SCH_LINE::Mirror_Y( int aYaxis_position )
{
m_Start.x -= aYaxis_position;
NEGATE( m_Start.x );
m_Start.x += aYaxis_position;
m_End.x -= aYaxis_position;
NEGATE( m_End.x );
m_End.x += aYaxis_position;
}
void SCH_LINE::Rotate( wxPoint rotationPoint )
{
RotatePoint( &m_Start, rotationPoint, 900 );
RotatePoint( &m_End, rotationPoint, 900 );
}
bool SCH_LINE::MergeOverlap( SCH_LINE* aLine )
{
wxCHECK_MSG( aLine != NULL && aLine->Type() == SCH_LINE_T, false,
wxT( "Cannot test line segment for overlap." ) );
if( this == aLine || GetLayer() != aLine->GetLayer() )
return false;
// Search for a common end, and modify coordinates to ensure RefSegm->m_End
// == TstSegm->m_Start
if( m_Start == aLine->m_Start )
{
if( m_End == aLine->m_End )
return true;
EXCHG( m_Start, m_End );
}
else if( m_Start == aLine->m_End )
{
EXCHG( m_Start, m_End );
EXCHG( aLine->m_Start, aLine->m_End );
}
else if( m_End == aLine->m_End )
{
EXCHG( aLine->m_Start, aLine->m_End );
}
else if( m_End != aLine->m_Start )
{
// No common end point, segments cannot be merged.
return false;
}
/* Test alignment: */
if( m_Start.y == m_End.y ) // Horizontal segment
{
if( aLine->m_Start.y == aLine->m_End.y )
{
m_End = aLine->m_End;
return true;
}
}
else if( m_Start.x == m_End.x ) // Vertical segment
{
if( aLine->m_Start.x == aLine->m_End.x )
{
m_End = aLine->m_End;
return true;
}
}
else
{
if( atan2( (double) ( m_Start.x - m_End.x ), (double) ( m_Start.y - m_End.y ) )
== atan2( (double) ( aLine->m_Start.x - aLine->m_End.x ),
(double) ( aLine->m_Start.y - aLine->m_End.y ) ) )
{
m_End = aLine->m_End;
return true;
}
}
return false;
}
void SCH_LINE::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
{
if( GetLayer() == LAYER_NOTES )
return;
if( ( GetLayer() == LAYER_BUS ) || ( GetLayer() == LAYER_WIRE ) )
{
DANGLING_END_ITEM item( (GetLayer() == LAYER_BUS) ? BUS_START_END : WIRE_START_END, this );
item.m_Pos = m_Start;
DANGLING_END_ITEM item1( (GetLayer() == LAYER_BUS) ? BUS_END_END : WIRE_END_END, this );
item1.m_Pos = m_End;
aItemList.push_back( item );
aItemList.push_back( item1 );
}
}
bool SCH_LINE::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemList )
{
bool previousStartState = m_StartIsDangling;
bool previousEndState = m_EndIsDangling;
m_StartIsDangling = m_EndIsDangling = true;
if( GetLayer() == LAYER_WIRE )
{
BOOST_FOREACH( DANGLING_END_ITEM item, aItemList )
{
if( item.m_Item == this )
continue;
if( m_Start == item.m_Pos )
m_StartIsDangling = false;
if( m_End == item.m_Pos )
m_EndIsDangling = false;
if( (m_StartIsDangling == false) && (m_EndIsDangling == false) )
break;
}
}
else if( GetLayer() == LAYER_BUS || GetLayer() == LAYER_NOTES )
{
// Lines on the notes layer and the bus layer cannot be tested for dangling ends.
previousStartState = previousEndState = m_StartIsDangling = m_EndIsDangling = false;
}
return ( previousStartState != m_StartIsDangling ) || ( previousEndState != m_EndIsDangling );
}
bool SCH_LINE::IsSelectStateChanged( const wxRect& aRect )
{
bool previousState = IsSelected();
if( aRect.Contains( m_Start ) )
m_Flags |= STARTPOINT | SELECTED;
else
m_Flags &= ~( STARTPOINT | SELECTED );
if( aRect.Contains( m_End ) )
m_Flags |= ENDPOINT | SELECTED;
else
m_Flags &= ~( ENDPOINT | SELECTED );
return previousState != IsSelected();
}
void SCH_LINE::GetConnectionPoints( vector< wxPoint >& aPoints ) const
{
aPoints.push_back( m_Start );
aPoints.push_back( m_End );
}
bool SCH_LINE::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & ( DRAW_ITEM_T | WIRE_T | BUS_T ) ) )
return false;
if( ( ( aFilter & DRAW_ITEM_T ) && ( m_Layer == LAYER_NOTES ) )
|| ( ( aFilter & WIRE_T ) && ( m_Layer == LAYER_WIRE ) )
|| ( ( aFilter & BUS_T ) && ( m_Layer == LAYER_BUS ) ) )
{
if( ( aFilter & EXCLUDE_WIRE_BUS_ENDPOINTS && IsEndPoint( aPoint ) )
|| ( aFilter & WIRE_BUS_ENDPOINTS_ONLY && !IsEndPoint( aPoint ) )
|| ( TestSegmentHit( aPoint, m_Start, m_End, aAccuracy ) ) )
return true;
}
return false;
}
bool SCH_LINE::doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
rect.Inflate( aAccuracy );
if( aContained )
return rect.Contains( GetBoundingBox() );
return rect.Intersects( GetBoundingBox() );
}
bool SCH_LINE::doIsConnected( const wxPoint& aPosition ) const
{
if( m_Layer != LAYER_WIRE && m_Layer != LAYER_BUS )
return false;
return IsEndPoint( aPosition );
}
/**
* @file sch_line.h
*
*/
#ifndef _SCH_LINE_H_
#define _SCH_LINE_H_
#include "sch_item_struct.h"
/**
* Class SCH_LINE
* is a segment description base class to describe items which have 2 end
* points (track, wire, draw line ...)
*/
class SCH_LINE : public SCH_ITEM
{
bool m_StartIsDangling;
bool m_EndIsDangling; // TRUE if not connected (wires, tracks...)
public:
int m_Width; // 0 = line, > 0 = tracks, bus ...
wxPoint m_Start; // Line start point
wxPoint m_End; // Line end point
public:
SCH_LINE( const wxPoint& pos = wxPoint( 0, 0 ), int layer = LAYER_NOTES );
SCH_LINE( const SCH_LINE& aLine );
~SCH_LINE() { }
SCH_LINE* Next() const { return (SCH_LINE*) Pnext; }
SCH_LINE* Back() const { return (SCH_LINE*) Pback; }
virtual wxString GetClass() const
{
return wxT( "SCH_LINE" );
}
bool IsEndPoint( const wxPoint& aPoint ) const
{
return aPoint == m_Start || aPoint == m_End;
}
bool IsNull() const { return m_Start == m_End; }
/**
* Function GetBoundingBox
* returns the orthogonal, bounding box of this object for display purposes.
* This box should be an enclosing perimeter for visible components of this
* object, and the units should be in the pcb or schematic coordinate system.
* It is OK to overestimate the size by a few counts.
*/
EDA_Rect GetBoundingBox() const;
virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor = -1 );
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool Save( FILE* aFile ) const;
/**
* Load schematic line from \a aLine in a .sch file.
*
* @param aLine - Essentially this is file to read schematic line from.
* @param aErrorMsg - Description of the error if an error occurs while loading the
* schematic line.
* @return True if the schematic line loaded successfully.
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
virtual int GetPenSize() const;
/**
* Function Move
* moves the item by \a aMoveVector.
* @param aMoveVector The displacement vector
*/
virtual void Move( const wxPoint& aMoveVector );
virtual void Mirror_X( int aXaxis_position );
/**
* Function Mirror_Y
* mirrors the item relative to \a aYaxis_position.
* @param aYaxis_position = the y axis position
*/
virtual void Mirror_Y( int aYaxis_position );
virtual void Rotate( wxPoint rotationPoint );
/**
* Check line against \a aLine to see if it overlaps and merge if it does.
*
* This method will change the line to be equivalent of the line and \a aLine if the
* two lines overlap. This method is used to merge multple line segments into a single
* line.
*
* @param aLine - Line to compare.
* @return True if lines overlap and the line was merged with \a aLine.
*/
bool MergeOverlap( SCH_LINE* aLine );
virtual void GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList );
virtual bool IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemList );
virtual bool IsDangling() const { return m_StartIsDangling || m_EndIsDangling; }
virtual bool IsSelectStateChanged( const wxRect& aRect );
virtual void GetConnectionPoints( vector< wxPoint >& aPoints ) const;
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const;
#endif
private:
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual bool doIsConnected( const wxPoint& aPosition ) const;
virtual EDA_ITEM* doClone() const;
};
#endif // _SCH_LINE_H_
......@@ -44,19 +44,21 @@ SCH_MARKER::SCH_MARKER( const wxPoint& pos, const wxString& text ) :
}
SCH_MARKER::~SCH_MARKER()
SCH_MARKER::SCH_MARKER( const SCH_MARKER& aMarker ) :
SCH_ITEM( aMarker ),
MARKER_BASE( aMarker )
{
}
SCH_MARKER* SCH_MARKER::GenCopy()
SCH_MARKER::~SCH_MARKER()
{
SCH_MARKER* newitem = new SCH_MARKER( GetPos(), GetReporter().GetMainText() );
}
newitem->SetMarkerType( GetMarkerType() );
newitem->SetErrorLevel( GetErrorLevel() );
return newitem;
EDA_ITEM* SCH_MARKER::doClone() const
{
return new SCH_MARKER( *this );
}
......@@ -76,7 +78,6 @@ void SCH_MARKER::Show( int nestLevel, std::ostream& os )
<< GetPos() << "/>\n";
}
#endif
/**
......@@ -194,7 +195,7 @@ bool SCH_MARKER::IsSelectStateChanged( const wxRect& aRect )
}
bool SCH_MARKER::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
bool SCH_MARKER::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & MARKER_T ) )
return false;
......
......@@ -30,6 +30,7 @@ class SCH_MARKER : public SCH_ITEM, public MARKER_BASE
public:
SCH_MARKER();
SCH_MARKER( const wxPoint& aPos, const wxString& aText );
SCH_MARKER( const SCH_MARKER& aMarker );
~SCH_MARKER();
virtual wxString GetClass() const
......@@ -37,11 +38,8 @@ public:
return wxT( "SCH_MARKER" );
}
SCH_MARKER* GenCopy();
virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC,
const wxPoint& aOffset, int aDraw_mode,
int aColor = -1 );
virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDraw_mode, int aColor = -1 );
/**
* Function Save
......@@ -104,7 +102,8 @@ public:
#endif
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual EDA_ITEM* doClone() const;
};
#endif /* _TYPE_SCH_MARKER_H_ */
/************************/
/* Class SCH_NO_CONNECT */
/************************/
#include "fctsys.h"
#include "gr_basic.h"
#include "macros.h"
#include "class_drawpanel.h"
#include "common.h"
#include "trigo.h"
#include "richio.h"
#include "general.h"
#include "protos.h"
#include "sch_no_connect.h"
SCH_NO_CONNECT::SCH_NO_CONNECT( const wxPoint& pos ) :
SCH_ITEM( NULL, SCH_NO_CONNECT_T )
{
#define DRAWNOCONNECT_SIZE 48 /* No symbol connection range. */
m_Pos = pos;
m_Size.x = m_Size.y = DRAWNOCONNECT_SIZE;
#undef DRAWNOCONNECT_SIZE
}
SCH_NO_CONNECT::SCH_NO_CONNECT( const SCH_NO_CONNECT& aNoConnect ) :
SCH_ITEM( aNoConnect )
{
m_Pos = aNoConnect.m_Pos;
m_Size = aNoConnect.m_Size;
}
EDA_ITEM* SCH_NO_CONNECT::doClone() const
{
return new SCH_NO_CONNECT( *this );
}
EDA_Rect SCH_NO_CONNECT::GetBoundingBox() const
{
int delta = ( GetPenSize() + m_Size.x ) / 2;
EDA_Rect box;
box.SetOrigin( m_Pos );
box.Inflate( delta );
return box;
}
bool SCH_NO_CONNECT::Save( FILE* aFile ) const
{
bool success = true;
if( fprintf( aFile, "NoConn ~ %-4d %-4d\n", m_Pos.x, m_Pos.y ) == EOF )
{
success = false;
}
return success;
}
bool SCH_NO_CONNECT::Load( LINE_READER& aLine, wxString& aErrorMsg )
{
char name[256];
char* line = (char*) aLine;
while( (*line != ' ' ) && *line )
line++;
if( sscanf( line, "%s %d %d", name, &m_Pos.x, &m_Pos.y ) != 3 )
{
aErrorMsg.Printf( wxT( "EESchema file No Connect load error at line %d" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( ((char*)aLine) );
return false;
}
return true;
}
int SCH_NO_CONNECT::GetPenSize() const
{
return g_DrawDefaultLineThickness;
}
void SCH_NO_CONNECT::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor )
{
int pX, pY, color;
int delta = m_Size.x / 2;
int width = g_DrawDefaultLineThickness;
pX = m_Pos.x + aOffset.x;
pY = m_Pos.y + aOffset.y;
if( aColor >= 0 )
color = aColor;
else
color = ReturnLayerColor( LAYER_NOCONNECT );
GRSetDrawMode( aDC, aDrawMode );
GRLine( &aPanel->m_ClipBox, aDC, pX - delta, pY - delta, pX + delta, pY + delta, width, color );
GRLine( &aPanel->m_ClipBox, aDC, pX + delta, pY - delta, pX - delta, pY + delta, width, color );
}
void SCH_NO_CONNECT::Mirror_X( int aXaxis_position )
{
m_Pos.y -= aXaxis_position;
NEGATE( m_Pos.y );
m_Pos.y += aXaxis_position;
}
void SCH_NO_CONNECT::Mirror_Y( int aYaxis_position )
{
m_Pos.x -= aYaxis_position;
NEGATE( m_Pos.x );
m_Pos.x += aYaxis_position;
}
void SCH_NO_CONNECT::Rotate( wxPoint rotationPoint )
{
RotatePoint( &m_Pos, rotationPoint, 900 );
}
bool SCH_NO_CONNECT::IsSelectStateChanged( const wxRect& aRect )
{
bool previousState = IsSelected();
if( aRect.Contains( m_Pos ) )
m_Flags |= SELECTED;
else
m_Flags &= ~SELECTED;
return previousState != IsSelected();
}
void SCH_NO_CONNECT::GetConnectionPoints( vector< wxPoint >& aPoints ) const
{
aPoints.push_back( m_Pos );
}
bool SCH_NO_CONNECT::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & NO_CONNECT_T ) )
return false;
int delta = ( ( m_Size.x + g_DrawDefaultLineThickness ) / 2 ) + aAccuracy;
wxPoint dist = aPoint - m_Pos;
if( ( ABS( dist.x ) <= delta ) && ( ABS( dist.y ) <= delta ) )
return true;
return false;
}
bool SCH_NO_CONNECT::doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
rect.Inflate( aAccuracy );
if( aContained )
return rect.Contains( GetBoundingBox() );
return rect.Intersects( GetBoundingBox() );
}
/**
* @file sch_no_connect.h
*
*/
#ifndef _SCH_NO_CONNECT_H_
#define _SCH_NO_CONNECT_H_
#include "sch_item_struct.h"
class SCH_NO_CONNECT : public SCH_ITEM
{
public:
wxPoint m_Pos; /* XY coordinates of NoConnect. */
wxSize m_Size; // size of this symbol
public:
SCH_NO_CONNECT( const wxPoint& pos = wxPoint( 0, 0 ) );
SCH_NO_CONNECT( const SCH_NO_CONNECT& aNoConnect );
~SCH_NO_CONNECT() { }
virtual wxString GetClass() const
{
return wxT( "SCH_NO_CONNECT" );
}
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
virtual int GetPenSize() const;
virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor = -1 );
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch"
* format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool Save( FILE* aFile ) const;
/**
* Load schematic no connect entry from \a aLine in a .sch file.
*
* @param aLine - Essentially this is file to read schematic no connect from.
* @param aErrorMsg - Description of the error if an error occurs while loading the
* schematic no connect.
* @return True if the schematic no connect loaded successfully.
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function GetBoundingBox
* returns the orthogonal, bounding box of this object for display
* purposes. This box should be an enclosing perimeter for visible
* components of this object, and the units should be in the pcb or
* schematic coordinate system. It is OK to overestimate the size
* by a few counts.
*/
EDA_Rect GetBoundingBox() const;
// Geometric transforms (used in block operations):
/** virtual function Move
* move item to a new position.
* @param aMoveVector = the displacement vector
*/
virtual void Move( const wxPoint& aMoveVector )
{
m_Pos += aMoveVector;
}
/**
* Function Mirror_Y
* mirrors item relative to \a aYaxis_position.
* @param aYaxis_position = the y axis position
*/
virtual void Mirror_Y( int aYaxis_position );
virtual void Mirror_X( int aXaxis_position );
virtual void Rotate( wxPoint rotationPoint );
virtual bool IsSelectStateChanged( const wxRect& aRect );
virtual void GetConnectionPoints( vector< wxPoint >& aPoints ) const;
private:
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual EDA_ITEM* doClone() const;
};
#endif // _SCH_NO_CONNECT_H_
/**********************/
/* Class SCH_POLYLINE */
/**********************/
#include "fctsys.h"
#include "gr_basic.h"
#include "macros.h"
#include "class_drawpanel.h"
#include "trigo.h"
#include "common.h"
#include "richio.h"
#include "general.h"
#include "protos.h"
#include "sch_polyline.h"
SCH_POLYLINE::SCH_POLYLINE( int layer ) :
SCH_ITEM( NULL, SCH_POLYLINE_T )
{
m_Width = 0;
switch( layer )
{
default:
m_Layer = LAYER_NOTES;
break;
case LAYER_WIRE:
case LAYER_NOTES:
case LAYER_BUS:
m_Layer = layer;
break;
}
}
SCH_POLYLINE::SCH_POLYLINE( const SCH_POLYLINE& aPolyLine ) :
SCH_ITEM( aPolyLine )
{
m_Width = aPolyLine.m_Width;
m_PolyPoints = aPolyLine.m_PolyPoints;
}
SCH_POLYLINE::~SCH_POLYLINE()
{
}
EDA_ITEM* SCH_POLYLINE::doClone() const
{
return new SCH_POLYLINE( *this );
}
bool SCH_POLYLINE::Save( FILE* aFile ) const
{
bool success = true;
const char* layer = "Notes";
const char* width = "Line";
if( GetLayer() == LAYER_WIRE )
layer = "Wire";
if( GetLayer() == LAYER_BUS )
layer = "Bus";
if( fprintf( aFile, "Poly %s %s %d\n", width, layer, GetCornerCount() ) == EOF )
{
return false;
}
for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
{
if( fprintf( aFile, "\t%-4d %-4d\n", m_PolyPoints[ii ].x, m_PolyPoints[ii].y ) == EOF )
{
success = false;
break;
}
}
return success;
}
bool SCH_POLYLINE::Load( LINE_READER& aLine, wxString& aErrorMsg )
{
char Name1[256];
char Name2[256];
wxPoint pt;
int ii;
char* line = (char*) aLine;
while( (*line != ' ' ) && *line )
line++;
if( sscanf( line, "%s %s %d", Name1, Name2, &ii ) != 3 )
{
aErrorMsg.Printf( wxT( "EESchema file polyline struct error at line %d, aborted" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
m_Layer = LAYER_NOTES;
if( Name2[0] == 'W' )
m_Layer = LAYER_WIRE;
if( Name2[0] == 'B' )
m_Layer = LAYER_BUS;
for( unsigned jj = 0; jj < (unsigned)ii; jj++ )
{
wxPoint point;
if( !aLine.ReadLine() || sscanf( ((char*) aLine), "%d %d", &pt.x, &pt.y ) != 2 )
{
aErrorMsg.Printf( wxT( "EESchema file polyline struct error at line %d, aborted" ),
aLine.LineNumber() );
aErrorMsg << wxT( "\n" ) << CONV_FROM_UTF8( (char*) aLine );
return false;
}
AddPoint( pt );
}
return true;
}
int SCH_POLYLINE::GetPenSize() const
{
int pensize = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width;
return pensize;
}
void SCH_POLYLINE::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor )
{
int color;
int width = GetPenSize();
if( aColor >= 0 )
color = aColor;
else
color = ReturnLayerColor( m_Layer );
GRSetDrawMode( aDC, aDrawMode );
if( m_Layer == LAYER_BUS )
{
width *= 3;
}
GRMoveTo( m_PolyPoints[0].x, m_PolyPoints[0].y );
if( m_Layer == LAYER_NOTES )
{
for( unsigned i = 1; i < GetCornerCount(); i++ )
GRDashedLineTo( &aPanel->m_ClipBox, aDC, m_PolyPoints[i].x + aOffset.x,
m_PolyPoints[i].y + aOffset.y, width, color );
}
else
{
for( unsigned i = 1; i < GetCornerCount(); i++ )
GRLineTo( &aPanel->m_ClipBox, aDC, m_PolyPoints[i].x + aOffset.x,
m_PolyPoints[i].y + aOffset.y, width, color );
}
}
void SCH_POLYLINE::Mirror_X( int aXaxis_position )
{
for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
{
m_PolyPoints[ii].y -= aXaxis_position;
NEGATE( m_PolyPoints[ii].y );
m_PolyPoints[ii].y = aXaxis_position;
}
}
void SCH_POLYLINE::Mirror_Y( int aYaxis_position )
{
for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
{
m_PolyPoints[ii].x -= aYaxis_position;
NEGATE( m_PolyPoints[ii].x );
m_PolyPoints[ii].x = aYaxis_position;
}
}
void SCH_POLYLINE::Rotate( wxPoint rotationPoint )
{
for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
{
RotatePoint( &m_PolyPoints[ii], rotationPoint, 900 );
}
}
bool SCH_POLYLINE::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & ( DRAW_ITEM_T | WIRE_T | BUS_T ) ) )
return false;
for( size_t i = 0; i < m_PolyPoints.size() - 1; i++ )
{
if( TestSegmentHit( aPoint, m_PolyPoints[i], m_PolyPoints[i + 1], aAccuracy ) )
return true;
}
return false;
}
bool SCH_POLYLINE::doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
rect.Inflate( aAccuracy );
if( aContained )
return rect.Contains( GetBoundingBox() );
return rect.Intersects( GetBoundingBox() );
}
/**
* @file sch_polyline.h
*
*/
#ifndef _SCH_POLYLINE_H_
#define _SCH_POLYLINE_H_
#include "sch_item_struct.h"
class SCH_POLYLINE : public SCH_ITEM
{
public:
int m_Width; /* Thickness */
std::vector<wxPoint> m_PolyPoints; // list of points (>= 2)
public:
SCH_POLYLINE( int layer = LAYER_NOTES );
SCH_POLYLINE( const SCH_POLYLINE& aPolyLine );
~SCH_POLYLINE();
virtual wxString GetClass() const
{
return wxT( "SCH_POLYLINE" );
}
virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset,
int aDrawMode, int aColor = -1 );
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch"
* format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool Save( FILE* aFile ) const;
/**
* Load schematic poly line entry from \a aLine in a .sch file.
*
* @param aLine - Essentially this is file to read schematic poly line from.
* @param aErrorMsg - Description of the error if an error occurs while loading the
* schematic poly line.
* @return True if the schematic poly line loaded successfully.
*/
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function AddPoint
* add a corner to m_PolyPoints
*/
void AddPoint( const wxPoint& point )
{
m_PolyPoints.push_back( point );
}
/**
* Function GetCornerCount
* @return the number of corners
*/
unsigned GetCornerCount() const { return m_PolyPoints.size(); }
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
virtual int GetPenSize() const;
/**
* Function Move
* moves an item to a new position by \a aMoveVector.
* @param aMoveVector = the displacement vector
*/
virtual void Move( const wxPoint& aMoveVector )
{
for( unsigned ii = 0; ii < GetCornerCount(); ii++ )
m_PolyPoints[ii] += aMoveVector;
}
/**
* Function Mirror_Y
* mirrors an item relative to \a aYaxis_position.
* @param aYaxis_position The y axis position to mirror around.
*/
virtual void Mirror_Y( int aYaxis_position );
virtual void Mirror_X( int aXaxis_position );
virtual void Rotate( wxPoint rotationPoint );
private:
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual EDA_ITEM* doClone() const;
};
#endif // _SCH_POLYLINE_H_
......@@ -14,6 +14,7 @@
#include "protos.h"
#include "class_library.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_sheet.h"
#include "sch_component.h"
......@@ -203,11 +204,7 @@ SCH_ITEM* SCH_SCREEN::ExtractWires( bool CreateCopy )
if( CreateCopy )
{
if( item->Type() == SCH_JUNCTION_T )
new_item = ( (SCH_JUNCTION*) item )->GenCopy();
else
new_item = ( (SCH_LINE*) item )->GenCopy();
new_item = item->Clone();
new_item->SetNext( GetDrawItems() );
SetDrawItems( new_item );
}
......
......@@ -41,6 +41,26 @@ SCH_SHEET::SCH_SHEET( const wxPoint& pos ) : SCH_ITEM( NULL, SCH_SHEET_T )
}
SCH_SHEET::SCH_SHEET( const SCH_SHEET& aSheet ) :
SCH_ITEM( aSheet )
{
m_Pos = aSheet.m_Pos;
m_TimeStamp = aSheet.m_TimeStamp;
m_SheetNameSize = aSheet.m_SheetNameSize;
m_FileNameSize = aSheet.m_FileNameSize;
m_AssociatedScreen = aSheet.m_AssociatedScreen;
m_SheetName = aSheet.m_SheetName;
m_FileName = aSheet.m_FileName;
m_labels = aSheet.m_labels;
for( size_t i = 0; i < m_labels.size(); i++ )
m_labels[i].SetParent( this );
if( m_AssociatedScreen )
m_AssociatedScreen->m_RefCount++;
}
SCH_SHEET::~SCH_SHEET()
{
// also, look at the associated sheet & its reference count
......@@ -55,12 +75,12 @@ SCH_SHEET::~SCH_SHEET()
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.brd" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
EDA_ITEM* SCH_SHEET::doClone() const
{
return new SCH_SHEET( *this );
}
bool SCH_SHEET::Save( FILE* aFile ) const
{
if( fprintf( aFile, "$Sheet\n" ) == EOF
......@@ -248,49 +268,6 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg )
}
/* creates a copy of a sheet
* The linked data itself (GetDrawItems()) is not duplicated
*/
SCH_SHEET* SCH_SHEET::GenCopy()
{
SCH_SHEET* newitem = new SCH_SHEET( m_Pos );
newitem->m_Size = m_Size;
newitem->SetParent( m_Parent );
newitem->m_TimeStamp = GetTimeStamp();
newitem->m_FileName = m_FileName;
newitem->m_FileNameSize = m_FileNameSize;
/* newitem->m_SheetName = m_SheetName; m_SheetName must be unique for
* all sub sheets in a given sheet
* so we no not duplicate sheet
* name
*/
newitem->m_SheetNameSize = m_SheetNameSize;
BOOST_FOREACH( SCH_SHEET_PIN& sheetPin, m_labels )
{
SCH_SHEET_PIN* newSheetPin = sheetPin.GenCopy();
newSheetPin->SetParent( newitem );
newitem->GetSheetPins().push_back( newSheetPin );
}
newitem->renumberLabels();
/* don't copy screen data - just reference it. */
newitem->m_AssociatedScreen = m_AssociatedScreen;
if( m_AssociatedScreen )
m_AssociatedScreen->m_RefCount++;
return newitem;
}
/* Used if undo / redo command:
* swap data between this and copyitem
*/
void SCH_SHEET::SwapData( SCH_SHEET* copyitem )
{
EXCHG( m_Pos, copyitem->m_Pos );
......@@ -487,20 +464,12 @@ SCH_SHEET_PIN* SCH_SHEET::GetLabel( const wxPoint& aPosition )
}
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
int SCH_SHEET::GetPenSize() const
{
return g_DrawDefaultLineThickness;
}
/**
* Function GetSheetNamePosition
* @return the position of the anchor of sheet name text
*/
wxPoint SCH_SHEET::GetSheetNamePosition()
{
wxPoint pos = m_Pos;
......@@ -517,10 +486,7 @@ wxPoint SCH_SHEET::GetSheetNamePosition()
return pos;
}
/**
* Function GetFileNamePosition
* @return the position of the anchor of filename text
*/
wxPoint SCH_SHEET::GetFileNamePosition()
{
wxPoint pos = m_Pos;
......@@ -538,16 +504,6 @@ wxPoint SCH_SHEET::GetFileNamePosition()
}
/**
* Function Draw
* Draw the hierarchical sheet shape
* @param aPanel = the current DrawPanel
* @param aDc = the current Device Context
* @param aOffset = draw offset (usually wxPoint(0,0))
* @param aDrawMode = draw mode
* @param aColor = color used to draw sheet. Usually -1 to use the normal
* color for sheet items
*/
void SCH_SHEET::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC,
const wxPoint& aOffset, int aDrawMode, int aColor )
{
......@@ -613,10 +569,6 @@ void SCH_SHEET::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC,
}
/**
* Function GetBoundingBox
* @return an EDA_Rect giving the bounding box of the sheet
*/
EDA_Rect SCH_SHEET::GetBoundingBox() const
{
int dx, dy;
......@@ -637,11 +589,6 @@ EDA_Rect SCH_SHEET::GetBoundingBox() const
}
/**
* Function ComponentCount
* count our own components, without the power components.
* @return the component count.
*/
int SCH_SHEET::ComponentCount()
{
int n = 0;
......@@ -672,13 +619,6 @@ int SCH_SHEET::ComponentCount()
}
/**
* Function SearchHierarchy
* search the existing hierarchy for an instance of screen "FileName".
* @param aFilename = the filename to find
* @param aFilename = a location to return a pointer to the screen (if found)
* @return bool if found, and a pointer to the screen
*/
bool SCH_SHEET::SearchHierarchy( wxString aFilename, SCH_SCREEN** aScreen )
{
if( m_AssociatedScreen )
......@@ -708,17 +648,6 @@ bool SCH_SHEET::SearchHierarchy( wxString aFilename, SCH_SCREEN** aScreen )
}
/**
* Function LocatePathOfScreen
* search the existing hierarchy for an instance of screen "FileName".
* don't bother looking at the root sheet - it must be unique,
* no other references to its m_AssociatedScreen otherwise there would be
* loops
* in the hierarchy.
* @param aScreen = the SCH_SCREEN* screen that we search for
* @param aList = the SCH_SHEET_PATH* that must be used
* @return true if found
*/
bool SCH_SHEET::LocatePathOfScreen( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aList )
{
if( m_AssociatedScreen )
......@@ -749,15 +678,6 @@ bool SCH_SHEET::LocatePathOfScreen( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aList )
}
/**
* Function Load.
* for the sheet: load the file m_FileName
* if a screen already exists, the file is already read.
* m_AssociatedScreen point on the screen, and its m_RefCount is incremented
* else creates a new associated screen and load the data file.
* @param aFrame = a SCH_EDIT_FRAME pointer to the maim schematic frame
* @return true if OK
*/
bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame )
{
bool success = true;
......@@ -804,12 +724,6 @@ bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame )
}
/**
* Function CountSheets
* calculates the number of sheets found in "this"
* this number includes the full subsheets count
* @return the full count of sheets+subsheets contained by "this"
*/
int SCH_SHEET::CountSheets()
{
int count = 1; //1 = this!!
......@@ -837,17 +751,6 @@ wxString SCH_SHEET::GetFileName( void )
}
/**
* Function ChangeFileName
* Set a new filename and manage data and associated screen
* The main difficulty is the filename change in a complex hierarchy.
* - if new filename is not already used: change to the new name (and if an
* existing file is found, load it on request)
* - if new filename is already used (a complex hierarchy) : reference the
* sheet.
* @param aFileName = the new filename
* @param aFrame = the schematic frame
*/
bool SCH_SHEET::ChangeFileName( SCH_EDIT_FRAME* aFrame, const wxString& aFileName )
{
if( ( GetFileName() == aFileName ) && m_AssociatedScreen )
......@@ -997,11 +900,6 @@ void SCH_SHEET::Mirror_X( int aXaxis_position )
}
/**
* Function Mirror_Y (virtual)
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
*/
void SCH_SHEET::Mirror_Y( int aYaxis_position )
{
m_Pos.x -= aYaxis_position;
......@@ -1031,14 +929,7 @@ void SCH_SHEET::Resize( const wxSize& aSize )
}
/** Compare schematic sheet entry (filename and sheetname) against search string.
* @param aSearchData - Criteria to search against.
* @param aAuxData - a pointer on auxiliary data, not used here.
* @param aFindLocation - a wxPoint where to put the location of matched item. can be NULL.
* @return True if this item matches the search criteria.
*/
bool SCH_SHEET::Matches( wxFindReplaceData& aSearchData,
void* aAuxData, wxPoint * aFindLocation )
bool SCH_SHEET::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation )
{
if( SCH_ITEM::Matches( m_FileName, aSearchData ) )
{
......@@ -1136,7 +1027,7 @@ void SCH_SHEET::GetConnectionPoints( vector< wxPoint >& aPoints ) const
}
bool SCH_SHEET::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
bool SCH_SHEET::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & SHEET_T ) )
return false;
......@@ -1149,7 +1040,7 @@ bool SCH_SHEET::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aF
}
bool SCH_SHEET::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
bool SCH_SHEET::doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
EDA_Rect rect = aRect;
......@@ -1182,4 +1073,3 @@ void SCH_SHEET::Show( int nestLevel, std::ostream& os )
}
#endif
......@@ -47,11 +47,15 @@ private:
* orientation.
*/
virtual EDA_ITEM* doClone() const;
public:
SCH_SHEET_PIN( SCH_SHEET* parent,
const wxPoint& pos = wxPoint( 0, 0 ),
const wxString& text = wxEmptyString );
SCH_SHEET_PIN( const SCH_SHEET_PIN& aSheetLabel );
~SCH_SHEET_PIN() { }
virtual wxString GetClass() const
......@@ -59,10 +63,7 @@ public:
return wxT( "SCH_SHEET_PIN" );
}
bool operator ==( const SCH_SHEET_PIN* aPin ) const;
SCH_SHEET_PIN* GenCopy();
bool operator ==( const SCH_SHEET_PIN* aPin ) const;
virtual void Draw( WinEDA_DrawPanel* aPanel,
wxDC* aDC,
......@@ -101,6 +102,12 @@ public:
void SetNumber( int aNumber );
void SetEdge( int aEdge );
int GetEdge();
/**
* Function ConstraintOnEdge
* is used to adjust label position to egde based on proximity to vertical / horizontal edge
* of the parent sheet.
*/
void ConstraintOnEdge( wxPoint Pos );
/**
......@@ -223,6 +230,9 @@ public:
public:
SCH_SHEET( const wxPoint& pos = wxPoint( 0, 0 ) );
SCH_SHEET( const SCH_SHEET& aSheet );
~SCH_SHEET();
virtual wxString GetClass() const
......@@ -250,8 +260,6 @@ public:
void Place( SCH_EDIT_FRAME* frame, wxDC* DC );
SCH_SHEET* GenCopy();
void DisplayInfo( WinEDA_DrawFrame* frame );
/* there is no member for orientation in sch_sheet, to preserve file
......@@ -513,8 +521,9 @@ protected:
void renumberLabels();
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual EDA_ITEM* doClone() const;
};
#endif /* CLASS_DRAWSHEET_H */
......@@ -52,22 +52,20 @@ SCH_SHEET_PIN::SCH_SHEET_PIN( SCH_SHEET* parent, const wxPoint& pos, const wxStr
}
SCH_SHEET_PIN* SCH_SHEET_PIN::GenCopy()
SCH_SHEET_PIN::SCH_SHEET_PIN( const SCH_SHEET_PIN& aSheetLabel ) :
SCH_HIERLABEL( aSheetLabel )
{
SCH_SHEET_PIN* newitem = new SCH_SHEET_PIN( (SCH_SHEET*) m_Parent, m_Pos, m_Text );
m_Number = aSheetLabel.m_Number;
m_Edge = aSheetLabel.m_Edge;
}
newitem->SetEdge( GetEdge() );
newitem->m_Shape = m_Shape;
newitem->m_Size = m_Size;
newitem->SetNumber( GetNumber() );
return newitem;
EDA_ITEM* SCH_SHEET_PIN::doClone() const
{
return new SCH_SHEET_PIN( *this );
}
/** SCH_SHEET_PIN::Draw is the same as SCH_HIERLABEL::Draw
* but the graphic icon is slightly different
* for INPUT type the icon is the OUTPUT shape of SCH_HIERLABEL
* for OUTPUT type the icon is the INPUT shape of SCH_HIERLABEL
*/
void SCH_SHEET_PIN::Draw( WinEDA_DrawPanel* aPanel,
wxDC* aDC,
const wxPoint& aOffset,
......@@ -76,7 +74,7 @@ void SCH_SHEET_PIN::Draw( WinEDA_DrawPanel* aPanel,
{
// The icon selection is handle by the virtual method CreateGraphicShape
// called by ::Draw
SCH_HIERLABEL::Draw(aPanel, aDC, aOffset, aDraw_mode, aColor );
SCH_HIERLABEL::Draw( aPanel, aDC, aOffset, aDraw_mode, aColor );
}
......@@ -99,10 +97,6 @@ bool SCH_SHEET_PIN::operator==( const SCH_SHEET_PIN* aPin ) const
}
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
int SCH_SHEET_PIN::GetPenSize() const
{
return g_DrawDefaultLineThickness;
......@@ -124,6 +118,7 @@ void SCH_SHEET_PIN::SetEdge( int aEdge )
/* use -1 to adjust text orientation without changing edge*/
if( aEdge > -1 )
m_Edge = aEdge;
switch( m_Edge )
{
case 0: /* pin on left side*/
......@@ -155,10 +150,6 @@ int SCH_SHEET_PIN::GetEdge()
}
/* ConstraintOnEdge is used to ajust label position to egde based
* on proximity to vertical / horizontal edge.
* used by sheetlab and resize
*/
void SCH_SHEET_PIN::ConstraintOnEdge( wxPoint Pos )
{
SCH_SHEET* Sheet = (SCH_SHEET*) GetParent();
......@@ -195,26 +186,23 @@ void SCH_SHEET_PIN::ConstraintOnEdge( wxPoint Pos )
}
m_Pos.x = Pos.x;
if( m_Pos.x < Sheet->m_Pos.x )
m_Pos.x = Sheet->m_Pos.x;
if( m_Pos.x > (Sheet->m_Pos.x + Sheet->m_Size.x) )
m_Pos.x = Sheet->m_Pos.x + Sheet->m_Size.x;
}
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.brd" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool SCH_SHEET_PIN::Save( FILE* aFile ) const
{
int type = 'U', side = 'L';
if( m_Text.IsEmpty() )
return true;
switch( m_Edge )
{
case 0: //pin on left side
......@@ -331,14 +319,6 @@ bool SCH_SHEET_PIN::Load( LINE_READER& aLine, wxString& aErrorMsg )
}
/**
* Function Matches
* Compare hierarchical pin name against search string.
* @param aSearchData - Criteria to search against.
* @param aAuxData - a pointer on auxiliary data, not used here
* @param aFindLocation - a wxPoint where to put the location of matched item. can be NULL.
* @return True if this item matches the search criteria.
*/
bool SCH_SHEET_PIN::Matches( wxFindReplaceData& aSearchData,
void* aAuxData, wxPoint * aFindLocation )
{
......@@ -346,6 +326,7 @@ bool SCH_SHEET_PIN::Matches( wxFindReplaceData& aSearchData,
{
if( aFindLocation )
*aFindLocation = m_Pos;
return true;
}
......@@ -358,6 +339,7 @@ void SCH_SHEET_PIN::Mirror_X( int aXaxis_position )
int p = m_Pos.y - aXaxis_position;
m_Pos.y = aXaxis_position - p;
switch( m_Edge )
{
case 2:
......@@ -376,6 +358,7 @@ void SCH_SHEET_PIN::Mirror_Y( int aYaxis_position )
int p = m_Pos.x - aYaxis_position;
m_Pos.x = aYaxis_position - p;
switch( m_Edge )
{
case 0:
......@@ -392,6 +375,7 @@ void SCH_SHEET_PIN::Mirror_Y( int aYaxis_position )
void SCH_SHEET_PIN::Rotate( wxPoint rotationPoint )
{
RotatePoint( &m_Pos, rotationPoint, 900 );
switch( m_Edge )
{
case 0: //pin on left side
......@@ -451,6 +435,7 @@ void SCH_SHEET_PIN::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
#if defined(DEBUG)
void SCH_SHEET_PIN::Show( int nestLevel, std::ostream& os )
{
// XML output:
......@@ -463,5 +448,4 @@ void SCH_SHEET_PIN::Show( int nestLevel, std::ostream& os )
// NestedSpace( nestLevel, os ) << "</" << s.Lower().mb_str() << ">\n";
}
#endif
......@@ -76,64 +76,42 @@ static int* TemplateShape[5][4] =
SCH_TEXT::SCH_TEXT( const wxPoint& pos, const wxString& text, KICAD_T aType ) :
SCH_ITEM( NULL, aType ), EDA_TextStruct( text )
SCH_ITEM( NULL, aType ),
EDA_TextStruct( text )
{
m_Layer = LAYER_NOTES;
m_Pos = pos;
m_Pos = pos;
m_Shape = 0;
m_IsDangling = false;
m_MultilineAllowed = true;
m_MultilineAllowed = true;
m_SchematicOrientation = 0;
}
SCH_TEXT* SCH_TEXT::GenCopy()
SCH_TEXT::SCH_TEXT( const SCH_TEXT& aText ) :
SCH_ITEM( aText ),
EDA_TextStruct( aText )
{
SCH_TEXT* newitem;
switch( Type() )
{
default:
case SCH_TEXT_T:
newitem = new SCH_TEXT( m_Pos, m_Text );
break;
case SCH_GLOBAL_LABEL_T:
newitem = new SCH_GLOBALLABEL( m_Pos, m_Text );
break;
m_Pos = aText.m_Pos;
m_Shape = aText.m_Shape;
m_MultilineAllowed = aText.m_MultilineAllowed;
m_SchematicOrientation = aText.m_SchematicOrientation;
m_IsDangling = false;
}
case SCH_HIERARCHICAL_LABEL_T:
newitem = new SCH_HIERLABEL( m_Pos, m_Text );
break;
case SCH_LABEL_T:
newitem = new SCH_LABEL( m_Pos, m_Text );
break;
}
EDA_ITEM* SCH_TEXT::doClone() const
{
return new SCH_TEXT( *this );
}
newitem->m_Layer = m_Layer;
newitem->m_Shape = m_Shape;
newitem->m_Orient = m_Orient;
newitem->m_Size = m_Size;
newitem->m_Thickness = m_Thickness;
newitem->m_HJustify = m_HJustify;
newitem->m_VJustify = m_VJustify;
newitem->m_IsDangling = m_IsDangling;
newitem->m_Italic = m_Italic;
newitem->m_Bold = m_Bold;
newitem->m_SchematicOrientation = m_SchematicOrientation;
return newitem;
void SCH_TEXT::IncrementLabel()
{
IncrementLabelMember( m_Text );
}
/**
* Function GetSchematicTextOffset (virtual)
* @return the offset between the SCH_TEXT position and the text itself
* position
* This offset depend on orientation, and the type of text
* (room to draw an associated graphic symbol, or put the text above a wire)
*/
wxPoint SCH_TEXT::GetSchematicTextOffset()
{
wxPoint text_offset;
......@@ -178,11 +156,6 @@ bool SCH_TEXT::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint
}
/**
* Function Mirror_Y (virtual)
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
*/
void SCH_TEXT::Mirror_Y( int aYaxis_position )
{
// Text is NOT really mirrored; it is moved to a suitable position
......@@ -224,11 +197,6 @@ void SCH_TEXT::Mirror_Y( int aYaxis_position )
}
/**
* Function Mirror_X (virtual)
* mirror item relative to an X axis
* @param aXaxis_position = the x axis position
*/
void SCH_TEXT::Mirror_X( int aXaxis_position )
{
// Text is NOT really mirrored; it is moved to a suitable position
......@@ -303,19 +271,6 @@ void SCH_TEXT::Rotate( wxPoint rotationPoint )
}
/**
* Function SetTextOrientAndJustifyParmeters (virtual)
* Set m_SchematicOrientation, and initialize
* m_orient,m_HJustified and m_VJustified, according to the value of
* m_SchematicOrientation
* must be called after changing m_SchematicOrientation
* @param aSchematicOrientation =
* 0 = normal (horizontal, left justified).
* 1 = up (vertical)
* 2 = (horizontal, right justified). This can be seen as the mirrored
* position of 0
* 3 = bottom . This can be seen as the mirrored position of up
*/
void SCH_TEXT::SetSchematicTextOrientation( int aSchematicOrientation )
{
m_SchematicOrientation = aSchematicOrientation;
......@@ -388,10 +343,6 @@ void SCH_TEXT::Place( SCH_EDIT_FRAME* frame, wxDC* DC )
}
/**
* Function GetPenSize
* @return the size of the "pen" that be used to draw or plot this item
*/
int SCH_TEXT::GetPenSize() const
{
int pensize = m_Thickness;
......@@ -410,9 +361,6 @@ int SCH_TEXT::GetPenSize() const
}
/* Text type Comment (text on layer "NOTE") have 4 directions, and the Text
* origin is the first letter
*/
void SCH_TEXT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& aOffset,
int DrawMode, int Color )
{
......@@ -425,6 +373,7 @@ void SCH_TEXT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& aOffset,
color = (EDA_Colors) Color;
else
color = ReturnLayerColor( m_Layer );
GRSetDrawMode( DC, DrawMode );
wxPoint text_offset = aOffset + GetSchematicTextOffset();
......@@ -671,7 +620,7 @@ EDA_Rect SCH_TEXT::GetBoundingBox() const
}
bool SCH_TEXT::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
bool SCH_TEXT::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & TEXT_T ) )
return false;
......@@ -680,7 +629,7 @@ bool SCH_TEXT::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFi
}
bool SCH_TEXT::DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
bool SCH_TEXT::doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
return TextHitTest( aRect, aContained, aAccuracy );
}
......@@ -702,57 +651,43 @@ void SCH_TEXT::Show( int nestLevel, std::ostream& os )
<< "</" << s.Lower().mb_str() << ">\n";
}
#endif
/**
* Function GetSchematicTextOffset (virtual)
* @return the offset between the SCH_TEXT position and the text itself
* position
* This offset depend on orientation, and the type of text
* (room to draw an associated graphic symbol, or put the text above a wire)
*/
wxPoint SCH_LABEL::GetSchematicTextOffset()
SCH_LABEL::SCH_LABEL( const wxPoint& pos, const wxString& text ) :
SCH_TEXT( pos, text, SCH_LABEL_T )
{
return SCH_TEXT::GetSchematicTextOffset();
m_Layer = LAYER_LOCLABEL;
m_Shape = NET_INPUT;
m_IsDangling = TRUE;
m_MultilineAllowed = false;
}
/**
* Function SetTextOrientAndJustifyParmeters
* Set m_SchematicOrientation, and initialize
* m_orient,m_HJustified and m_VJustified, according to the value of
* m_SchematicOrientation (for a label)
* must be called after changing m_SchematicOrientation
* @param aSchematicOrientation =
* 0 = normal (horizontal, left justified).
* 1 = up (vertical)
* 2 = (horizontal, right justified). This can be seen as the mirrored
* position of 0
* 3 = bottom . This can be seen as the mirrored position of up
*/
void SCH_LABEL::SetSchematicTextOrientation( int aSchematicOrientation )
SCH_LABEL::SCH_LABEL( const SCH_LABEL& aLabel ) :
SCH_TEXT( aLabel )
{
SCH_TEXT::SetSchematicTextOrientation( aSchematicOrientation );
}
SCH_LABEL::SCH_LABEL( const wxPoint& pos, const wxString& text ) :
SCH_TEXT( pos, text, SCH_LABEL_T )
EDA_ITEM* SCH_LABEL::doClone() const
{
m_Layer = LAYER_LOCLABEL;
m_Shape = NET_INPUT;
m_IsDangling = TRUE;
m_MultilineAllowed = false;
return new SCH_LABEL( *this );
}
wxPoint SCH_LABEL::GetSchematicTextOffset()
{
return SCH_TEXT::GetSchematicTextOffset();
}
void SCH_LABEL::SetSchematicTextOrientation( int aSchematicOrientation )
{
SCH_TEXT::SetSchematicTextOrientation( aSchematicOrientation );
}
/**
* Function Mirror_X (virtual)
* mirror item relative to an X axis
* @param aXaxis_position = the x axis position
*/
void SCH_LABEL::Mirror_X( int aXaxis_position )
{
// Text is NOT really mirrored; it is moved to a suitable position
......@@ -775,12 +710,6 @@ void SCH_LABEL::Rotate( wxPoint rotationPoint )
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.brd" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool SCH_LABEL::Save( FILE* aFile ) const
{
bool success = true;
......@@ -862,10 +791,6 @@ bool SCH_LABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
}
/**
* Function Draw
* a label is drawn like a text. So just call SCH_TEXT::Draw
*/
void SCH_LABEL::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset,
int DrawMode, int Color )
{
......@@ -921,7 +846,7 @@ EDA_Rect SCH_LABEL::GetBoundingBox() const
}
bool SCH_LABEL::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
bool SCH_LABEL::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & LABEL_T ) )
return false;
......@@ -940,12 +865,18 @@ SCH_GLOBALLABEL::SCH_GLOBALLABEL( const wxPoint& pos, const wxString& text ) :
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.brd" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
SCH_GLOBALLABEL::SCH_GLOBALLABEL( const SCH_GLOBALLABEL& aGlobalLabel ) :
SCH_TEXT( aGlobalLabel )
{
}
EDA_ITEM* SCH_GLOBALLABEL::doClone() const
{
return new SCH_GLOBALLABEL( *this );
}
bool SCH_GLOBALLABEL::Save( FILE* aFile ) const
{
bool success = true;
......@@ -953,6 +884,7 @@ bool SCH_GLOBALLABEL::Save( FILE* aFile ) const
if( m_Italic )
shape = "Italic";
if( fprintf( aFile, "Text GLabel %-4d %-4d %-4d %-4d %s %s %d\n%s\n",
m_Pos.x, m_Pos.y, m_SchematicOrientation, m_Size.x,
SheetLabelType[m_Shape], shape, m_Thickness, CONV_TO_UTF8( m_Text ) ) == EOF )
......@@ -1016,12 +948,16 @@ bool SCH_GLOBALLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
if( stricmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 )
m_Shape = NET_OUTPUT;
if( stricmp( Name2, SheetLabelType[NET_BIDI] ) == 0 )
m_Shape = NET_BIDI;
if( stricmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 )
m_Shape = NET_TRISTATE;
if( stricmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 )
m_Shape = NET_UNSPECIFIED;
if( stricmp( Name3, "Italic" ) == 0 )
m_Italic = 1;
......@@ -1029,11 +965,6 @@ bool SCH_GLOBALLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
}
/**
* Function Mirror_Y (virtual)
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
*/
void SCH_GLOBALLABEL::Mirror_Y( int aYaxis_position )
{
/* The global label is NOT really mirrored.
......@@ -1084,13 +1015,6 @@ void SCH_GLOBALLABEL::Rotate( wxPoint rotationPoint )
}
/**
* Function GetSchematicTextOffset (virtual)
* @return the offset between the SCH_TEXT position and the text itself
* position
* This offset depend on orientation, and the type of text
* (room to draw an associated graphic symbol, or put the text above a wire)
*/
wxPoint SCH_GLOBALLABEL::GetSchematicTextOffset()
{
wxPoint text_offset;
......@@ -1140,19 +1064,6 @@ wxPoint SCH_GLOBALLABEL::GetSchematicTextOffset()
}
/**
* Function SetTextOrientAndJustifyParmeters
* Set m_SchematicOrientation, and initialize
* m_orient,m_HJustified and m_VJustified, according to the value of
* m_SchematicOrientation
* must be called after changing m_SchematicOrientation
* @param aSchematicOrientation =
* 0 = normal (horizontal, left justified).
* 1 = up (vertical)
* 2 = (horizontal, right justified). This can be seen as the mirrored
* position of 0
* 3 = bottom . This can be seen as the mirrored position of up
*/
void SCH_GLOBALLABEL::SetSchematicTextOrientation( int aSchematicOrientation )
{
m_SchematicOrientation = aSchematicOrientation;
......@@ -1187,8 +1098,6 @@ void SCH_GLOBALLABEL::SetSchematicTextOrientation( int aSchematicOrientation )
}
/* Texts type Global Label have 4 directions, and the Text origin is the graphic icon
*/
void SCH_GLOBALLABEL::Draw( WinEDA_DrawPanel* panel,
wxDC* DC,
const wxPoint& aOffset,
......@@ -1199,7 +1108,6 @@ void SCH_GLOBALLABEL::Draw( WinEDA_DrawPanel* panel,
EDA_Colors color;
wxPoint text_offset = aOffset + GetSchematicTextOffset();
if( Color >= 0 )
color = (EDA_Colors) Color;
else
......@@ -1229,12 +1137,6 @@ void SCH_GLOBALLABEL::Draw( WinEDA_DrawPanel* panel,
}
/**
* Function CreateGraphicShape
* Calculates the graphic shape (a polygon) associated to the text
* @param aCorner_list = a buffer to fill with polygon corners coordinates
* @param Pos = Position of the shape
*/
void SCH_GLOBALLABEL::CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
const wxPoint& Pos )
{
......@@ -1370,7 +1272,7 @@ EDA_Rect SCH_GLOBALLABEL::GetBoundingBox() const
}
bool SCH_GLOBALLABEL::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
bool SCH_GLOBALLABEL::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & LABEL_T ) )
return false;
......@@ -1389,12 +1291,18 @@ SCH_HIERLABEL::SCH_HIERLABEL( const wxPoint& pos, const wxString& text, KICAD_T
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.brd" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
SCH_HIERLABEL::SCH_HIERLABEL( const SCH_HIERLABEL& aHierLabel ) :
SCH_TEXT( aHierLabel )
{
}
EDA_ITEM* SCH_HIERLABEL::doClone() const
{
return new SCH_HIERLABEL( *this );
}
bool SCH_HIERLABEL::Save( FILE* aFile ) const
{
bool success = true;
......@@ -1402,6 +1310,7 @@ bool SCH_HIERLABEL::Save( FILE* aFile ) const
if( m_Italic )
shape = "Italic";
if( fprintf( aFile, "Text HLabel %-4d %-4d %-4d %-4d %s %s %d\n%s\n",
m_Pos.x, m_Pos.y, m_SchematicOrientation, m_Size.x,
SheetLabelType[m_Shape], shape, m_Thickness, CONV_TO_UTF8( m_Text ) ) == EOF )
......@@ -1465,12 +1374,16 @@ bool SCH_HIERLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
if( stricmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 )
m_Shape = NET_OUTPUT;
if( stricmp( Name2, SheetLabelType[NET_BIDI] ) == 0 )
m_Shape = NET_BIDI;
if( stricmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 )
m_Shape = NET_TRISTATE;
if( stricmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 )
m_Shape = NET_UNSPECIFIED;
if( stricmp( Name3, "Italic" ) == 0 )
m_Italic = 1;
......@@ -1478,19 +1391,6 @@ bool SCH_HIERLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
}
/**
* Function SetTextOrientAndJustifyParmeters
* Set m_SchematicOrientation, and initialize
* m_orient,m_HJustified and m_VJustified, according to the value of
* m_SchematicOrientation
* must be called after changing m_SchematicOrientation
* @param aSchematicOrientation =
* 0 = normal (horizontal, left justified).
* 1 = up (vertical)
* 2 = (horizontal, right justified). This can be seen as the mirrored
* position of 0
* 3 = bottom . This can be seen as the mirrored position of up
*/
void SCH_HIERLABEL::SetSchematicTextOrientation( int aSchematicOrientation )
{
m_SchematicOrientation = aSchematicOrientation;
......@@ -1525,9 +1425,6 @@ void SCH_HIERLABEL::SetSchematicTextOrientation( int aSchematicOrientation )
}
/* Hierarchical Label have a text and a graphic icon.
* Texts type have 4 directions, and the text origin is the graphic icon
*/
void SCH_HIERLABEL::Draw( WinEDA_DrawPanel* panel,
wxDC* DC,
const wxPoint& offset,
......@@ -1568,12 +1465,6 @@ void SCH_HIERLABEL::Draw( WinEDA_DrawPanel* panel,
}
/**
* Function CreateGraphicShape
* calculates the graphic shape (a polygon) associated to the text
* @param aCorner_list = a buffer to fill with polygon corners coordinates
* @param Pos = Postion of the shape
*/
void SCH_HIERLABEL::CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
const wxPoint& Pos )
{
......@@ -1583,6 +1474,7 @@ void SCH_HIERLABEL::CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
int imax = *Template; Template++;
aCorner_list.clear();
for( int ii = 0; ii < imax; ii++ )
{
wxPoint corner;
......@@ -1596,6 +1488,7 @@ void SCH_HIERLABEL::CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
}
}
EDA_Rect SCH_HIERLABEL::GetBoundingBox() const
{
int x, y, dx, dy, length, height;
......@@ -1648,13 +1541,6 @@ EDA_Rect SCH_HIERLABEL::GetBoundingBox() const
}
/**
* Function GetSchematicTextOffset (virtual)
* @return the offset between the SCH_TEXT position and the text itself
* position
* This offset depend on orientation, and the type of text
* (room to draw an associated graphic symbol, or put the text above a wire)
*/
wxPoint SCH_HIERLABEL::GetSchematicTextOffset()
{
wxPoint text_offset;
......@@ -1686,18 +1572,12 @@ wxPoint SCH_HIERLABEL::GetSchematicTextOffset()
}
/**
* Function Mirror_Y (virtual)
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
*/
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.
* and the label is moved to a suitable 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
* and the label is moved to a suitable position.
*/
switch( GetSchematicTextOrientation() )
{
......@@ -1705,7 +1585,7 @@ void SCH_HIERLABEL::Mirror_Y( int aYaxis_position )
SetSchematicTextOrientation( 2 );
break;
case 2: /* invert horizontal text*/
case 2: /* invert horizontal text*/
SetSchematicTextOrientation( 0 );
break;
}
......@@ -1742,7 +1622,7 @@ void SCH_HIERLABEL::Rotate( wxPoint rotationPoint )
}
bool SCH_HIERLABEL::DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
bool SCH_HIERLABEL::doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
if( !( aFilter & LABEL_T ) )
return false;
......
......@@ -56,6 +56,9 @@ public:
SCH_TEXT( const wxPoint& pos = wxPoint( 0, 0 ),
const wxString& text = wxEmptyString,
KICAD_T aType = SCH_TEXT_T );
SCH_TEXT( const SCH_TEXT& aText );
~SCH_TEXT() { }
virtual wxString GetClass() const
......@@ -63,6 +66,11 @@ public:
return wxT( "SCH_TEXT" );
}
/**
* Function IncrementLabel
* increments the label text.
*/
void IncrementLabel();
/**
* Function SetTextOrientAndJustifyParmeters
......@@ -161,15 +169,16 @@ public:
m_Pos += aMoveVector;
}
/** virtual function Mirror_Y
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
/**
* Function Mirror_Y
* mirrors the item relative to \a aYaxisPosition.
* @param aYaxis_position The y axis coordinate to mirror around.
*/
virtual void Rotate( wxPoint rotationPoint );
virtual void Mirror_Y( int aYaxis_position );
virtual void Mirror_X( int aXaxis_position );
virtual void Rotate( wxPoint rotationPoint );
virtual void Mirror_X( int aXaxis_position );
/**
* Compare schematic text entry against search string.
......@@ -196,8 +205,9 @@ public:
#endif
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const;
virtual EDA_ITEM* doClone() const;
};
......@@ -205,6 +215,9 @@ class SCH_LABEL : public SCH_TEXT
{
public:
SCH_LABEL( const wxPoint& pos = wxPoint( 0, 0 ), const wxString& text = wxEmptyString );
SCH_LABEL( const SCH_LABEL& aLabel );
~SCH_LABEL() { }
virtual void Draw( WinEDA_DrawPanel* panel,
......@@ -218,7 +231,6 @@ public:
return wxT( "SCH_LABEL" );
}
/**
* Function SetTextOrientAndJustifyParmeters
* Set m_SchematicOrientation, and initialize
......@@ -243,7 +255,9 @@ public:
* wire)
*/
virtual wxPoint GetSchematicTextOffset();
virtual void Mirror_X( int aXaxis_position );
virtual void Rotate( wxPoint rotationPoint );
/**
......@@ -275,7 +289,8 @@ public:
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg );
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual EDA_ITEM* doClone() const;
};
......@@ -283,6 +298,9 @@ class SCH_GLOBALLABEL : public SCH_TEXT
{
public:
SCH_GLOBALLABEL( const wxPoint& pos = wxPoint( 0, 0 ), const wxString& text = wxEmptyString );
SCH_GLOBALLABEL( const SCH_GLOBALLABEL& aGlobalLabel );
~SCH_GLOBALLABEL() { }
virtual void Draw( WinEDA_DrawPanel* panel,
......@@ -296,7 +314,6 @@ public:
return wxT( "SCH_GLOBALLABEL" );
}
/**
* Function SetTextOrientAndJustifyParmeters
* Set m_SchematicOrientation, and initialize
......@@ -356,8 +373,7 @@ public:
* @param aCorner_list = a buffer to fill with polygon corners coordinates
* @param aPos = Position of the shape
*/
virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
const wxPoint& aPos );
virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list, const wxPoint& aPos );
/** virtual function Mirror_Y
* mirror item relative to an Y axis
......@@ -370,7 +386,8 @@ public:
virtual void Rotate( wxPoint rotationPoint );
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual EDA_ITEM* doClone() const;
};
......@@ -381,7 +398,10 @@ public:
const wxString& text = wxEmptyString,
KICAD_T aType = SCH_HIERARCHICAL_LABEL_T );
SCH_HIERLABEL( const SCH_HIERLABEL& aHierLabel );
~SCH_HIERLABEL() { }
virtual void Draw( WinEDA_DrawPanel* panel,
wxDC* DC,
const wxPoint& offset,
......@@ -393,7 +413,6 @@ public:
return wxT( "SCH_HIERLABEL" );
}
/**
* Function SetTextOrientAndJustifyParmeters
* Set m_SchematicOrientation, and initialize
......@@ -425,8 +444,7 @@ public:
* @param aCorner_list = a buffer to fill with polygon corners coordinates
* @param Pos = Postion of the shape
*/
virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list,
const wxPoint& Pos );
virtual void CreateGraphicShape( std::vector <wxPoint>& aCorner_list, const wxPoint& Pos );
/**
* Function Save
......@@ -467,7 +485,8 @@ public:
virtual void Rotate( wxPoint rotationPoint );
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const;
virtual EDA_ITEM* doClone() const;
};
#endif /* CLASS_TEXT_LABEL_H */
......@@ -17,9 +17,11 @@
#include "eeschema_id.h"
#include "protos.h"
#include "class_library.h"
#include "sch_bus_entry.h"
#include "sch_marker.h"
#include "sch_component.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_sheet.h"
......
......@@ -10,9 +10,13 @@
#include "general.h"
#include "protos.h"
#include "sch_bus_entry.h"
#include "sch_marker.h"
#include "sch_items.h"
#include "sch_line.h"
#include "sch_no_connect.h"
#include "sch_component.h"
#include "sch_polyline.h"
#include "sch_sheet.h"
......
......@@ -124,7 +124,7 @@ WinEDA_ConfigFrame::WinEDA_ConfigFrame( WinEDA_GerberFrame* parent,
}
void WinEDA_ConfigFrame::OnOkClick( wxCommandEvent &event )
void WinEDA_ConfigFrame::OnOkClick( wxCommandEvent& event )
{
g_DrillFilenameExt = TextDrillExt->GetValue();
g_PhotoFilenameExt = TextPhotoExt->GetValue();
......@@ -134,7 +134,7 @@ void WinEDA_ConfigFrame::OnOkClick( wxCommandEvent &event )
}
void WinEDA_ConfigFrame::OnCancelClick( wxCommandEvent &event )
void WinEDA_ConfigFrame::OnCancelClick( wxCommandEvent& event )
{
EndModal( -1 );
}
......
......@@ -7,14 +7,16 @@
#include "colors.h"
#include <boost/ptr_container/ptr_vector.hpp>
#if defined(DEBUG)
#include <iostream> // needed for Show()
extern std::ostream& operator <<( std::ostream& out, const wxSize& size );
extern std::ostream& operator <<( std::ostream& out, const wxPoint& pt );
#endif
/* Id for class identification, at run time */
enum KICAD_T {
NOT_USED = -1, // the 3d code uses this value
......@@ -170,23 +172,25 @@ public:
m_Pos.y + ( m_Size.y >> 1 ) );
}
/* Move this by the aMoveVector value (this is a relative move
/**
* Function Move
* moves the rectangle by the \a aMoveVector.
* @param aMoveVector A wxPoint that is the value to move this rectangle
*/
void Move( const wxPoint& aMoveVector );
/**
* Function Normalize
* Ensure the height and width are >= 0
* ensures thatthe height ant width are positive.
*/
void Normalize();
void Normalize();
/**
* Function Contains
* @param aPoint = the wxPoint to test
* @return true if aPoint is inside the boundary box. A point on a edge is seen as inside
*/
bool Contains( const wxPoint& aPoint ) const;
bool Contains( const wxPoint& aPoint ) const;
/**
* Function Contains
* @param x = the x coordinate of the point to test
......@@ -237,42 +241,38 @@ public:
*/
bool Intersects( const EDA_Rect& aRect ) const;
/**
* Function operator(wxRect)
* overloads the cast operator to return a wxRect
*/
operator wxRect() const { return wxRect( m_Pos, m_Size ); }
/** Inflate
* Inflate this object: move each horizontal edge by dx and each vertical
* edge by dy toward rect outside
* if dx and/or dy is negative, move toward rect inside (deflate)
* Works for positive and negative rect size
/**
* Function Inflate
* inflates the rectangle horizontally by \a dx and vertically by \a dy. If \a dx
* and/or \a dy is negative the rectangle is deflated.
*/
EDA_Rect& Inflate( wxCoord dx, wxCoord dy );
/** Inflate
* Inflate this object: move each horizontal edge and each vertical edge by
* aDelta toward rect outside
* if aDelta is negative, move toward rect inside (deflate)
* Works for positive and negative rect size
/**
* Function Inflate
* inflates the rectangle horizontally and vertically by \a aDelta. If \a aDelta
* is negative the rectangle is deflated.
*/
EDA_Rect& Inflate( int aDelta );
/**
* Function Merge
* Modify Position and Size of this in order to contain the given rect
* mainly used to calculate bounding boxes
* @param aRect = given rect to merge with this
* modifies the position and size of the rectangle in order to contain \a aRect. It is
* mainly used to calculate bounding boxes.
* @param aRect The rectangle to merge with this rectangle.
*/
void Merge( const EDA_Rect& aRect );
/**
* Function Merge
* Modify Position and Size of this in order to contain the given point
* mainly used to calculate bounding boxes
* @param aPoint = given point to merge with this
* modifies the position and size of the rectangle in order to contain the given point.
* @param aPoint The point to merge with the rectangle.
*/
void Merge( const wxPoint& aPoint );
};
......@@ -344,6 +344,21 @@ public:
private:
void InitVars();
/**
* @brief Function doClone
* is used by the derived class to actually implement the cloning.
*
* The default version will return NULL in release builds and likely crash the
* program. In debug builds, an warning message indicating the derived class
* has not implemented cloning. This really should be a pure virtual function.
* Due to the fact that there are so many objects derived from EDA_ITEM, the
* decision was made to return NULL until all the objects derived from EDA_ITEM
* implement cloning. Once that happens, this function should be made pure.
*
* @return A clone of the item.
*/
virtual EDA_ITEM* doClone() const;
public:
EDA_ITEM( EDA_ITEM* parent, KICAD_T idType );
......@@ -417,7 +432,6 @@ public:
// derived classes may implement this
}
/**
* Function HitTest
* tests if the given wxPoint is within the bounds of this object.
......@@ -429,7 +443,6 @@ public:
return false; // derived classes should override this function
}
/**
* Function HitTest (overlaid)
* tests if the given EDA_Rect intersect this object.
......@@ -442,7 +455,6 @@ public:
return false; // derived classes should override this function
}
/**
* Function GetBoundingBox
* returns the orthogonal, bounding box of this object for display
......@@ -464,6 +476,16 @@ public:
return EDA_Rect( wxPoint( 0, 0 ), wxSize( 0, 0 ) );
}
/**
* @brief Function Clone
* creates a duplicate of this item with linked list members set to NULL.
*
* The Clone() function only calls the private virtual doClone() which actually
* does the cloning for the derived object.
*
* @return A clone of the item.
*/
EDA_ITEM* Clone() const { return doClone(); }
/**
* Function IterateForward
......@@ -542,6 +564,25 @@ public:
};
/**
* Function new_clone
* provides cloning capabilities for all Boost pointer containers of EDA_ITEMs.
*
* @param aItem EDA_ITEM to clone.
* @return Clone of \a aItem.
*/
inline EDA_ITEM* new_clone( const EDA_ITEM& aItem ) { return aItem.Clone(); }
/**
* Define list of drawing items for screens.
*
* The Boost containter was choosen over the statand C++ contain because you can detach
* the pointer from a list with the release method.
*/
typedef boost::ptr_vector< EDA_ITEM > EDA_ITEMS;
// Graphic Text justify:
// Values -1,0,1 are used in computations, do not change them
enum GRTextHorizJustifyType {
......@@ -611,6 +652,7 @@ public:
public:
EDA_TextStruct( const wxString& text = wxEmptyString );
EDA_TextStruct( const EDA_TextStruct& aText );
virtual ~EDA_TextStruct();
int GetLength() const { return m_Text.Length(); };
......
......@@ -14,22 +14,11 @@
#include "block_commande.h"
#include "common.h"
#include <boost/ptr_container/ptr_vector.hpp>
// Forward declarations:
class Ki_PageDescr;
/**
* Define list of drawing items for screens.
*
* The Boost containter was choosen over the statand C++ contain because you can detach
* the pointer from a list with the release method.
*/
typedef boost::ptr_vector< EDA_ITEM > EDA_ITEMS;
/* Simple class for handling grid arrays. */
class GRID_TYPE
{
......
......@@ -10,13 +10,16 @@
class MARKER_BASE
{
public:
wxPoint m_Pos; ///< position of the marker
wxPoint m_Pos; ///< position of the marker
protected:
std::vector <wxPoint> m_Corners; ///< Corner list for shape definition (a polygon)
int m_MarkerType; ///< Can be used as a flag
EDA_Colors m_Color; ///< color
EDA_Rect m_ShapeBoundingBox; ///< Bounding box of the graphic symbol, relative to the position of the shape, used for Hit Tests
int m_ScalingFactor; ///< Scaling factor for m_Size and m_Corners (can set the physical size
std::vector <wxPoint> m_Corners; ///< Corner list for shape definition (a polygon)
int m_MarkerType; ///< Can be used as a flag
EDA_Colors m_Color; ///< color
EDA_Rect m_ShapeBoundingBox; ///< Bounding box of the graphic symbol, relative
///< to the position of the shape, used for Hit
///< Tests
int m_ScalingFactor; ///< Scaling factor for m_Size and m_Corners (can
///< set the physical size
DRC_ITEM m_drc;
void init();
......@@ -48,14 +51,21 @@ public:
MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos );
/**
* Contructor
* makes a copy of \a aMarker but does not copy the DRC_ITEM.
*
* @param aMarker The marker to copy.
*/
MARKER_BASE( const MARKER_BASE& aMarker );
~MARKER_BASE();
/**
* Function DrawMarker
* draws the shape is the polygon defined in m_Corners (array of wxPoints).
*/
void DrawMarker( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode, const wxPoint& offset );
void DrawMarker( WinEDA_DrawPanel* aPanel, wxDC* aDC, int aDrawMode, const wxPoint& aOffset );
/**
* Function GetPos
......@@ -66,7 +76,6 @@ public:
return m_Pos;
}
/**
* Function SetColor
* Set the color of this marker
......@@ -76,7 +85,6 @@ public:
m_Color = aColor;
}
/**
* Function to set/get error levels (warning, fatal ..)
* this value is stored in m_MarkerType
......@@ -88,13 +96,11 @@ public:
m_MarkerType |= aErrorLevel << 8;
}
int GetErrorLevel() const
{
return (m_MarkerType >> 8) & 0xFF;
}
/** Functions to set/get marker type (DRC, ERC, or other)
* this value is stored in m_MarkerType
*/
......@@ -105,13 +111,11 @@ public:
m_MarkerType |= aMarkerType;
}
int GetMarkerType() const
{
return m_MarkerType & 0xFF;
}
/**
* Function SetData
* fills in all the reportable data associated with a MARKER.
......@@ -137,11 +141,11 @@ public:
void SetData( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos );
/**
* Function SetAuxiliaryData
* initialize data for the second (auxiliary) item
* @param aAuxiliaryText = the second text (main text) concerning the second schematic or board item
* @param aAuxiliaryText = the second text (main text) concerning the second schematic or
* board item
* @param aAuxiliaryPos = position the second item
*/
void SetAuxiliaryData( const wxString& aAuxiliaryText, const wxPoint& aAuxiliaryPos )
......@@ -165,12 +169,11 @@ public:
return m_drc;
}
/**
* Function DisplayMarkerInfo
* Displays the full info of this marker, in a HTML window
* displays the full info of this marker, in a HTML window.
*/
void DisplayMarkerInfo(WinEDA_DrawFrame * aFrame);
void DisplayMarkerInfo( WinEDA_DrawFrame* aFrame );
/**
* Function HitTestMarker
......
......@@ -39,6 +39,16 @@ enum SCH_FILTER_T {
};
/* used to calculate the pen size from default value
* the actual pen size is default value * BUS_WIDTH_EXPAND
*/
#if defined(KICAD_GOST)
#define BUS_WIDTH_EXPAND 3.6
#else
#define BUS_WIDTH_EXPAND 1.4
#endif
enum DANGLING_END_T {
UNKNOWN = 0,
WIRE_START_END,
......@@ -84,6 +94,8 @@ protected:
public:
SCH_ITEM( EDA_ITEM* aParent, KICAD_T aType );
SCH_ITEM( const SCH_ITEM& aItem );
~SCH_ITEM();
virtual wxString GetClass() const
......@@ -91,6 +103,8 @@ public:
return wxT( "SCH_ITEM" );
}
SCH_ITEM* Clone() const { return ( SCH_ITEM* ) EDA_ITEM::Clone(); }
SCH_ITEM* Next() { return (SCH_ITEM*) Pnext; }
SCH_ITEM* Back() { return (SCH_ITEM*) Pback; }
......@@ -122,37 +136,38 @@ public:
int aDrawMode,
int aColor = -1 ) = 0;
/* Place function */
virtual void Place( SCH_EDIT_FRAME* aFrame, wxDC* aDC );
// Geometric transforms (used in block operations):
/** virtual function Move
* move item to a new position.
/**
* Function Move
* moves the item by \a aMoveVector to a new position.
* @param aMoveVector = the deplacement vector
*/
virtual void Move( const wxPoint& aMoveVector ) = 0;
/** virtual function Mirror_Y
* mirror item relative to an Y axis
* @param aYaxis_position = the y axis position
/**
* Function Mirror_Y
* mirrors item relative to an Y axis about \a aYaxis_position.
* @param aYaxis_position The Y axis position to mirror around.
*/
virtual void Mirror_Y( int aYaxis_position ) = 0;
virtual void Mirror_X( int aXaxis_position ) = 0;
virtual void Rotate( wxPoint rotationPoint ) = 0;
virtual void Rotate( wxPoint rotationPoint ) = 0;
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch"
* format.
* writes the data structures for this object out to a FILE in "*.sch" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
virtual bool Save( FILE* aFile ) const = 0;
/**
* Load schematic item from \a aLine in a .sch file.
* Function Load
* reads a schematic item from \a aLine in a .sch file.
*
* @param aLine - Essentially this is file to read the object from.
* @param aErrorMsg - Description of the error if an error occurs while loading the object.
......@@ -161,7 +176,8 @@ public:
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg ) { return false; }
/**
* Compare schematic item against search string.
* Function Matches
* compares the schematic item against search \a aSearchData.
*
* The base class returns false since many of the objects derived from
* SCH_ITEM do not have any text to search.
......@@ -190,7 +206,8 @@ public:
bool Matches( const wxString& aText, wxFindReplaceData& aSearchData );
/**
* Add schematic item end points to \a aItemList if the item has endpoints.
* Function GetEndPoints
* adds the schematic item end points to \a aItemList if the item has end points.
*
* The default version doesn't do anything since many of the schematic object cannot
* be tested for dangling ends. If you add a new schematic item that can have a
......@@ -202,7 +219,8 @@ public:
virtual void GetEndPoints( vector< DANGLING_END_ITEM >& aItemList ) {}
/**
* Test the schematic item to \a aItemList to check if it's dangling state has changed.
* Function IsDanglingStateChanged
* tests the schematic item to \a aItemList to check if it's dangling state has changed.
*
* Note that the return value only true when the state of the test has changed. Use
* the IsDangling() method to get the current dangling state of the item. Some of
......@@ -218,9 +236,10 @@ public:
virtual bool IsDangling() const { return false; }
/**
* Check if the selection state of an item inside \a aRect has changed.
* Function IsSelectStateChanged
* checks if the selection state of an item inside \a aRect has changed.
*
* The is used by the block selection code to verify if an item is selected or not.
* This is used by the block selection code to verify if an item is selected or not.
* True is be return anytime the select state changes. If you need to know the
* the current selection state, use the IsSelected() method.
*
......@@ -229,16 +248,18 @@ public:
virtual bool IsSelectStateChanged( const wxRect& aRect ) { return false; }
/**
* Get a list of connection points for this item.
* Function GetConnectionPoints
* add all the connection points for this item to \a aPoints.
*
* Not all schematic items have connection points so the default method does nothing.
*
* @param aPoints - List of connection points to add to.
* @param aPoints List of connection points to add to.
*/
virtual void GetConnectionPoints( vector< wxPoint >& aPoints ) const { }
/**
* Clear all of the connection items from the list.
* Function ClearConnections
* clears all of the connection items from the list.
*
* The vector release method is used to prevent the item pointers from being deleted.
* Do not use the vector erase method on the connection list.
......@@ -246,8 +267,8 @@ public:
void ClearConnections() { m_connections.release(); }
/**
* Function IsConnected().
* Test \a aPoint to see if it is connected to this schematic object.
* Function IsConnected
* tests the item to see if it is connected to \a aPoint.
*
* @param aPoint - Position to test for connection.
* @return True if connection to \a aPoint exists.
......@@ -255,8 +276,8 @@ public:
bool IsConnected( const wxPoint& aPoint ) const;
/**
* Function HitTest().
* Test if \a aPoint is contained within the bounding box or on an item.
* Function HitTest
* tests if \a aPoint is contained within or on the bounding box of an item.
*
* @param aPoint - Point to test.
* @param aAccuracy - Increase the item bounding box by this amount.
......@@ -266,12 +287,12 @@ public:
bool HitTest( const wxPoint& aPoint, int aAccuracy = 0,
SCH_FILTER_T aFilter = NO_FILTER_T ) const
{
return DoHitTest( aPoint, aAccuracy, aFilter );
return doHitTest( aPoint, aAccuracy, aFilter );
}
/**
* Function HitTest().
* Test if \a aRect intersects or contains the bounding box of me.
* Function HitTest
* tests if \a aRect intersects or is contained within the bounding box of an item.
*
* @param aRect - Rectangle to test.
* @param aContained - Set to true to test for containment instead of an intersection.
......@@ -280,7 +301,7 @@ public:
*/
bool HitTest( const EDA_Rect& aRect, bool aContained = false, int aAccuracy = 0 ) const
{
return DoHitTest( aRect, aContained, aAccuracy );
return doHitTest( aRect, aContained, aAccuracy );
}
/**
......@@ -290,17 +311,17 @@ public:
* http://www.gotw.ca/publications/mill18.htm.
*/
private:
virtual bool DoHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy, SCH_FILTER_T aFilter ) const
{
return false;
}
virtual bool DoHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
virtual bool doHitTest( const EDA_Rect& aRect, bool aContained, int aAccuracy ) const
{
return false;
}
virtual bool DoIsConnected( const wxPoint& aPosition ) const { return false; }
virtual bool doIsConnected( const wxPoint& aPosition ) const { return false; }
};
#endif /* SCH_ITEM_STRUCT_H */
......@@ -139,7 +139,7 @@ public:
~WinEDA_PcbFrame();
void OnQuit( wxCommandEvent & WXUNUSED(event) );
void OnQuit( wxCommandEvent& event );
/**
* Function ToPlotter
......
/**
* @file pcbnew/dialog_display_options.h
* @file pcbnew/dialogs/dialog_display_options.h
*/
#include "dialog_display_options_base.h"
......
......@@ -129,7 +129,7 @@ void DIALOG_MODULE_BOARD_EDITOR::InitBoardProperties()
}
void DIALOG_MODULE_BOARD_EDITOR::OnCancelClick( wxCommandEvent& WXUNUSED( event ) )
void DIALOG_MODULE_BOARD_EDITOR::OnCancelClick( wxCommandEvent& event )
{
EndModal( -1 );
}
......
......@@ -307,7 +307,7 @@ void DIALOG_MODULE_MODULE_EDITOR::BrowseAndAdd3DLib( wxCommandEvent& event )
/**********************************************************************/
void DIALOG_MODULE_MODULE_EDITOR::OnCancelClick( wxCommandEvent& WXUNUSED (event) )
void DIALOG_MODULE_MODULE_EDITOR::OnCancelClick( wxCommandEvent& event )
/**********************************************************************/
{
EndModal( -1 );
......
......@@ -139,7 +139,7 @@ DIMENSION_EDITOR_DIALOG::DIMENSION_EDITOR_DIALOG( WinEDA_PcbFrame* parent,
/**********************************************************************/
void DIMENSION_EDITOR_DIALOG::OnCancelClick( wxCommandEvent& WXUNUSED (event) )
void DIMENSION_EDITOR_DIALOG::OnCancelClick( wxCommandEvent& event )
/**********************************************************************/
{
EndModal( -1 );
......
......@@ -124,7 +124,7 @@ TARGET_PROPERTIES_DIALOG_EDITOR::TARGET_PROPERTIES_DIALOG_EDITOR(
}
void TARGET_PROPERTIES_DIALOG_EDITOR::OnCancelClick( wxCommandEvent& WXUNUSED( event ) )
void TARGET_PROPERTIES_DIALOG_EDITOR::OnCancelClick( wxCommandEvent& event )
{
EndModal( -1 );
}
......
......@@ -797,7 +797,7 @@ WinEDA_SetParamShapeFrame::WinEDA_SetParamShapeFrame( WinEDA_PcbFrame* parent,
}
void WinEDA_SetParamShapeFrame::OnCancelClick( wxCommandEvent& WXUNUSED(event) )
void WinEDA_SetParamShapeFrame::OnCancelClick( wxCommandEvent& event )
{
if( PolyEdges )
free( PolyEdges );
......
......@@ -414,7 +414,7 @@ void WinEDA_PcbFrame::ReFillLayerWidget()
}
void WinEDA_PcbFrame::OnQuit( wxCommandEvent & WXUNUSED(event) )
void WinEDA_PcbFrame::OnQuit( wxCommandEvent& event )
{
Close( true );
}
......
......@@ -303,7 +303,7 @@ void DIALOG_PLOT::Init_Dialog()
}
void DIALOG_PLOT::OnQuit( wxCommandEvent& WXUNUSED( event ) )
void DIALOG_PLOT::OnQuit( wxCommandEvent& event )
{
Close( true ); // true is to force the frame to close
}
......
......@@ -66,7 +66,7 @@ void WinEDA_PcbFrame::InstallExchangeModuleFrame( MODULE* Module )
}
void DIALOG_EXCHANGE_MODULE::OnQuit( wxCommandEvent& WXUNUSED( event ) )
void DIALOG_EXCHANGE_MODULE::OnQuit( wxCommandEvent& event )
{
s_SelectionMode = m_Selection->GetSelection();
Close( true ); // true is to force the frame to close
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment