Commit 00f0e278 authored by Lorenzo Marcantonio's avatar Lorenzo Marcantonio
Browse files

Factored layer utility functions: classification, layer flip and mask flip

parent db09deed
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -106,7 +106,6 @@ set(PCB_COMMON_SRCS
    ../pcbnew/class_marker_pcb.cpp
    ../pcbnew/class_marker_pcb.cpp
    ../pcbnew/class_mire.cpp
    ../pcbnew/class_mire.cpp
    ../pcbnew/class_module.cpp
    ../pcbnew/class_module.cpp
    ../pcbnew/class_module_transform_functions.cpp
    ../pcbnew/class_pad.cpp
    ../pcbnew/class_pad.cpp
    ../pcbnew/class_pad_draw_functions.cpp
    ../pcbnew/class_pad_draw_functions.cpp
    ../pcbnew/class_pcb_text.cpp
    ../pcbnew/class_pcb_text.cpp
+112 −0
Original line number Original line Diff line number Diff line
@@ -72,3 +72,115 @@ int g_PadCMPColor = RED;
 */
 */
DLIST<TRACK> g_CurrentTrackList;
DLIST<TRACK> g_CurrentTrackList;


LAYER_NUM FlipLayer( LAYER_NUM oldlayer )
{
    switch( oldlayer )
    {
    case LAYER_N_BACK:
        return LAYER_N_FRONT;

    case LAYER_N_FRONT:
        return LAYER_N_BACK;

    case SILKSCREEN_N_BACK:
        return SILKSCREEN_N_FRONT;

    case SILKSCREEN_N_FRONT:
        return SILKSCREEN_N_BACK;

    case ADHESIVE_N_BACK:
        return ADHESIVE_N_FRONT;

    case ADHESIVE_N_FRONT:
        return ADHESIVE_N_BACK;

    case SOLDERMASK_N_BACK:
        return SOLDERMASK_N_FRONT;

    case SOLDERMASK_N_FRONT:
        return SOLDERMASK_N_BACK;

    case SOLDERPASTE_N_BACK:
        return SOLDERPASTE_N_FRONT;

    case SOLDERPASTE_N_FRONT:
        return SOLDERPASTE_N_BACK;

    // No change for the other layers
    default:
        return oldlayer;
    }
}


LAYER_MSK FlipLayerMask( LAYER_MSK aMask )
{
    LAYER_MSK newMask;

    newMask = aMask & ~(LAYER_BACK | LAYER_FRONT |
                        SILKSCREEN_LAYER_BACK | SILKSCREEN_LAYER_FRONT |
                        ADHESIVE_LAYER_BACK | ADHESIVE_LAYER_FRONT |
                        SOLDERMASK_LAYER_BACK | SOLDERMASK_LAYER_FRONT |
                        SOLDERPASTE_LAYER_BACK | SOLDERPASTE_LAYER_FRONT |
                        ADHESIVE_LAYER_BACK | ADHESIVE_LAYER_FRONT);

    if( aMask & LAYER_BACK )
        newMask |= LAYER_FRONT;

    if( aMask & LAYER_FRONT )
        newMask |= LAYER_BACK;

    if( aMask & SILKSCREEN_LAYER_BACK )
        newMask |= SILKSCREEN_LAYER_FRONT;

    if( aMask & SILKSCREEN_LAYER_FRONT )
        newMask |= SILKSCREEN_LAYER_BACK;

    if( aMask & ADHESIVE_LAYER_BACK )
        newMask |= ADHESIVE_LAYER_FRONT;

    if( aMask & ADHESIVE_LAYER_FRONT )
        newMask |= ADHESIVE_LAYER_BACK;

    if( aMask & SOLDERMASK_LAYER_BACK )
        newMask |= SOLDERMASK_LAYER_FRONT;

    if( aMask & SOLDERMASK_LAYER_FRONT )
        newMask |= SOLDERMASK_LAYER_BACK;

    if( aMask & SOLDERPASTE_LAYER_BACK )
        newMask |= SOLDERPASTE_LAYER_FRONT;

    if( aMask & SOLDERPASTE_LAYER_FRONT )
        newMask |= SOLDERPASTE_LAYER_BACK;

    if( aMask & ADHESIVE_LAYER_BACK )
        newMask |= ADHESIVE_LAYER_FRONT;

    if( aMask & ADHESIVE_LAYER_FRONT )
        newMask |= ADHESIVE_LAYER_BACK;

    return newMask;
}

LAYER_NUM ExtractLayer( LAYER_MSK aMask )
{
    if( aMask == NO_LAYERS )
        return UNSELECTED_LAYER;

    LAYER_NUM candidate = UNDEFINED_LAYER;

    // Scan all the layers and take note of the first set; if other are
    // then found return UNDEFINED_LAYER
    for( LAYER_NUM i = FIRST_LAYER; i < NB_LAYERS; ++i )
    {
        if( aMask & GetLayerMask( i ) )
        {
            if( candidate == UNDEFINED_LAYER )
                candidate = i;
            else 
                return UNDEFINED_LAYER;
        }
    }
    return candidate;
}
+25 −0
Original line number Original line Diff line number Diff line
@@ -124,6 +124,12 @@ typedef unsigned LAYER_MSK;
#define ALL_CU_LAYERS           0x0000FFFF
#define ALL_CU_LAYERS           0x0000FFFF
#define INTERNAL_LAYERS         0x00007FFE
#define INTERNAL_LAYERS         0x00007FFE
#define EXTERNAL_LAYERS         0x00008001
#define EXTERNAL_LAYERS         0x00008001
#define BACK_LAYERS            (LAYER_BACK | ADHESIVE_LAYER_BACK | \
                                SOLDERPASTE_LAYER_BACK | SILKSCREEN_LAYER_BACK | \
                                SOLDERMASK_LAYER_BACK)
#define FRONT_LAYERS           (LAYER_FRONT | ADHESIVE_LAYER_FRONT | \
                                SOLDERPASTE_LAYER_FRONT | SILKSCREEN_LAYER_FRONT | \
                                SOLDERMASK_LAYER_FRONT)
#define NO_LAYERS               0x00000000
#define NO_LAYERS               0x00000000


/** return a one bit layer mask from a layer number
/** return a one bit layer mask from a layer number
@@ -271,5 +277,24 @@ inline bool IsBackLayer( LAYER_NUM aLayer )
             aLayer == SOLDERPASTE_N_BACK );
             aLayer == SOLDERPASTE_N_BACK );
}
}


/**
 * Function ReturnFlippedLayerNumber
 * @return the layer number after flipping an item
 * some (not all) layers: external copper, Mask, Paste, and solder
 * are swapped between front and back sides
 */
LAYER_NUM FlipLayer( LAYER_NUM oldlayer );

/**
 * Calculate the mask layer when flipping a footprint
 * BACK and FRONT copper layers, mask, paste, solder layers are swapped
 */
LAYER_MSK FlipLayerMask( LAYER_MSK aMask );

/**
 * Extract the set layer from a mask. Returns UNDEFINED_LAYER if more
 * than one is set or UNSELECTED_LAYER if none is 
 */
LAYER_NUM ExtractLayer( LAYER_MSK aMask );


#endif // _LAYERS_ID_AND_VISIBILITY_H_
#endif // _LAYERS_ID_AND_VISIBILITY_H_
+0 −8
Original line number Original line Diff line number Diff line
@@ -656,14 +656,6 @@ public:
     */
     */
    EDA_COLOR_T GetLayerColor( LAYER_NUM aLayer ) const;
    EDA_COLOR_T GetLayerColor( LAYER_NUM aLayer ) const;


    /**
     * Function ReturnFlippedLayerNumber
     * @return the layer number after flipping an item
     * some (not all) layers: external copper, Mask, Paste, and solder
     * are swapped between front and back sides
     */
    static LAYER_NUM ReturnFlippedLayerNumber( LAYER_NUM oldlayer );

    /** Functions to get some items count */
    /** Functions to get some items count */
    int GetNumSegmTrack() const;
    int GetNumSegmTrack() const;


+1 −1
Original line number Original line Diff line number Diff line
@@ -176,7 +176,7 @@ void DIMENSION::Rotate( const wxPoint& aRotCentre, double aAngle )
void DIMENSION::Flip( const wxPoint& aCentre )
void DIMENSION::Flip( const wxPoint& aCentre )
{
{
    Mirror( aCentre );
    Mirror( aCentre );
    SetLayer( BOARD::ReturnFlippedLayerNumber( GetLayer() ) );
    SetLayer( FlipLayer( GetLayer() ) );
}
}




Loading