100
static std::string GenCADLayerName( int aCuCount, LAYER_ID aId )
102
if( IsCopperLayer( aId ) )
106
else if( aId == B_Cu )
111
return StrPrintf( "INNER%d", aCuCount - aId - 1 );
115
return StrPrintf( "LAYER%d", aId );
123
// using a switch to clearly show mapping & catch out of bounds index.
127
case B_Adhes: txt = "B.Adhes"; break;
128
case F_Adhes: txt = "F.Adhes"; break;
129
case B_Paste: txt = "SOLDERPASTE_BOTTOM"; break;
130
case F_Paste: txt = "SOLDERPASTE_TOP"; break;
131
case B_SilkS: txt = "SILKSCREEN_BOTTOM"; break;
132
case F_SilkS: txt = "SILKSCREEN_TOP"; break;
133
case B_Mask: txt = "SOLDERMASK_BOTTOM"; break;
134
case F_Mask: txt = "SOLDERMASK_TOP"; break;
137
case Dwgs_User: txt = "Dwgs.User"; break;
138
case Cmts_User: txt = "Cmts.User"; break;
139
case Eco1_User: txt = "Eco1.User"; break;
140
case Eco2_User: txt = "Eco2.User"; break;
141
case Edge_Cuts: txt = "Edge.Cuts"; break;
142
case Margin: txt = "Margin"; break;
145
case F_CrtYd: txt = "F_CrtYd"; break;
146
case B_CrtYd: txt = "B_CrtYd"; break;
147
case F_Fab: txt = "F_Fab"; break;
148
case B_Fab: txt = "B_Fab"; break;
151
wxASSERT_MSG( 0, wxT( "aId UNEXPECTED" ) );
152
txt = "BAD-INDEX!"; break;
160
static const LAYER_ID gc_seq[] = {
196
// flipped layer name for Gencad export (to make CAM350 imports correct)
197
static std::string GenCADLayerNameFlipped( int aCuCount, LAYER_ID aId )
199
if( 1<= aId && aId <= 14 )
201
return StrPrintf( "INNER%d", 14 - aId );
204
return GenCADLayerName( aCuCount, aId );
210
static std::string fmt_mask( LSET aSet )
213
return aSet.FmtHex();
215
return StrPrintf( "%08x", (unsigned) ( aSet & LSET::AllCuMask() ).to_ulong() );
96
220
// These are the export origin (the auxiliary axis)
97
221
static int GencadOffsetX, GencadOffsetY;
348
477
case PAD_OVAL: // Create outline by 2 lines and 2 arcs
350
// OrCAD Layout call them OVAL or OBLONG - GenCAD call them FINGERs
351
fprintf( aFile, " FINGER %g\n",
352
pad->GetDrillSize().x / SCALE_FACTOR );
355
if( dr >= 0 ) // Horizontal oval
358
fprintf( aFile, "LINE %g %g %g %g\n",
359
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
360
(-pad->GetOffset().y - radius) / SCALE_FACTOR,
361
(dr + pad->GetOffset().x ) / SCALE_FACTOR,
362
(-pad->GetOffset().y - radius) / SCALE_FACTOR );
364
// GenCAD arcs are (start, end, center)
365
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
366
(dr + pad->GetOffset().x) / SCALE_FACTOR,
367
(-pad->GetOffset().y - radius) / SCALE_FACTOR,
368
(dr + pad->GetOffset().x) / SCALE_FACTOR,
369
(-pad->GetOffset().y + radius) / SCALE_FACTOR,
370
(dr + pad->GetOffset().x) / SCALE_FACTOR,
371
-pad->GetOffset().y / SCALE_FACTOR );
373
fprintf( aFile, "LINE %g %g %g %g\n",
374
(dr + pad->GetOffset().x) / SCALE_FACTOR,
375
(-pad->GetOffset().y + radius) / SCALE_FACTOR,
376
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
377
(-pad->GetOffset().y + radius) / SCALE_FACTOR );
378
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
379
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
380
(-pad->GetOffset().y + radius) / SCALE_FACTOR,
381
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
382
(-pad->GetOffset().y - radius) / SCALE_FACTOR,
383
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
384
-pad->GetOffset().y / SCALE_FACTOR );
386
else // Vertical oval
390
fprintf( aFile, "LINE %g %g %g %g\n",
391
(-radius + pad->GetOffset().x) / SCALE_FACTOR,
392
(-pad->GetOffset().y - dr) / SCALE_FACTOR,
393
(-radius + pad->GetOffset().x ) / SCALE_FACTOR,
394
(-pad->GetOffset().y + dr) / SCALE_FACTOR );
395
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
396
(-radius + pad->GetOffset().x ) / SCALE_FACTOR,
397
(-pad->GetOffset().y + dr) / SCALE_FACTOR,
398
(radius + pad->GetOffset().x ) / SCALE_FACTOR,
399
(-pad->GetOffset().y + dr) / SCALE_FACTOR,
400
pad->GetOffset().x / SCALE_FACTOR,
401
(-pad->GetOffset().y + dr) / SCALE_FACTOR );
403
fprintf( aFile, "LINE %g %g %g %g\n",
404
(radius + pad->GetOffset().x) / SCALE_FACTOR,
405
(-pad->GetOffset().y + dr) / SCALE_FACTOR,
406
(radius + pad->GetOffset().x) / SCALE_FACTOR,
407
(-pad->GetOffset().y - dr) / SCALE_FACTOR );
408
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
409
(radius + pad->GetOffset().x) / SCALE_FACTOR,
410
(-pad->GetOffset().y - dr) / SCALE_FACTOR,
411
(-radius + pad->GetOffset().x) / SCALE_FACTOR,
412
(-pad->GetOffset().y - dr) / SCALE_FACTOR,
413
pad->GetOffset().x / SCALE_FACTOR,
414
(-pad->GetOffset().y - dr) / SCALE_FACTOR );
479
// OrCAD Layout call them OVAL or OBLONG - GenCAD call them FINGERs
480
fprintf( aFile, " FINGER %g\n",
481
pad->GetDrillSize().x / SCALE_FACTOR );
484
if( dr >= 0 ) // Horizontal oval
487
fprintf( aFile, "LINE %g %g %g %g\n",
488
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
489
(-pad->GetOffset().y - radius) / SCALE_FACTOR,
490
(dr + pad->GetOffset().x ) / SCALE_FACTOR,
491
(-pad->GetOffset().y - radius) / SCALE_FACTOR );
493
// GenCAD arcs are (start, end, center)
494
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
495
(dr + pad->GetOffset().x) / SCALE_FACTOR,
496
(-pad->GetOffset().y - radius) / SCALE_FACTOR,
497
(dr + pad->GetOffset().x) / SCALE_FACTOR,
498
(-pad->GetOffset().y + radius) / SCALE_FACTOR,
499
(dr + pad->GetOffset().x) / SCALE_FACTOR,
500
-pad->GetOffset().y / SCALE_FACTOR );
502
fprintf( aFile, "LINE %g %g %g %g\n",
503
(dr + pad->GetOffset().x) / SCALE_FACTOR,
504
(-pad->GetOffset().y + radius) / SCALE_FACTOR,
505
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
506
(-pad->GetOffset().y + radius) / SCALE_FACTOR );
507
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
508
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
509
(-pad->GetOffset().y + radius) / SCALE_FACTOR,
510
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
511
(-pad->GetOffset().y - radius) / SCALE_FACTOR,
512
(-dr + pad->GetOffset().x) / SCALE_FACTOR,
513
-pad->GetOffset().y / SCALE_FACTOR );
515
else // Vertical oval
519
fprintf( aFile, "LINE %g %g %g %g\n",
520
(-radius + pad->GetOffset().x) / SCALE_FACTOR,
521
(-pad->GetOffset().y - dr) / SCALE_FACTOR,
522
(-radius + pad->GetOffset().x ) / SCALE_FACTOR,
523
(-pad->GetOffset().y + dr) / SCALE_FACTOR );
524
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
525
(-radius + pad->GetOffset().x ) / SCALE_FACTOR,
526
(-pad->GetOffset().y + dr) / SCALE_FACTOR,
527
(radius + pad->GetOffset().x ) / SCALE_FACTOR,
528
(-pad->GetOffset().y + dr) / SCALE_FACTOR,
529
pad->GetOffset().x / SCALE_FACTOR,
530
(-pad->GetOffset().y + dr) / SCALE_FACTOR );
532
fprintf( aFile, "LINE %g %g %g %g\n",
533
(radius + pad->GetOffset().x) / SCALE_FACTOR,
534
(-pad->GetOffset().y + dr) / SCALE_FACTOR,
535
(radius + pad->GetOffset().x) / SCALE_FACTOR,
536
(-pad->GetOffset().y - dr) / SCALE_FACTOR );
537
fprintf( aFile, "ARC %g %g %g %g %g %g\n",
538
(radius + pad->GetOffset().x) / SCALE_FACTOR,
539
(-pad->GetOffset().y - dr) / SCALE_FACTOR,
540
(-radius + pad->GetOffset().x) / SCALE_FACTOR,
541
(-pad->GetOffset().y - dr) / SCALE_FACTOR,
542
pad->GetOffset().x / SCALE_FACTOR,
543
(-pad->GetOffset().y - dr) / SCALE_FACTOR );
419
548
case PAD_TRAPEZOID:
420
549
fprintf( aFile, " POLYGON %g\n",
434
563
for( unsigned i = 0; i < viastacks.size(); i++ )
436
TRACK* via = viastacks[i];
437
LAYER_MSK mask = via->GetLayerMask() & master_layermask;
438
fprintf( aFile, "PADSTACK VIA%d.%d.%X %g\n",
439
via->GetWidth(), via->GetDrillValue(), mask,
565
VIA* via = viastacks[i];
567
LSET mask = via->GetLayerSet() & master_layermask;
569
fprintf( aFile, "PADSTACK VIA%d.%d.%s %g\n",
570
via->GetWidth(), via->GetDrillValue(),
571
fmt_mask( mask ).c_str(),
440
572
via->GetDrillValue() / SCALE_FACTOR );
442
for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
574
for( LSEQ seq = mask.Seq( gc_seq, DIM( gc_seq ) ); seq; ++seq )
444
if( mask & GetLayerMask( layer ) )
446
fprintf( aFile, "PAD V%d.%d.%X %s 0 0\n",
447
via->GetWidth(), via->GetDrillValue(),
449
TO_UTF8( GenCADLayerName[layer] ) );
576
LAYER_ID layer = *seq;
578
fprintf( aFile, "PAD V%d.%d.%s %s 0 0\n",
579
via->GetWidth(), via->GetDrillValue(),
580
fmt_mask( mask ).c_str(),
581
GenCADLayerName( cu_count, layer ).c_str()
461
593
D_PAD* pad = padstacks[i];
463
595
// Straight padstack
464
fprintf( aFile, "PADSTACK PAD%d %g\n", i,
465
pad->GetDrillSize().x / SCALE_FACTOR );
466
for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
596
fprintf( aFile, "PADSTACK PAD%d %g\n", i, pad->GetDrillSize().x / SCALE_FACTOR );
598
LSET pad_set = pad->GetLayerSet() & master_layermask;
600
// the special gc_seq
601
for( LSEQ seq = pad_set.Seq( gc_seq, DIM( gc_seq ) ); seq; ++seq )
468
if( pad->GetLayerMask() & GetLayerMask( layer ) & master_layermask )
470
fprintf( aFile, "PAD P%d %s 0 0\n", i,
471
TO_UTF8( GenCADLayerName[layer] ) );
603
LAYER_ID layer = *seq;
605
fprintf( aFile, "PAD P%d %s 0 0\n", i, GenCADLayerName( cu_count, layer ).c_str() );
475
608
// Flipped padstack
476
fprintf( aFile, "PADSTACK PAD%dF %g\n", i,
477
pad->GetDrillSize().x / SCALE_FACTOR );
478
for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
609
fprintf( aFile, "PADSTACK PAD%dF %g\n", i, pad->GetDrillSize().x / SCALE_FACTOR );
611
// the normal LAYER_ID sequence is inverted from gc_seq[]
612
for( LSEQ seq = pad_set.Seq(); seq; ++seq )
480
if( pad->GetLayerMask() & GetLayerMask( layer ) & master_layermask )
482
fprintf( aFile, "PAD P%d %s 0 0\n", i,
483
TO_UTF8( GenCADLayerNameFlipped[layer] ) );
614
LAYER_ID layer = *seq;
616
fprintf( aFile, "PAD P%d %s 0 0\n", i, GenCADLayerNameFlipped( cu_count, layer ).c_str() );
824
961
old_layer = track->GetLayer();
825
962
fprintf( aFile, "LAYER %s\n",
826
TO_UTF8( GenCADLayerName[track->GetLayer() & 0x1F] ) );
963
GenCADLayerName( cu_count, track->GetLayer() ).c_str()
829
967
fprintf( aFile, "LINE %g %g %g %g\n",
830
968
MapXTo( track->GetStart().x ), MapYTo( track->GetStart().y ),
831
969
MapXTo( track->GetEnd().x ), MapYTo( track->GetEnd().y ) );
833
972
if( track->Type() == PCB_VIA_T )
835
fprintf( aFile, "VIA VIA%d.%d.%X %g %g ALL %g via%d\n",
836
track->GetWidth(), track->GetDrillValue(),
837
track->GetLayerMask() & master_layermask,
838
MapXTo( track->GetStart().x ), MapYTo( track->GetStart().y ),
839
track->GetDrillValue() / SCALE_FACTOR, vianum++ );
974
const VIA* via = static_cast<const VIA*>(track);
976
LSET vset = via->GetLayerSet() & master_layermask;
978
fprintf( aFile, "VIA VIA%d.%d.%s %g %g ALL %g via%d\n",
979
via->GetWidth(), via->GetDrillValue(),
980
fmt_mask( vset ).c_str(),
981
MapXTo( via->GetStart().x ), MapYTo( via->GetStart().y ),
982
via->GetDrillValue() / SCALE_FACTOR, vianum++ );