class_board_item.cpp 9.73 KB
Newer Older
1 2 3
/******************************************/
/* class BOARD_ITEM: some basic functions */
/******************************************/
4 5 6 7 8 9 10

#include "fctsys.h"
#include "gr_basic.h"

#include "common.h"
#include "pcbnew.h"

11
#include "pcbnew_id.h"
12 13 14
#include "collectors.h"

#include "bitmaps.h"
dickelbeck's avatar
dickelbeck committed
15

16 17 18 19 20 21 22 23 24 25 26

/********************************************************/
wxString BOARD_ITEM::ShowShape( Track_Shapes aShape )
/********************************************************/
{
    switch( aShape )
    {
    case S_SEGMENT:         return _( "Line" );
    case S_RECT:            return _( "Rect" );
    case S_ARC:             return _( "Arc" );
    case S_CIRCLE:          return _( "Circle" );
charras's avatar
charras committed
27
    case S_CURVE:           return _( "Bezier Curve" );
28 29 30 31 32 33
    case S_POLYGON:         return wxT( "polygon" );
    default:                return wxT( "??" );
    }
}


34 35 36 37 38 39 40 41
/********************************************************/
wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
/********************************************************/

/** return a specific comment for "this". Used in pop up menus
 * @param aPcb = the parent board
 */
{
42 43 44
    wxString            text;
    wxString            msg;
    wxString            temp;
45
    NETINFO_ITEM* net;
46 47
    const BOARD_ITEM*   item = this;
    D_PAD *             pad;
48 49 50

    switch( item->Type() )
    {
51
    case TYPE_MODULE:
52
        text << _( "Footprint" ) << wxT( " " ) << ( (MODULE*) item )->GetReference();
dickelbeck's avatar
dickelbeck committed
53
        text << wxT( " (" ) << aPcb->GetLayerName( item->m_Layer ).Trim() << wxT( ")" );
54 55
        break;

56
    case TYPE_PAD:
57
        pad = (D_PAD *) this;
58
        text << _( "Pad" ) << wxT( " \"" ) << pad->ReturnStringPadName()
59 60 61
                << wxT( "\" (" );
        if ( (pad->m_Masque_Layer & ALL_CU_LAYERS) == ALL_CU_LAYERS )
            text << _("all copper layers");
62
        else if( (pad->m_Masque_Layer & LAYER_BACK) == LAYER_BACK )
dickelbeck's avatar
dickelbeck committed
63
            text << aPcb->GetLayerName( LAYER_N_BACK ).Trim();
64
        else if( (pad->m_Masque_Layer & LAYER_FRONT) == LAYER_FRONT )
dickelbeck's avatar
dickelbeck committed
65
            text << aPcb->GetLayerName( LAYER_N_FRONT );
66 67
        else text << _("???");
        text << _( ") of " ) << ( (MODULE*) GetParent() )->GetReference();
68 69
        break;

70
    case TYPE_DRAWSEGMENT:
71 72 73 74
        text << _( "Pcb Graphic" ) << wxT(": ")
            << ShowShape( (Track_Shapes) ((DRAWSEGMENT*)item)->m_Shape )
            << wxChar(' ') << _("Length:") << valeur_param( (int) ((DRAWSEGMENT*)item)->GetLength(), temp )
            << _( " on " ) << aPcb->GetLayerName( item->GetLayer() ).Trim();
75 76
        break;

77
    case TYPE_TEXTE:
78 79 80 81 82
        text << _( "Pcb Text" ) << wxT( " " );;
        if( ( (TEXTE_PCB*) item )->m_Text.Len() < 12 )
            text << ( (TEXTE_PCB*) item )->m_Text;
        else
            text += ( (TEXTE_PCB*) item )->m_Text.Left( 10 ) + wxT( ".." );
dickelbeck's avatar
dickelbeck committed
83
        text << _( " on " ) << aPcb->GetLayerName( item->GetLayer() ).Trim();
84 85
        break;

86
    case TYPE_TEXTE_MODULE:
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
        switch( ( (TEXTE_MODULE*) item )->m_Type )
        {
        case TEXT_is_REFERENCE:
            text << _( "Reference" ) << wxT( " " ) << ( (TEXTE_MODULE*) item )->m_Text;
            break;

        case TEXT_is_VALUE:
            text << _( "Value" ) << wxT( " " ) << ( (TEXTE_MODULE*) item )->m_Text << _( " of " )
                 << ( (MODULE*) GetParent() )->GetReference();
            break;

        default:    // wrap this one in quotes:
            text << _( "Text" ) << wxT( " \"" ) << ( (TEXTE_MODULE*) item )->m_Text <<
            wxT( "\"" ) << _( " of " )
                 << ( (MODULE*) GetParent() )->GetReference();
            break;
        }
        break;

106
    case TYPE_EDGE_MODULE:
107
        text << _( "Graphic" ) << wxT( " " );
108
        text << ShowShape( (Track_Shapes) ( (EDGE_MODULE*) item )->m_Shape );
dickelbeck's avatar
dickelbeck committed
109
        text << wxT( " (" ) << aPcb->GetLayerName( ((EDGE_MODULE*) item )->m_Layer ).Trim() << wxT( ")" );
110
        text << _( " of " )
111 112
             << ( (MODULE*) GetParent() )->GetReference();
        break;
113

114
    case TYPE_TRACK:
115
        // deleting tracks requires all the information we can get to
116 117 118 119
        // disambiguate all the choices under the cursor!
        text << _( "Track" ) << wxT( " " ) << ((TRACK*)item)->ShowWidth();
        net = aPcb->FindNet( ((TRACK*)item)->GetNet() );
        if( net )
120
        {
121
            text << wxT( " [" ) << net->GetNetname() << wxT( "]" );
122
        }
123 124 125
        text << _( " on " ) << aPcb->GetLayerName( item->GetLayer() ).Trim()
             << wxT("  ") << _("Net:") << ((TRACK*)item)->GetNet()
             << wxT("  ") << _("Length:") << valeur_param( (int) ((TRACK*)item)->GetLength(), temp );
126 127
        break;

128
    case TYPE_ZONE_CONTAINER:
129
        text = _( "Zone Outline" );
130
        {
dickelbeck's avatar
dickelbeck committed
131 132 133 134
            ZONE_CONTAINER* area = (ZONE_CONTAINER*) this;
            int ncont = area->m_Poly->GetContour(area->m_CornerSelection);
            if( ncont )
                text << wxT(" ") << _("(Cutout)");
135 136
        }
        text << wxT( " " );
137 138 139 140 141
        {
            wxString TimeStampText;
            TimeStampText.Printf( wxT( "(%8.8X)" ), item->m_TimeStamp );
            text << TimeStampText;
        }
142 143 144 145 146
        if ( !((ZONE_CONTAINER*) item)->IsOnCopperLayer() )
        {
            text << wxT( " [" ) << _("Not on copper layer") << wxT( "]" );
        }
        else if( ((ZONE_CONTAINER*) item)->GetNet() >= 0 )
147 148 149 150
        {
            net = aPcb->FindNet( ( (ZONE_CONTAINER*) item )->GetNet() );
            if( net )
            {
151
                text << wxT( " [" ) << net->GetNetname() << wxT( "]" );
152 153
            }
        }
dickelbeck's avatar
dickelbeck committed
154
        else    // A netcode < 0 is an error flag (Netname not found or area not initialised)
155 156 157 158
        {
            text << wxT( " [" ) << ( (ZONE_CONTAINER*) item )->m_Netname << wxT( "]" );
            text << wxT(" <") << _("Not Found") << wxT(">");
        }
dickelbeck's avatar
dickelbeck committed
159
        text << _( " on " ) << aPcb->GetLayerName( item->GetLayer() ).Trim();
160
        break;
161

162
    case TYPE_ZONE:
163 164
        text = _( "Zone" );
        text << wxT( " " );
165 166 167 168 169
        {
            wxString TimeStampText;
            TimeStampText.Printf( wxT( "(%8.8X)" ), item->m_TimeStamp );
            text << TimeStampText;
        }
170
        net = aPcb->FindNet( ( (SEGZONE*) item )->GetNet() );
171 172
        if( net )
        {
173
            text << wxT( " [" ) << net->GetNetname() << wxT( "]" );
174
        }
dickelbeck's avatar
dickelbeck committed
175
        text << _( " on " ) << aPcb->GetLayerName( item->GetLayer() ).Trim();
176 177
        break;

178
    case TYPE_VIA:
179
        {
180
            SEGVIA* via = (SEGVIA*) item;
181
            text << _( "Via" ) << wxT( " " ) << via->ShowWidth();
182 183

            int shape = via->Shape();
184 185 186 187
            if( shape == VIA_BLIND_BURIED )
                text << wxT(" ") << _( "Blind/Buried" );
            else if( shape == VIA_MICROVIA )
                text << wxT(" ") << _("Micro Via");
CHARRAS's avatar
CHARRAS committed
188
            // else say nothing about normal (through) vias
189

190
            net = aPcb->FindNet( via->GetNet() );
191 192
            if( net )
            {
193
                text << wxT( " [" ) << net->GetNetname() << wxT( "]" );
194
            }
195 196
            text << wxChar(' ') << _("Net:") << via->GetNet();

197
            if( shape != VIA_THROUGH )
dickelbeck's avatar
dickelbeck committed
198 199 200 201 202
            {
                // say which layers, only two for now
                int topLayer;
                int botLayer;
                via->ReturnLayerPair( &topLayer, &botLayer );
dickelbeck's avatar
dickelbeck committed
203 204
                text << _( " on " ) << aPcb->GetLayerName( topLayer).Trim() << wxT(" <-> ")
                    << aPcb->GetLayerName( botLayer ).Trim();
dickelbeck's avatar
dickelbeck committed
205
            }
206 207 208
        }
        break;

209 210 211
    case TYPE_MARKER_PCB:
        text << _( "Marker" ) << wxT( " @(" ) << ((MARKER_PCB*)item)->GetPos().x
             << wxT(",") << ((MARKER_PCB*)item)->GetPos().y << wxT(")");
212 213
        break;

214 215
    case TYPE_DIMENSION:
        text << _( "Dimension" ) << wxT( " \"" ) << ( (DIMENSION*) item )->GetText() << wxT( "\"" );
216 217
        break;

218
    case TYPE_MIRE:
219
        valeur_param( ((MIREPCB*)item)->m_Size, msg );
dickelbeck's avatar
dickelbeck committed
220
        text << _( "Target" ) << _( " on " ) << aPcb->GetLayerName( item->GetLayer() ).Trim()
CHARRAS's avatar
CHARRAS committed
221
            << wxT( " " ) << _( "size" ) << wxT( " " ) << msg
dickelbeck's avatar
dickelbeck committed
222
            ;
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
        break;

    default:
        text << item->GetClass() << wxT( " Unexpected item type: BUG!!" );
        break;
    }

    return text;
}


/*****************************************/
const char** BOARD_ITEM::MenuIcon() const
/*****************************************/

/** return a specific icon pointer (an xpm icon)  for "this". Used in pop up menus
 * @return an icon pointer (can be NULL)
 */
{
242
    const char**            xpm;
243 244 245 246
    const BOARD_ITEM* item = this;

    switch( item->Type() )
    {
247
    case TYPE_MODULE:
248 249 250
        xpm = module_xpm;
        break;

251
    case TYPE_PAD:
252 253 254
        xpm = pad_xpm;
        break;

255
    case TYPE_DRAWSEGMENT:
256 257 258
        xpm = add_dashed_line_xpm;
        break;

259
    case TYPE_TEXTE:
260 261 262
        xpm = add_text_xpm;
        break;

263
    case TYPE_TEXTE_MODULE:
264 265 266
        xpm = footprint_text_xpm;
        break;

267
    case TYPE_EDGE_MODULE:
268 269 270
        xpm = show_mod_edge_xpm;
        break;

271
    case TYPE_TRACK:
272 273 274
        xpm = showtrack_xpm;
        break;

275 276
    case TYPE_ZONE_CONTAINER:
    case TYPE_ZONE:
277 278 279
        xpm = add_zone_xpm;
        break;

280
    case TYPE_VIA:
dickelbeck's avatar
dickelbeck committed
281
        xpm = via_sketch_xpm;
282 283
        break;

284
    case TYPE_MARKER_PCB:
285 286 287
        xpm = pad_xpm;              // @todo: create and use marker xpm
        break;

288
    case TYPE_DIMENSION:
289
        xpm = add_dimension_xpm;
290 291
        break;

292
    case TYPE_MIRE:
293 294 295 296 297 298 299 300 301 302
        xpm = add_mires_xpm;
        break;

    default:
        xpm = 0;
        break;
    }

    return (const char**) xpm;
}
303

304 305 306 307 308 309 310 311
void BOARD_ITEM::UnLink()
{
    DLIST<BOARD_ITEM>* list = (DLIST<BOARD_ITEM>*) GetList();
    wxASSERT( list );
    if( list )
        list->Remove( this );
}

dickelbeck's avatar
dickelbeck committed
312 313 314

BOARD* BOARD_ITEM::GetBoard() const
{
315 316
    if( Type() == TYPE_PCB )
        return (BOARD*) this;
dickelbeck's avatar
dickelbeck committed
317

318 319 320 321 322 323
    BOARD_ITEM* parent = GetParent();

    if( parent )
        return parent->GetBoard();

    return NULL;
dickelbeck's avatar
dickelbeck committed
324 325
}