Commit f1b36209 authored by dickelbeck's avatar dickelbeck
Browse files

DRAWSEGMENT::Draw()

parent aa93f54d
Loading
Loading
Loading
Loading
+2 −95
Original line number Original line Diff line number Diff line
@@ -221,103 +221,10 @@ void Trace_Segment( WinEDA_DrawPanel* panel, wxDC* DC, TRACK* track, int draw_mo
void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC,
void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC,
                           DRAWSEGMENT* PtDrawSegment, int draw_mode )
                           DRAWSEGMENT* PtDrawSegment, int draw_mode )
/**************************************************************************/
/**************************************************************************/

/* Affichage d'un segment type drawing PCB:
 *  Entree : ox, oy = offset de trace
 *  draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND)
 *      Les contours sont de differents type:
 *      segment
 *      cercle
 *      arc
 */
{
    int ux0, uy0, dx, dy;
    int l_piste;
    int color, mode;
    int zoom = panel->GetZoom();
    int rayon;

    color = g_DesignSettings.m_LayerColor[PtDrawSegment->GetLayer()];
    if( color & ITEM_NOT_SHOW )
        return;

    GRSetDrawMode( DC, draw_mode );
    l_piste = PtDrawSegment->m_Width >> 1;  /* l_piste = demi largeur piste */

    /* coord de depart */
    ux0 = PtDrawSegment->m_Start.x;
    uy0 = PtDrawSegment->m_Start.y;
    
    /* coord d'arrivee */
    dx = PtDrawSegment->m_End.x;
    dy = PtDrawSegment->m_End.y;

    mode = DisplayOpt.DisplayPcbTrackFill ? FILLED : SKETCH;
    
    if( PtDrawSegment->m_Flags & FORCE_SKETCH )
        mode = SKETCH;
    
    if( l_piste < (L_MIN_DESSIN * zoom) )
        mode = FILAIRE;

    switch( PtDrawSegment->m_Shape )
    {
    case S_CIRCLE:
        rayon = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
        if( mode == FILAIRE )
        {
            GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon, 0, color );
        }
        else if( mode == SKETCH )
        {
            GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon - l_piste, 0, color );
            GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon + l_piste, 0, color );
        }
        else
        {
            GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon, PtDrawSegment->m_Width, color );
        }
        break;

    case S_ARC:
{
{
        int StAngle, EndAngle;
    // @todo Replace all calls to Trace_DrawSegmentPcb() with this call:
        rayon    = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
        StAngle  = (int) ArcTangente( dy - uy0, dx - ux0 );
        EndAngle = StAngle + PtDrawSegment->m_Angle;
        if( mode == FILAIRE )
            GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, 0, color );
        else if( mode == SKETCH )
        {
            GRArc( &panel->m_ClipBox, DC, ux0, uy0, 0, StAngle, EndAngle,
                   rayon - l_piste, color );
            GRArc( &panel->m_ClipBox, DC, ux0, uy0, 0, StAngle, EndAngle,
                   rayon + l_piste, color );
        }
        else
        {
            GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
                   rayon, PtDrawSegment->m_Width, color );
        }
    }
        break;



    default:
    PtDrawSegment->Draw( panel, DC, draw_mode );
        if( mode == FILAIRE )
            GRLine( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, 0, color );
        else if( mode == SKETCH )
        {
            GRCSegm( &panel->m_ClipBox, DC, ux0, uy0, dx, dy,
                     PtDrawSegment->m_Width, color );
        }
        else
        {
            GRFillCSegm( &panel->m_ClipBox, DC, ux0, uy0, dx, dy,
                         PtDrawSegment->m_Width, color );
        }
        break;
    }
}
}




+1 −3
Original line number Original line Diff line number Diff line
@@ -612,9 +612,7 @@ public:
     * BOARD_ITEMs which have their own color information.
     * BOARD_ITEMs which have their own color information.
     */
     */
    virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC,
    virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC,
                      int aDrawMode, const wxPoint& offset = ZeroOffset )
                      int aDrawMode, const wxPoint& offset = ZeroOffset ) = 0;
    {
    }




    /**
    /**
+4 −5
Original line number Original line Diff line number Diff line
@@ -503,12 +503,11 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
        switch( PtStruct->Type() )
        switch( PtStruct->Type() )
        {
        {
        case TYPEDRAWSEGMENT:
        case TYPEDRAWSEGMENT:
                #undef STRUCT
            if( (g_TabOneLayerMask[PtStruct->GetLayer()] & masque_layer) == 0 )
                #define STRUCT ( (DRAWSEGMENT*) PtStruct )
            if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
                break;
                break;
            if( ! PtStruct->HitTest( GetScreen()->BlockLocate ) )
            if( ! PtStruct->HitTest( GetScreen()->BlockLocate ) )
                break;
                break;

            /* l'element est ici bon a etre efface */
            /* l'element est ici bon a etre efface */
            Trace_DrawSegmentPcb( DrawPanel, DC, (DRAWSEGMENT*) PtStruct, GR_XOR );
            Trace_DrawSegmentPcb( DrawPanel, DC, (DRAWSEGMENT*) PtStruct, GR_XOR );
            PtStruct->DeleteStructure();
            PtStruct->DeleteStructure();
@@ -526,7 +525,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
            break;
            break;


        case TYPEMIRE:
        case TYPEMIRE:
            if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
            if( (g_TabOneLayerMask[PtStruct->GetLayer()] & masque_layer) == 0 )
                break;
                break;
            if( ! PtStruct->HitTest( GetScreen()->BlockLocate ) )
            if( ! PtStruct->HitTest( GetScreen()->BlockLocate ) )
                break;
                break;
@@ -535,7 +534,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC )
            break;
            break;


        case TYPECOTATION:
        case TYPECOTATION:
            if( (g_TabOneLayerMask[STRUCT->GetLayer()] & masque_layer) == 0 )
            if( (g_TabOneLayerMask[PtStruct->GetLayer()] & masque_layer) == 0 )
                break;
                break;
            if( ! PtStruct->HitTest( GetScreen()->BlockLocate ) )
            if( ! PtStruct->HitTest( GetScreen()->BlockLocate ) )
                break;
                break;
+7 −0
Original line number Original line Diff line number Diff line
@@ -252,6 +252,13 @@ public:
     */
     */
    void    Display_Infos( WinEDA_DrawFrame* frame );
    void    Display_Infos( WinEDA_DrawFrame* frame );


    void Draw( WinEDA_DrawPanel* panel, wxDC* DC,
                      int aDrawMode, const wxPoint& offset = ZeroOffset )
    {
        // void WinEDA_PcbFrame::Trace_Pcb( wxDC* DC, int mode )
        // goes here.
    }



    /**
    /**
     * Function Visit
     * Function Visit
+100 −0
Original line number Original line Diff line number Diff line
@@ -144,6 +144,106 @@ bool DRAWSEGMENT::ReadDrawSegmentDescr( FILE* File, int* LineNum )
}
}




void DRAWSEGMENT::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
                      int draw_mode, const wxPoint& notUsed )
{
    int ux0, uy0, dx, dy;
    int l_piste;
    int color, mode;
    int zoom;
    int rayon;

    color = g_DesignSettings.m_LayerColor[GetLayer()];
    if( color & ITEM_NOT_SHOW )
        return;

    if( panel )
        zoom = panel->GetZoom();
    else
        zoom = ActiveScreen->GetZoom();

    GRSetDrawMode( DC, draw_mode );
    l_piste = m_Width >> 1;  /* l_piste = demi largeur piste */

    /* coord de depart */
    ux0 = m_Start.x;
    uy0 = m_Start.y;

    /* coord d'arrivee */
    dx = m_End.x;
    dy = m_End.y;

    mode = DisplayOpt.DisplayDrawItems;
    if( m_Flags & FORCE_SKETCH )
        mode = SKETCH;
    if( l_piste < (L_MIN_DESSIN * zoom) )
        mode = FILAIRE;

    switch( m_Shape )
    {
    case S_CIRCLE:
        rayon = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
        if( mode == FILAIRE )
        {
            GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon, color );
        }
        else if( mode == SKETCH )
        {
            GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon - l_piste, color );
            GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon + l_piste, color );
        }
        else
        {
            GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon, m_Width, color );
        }
        break;

    case S_ARC:
        {
            int StAngle, EndAngle;
            rayon    = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) );
            StAngle  = (int) ArcTangente( dy - uy0, dx - ux0 );
            EndAngle = StAngle + m_Angle;

            if( StAngle > EndAngle )
                EXCHG( StAngle, EndAngle );

            if( mode == FILAIRE )
                GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, color );

            else if( mode == SKETCH )
            {
                GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
                       rayon - l_piste, color );
                GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
                       rayon + l_piste, color );
            }
            else
            {
                GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
                       rayon, m_Width, color );
            }
        }
        break;

    default:
        if( mode == FILAIRE )
            GRLine( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, 0, color );
        else if( mode == SKETCH )
        {
            GRCSegm( &panel->m_ClipBox, DC, ux0, uy0, dx, dy,
                     m_Width, color );
        }
        else
        {
            GRFillCSegm( &panel->m_ClipBox, DC, ux0, uy0, dx, dy,
                         m_Width, color );
        }
        break;
    }
}


// see pcbstruct.h
// see pcbstruct.h
void DRAWSEGMENT::Display_Infos( WinEDA_DrawFrame* frame )
void DRAWSEGMENT::Display_Infos( WinEDA_DrawFrame* frame )
{
{
Loading