Commit 9dce6fba authored by Wayne Stambaugh's avatar Wayne Stambaugh
Browse files

Encapsulate SCH_JUNCTION, SCH_LINE, and SCH_NO_CONNECT classes.

parent 16131a50
Loading
Loading
Loading
Loading
+25 −26
Original line number Original line Diff line number Diff line
@@ -88,7 +88,7 @@ static void DrawSegment( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosi
    if( g_HVLines ) /* Coerce the line to vertical or horizontal one: */
    if( g_HVLines ) /* Coerce the line to vertical or horizontal one: */
        ComputeBreakPoint( CurrentLine, endpos );
        ComputeBreakPoint( CurrentLine, endpos );
    else
    else
        CurrentLine->m_End = endpos;
        CurrentLine->SetEndPoint( endpos );


    segment = CurrentLine;
    segment = CurrentLine;


@@ -201,7 +201,7 @@ void SCH_EDIT_FRAME::BeginSegment( wxDC* DC, int type )
        if( nextsegment )
        if( nextsegment )
        {
        {
            newsegment = new SCH_LINE( *nextsegment );
            newsegment = new SCH_LINE( *nextsegment );
            nextsegment->m_Start = newsegment->m_End;
            nextsegment->SetStartPoint( newsegment->GetEndPoint() );
            nextsegment->SetNext( NULL );
            nextsegment->SetNext( NULL );
            nextsegment->SetBack( newsegment );
            nextsegment->SetBack( newsegment );
            newsegment->SetNext( nextsegment );
            newsegment->SetNext( nextsegment );
@@ -210,10 +210,10 @@ void SCH_EDIT_FRAME::BeginSegment( wxDC* DC, int type )
        else
        else
        {
        {
            newsegment = new SCH_LINE( *oldsegment );
            newsegment = new SCH_LINE( *oldsegment );
            newsegment->m_Start = oldsegment->m_End;
            newsegment->SetStartPoint( oldsegment->GetEndPoint() );
        }
        }


        newsegment->m_End   = cursorpos;
        newsegment->SetEndPoint( cursorpos );
        oldsegment->ClearFlags( IS_NEW );
        oldsegment->ClearFlags( IS_NEW );
        oldsegment->SetFlags( SELECTED );
        oldsegment->SetFlags( SELECTED );
        newsegment->SetFlags( IS_NEW );
        newsegment->SetFlags( IS_NEW );
@@ -224,7 +224,7 @@ void SCH_EDIT_FRAME::BeginSegment( wxDC* DC, int type )
         * Create a junction if needed. Note: a junction can be needed later,
         * Create a junction if needed. Note: a junction can be needed later,
         * if the new segment is merged (after a cleanup) with an older one
         * if the new segment is merged (after a cleanup) with an older one
         * (tested when the connection will be finished)*/
         * (tested when the connection will be finished)*/
        if( oldsegment->m_Start == s_ConnexionStartPoint )
        if( oldsegment->GetStartPoint() == s_ConnexionStartPoint )
        {
        {
            if( GetScreen()->IsJunctionNeeded( s_ConnexionStartPoint ) )
            if( GetScreen()->IsJunctionNeeded( s_ConnexionStartPoint ) )
                AddJunction( DC, s_ConnexionStartPoint );
                AddJunction( DC, s_ConnexionStartPoint );
@@ -288,14 +288,14 @@ void SCH_EDIT_FRAME::EndSegment( wxDC* DC )
    wxPoint end_point, alt_end_point;
    wxPoint end_point, alt_end_point;


    /* A junction can be needed to connect the last segment
    /* A junction can be needed to connect the last segment
     *  usually to m_End coordinate.
     *  usually to m_end coordinate.
     *  But if the last segment is removed by a cleanup, because of redundancy,
     *  But if the last segment is removed by a cleanup, because of redundancy,
     * a junction can be needed to connect the previous segment m_End
     * a junction can be needed to connect the previous segment m_end
     * coordinate with is also the lastsegment->m_Start coordinate */
     * coordinate with is also the lastsegment->m_start coordinate */
    if( lastsegment )
    if( lastsegment )
    {
    {
        end_point     = lastsegment->m_End;
        end_point     = lastsegment->GetEndPoint();
        alt_end_point = lastsegment->m_Start;
        alt_end_point = lastsegment->GetStartPoint();
    }
    }


    GetScreen()->SchematicCleanUp( DrawPanel );
    GetScreen()->SchematicCleanUp( DrawPanel );
@@ -373,37 +373,36 @@ static void ComputeBreakPoint( SCH_LINE* aSegment, const wxPoint& aPosition )
    if( nextsegment == NULL )
    if( nextsegment == NULL )
        return;
        return;
#if 0
#if 0
    if( ABS( middle_position.x - aSegment->m_Start.x ) <
    if( ABS( middle_position.x - aSegment->GetStartPoint().x ) <
        ABS( middle_position.y - aSegment->m_Start.y ) )
        ABS( middle_position.y - aSegment->GetStartPoint().y ) )
        middle_position.x = aSegment->m_Start.x;
        middle_position.x = aSegment->GetStartPoint().x;
    else
    else
        middle_position.y = aSegment->m_Start.y;
        middle_position.y = aSegment->GetStartPoint().y;
#else
#else
    int iDx = aSegment->m_End.x - aSegment->m_Start.x;
    int iDx = aSegment->GetEndPoint().x - aSegment->GetStartPoint().x;
    int iDy = aSegment->m_End.y - aSegment->m_Start.y;
    int iDy = aSegment->GetEndPoint().y - aSegment->GetStartPoint().y;


    if( iDy != 0 )         // keep the first segment orientation (currently horizontal)
    if( iDy != 0 )         // keep the first segment orientation (currently horizontal)
    {
    {
        middle_position.x = aSegment->m_Start.x;
        middle_position.x = aSegment->GetStartPoint().x;
    }
    }
    else if( iDx != 0 )    // keep the first segment orientation (currently vertical)
    else if( iDx != 0 )    // keep the first segment orientation (currently vertical)
    {
    {
        middle_position.y = aSegment->m_Start.y;
        middle_position.y = aSegment->GetStartPoint().y;
    }
    }
    else
    else
    {
    {
        if( ABS( middle_position.x - aSegment->m_Start.x ) <
        if( ABS( middle_position.x - aSegment->GetStartPoint().x ) <
            ABS( middle_position.y - aSegment->m_Start.y ) )
            ABS( middle_position.y - aSegment->GetStartPoint().y ) )
            middle_position.x = aSegment->m_Start.x;
            middle_position.x = aSegment->GetStartPoint().x;
        else
        else
            middle_position.y = aSegment->m_Start.y;
            middle_position.y = aSegment->GetStartPoint().y;
    }
    }
#endif
#endif


    aSegment->m_End = middle_position;
    aSegment->SetEndPoint( middle_position );

    nextsegment->SetStartPoint( middle_position );
    nextsegment->m_Start = middle_position;
    nextsegment->SetEndPoint( aPosition );
    nextsegment->m_End   = aPosition;
}
}




+2 −2
Original line number Original line Diff line number Diff line
@@ -578,7 +578,7 @@ void AddMenusForWire( wxMenu* PopMenu, SCH_LINE* Wire, SCH_EDIT_FRAME* frame )
    AddMenuItem( PopMenu, ID_POPUP_SCH_ADD_LABEL, msg, KiBitmap( add_line_label_xpm ) );
    AddMenuItem( PopMenu, ID_POPUP_SCH_ADD_LABEL, msg, KiBitmap( add_line_label_xpm ) );


    // Add global label command only if the cursor is over one end of the wire.
    // Add global label command only if the cursor is over one end of the wire.
    if( ( pos == Wire->m_Start ) || ( pos == Wire->m_End ) )
    if( Wire->IsEndPoint( pos ) )
        AddMenuItem( PopMenu, ID_POPUP_SCH_ADD_GLABEL, _( "Add Global Label" ),
        AddMenuItem( PopMenu, ID_POPUP_SCH_ADD_GLABEL, _( "Add Global Label" ),
                     KiBitmap( add_glabel_xpm ) );
                     KiBitmap( add_glabel_xpm ) );
}
}
@@ -608,7 +608,7 @@ void AddMenusForBus( wxMenu* PopMenu, SCH_LINE* Bus, SCH_EDIT_FRAME* frame )
    AddMenuItem( PopMenu, ID_POPUP_SCH_ADD_LABEL, msg, KiBitmap( add_line_label_xpm ) );
    AddMenuItem( PopMenu, ID_POPUP_SCH_ADD_LABEL, msg, KiBitmap( add_line_label_xpm ) );


    // Add global label command only if the cursor is over one end of the bus.
    // Add global label command only if the cursor is over one end of the bus.
    if( ( pos == Bus->m_Start ) || ( pos == Bus->m_End ) )
    if( Bus->IsEndPoint( pos ) )
        AddMenuItem( PopMenu, ID_POPUP_SCH_ADD_GLABEL, _( "Add Global Label" ),
        AddMenuItem( PopMenu, ID_POPUP_SCH_ADD_GLABEL, _( "Add Global Label" ),
                     KiBitmap( add_glabel_xpm ) );
                     KiBitmap( add_glabel_xpm ) );
}
}
+26 −26
Original line number Original line Diff line number Diff line
@@ -46,9 +46,9 @@ SCH_JUNCTION::SCH_JUNCTION( const wxPoint& pos ) :
    SCH_ITEM( NULL, SCH_JUNCTION_T )
    SCH_ITEM( NULL, SCH_JUNCTION_T )
{
{
#define DRAWJUNCTION_DIAMETER 32   /* Diameter of junction symbol between wires */
#define DRAWJUNCTION_DIAMETER 32   /* Diameter of junction symbol between wires */
    m_Pos    = pos;
    m_pos    = pos;
    m_Layer  = LAYER_JUNCTION;
    m_Layer  = LAYER_JUNCTION;
    m_Size.x = m_Size.y = DRAWJUNCTION_DIAMETER;
    m_size.x = m_size.y = DRAWJUNCTION_DIAMETER;
#undef DRAWJUNCTION_DIAMETER
#undef DRAWJUNCTION_DIAMETER
}
}


@@ -56,8 +56,8 @@ SCH_JUNCTION::SCH_JUNCTION( const wxPoint& pos ) :
SCH_JUNCTION::SCH_JUNCTION( const SCH_JUNCTION& aJunction ) :
SCH_JUNCTION::SCH_JUNCTION( const SCH_JUNCTION& aJunction ) :
    SCH_ITEM( aJunction )
    SCH_ITEM( aJunction )
{
{
    m_Pos = aJunction.m_Pos;
    m_pos = aJunction.m_pos;
    m_Size = aJunction.m_Size;
    m_size = aJunction.m_size;
}
}




@@ -65,7 +65,7 @@ bool SCH_JUNCTION::Save( FILE* aFile ) const
{
{
    bool success = true;
    bool success = true;


    if( fprintf( aFile, "Connection ~ %-4d %-4d\n", m_Pos.x, m_Pos.y ) == EOF )
    if( fprintf( aFile, "Connection ~ %-4d %-4d\n", m_pos.x, m_pos.y ) == EOF )
    {
    {
        success = false;
        success = false;
    }
    }
@@ -86,8 +86,8 @@ void SCH_JUNCTION::SwapData( SCH_ITEM* aItem )
                 wxT( "Cannot swap junction data with invalid item." ) );
                 wxT( "Cannot swap junction data with invalid item." ) );


    SCH_JUNCTION* item = (SCH_JUNCTION*) aItem;
    SCH_JUNCTION* item = (SCH_JUNCTION*) aItem;
    EXCHG( m_Pos, item->m_Pos );
    EXCHG( m_pos, item->m_pos );
    EXCHG( m_Size, item->m_Size );
    EXCHG( m_size, item->m_size );
}
}




@@ -99,7 +99,7 @@ bool SCH_JUNCTION::Load( LINE_READER& aLine, wxString& aErrorMsg )
    while( (*line != ' ' ) && *line )
    while( (*line != ' ' ) && *line )
        line++;
        line++;


    if( sscanf( line, "%s %d %d", name, &m_Pos.x, &m_Pos.y ) != 3 )
    if( sscanf( line, "%s %d %d", name, &m_pos.x, &m_pos.y ) != 3 )
    {
    {
        aErrorMsg.Printf( wxT( "Eeschema file connection load error at line %d, aborted" ),
        aErrorMsg.Printf( wxT( "Eeschema file connection load error at line %d, aborted" ),
                          aLine.LineNumber() );
                          aLine.LineNumber() );
@@ -115,8 +115,8 @@ EDA_RECT SCH_JUNCTION::GetBoundingBox() const
{
{
    EDA_RECT rect;
    EDA_RECT rect;


    rect.SetOrigin( m_Pos );
    rect.SetOrigin( m_pos );
    rect.Inflate( ( GetPenSize() + m_Size.x ) / 2 );
    rect.Inflate( ( GetPenSize() + m_size.x ) / 2 );


    return rect;
    return rect;
}
}
@@ -134,36 +134,36 @@ void SCH_JUNCTION::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffs


    GRSetDrawMode( aDC, aDrawMode );
    GRSetDrawMode( aDC, aDrawMode );


    GRFilledCircle( &aPanel->m_ClipBox, aDC, m_Pos.x + aOffset.x, m_Pos.y + aOffset.y,
    GRFilledCircle( &aPanel->m_ClipBox, aDC, m_pos.x + aOffset.x, m_pos.y + aOffset.y,
                    ( m_Size.x / 2 ), 0, color, color );
                    ( m_size.x / 2 ), 0, color, color );
}
}




void SCH_JUNCTION::Mirror_X( int aXaxis_position )
void SCH_JUNCTION::Mirror_X( int aXaxis_position )
{
{
    m_Pos.y -= aXaxis_position;
    m_pos.y -= aXaxis_position;
    NEGATE( m_Pos.y );
    NEGATE( m_pos.y );
    m_Pos.y += aXaxis_position;
    m_pos.y += aXaxis_position;
}
}




void SCH_JUNCTION::Mirror_Y( int aYaxis_position )
void SCH_JUNCTION::Mirror_Y( int aYaxis_position )
{
{
    m_Pos.x -= aYaxis_position;
    m_pos.x -= aYaxis_position;
    NEGATE( m_Pos.x );
    NEGATE( m_pos.x );
    m_Pos.x += aYaxis_position;
    m_pos.x += aYaxis_position;
}
}




void SCH_JUNCTION::Rotate( wxPoint rotationPoint )
void SCH_JUNCTION::Rotate( wxPoint rotationPoint )
{
{
    RotatePoint( &m_Pos, rotationPoint, 900 );
    RotatePoint( &m_pos, rotationPoint, 900 );
}
}




void SCH_JUNCTION::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
void SCH_JUNCTION::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
{
{
    DANGLING_END_ITEM item( JUNCTION_END, this, m_Pos );
    DANGLING_END_ITEM item( JUNCTION_END, this, m_pos );
    aItemList.push_back( item );
    aItemList.push_back( item );
}
}


@@ -172,7 +172,7 @@ bool SCH_JUNCTION::IsSelectStateChanged( const wxRect& aRect )
{
{
    bool previousState = IsSelected();
    bool previousState = IsSelected();


    if( aRect.Contains( m_Pos ) )
    if( aRect.Contains( m_pos ) )
        m_Flags |= SELECTED;
        m_Flags |= SELECTED;
    else
    else
        m_Flags &= ~SELECTED;
        m_Flags &= ~SELECTED;
@@ -183,7 +183,7 @@ bool SCH_JUNCTION::IsSelectStateChanged( const wxRect& aRect )


void SCH_JUNCTION::GetConnectionPoints( vector< wxPoint >& aPoints ) const
void SCH_JUNCTION::GetConnectionPoints( vector< wxPoint >& aPoints ) const
{
{
    aPoints.push_back( m_Pos );
    aPoints.push_back( m_pos );
}
}




@@ -196,7 +196,7 @@ void SCH_JUNCTION::GetNetListItem( vector<NETLIST_OBJECT*>& aNetListItems,
    item->m_SheetListInclude = *aSheetPath;
    item->m_SheetListInclude = *aSheetPath;
    item->m_Comp = (SCH_ITEM*) this;
    item->m_Comp = (SCH_ITEM*) this;
    item->m_Type = NET_JUNCTION;
    item->m_Type = NET_JUNCTION;
    item->m_Start = item->m_End = m_Pos;
    item->m_Start = item->m_End = m_pos;


    aNetListItems.push_back( item );
    aNetListItems.push_back( item );
}
}
@@ -208,7 +208,7 @@ void SCH_JUNCTION::Show( int nestLevel, std::ostream& os )
    // XML output:
    // XML output:
    wxString s = GetClass();
    wxString s = GetClass();


    NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_Pos << "/>\n";
    NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << m_pos << "/>\n";
}
}
#endif
#endif


@@ -238,12 +238,12 @@ 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;
    return m_pos == aPosition;
}
}




void SCH_JUNCTION::doPlot( PLOTTER* aPlotter )
void SCH_JUNCTION::doPlot( PLOTTER* aPlotter )
{
{
    aPlotter->set_color( ReturnLayerColor( GetLayer() ) );
    aPlotter->set_color( ReturnLayerColor( GetLayer() ) );
    aPlotter->circle( m_Pos, m_Size.x, FILLED_SHAPE );
    aPlotter->circle( m_pos, m_size.x, FILLED_SHAPE );
}
}
+5 −7
Original line number Original line Diff line number Diff line
@@ -36,10 +36,8 @@


class SCH_JUNCTION : public SCH_ITEM
class SCH_JUNCTION : public SCH_ITEM
{
{
    wxPoint m_Pos;                  /* XY coordinates of connection. */
    wxPoint m_pos;                  /* XY coordinates of connection. */

    wxSize  m_size;
public:
    wxSize  m_Size;


public:
public:
    SCH_JUNCTION( const wxPoint& pos = wxPoint( 0, 0 ) );
    SCH_JUNCTION( const wxPoint& pos = wxPoint( 0, 0 ) );
@@ -94,7 +92,7 @@ public:
     */
     */
    virtual void Move( const wxPoint& aMoveVector )
    virtual void Move( const wxPoint& aMoveVector )
    {
    {
        m_Pos += aMoveVector;
        m_pos += aMoveVector;
    }
    }


    /**
    /**
@@ -133,8 +131,8 @@ private:
    virtual bool doIsConnected( const wxPoint& aPosition ) const;
    virtual bool doIsConnected( const wxPoint& aPosition ) const;
    virtual EDA_ITEM* doClone() const;
    virtual EDA_ITEM* doClone() const;
    virtual void doPlot( PLOTTER* aPlotter );
    virtual void doPlot( PLOTTER* aPlotter );
    virtual wxPoint doGetPosition() const { return m_Pos; }
    virtual wxPoint doGetPosition() const { return m_pos; }
    virtual void doSetPosition( const wxPoint& aPosition ) { m_Pos = aPosition; }
    virtual void doSetPosition( const wxPoint& aPosition ) { m_pos = aPosition; }
};
};




+98 −98
Original line number Original line Diff line number Diff line
@@ -47,10 +47,10 @@
SCH_LINE::SCH_LINE( const wxPoint& pos, int layer ) :
SCH_LINE::SCH_LINE( const wxPoint& pos, int layer ) :
    SCH_ITEM( NULL, SCH_LINE_T )
    SCH_ITEM( NULL, SCH_LINE_T )
{
{
    m_Start = pos;
    m_start = pos;
    m_End   = pos;
    m_end   = pos;
    m_Width = 0;        // Default thickness used
    m_width = 0;        // Default thickness used
    m_StartIsDangling = m_EndIsDangling = false;
    m_startIsDangling = m_endIsDangling = false;


    switch( layer )
    switch( layer )
    {
    {
@@ -72,10 +72,10 @@ SCH_LINE::SCH_LINE( const wxPoint& pos, int layer ) :
SCH_LINE::SCH_LINE( const SCH_LINE& aLine ) :
SCH_LINE::SCH_LINE( const SCH_LINE& aLine ) :
    SCH_ITEM( aLine )
    SCH_ITEM( aLine )
{
{
    m_Start = aLine.m_Start;
    m_start = aLine.m_start;
    m_End = aLine.m_End;
    m_end = aLine.m_end;
    m_Width = aLine.m_Width;
    m_width = aLine.m_width;
    m_StartIsDangling = m_EndIsDangling = false;
    m_startIsDangling = m_endIsDangling = false;
}
}




@@ -89,13 +89,13 @@ void SCH_LINE::Move( const wxPoint& aOffset )
{
{
    if( (m_Flags & STARTPOINT) == 0 && aOffset != wxPoint( 0, 0 ) )
    if( (m_Flags & STARTPOINT) == 0 && aOffset != wxPoint( 0, 0 ) )
    {
    {
        m_Start += aOffset;
        m_start += aOffset;
        SetModified();
        SetModified();
    }
    }


    if( (m_Flags & ENDPOINT) == 0 && aOffset != wxPoint( 0, 0 ) )
    if( (m_Flags & ENDPOINT) == 0 && aOffset != wxPoint( 0, 0 ) )
    {
    {
        m_End += aOffset;
        m_end += aOffset;
        SetModified();
        SetModified();
    }
    }
}
}
@@ -107,12 +107,12 @@ void SCH_LINE::Show( int nestLevel, std::ostream& os ) const
{
{
    NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str()
    NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str()
                                 << " layer=\"" << m_Layer << '"'
                                 << " layer=\"" << m_Layer << '"'
                                 << " width=\"" << m_Width << '"'
                                 << " width=\"" << m_width << '"'
                                 << " startIsDangling=\"" << m_StartIsDangling
                                 << " startIsDangling=\"" << m_startIsDangling
                                 << '"' << " endIsDangling=\""
                                 << '"' << " endIsDangling=\""
                                 << m_EndIsDangling << '"' << ">"
                                 << m_endIsDangling << '"' << ">"
                                 << " <start" << m_Start << "/>"
                                 << " <start" << m_start << "/>"
                                 << " <end" << m_End << "/>" << "</"
                                 << " <end" << m_end << "/>" << "</"
                                 << GetClass().Lower().mb_str() << ">\n";
                                 << GetClass().Lower().mb_str() << ">\n";
}
}


@@ -123,11 +123,11 @@ EDA_RECT SCH_LINE::GetBoundingBox() const
{
{
    int      width = 25;
    int      width = 25;


    int      xmin = MIN( m_Start.x, m_End.x ) - width;
    int      xmin = MIN( m_start.x, m_end.x ) - width;
    int      ymin = MIN( m_Start.y, m_End.y ) - width;
    int      ymin = MIN( m_start.y, m_end.y ) - width;


    int      xmax = MAX( m_Start.x, m_End.x ) + width;
    int      xmax = MAX( m_start.x, m_end.x ) + width;
    int      ymax = MAX( m_Start.y, m_End.y ) + width;
    int      ymax = MAX( m_start.y, m_end.y ) + width;


    // return a rectangle which is [pos,dim) in nature.  therefore the +1
    // 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 ) );
    EDA_RECT ret( wxPoint( xmin, ymin ), wxSize( xmax - xmin + 1, ymax - ymin + 1 ) );
@@ -138,7 +138,7 @@ EDA_RECT SCH_LINE::GetBoundingBox() const


double SCH_LINE::GetLength() const
double SCH_LINE::GetLength() const
{
{
    return GetLineLength( m_Start, m_End );
    return GetLineLength( m_start, m_end );
}
}




@@ -160,8 +160,8 @@ bool SCH_LINE::Save( FILE* aFile ) const
        success = false;
        success = false;
    }
    }


    if( fprintf( aFile, "\t%-4d %-4d %-4d %-4d\n", m_Start.x, m_Start.y,
    if( fprintf( aFile, "\t%-4d %-4d %-4d %-4d\n", m_start.x, m_start.y,
                 m_End.x, m_End.y ) == EOF )
                 m_end.x, m_end.y ) == EOF )
    {
    {
        success = false;
        success = false;
    }
    }
@@ -196,7 +196,7 @@ bool SCH_LINE::Load( LINE_READER& aLine, wxString& aErrorMsg )
        m_Layer = LAYER_BUS;
        m_Layer = LAYER_BUS;


    if( !aLine.ReadLine() || sscanf( (char*) aLine, "%d %d %d %d ",
    if( !aLine.ReadLine() || sscanf( (char*) aLine, "%d %d %d %d ",
                                      &m_Start.x, &m_Start.y, &m_End.x, &m_End.y ) != 4 )
                                      &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" ),
        aErrorMsg.Printf( wxT( "Eeschema file Segment struct error at line %d, aborted" ),
                          aLine.LineNumber() );
                          aLine.LineNumber() );
@@ -210,9 +210,9 @@ bool SCH_LINE::Load( LINE_READER& aLine, wxString& aErrorMsg )


int SCH_LINE::GetPenSize() const
int SCH_LINE::GetPenSize() const
{
{
    int pensize = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width;
    int pensize = ( m_width == 0 ) ? g_DrawDefaultLineThickness : m_width;


    if( m_Layer == LAYER_BUS && m_Width == 0 )
    if( m_Layer == LAYER_BUS && m_width == 0 )
    {
    {
        pensize = wxRound( g_DrawDefaultLineThickness * BUS_WIDTH_EXPAND );
        pensize = wxRound( g_DrawDefaultLineThickness * BUS_WIDTH_EXPAND );
        pensize = MAX( pensize, 3 );
        pensize = MAX( pensize, 3 );
@@ -235,8 +235,8 @@ void SCH_LINE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset,


    GRSetDrawMode( DC, DrawMode );
    GRSetDrawMode( DC, DrawMode );


    wxPoint start = m_Start;
    wxPoint start = m_start;
    wxPoint end = m_End;
    wxPoint end = m_end;


    if( ( m_Flags & STARTPOINT ) == 0 )
    if( ( m_Flags & STARTPOINT ) == 0 )
        start += offset;
        start += offset;
@@ -248,40 +248,40 @@ void SCH_LINE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset,
    else
    else
        GRLine( &panel->m_ClipBox, DC, start, end, width, color );
        GRLine( &panel->m_ClipBox, DC, start, end, width, color );


    if( m_StartIsDangling )
    if( m_startIsDangling )
        DrawDanglingSymbol( panel, DC, start, color );
        DrawDanglingSymbol( panel, DC, start, color );


    if( m_EndIsDangling )
    if( m_endIsDangling )
        DrawDanglingSymbol( panel, DC, end, color );
        DrawDanglingSymbol( panel, DC, end, color );
}
}




void SCH_LINE::Mirror_X( int aXaxis_position )
void SCH_LINE::Mirror_X( int aXaxis_position )
{
{
    m_Start.y -= aXaxis_position;
    m_start.y -= aXaxis_position;
    NEGATE(  m_Start.y );
    NEGATE(  m_start.y );
    m_Start.y += aXaxis_position;
    m_start.y += aXaxis_position;
    m_End.y   -= aXaxis_position;
    m_end.y   -= aXaxis_position;
    NEGATE(  m_End.y );
    NEGATE(  m_end.y );
    m_End.y += aXaxis_position;
    m_end.y += aXaxis_position;
}
}




void SCH_LINE::Mirror_Y( int aYaxis_position )
void SCH_LINE::Mirror_Y( int aYaxis_position )
{
{
    m_Start.x -= aYaxis_position;
    m_start.x -= aYaxis_position;
    NEGATE(  m_Start.x );
    NEGATE(  m_start.x );
    m_Start.x += aYaxis_position;
    m_start.x += aYaxis_position;
    m_End.x   -= aYaxis_position;
    m_end.x   -= aYaxis_position;
    NEGATE(  m_End.x );
    NEGATE(  m_end.x );
    m_End.x += aYaxis_position;
    m_end.x += aYaxis_position;
}
}




void SCH_LINE::Rotate( wxPoint rotationPoint )
void SCH_LINE::Rotate( wxPoint rotationPoint )
{
{
    RotatePoint( &m_Start, rotationPoint, 900 );
    RotatePoint( &m_start, rotationPoint, 900 );
    RotatePoint( &m_End, rotationPoint, 900 );
    RotatePoint( &m_end, rotationPoint, 900 );
}
}




@@ -293,54 +293,54 @@ bool SCH_LINE::MergeOverlap( SCH_LINE* aLine )
    if( this == aLine || GetLayer() != aLine->GetLayer() )
    if( this == aLine || GetLayer() != aLine->GetLayer() )
        return false;
        return false;


    // Search for a common end, and modify coordinates to ensure RefSegm->m_End
    // Search for a common end, and modify coordinates to ensure RefSegm->m_end
    // == TstSegm->m_Start
    // == TstSegm->m_start
    if( m_Start == aLine->m_Start )
    if( m_start == aLine->m_start )
    {
    {
        if( m_End == aLine->m_End )
        if( m_end == aLine->m_end )
            return true;
            return true;


        EXCHG( m_Start, m_End );
        EXCHG( m_start, m_end );
    }
    }
    else if( m_Start == aLine->m_End )
    else if( m_start == aLine->m_end )
    {
    {
        EXCHG( m_Start, m_End );
        EXCHG( m_start, m_end );
        EXCHG( aLine->m_Start, aLine->m_End );
        EXCHG( aLine->m_start, aLine->m_end );
    }
    }
    else if( m_End == aLine->m_End )
    else if( m_end == aLine->m_end )
    {
    {
        EXCHG( aLine->m_Start, aLine->m_End );
        EXCHG( aLine->m_start, aLine->m_end );
    }
    }
    else if( m_End != aLine->m_Start )
    else if( m_end != aLine->m_start )
    {
    {
        // No common end point, segments cannot be merged.
        // No common end point, segments cannot be merged.
        return false;
        return false;
    }
    }


    /* Test alignment: */
    /* Test alignment: */
    if( m_Start.y == m_End.y )       // Horizontal segment
    if( m_start.y == m_end.y )       // Horizontal segment
    {
    {
        if( aLine->m_Start.y == aLine->m_End.y )
        if( aLine->m_start.y == aLine->m_end.y )
        {
        {
            m_End = aLine->m_End;
            m_end = aLine->m_end;
            return true;
            return true;
        }
        }
    }
    }
    else if( m_Start.x == m_End.x )  // Vertical segment
    else if( m_start.x == m_end.x )  // Vertical segment
    {
    {
        if( aLine->m_Start.x == aLine->m_End.x )
        if( aLine->m_start.x == aLine->m_end.x )
        {
        {
            m_End = aLine->m_End;
            m_end = aLine->m_end;
            return true;
            return true;
        }
        }
    }
    }
    else
    else
    {
    {
        if( atan2( (double) ( m_Start.x - m_End.x ), (double) ( m_Start.y - m_End.y ) )
        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 ),
            == atan2( (double) ( aLine->m_start.x - aLine->m_end.x ),
                      (double) ( aLine->m_Start.y - aLine->m_End.y ) ) )
                      (double) ( aLine->m_start.y - aLine->m_end.y ) ) )
        {
        {
            m_End = aLine->m_End;
            m_end = aLine->m_end;
            return true;
            return true;
        }
        }
    }
    }
@@ -357,11 +357,11 @@ void SCH_LINE::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )
    if( ( GetLayer() == LAYER_BUS ) || ( GetLayer() == LAYER_WIRE ) )
    if( ( GetLayer() == LAYER_BUS ) || ( GetLayer() == LAYER_WIRE ) )
    {
    {
        DANGLING_END_ITEM item( (GetLayer() == LAYER_BUS) ? BUS_START_END : WIRE_START_END, this,
        DANGLING_END_ITEM item( (GetLayer() == LAYER_BUS) ? BUS_START_END : WIRE_START_END, this,
                                m_Start );
                                m_start );
        aItemList.push_back( item );
        aItemList.push_back( item );


        DANGLING_END_ITEM item1( (GetLayer() == LAYER_BUS) ? BUS_END_END : WIRE_END_END, this,
        DANGLING_END_ITEM item1( (GetLayer() == LAYER_BUS) ? BUS_END_END : WIRE_END_END, this,
                                 m_End );
                                 m_end );
        aItemList.push_back( item1 );
        aItemList.push_back( item1 );
    }
    }
}
}
@@ -369,10 +369,10 @@ void SCH_LINE::GetEndPoints( std::vector <DANGLING_END_ITEM>& aItemList )


bool SCH_LINE::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemList )
bool SCH_LINE::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemList )
{
{
    bool previousStartState = m_StartIsDangling;
    bool previousStartState = m_startIsDangling;
    bool previousEndState = m_EndIsDangling;
    bool previousEndState = m_endIsDangling;


    m_StartIsDangling = m_EndIsDangling = true;
    m_startIsDangling = m_endIsDangling = true;


    if( GetLayer() == LAYER_WIRE )
    if( GetLayer() == LAYER_WIRE )
    {
    {
@@ -381,23 +381,23 @@ bool SCH_LINE::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemLi
            if( item.GetItem() == this )
            if( item.GetItem() == this )
                continue;
                continue;


            if( m_Start == item.GetPosition() )
            if( m_start == item.GetPosition() )
                m_StartIsDangling = false;
                m_startIsDangling = false;


            if( m_End == item.GetPosition() )
            if( m_end == item.GetPosition() )
                m_EndIsDangling = false;
                m_endIsDangling = false;


            if( (m_StartIsDangling == false) && (m_EndIsDangling == false) )
            if( (m_startIsDangling == false) && (m_endIsDangling == false) )
                break;
                break;
        }
        }
    }
    }
    else if( GetLayer() == LAYER_BUS || GetLayer() == LAYER_NOTES )
    else if( GetLayer() == LAYER_BUS || GetLayer() == LAYER_NOTES )
    {
    {
        // Lines on the notes layer and the bus layer cannot be tested for dangling ends.
        // Lines on the notes layer and the bus layer cannot be tested for dangling ends.
        previousStartState = previousEndState = m_StartIsDangling = m_EndIsDangling = false;
        previousStartState = previousEndState = m_startIsDangling = m_endIsDangling = false;
    }
    }


    return ( previousStartState != m_StartIsDangling ) || ( previousEndState != m_EndIsDangling );
    return ( previousStartState != m_startIsDangling ) || ( previousEndState != m_endIsDangling );
}
}




@@ -405,17 +405,17 @@ bool SCH_LINE::IsSelectStateChanged( const wxRect& aRect )
{
{
    bool previousState = IsSelected();
    bool previousState = IsSelected();


    if( aRect.Contains( m_Start ) && aRect.Contains( m_End ) )
    if( aRect.Contains( m_start ) && aRect.Contains( m_end ) )
    {
    {
        m_Flags |= SELECTED;
        m_Flags |= SELECTED;
        m_Flags &= ~(STARTPOINT | ENDPOINT);
        m_Flags &= ~(STARTPOINT | ENDPOINT);
    }
    }
    else if( aRect.Contains( m_Start ) )
    else if( aRect.Contains( m_start ) )
    {
    {
        m_Flags &= ~STARTPOINT;
        m_Flags &= ~STARTPOINT;
        m_Flags |= ( SELECTED | ENDPOINT );
        m_Flags |= ( SELECTED | ENDPOINT );
    }
    }
    else if( aRect.Contains( m_End ) )
    else if( aRect.Contains( m_end ) )
    {
    {
        m_Flags &= ~ENDPOINT;
        m_Flags &= ~ENDPOINT;
        m_Flags |= ( SELECTED | STARTPOINT );
        m_Flags |= ( SELECTED | STARTPOINT );
@@ -440,8 +440,8 @@ bool SCH_LINE::IsConnectable() const


void SCH_LINE::GetConnectionPoints( vector< wxPoint >& aPoints ) const
void SCH_LINE::GetConnectionPoints( vector< wxPoint >& aPoints ) const
{
{
    aPoints.push_back( m_Start );
    aPoints.push_back( m_start );
    aPoints.push_back( m_End );
    aPoints.push_back( m_end );
}
}




@@ -449,9 +449,9 @@ wxString SCH_LINE::GetSelectMenuText() const
{
{
    wxString menuText, txtfmt, orient;
    wxString menuText, txtfmt, orient;


    if( m_Start.x == m_End.x )
    if( m_start.x == m_end.x )
        orient = _("Vert.");
        orient = _("Vert.");
    else if( m_Start.y == m_End.y )
    else if( m_start.y == m_end.y )
        orient = _("Horiz.");
        orient = _("Horiz.");


    switch( m_Layer )
    switch( m_Layer )
@@ -473,10 +473,10 @@ wxString SCH_LINE::GetSelectMenuText() const
    }
    }


    menuText.Printf( txtfmt, GetChars( orient ),
    menuText.Printf( txtfmt, GetChars( orient ),
                    GetChars(CoordinateToString( m_Start.x, EESCHEMA_INTERNAL_UNIT )),
                    GetChars(CoordinateToString( m_start.x, EESCHEMA_INTERNAL_UNIT )),
                    GetChars(CoordinateToString( m_Start.y, EESCHEMA_INTERNAL_UNIT )),
                    GetChars(CoordinateToString( m_start.y, EESCHEMA_INTERNAL_UNIT )),
                    GetChars(CoordinateToString( m_End.x, EESCHEMA_INTERNAL_UNIT )),
                    GetChars(CoordinateToString( m_end.x, EESCHEMA_INTERNAL_UNIT )),
                    GetChars(CoordinateToString( m_End.y, EESCHEMA_INTERNAL_UNIT )) );
                    GetChars(CoordinateToString( m_end.y, EESCHEMA_INTERNAL_UNIT )) );


    return menuText;
    return menuText;
}
}
@@ -504,8 +504,8 @@ void SCH_LINE::GetNetListItem( vector<NETLIST_OBJECT*>& aNetListItems,
    item->m_SheetList = *aSheetPath;
    item->m_SheetList = *aSheetPath;
    item->m_SheetListInclude = *aSheetPath;
    item->m_SheetListInclude = *aSheetPath;
    item->m_Comp = (SCH_ITEM*) this;
    item->m_Comp = (SCH_ITEM*) this;
    item->m_Start = m_Start;
    item->m_Start = m_start;
    item->m_End = m_End;
    item->m_End = m_end;


    if( GetLayer() == LAYER_BUS )
    if( GetLayer() == LAYER_BUS )
    {
    {
@@ -530,11 +530,11 @@ bool SCH_LINE::operator <( const SCH_ITEM& aItem ) const
    if( GetLength() != line->GetLength() )
    if( GetLength() != line->GetLength() )
        return GetLength() < line->GetLength();
        return GetLength() < line->GetLength();


    if( m_Start.x != line->m_Start.x )
    if( m_start.x != line->m_start.x )
        return m_Start.x < line->m_Start.x;
        return m_start.x < line->m_start.x;


    if( m_Start.y != line->m_Start.y )
    if( m_start.y != line->m_start.y )
        return m_Start.y < line->m_Start.y;
        return m_start.y < line->m_start.y;


    return false;
    return false;
}
}
@@ -542,7 +542,7 @@ bool SCH_LINE::operator <( const SCH_ITEM& aItem ) const


bool SCH_LINE::doHitTest( const wxPoint& aPoint, int aAccuracy ) const
bool SCH_LINE::doHitTest( const wxPoint& aPoint, int aAccuracy ) const
{
{
    return TestSegmentHit( aPoint, m_Start, m_End, aAccuracy );
    return TestSegmentHit( aPoint, m_start, m_end, aAccuracy );
}
}




@@ -576,8 +576,8 @@ void SCH_LINE::doPlot( PLOTTER* aPlotter )
    if( m_Layer == LAYER_NOTES )
    if( m_Layer == LAYER_NOTES )
        aPlotter->set_dash( true );
        aPlotter->set_dash( true );


    aPlotter->move_to( m_Start );
    aPlotter->move_to( m_start );
    aPlotter->finish_to( m_End );
    aPlotter->finish_to( m_end );


    if( m_Layer == LAYER_NOTES )
    if( m_Layer == LAYER_NOTES )
        aPlotter->set_dash( false );
        aPlotter->set_dash( false );
@@ -586,6 +586,6 @@ void SCH_LINE::doPlot( PLOTTER* aPlotter )


void SCH_LINE::doSetPosition( const wxPoint& aPosition )
void SCH_LINE::doSetPosition( const wxPoint& aPosition )
{
{
    m_End = m_End - ( m_Start - aPosition );
    m_end = m_end - ( m_start - aPosition );
    m_Start = aPosition;
    m_start = aPosition;
}
}
Loading