Skip to content

Commit

Permalink
Don't merge_multi_draws twice.
Browse files Browse the repository at this point in the history
This was a mistake that wasted a lot of time in processing the gerber
files.
  • Loading branch information
eyal0 committed Feb 1, 2021
1 parent dd03ed1 commit 5bbf9e3
Showing 1 changed file with 20 additions and 6 deletions.
26 changes: 20 additions & 6 deletions gerberimporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -338,16 +338,25 @@ mp_pair merge_multi_draws(const vector<mp_pair>& multi_draws) {
return merge_multi_draws(new_draws);
}

multi_polygon_type_fp generate_layers(vector<pair<const gerbv_layer_t *, vector<mp_pair>>>& layers,
// layers is a vector of layers. Each layer has a polarity, which can
// be dark meaning to draw, or clear, meaning to erase. In the end,
// the output is regions that are drawn and regions that are undrawn.
// The layers also have two sets of elements to draw: shapes and
// filled_closed_regions. The former are actual shapes. The later
// are line drawings that maybe need to be treated as shapes, or not,
// depend on the options provided. Finally, there is the xor. xor
// overrides the layer polarity if set and causes each layer to be
// xored with the previous layer, instead of drawn or erased (dark or
// clear).
multi_polygon_type_fp generate_layers(vector<pair<const gerbv_layer_t *, mp_pair>>& layers,
multi_polygon_type_fp mp_pair::* member, bool xor_layers) {
multi_polygon_type_fp output;
vector<ring_type_fp> rings;

for (auto layer = layers.cbegin(); layer != layers.cend(); layer++) {
const gerbv_polarity_t polarity = layer->first->polarity;
const gerbv_step_and_repeat_t& stepAndRepeat = layer->first->stepAndRepeat;
const vector<mp_pair>& multi_draws = layer->second;
mp_pair draw_pair = merge_multi_draws(multi_draws);
mp_pair draw_pair = layer->second;
multi_polygon_type_fp draws = draw_pair.*member;

// First duplicate in the x direction.
Expand Down Expand Up @@ -892,11 +901,16 @@ pair<multi_polygon_type_fp, map<coordinate_type_fp, multi_linestring_type_fp>> G
}
linear_circular_paths.clear();
}
auto result = generate_layers(layers, &mp_pair::filled_closed_lines, fill_closed_lines);
vector<pair<const gerbv_layer_t *, mp_pair>> merged_layers;
merged_layers.reserve(layers.size());
for (const auto& layer : layers) {
merged_layers.emplace_back(layer.first, merge_multi_draws(layer.second));
}
auto result = generate_layers(merged_layers, &mp_pair::filled_closed_lines, fill_closed_lines);
if (fill_closed_lines) {
result = result - generate_layers(layers, &mp_pair::shapes, false);
result = result - generate_layers(merged_layers, &mp_pair::shapes, false);
} else {
result = result + generate_layers(layers, &mp_pair::shapes, false);
result = result + generate_layers(merged_layers, &mp_pair::shapes, false);
}

if (gerber->netlist->state->unit == GERBV_UNIT_MM) {
Expand Down

0 comments on commit 5bbf9e3

Please sign in to comment.