@@ -43,7 +43,7 @@ const LutEnumStr<Board::OutputFormat> Board::output_format_lut = {
43
43
{" odb" , Board::OutputFormat::ODB},
44
44
};
45
45
46
- static const unsigned int app_version = 20 ;
46
+ static const unsigned int app_version = 21 ;
47
47
48
48
unsigned int Board::get_app_version ()
49
49
{
@@ -62,6 +62,14 @@ Board::Board(const UUID &uu, const json &j, Block &iblock, IPool &pool, const st
62
62
stackup.emplace (std::piecewise_construct, std::forward_as_tuple (l), std::forward_as_tuple (l, it.value ()));
63
63
}
64
64
}
65
+ if (j.count (" user_layers" )) {
66
+ const json &o = j[" user_layers" ];
67
+ for (auto it = o.cbegin (); it != o.cend (); ++it) {
68
+ int l = std::stoi (it.key ());
69
+ user_layers.emplace (std::piecewise_construct, std::forward_as_tuple (l),
70
+ std::forward_as_tuple (l, it.value ()));
71
+ }
72
+ }
65
73
set_n_inner_layers (n_inner_layers);
66
74
if (j.count (" polygons" )) {
67
75
const json &o = j[" polygons" ];
@@ -369,7 +377,7 @@ Board::Board(const Board &brd, CopyMode copy_mode)
369
377
grid_settings(brd.grid_settings), airwires(brd.airwires), stackup(brd.stackup), colors(brd.colors),
370
378
pdf_export_settings(brd.pdf_export_settings), step_export_settings(brd.step_export_settings),
371
379
pnp_export_settings(brd.pnp_export_settings), version(brd.version), board_directory(brd.board_directory),
372
- n_inner_layers(brd.n_inner_layers)
380
+ n_inner_layers(brd.n_inner_layers), user_layers(brd.user_layers)
373
381
{
374
382
if (copy_mode == CopyMode::DEEP) {
375
383
packages = brd.packages ;
@@ -510,6 +518,11 @@ unsigned int Board::get_n_inner_layers() const
510
518
void Board::set_n_inner_layers (unsigned int n)
511
519
{
512
520
n_inner_layers = n;
521
+ update_layers ();
522
+ }
523
+
524
+ void Board::update_layers ()
525
+ {
513
526
layers.clear ();
514
527
layers = {{200 , {200 , " Top Notes" }},
515
528
{BoardLayers::OUTLINE_NOTES, {BoardLayers::OUTLINE_NOTES, " Outline Notes" }},
@@ -539,12 +552,132 @@ void Board::set_n_inner_layers(unsigned int n)
539
552
layers.emplace (std::make_pair (-j, Layer (-j, " Inner " + std::to_string (j), false , true )));
540
553
stackup.emplace (-j, -j);
541
554
}
555
+ for (const auto &[i, ul] : user_layers) {
556
+ auto &l = layers.emplace (std::piecewise_construct, std::forward_as_tuple (i), std::forward_as_tuple (i, ul.name ))
557
+ .first ->second ;
558
+ l.position = ul.position ;
559
+ l.color_layer = ul.id_color ;
560
+ stackup.emplace (i, i);
561
+ }
562
+ assign_user_layer_positions ();
563
+
542
564
map_erase_if (stackup, [this ](const auto &x) { return layers.count (x.first ) == 0 ; });
543
565
gerber_output_settings.update_for_board (*this );
544
566
odb_output_settings.update_for_board (*this );
545
567
update_pdf_export_settings (pdf_export_settings);
546
568
}
547
569
570
+ unsigned int Board::count_available_user_layers () const
571
+ {
572
+ return std::max (0 , (int )BoardLayers::max_user_layers - (int )user_layers.size ());
573
+ }
574
+
575
+ Board::UserLayer::UserLayer (int l)
576
+ : id(l), id_color(l), name(" User Layer " + std::to_string(l - BoardLayers::FIRST_USER_LAYER)), position(l),
577
+ type(Type::DOCUMENTATION)
578
+ {
579
+ }
580
+
581
+ static const LutEnumStr<Board::UserLayer::Type> user_layer_type_lut = {
582
+ {" documentation" , Board::UserLayer::Type::DOCUMENTATION}, {" stiffener" , Board::UserLayer::Type::STIFFENER},
583
+ {" bend_area" , Board::UserLayer::Type::BEND_AREA}, {" flex_area" , Board::UserLayer::Type::FLEX_AREA},
584
+ {" rigid_area" , Board::UserLayer::Type::RIGID_AREA}, {" carbon_mask" , Board::UserLayer::Type::CARBON_MASK},
585
+ {" silver_mask" , Board::UserLayer::Type::SILVER_MASK}, {" covercoat" , Board::UserLayer::Type::COVERCOAT},
586
+ {" coverlay" , Board::UserLayer::Type::COVERLAY}, {" psa" , Board::UserLayer::Type::PSA},
587
+ };
588
+
589
+ Board::UserLayer::UserLayer (int l, const json &j)
590
+ : id(l), id_color(j.value(" id_color" , l)), name(j.at(" name" ).get<std::string>()),
591
+ position (j.at(" position" ).get<double>()), type(user_layer_type_lut.lookup(j.at(" type" )))
592
+ {
593
+ }
594
+
595
+ json Board::UserLayer::serialize () const
596
+ {
597
+ json j;
598
+ j[" name" ] = name;
599
+ j[" position" ] = position;
600
+ j[" id_color" ] = id_color;
601
+ j[" type" ] = user_layer_type_lut.lookup_reverse (type);
602
+ return j;
603
+ }
604
+
605
+ int Board::add_user_layer (int other_layer, UserLayerOrder order)
606
+ {
607
+ if (count_available_user_layers () < 1 )
608
+ throw std::runtime_error (" no more user layers available" );
609
+ int user_layer;
610
+ for (user_layer = BoardLayers::FIRST_USER_LAYER; user_layer <= BoardLayers::LAST_USER_LAYER; user_layer++) {
611
+ if (user_layers.count (user_layer) == 0 )
612
+ break ;
613
+ }
614
+ if (user_layers.count (user_layer))
615
+ throw std::runtime_error (" no more user layers available" );
616
+
617
+
618
+ auto &ul = user_layers.emplace (user_layer, user_layer).first ->second ;
619
+ const double offset = 1.0 / (2 * BoardLayers::max_user_layers);
620
+ const auto other_pos = layers.at (other_layer).position ;
621
+ ul.position = other_pos + offset * static_cast <int >(order);
622
+
623
+
624
+ update_layers ();
625
+ return user_layer;
626
+ }
627
+
628
+ void Board::delete_user_layer (int layer)
629
+ {
630
+ user_layers.erase (layer);
631
+ update_layers ();
632
+ }
633
+
634
+ void Board::assign_user_layer_positions ()
635
+ {
636
+ const auto layers_sorted = get_layers_sorted (LayerSortOrder::BOTTOM_TO_TOP);
637
+ const double step = 1.0 / BoardLayers::max_user_layers;
638
+ double pos = BoardLayers::BOTTOM_NOTES - 1 ;
639
+ for (const auto &it : layers_sorted) {
640
+ if (BoardLayers::is_user (it.index )) {
641
+ pos += step;
642
+ layers.at (it.index ).position = pos;
643
+ user_layers.at (it.index ).position = pos;
644
+ }
645
+ else {
646
+ layers.at (it.index ).position = it.index ;
647
+ pos = it.index ;
648
+ }
649
+ }
650
+ }
651
+
652
+ void Board::set_user_layer_name (int user_layer, const std::string &name)
653
+ {
654
+ user_layers.at (user_layer).name = name;
655
+ update_layers ();
656
+ }
657
+
658
+ void Board::set_user_layer_type (int user_layer, UserLayer::Type type)
659
+ {
660
+ user_layers.at (user_layer).type = type;
661
+ }
662
+
663
+ void Board::set_user_layer_color (int user_layer, int color_layer)
664
+ {
665
+ user_layers.at (user_layer).id_color = color_layer;
666
+ }
667
+
668
+ void Board::move_user_layer (int user_layer, int other_layer, UserLayerOrder pos)
669
+ {
670
+ const double offset = 1.0 / (2 * BoardLayers::max_user_layers) * static_cast <int >(pos);
671
+ user_layers.at (user_layer).position = layers.at (other_layer).position + offset;
672
+ update_layers ();
673
+ }
674
+
675
+
676
+ const std::map<int , Board::UserLayer> &Board::get_user_layers () const
677
+ {
678
+ return user_layers;
679
+ }
680
+
548
681
void Board::update_pdf_export_settings (PDFExportSettings &settings)
549
682
{
550
683
auto layers_from_board = get_layers ();
@@ -573,9 +706,10 @@ void Board::update_pdf_export_settings(PDFExportSettings &settings)
573
706
add_layer (BoardLayers::TOP_PACKAGE, false );
574
707
add_layer (BoardLayers::TOP_COPPER, false );
575
708
for (const auto &la : layers_from_board) {
576
- if (BoardLayers::is_copper (la.first ) && la.first > BoardLayers::BOTTOM_COPPER
577
- && la.first < BoardLayers::TOP_COPPER)
578
- add_layer (la.first , false );
709
+ if ((BoardLayers::is_copper (la.first ) && la.first > BoardLayers::BOTTOM_COPPER
710
+ && la.first < BoardLayers::TOP_COPPER)
711
+ || BoardLayers::is_user (la.first ))
712
+ add_layer (la.first , BoardLayers::is_user (la.first ));
579
713
}
580
714
add_layer (BoardLayers::BOTTOM_COPPER, false );
581
715
add_layer (BoardLayers::BOTTOM_MASK, false );
@@ -1214,6 +1348,12 @@ json Board::serialize() const
1214
1348
j[" net_ties" ][(std::string)it.first ] = it.second .serialize ();
1215
1349
}
1216
1350
}
1351
+ if (user_layers.size ()) {
1352
+ j[" user_layers" ] = json::object ();
1353
+ for (const auto &it : user_layers) {
1354
+ j[" user_layers" ][std::to_string (it.first )] = it.second .serialize ();
1355
+ }
1356
+ }
1217
1357
return j;
1218
1358
}
1219
1359
0 commit comments