Skip to content

Commit 596ac13

Browse files
Merge pull request #784 from jmwilson/fixed_parameters
Allow packages to fix parameters changelog: Enhancements/Package editor: Allow packages to fix parameters
2 parents b979731 + 4d44c7f commit 596ac13

File tree

13 files changed

+172
-26
lines changed

13 files changed

+172
-26
lines changed

scripts/app_versions.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ versions:
3030
6: add net ties
3131
7: keep nets on unconnected labels
3232
8: add BOM export customisation
33+
package:
34+
1: package-defined solder mask & paste parameters override board parameters
3335
project:
3436
1: replace pool cache with project pool
3537
2: add hierarchy

src/core/core_package.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ CorePackage::CorePackage(const std::string &filename, IPool &pool)
1313
: Core(pool, nullptr), package(Package::new_from_file(filename, pool)), m_filename(filename),
1414
m_pictures_dir(Glib::build_filename(Glib::path_get_dirname(filename), "pictures")), rules(package.rules),
1515
grid_settings(package.grid_settings), parameter_program_code(package.parameter_program.get_code()),
16-
parameter_set(package.parameter_set), models(package.models), default_model(package.default_model)
16+
parameter_set(package.parameter_set), parameters_fixed(package.parameters_fixed), models(package.models),
17+
default_model(package.default_model)
1718
{
1819
package.load_pictures(m_pictures_dir);
1920
rebuild("init");
@@ -261,6 +262,7 @@ const std::string &CorePackage::get_filename() const
261262
void CorePackage::save(const std::string &suffix)
262263
{
263264
package.parameter_set = parameter_set;
265+
package.parameters_fixed = parameters_fixed;
264266
package.parameter_program.set_code(parameter_program_code);
265267
package.models = models;
266268
package.default_model = default_model;

src/core/core_package.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class CorePackage : public Core, public virtual IDocumentPackage {
8181
public:
8282
std::string parameter_program_code;
8383
ParameterSet parameter_set;
84+
std::set<ParameterID> parameters_fixed;
8485

8586
std::map<UUID, Package::Model> models;
8687
UUID default_model;

src/dialogs/pad_parameter_set_window.cpp

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ PadParameterSetWindow::PadParameterSetWindow(Gtk::Window *parent, class ImpInter
4444
for (auto &it : pads) {
4545
it->pool_padstack = ps;
4646
it->padstack = *ps;
47-
it->padstack.apply_parameter_set(it->parameter_set);
47+
auto ps_this = it->parameter_set;
48+
copy_param(ps_this, pkg.parameter_set, it->parameters_fixed,
49+
{ParameterID::SOLDER_MASK_EXPANSION, ParameterID::PASTE_MASK_CONTRACTION,
50+
ParameterID::HOLE_SOLDER_MASK_EXPANSION});
51+
it->padstack.apply_parameter_set(ps_this);
4852
}
4953
emit_event(ToolDataWindow::Event::UPDATE);
5054
});
@@ -79,14 +83,51 @@ void PadParameterSetWindow::load_pad()
7983
delete editor;
8084
editor = Gtk::manage(new ParameterSetEditor(&pad_current->parameter_set, false));
8185
editor->set_has_apply_all_toggle("Apply to all selected pads (Shift+Enter)");
86+
editor->signal_create_extra_widget().connect([this](ParameterID id) {
87+
auto w = Gtk::manage(new Gtk::CheckButton("Fixed"));
88+
w->set_tooltip_text("Fixed pad parameters cannot be changed by package or board rules");
89+
w->set_active(pad_current->parameters_fixed.count(id));
90+
w->signal_toggled().connect([this, id, w] {
91+
if (w->get_active()) {
92+
pad_current->parameters_fixed.insert(id);
93+
}
94+
else {
95+
pad_current->parameters_fixed.erase(id);
96+
}
97+
if (params_apply_all.count(id)) {
98+
apply_all(id);
99+
for (auto pad : pads) {
100+
auto ps_this = pad->parameter_set;
101+
copy_param(ps_this, pkg.parameter_set, pad->parameters_fixed,
102+
{ParameterID::SOLDER_MASK_EXPANSION, ParameterID::PASTE_MASK_CONTRACTION,
103+
ParameterID::HOLE_SOLDER_MASK_EXPANSION});
104+
pad->padstack.apply_parameter_set(ps_this);
105+
}
106+
}
107+
else {
108+
auto ps_current = pad_current->parameter_set;
109+
copy_param(ps_current, pkg.parameter_set, pad_current->parameters_fixed,
110+
{ParameterID::SOLDER_MASK_EXPANSION, ParameterID::PASTE_MASK_CONTRACTION,
111+
ParameterID::HOLE_SOLDER_MASK_EXPANSION});
112+
pad_current->padstack.apply_parameter_set(ps_current);
113+
}
114+
emit_event(ToolDataWindow::Event::UPDATE);
115+
});
116+
return w;
117+
});
118+
editor->signal_remove_extra_widget().connect([this](ParameterID id) { pad_current->parameters_fixed.erase(id); });
82119
editor->populate();
83120
editor->set_apply_all(params_apply_all);
84121
editor->signal_apply_all_toggled().connect([this](ParameterID id, bool enable) {
85122
if (enable) {
86123
params_apply_all.insert(id);
87124
apply_all(id);
88125
for (auto pad : pads) {
89-
pad->padstack.apply_parameter_set(pad->parameter_set);
126+
auto ps_this = pad->parameter_set;
127+
copy_param(ps_this, pkg.parameter_set, pad->parameters_fixed,
128+
{ParameterID::SOLDER_MASK_EXPANSION, ParameterID::PASTE_MASK_CONTRACTION,
129+
ParameterID::HOLE_SOLDER_MASK_EXPANSION});
130+
pad->padstack.apply_parameter_set(ps_this);
90131
}
91132
emit_event(ToolDataWindow::Event::UPDATE);
92133
}
@@ -100,7 +141,11 @@ void PadParameterSetWindow::load_pad()
100141
apply_all(id);
101142
}
102143
for (auto pad : pads) {
103-
pad->padstack.apply_parameter_set(pad->parameter_set);
144+
auto ps_this = pad->parameter_set;
145+
copy_param(ps_this, pkg.parameter_set, pad->parameters_fixed,
146+
{ParameterID::SOLDER_MASK_EXPANSION, ParameterID::PASTE_MASK_CONTRACTION,
147+
ParameterID::HOLE_SOLDER_MASK_EXPANSION});
148+
pad->padstack.apply_parameter_set(ps_this);
104149
}
105150
emit_event(ToolDataWindow::Event::UPDATE);
106151
});
@@ -118,7 +163,11 @@ void PadParameterSetWindow::load_pad()
118163
auto ps = pool.get_padstack(padstack_button->property_selected_uuid());
119164
pad_current->pool_padstack = ps;
120165
pad_current->padstack = *ps;
121-
pad_current->padstack.apply_parameter_set(pad_current->parameter_set);
166+
auto ps_current = pad_current->parameter_set;
167+
copy_param(ps_current, pkg.parameter_set, pad_current->parameters_fixed,
168+
{ParameterID::SOLDER_MASK_EXPANSION, ParameterID::PASTE_MASK_CONTRACTION,
169+
ParameterID::HOLE_SOLDER_MASK_EXPANSION});
170+
pad_current->padstack.apply_parameter_set(ps_current);
122171
emit_event(ToolDataWindow::Event::UPDATE);
123172
});
124173
box2->pack_start(*padstack_button, true, true, 0);
@@ -129,6 +178,12 @@ void PadParameterSetWindow::apply_all(ParameterID id)
129178
{
130179
for (auto it : pads) {
131180
it->parameter_set[id] = pad_current->parameter_set.at(id);
181+
if (pad_current->parameters_fixed.count(id)) {
182+
it->parameters_fixed.insert(id);
183+
}
184+
else {
185+
it->parameters_fixed.erase(id);
186+
}
132187
}
133188
}
134189

src/imp/imp_package.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,26 @@ void ImpPackage::construct()
188188
footprint_generator_window = FootprintGeneratorWindow::create(main_window, core_package);
189189
footprint_generator_window->signal_generated().connect(sigc::mem_fun(*this, &ImpBase::canvas_update_from_pp));
190190

191+
auto editor = new ParameterSetEditor(&core_package.parameter_set, false);
192+
editor->signal_create_extra_widget().connect([this, editor](ParameterID id) {
193+
auto w = Gtk::manage(new Gtk::CheckButton("Fixed"));
194+
w->set_tooltip_text("Fixed parameters cannot be changed by board rules");
195+
w->set_active(core_package.parameters_fixed.count(id));
196+
w->signal_toggled().connect([this, id, w, editor] {
197+
if (w->get_active()) {
198+
core_package.parameters_fixed.insert(id);
199+
}
200+
else {
201+
core_package.parameters_fixed.erase(id);
202+
}
203+
editor->signal_changed().emit();
204+
});
205+
return w;
206+
});
207+
editor->signal_remove_extra_widget().connect([this](ParameterID id) { core_package.parameters_fixed.erase(id); });
208+
191209
parameter_window =
192-
new ParameterWindow(main_window, &core_package.parameter_program_code, &core_package.parameter_set);
210+
new ParameterWindow(main_window, &core_package.parameter_program_code, &core_package.parameter_set, editor);
193211
parameter_window->signal_changed().connect([this] { core_package.set_needs_save(); });
194212
{
195213
auto button = Gtk::manage(new Gtk::Button("Parameters…"));
@@ -652,4 +670,16 @@ bool ImpPackage::set_filename()
652670
return success;
653671
}
654672

673+
unsigned int ImpPackage::get_required_version() const
674+
{
675+
if (core_package.parameters_fixed.size() || std::any_of(package.pads.cbegin(), package.pads.cend(), [](auto &it) {
676+
return it.second.parameters_fixed.size() != 0;
677+
})) {
678+
return 1;
679+
}
680+
else {
681+
return 0;
682+
}
683+
}
684+
655685
} // namespace horizon

src/imp/imp_package.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ class ImpPackage : public ImpLayer {
5555

5656
std::vector<std::string> get_view_hints() override;
5757

58+
unsigned int get_required_version() const override;
59+
60+
bool uses_dynamic_version() const override
61+
{
62+
return true;
63+
}
64+
5865
private:
5966
void canvas_update() override;
6067
CorePackage core_package;

src/imp/rules/rule_editor_thermals.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ void RuleEditorThermals::populate()
170170
b2->join_group(*b1);
171171
box->pack_start(*b2, true, true, 0);
172172

173-
auto b3 = Gtk::manage(new Gtk::RadioButton("Thermal rlief"));
173+
auto b3 = Gtk::manage(new Gtk::RadioButton("Thermal relief"));
174174
b3->set_mode(false);
175175
b3->join_group(*b1);
176176
box->pack_start(*b3, true, true, 0);

src/package/pad.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ Pad::Pad(const UUID &uu, const json &j, IPool &pool)
1111
if (j.count("parameter_set")) {
1212
parameter_set = parameter_set_from_json(j.at("parameter_set"));
1313
}
14+
if (j.count("parameters_fixed")) {
15+
const json &o = j["parameters_fixed"];
16+
for (const auto &value : o) {
17+
parameters_fixed.insert(parameter_id_from_string(value.get<std::string>()));
18+
}
19+
}
1420
}
1521
Pad::Pad(const UUID &uu, std::shared_ptr<const Padstack> ps) : uuid(uu), pool_padstack(ps), padstack(*ps)
1622
{
@@ -23,6 +29,9 @@ json Pad::serialize() const
2329
j["placement"] = placement.serialize();
2430
j["name"] = name;
2531
j["parameter_set"] = parameter_set_serialize(parameter_set);
32+
for (const auto &it : parameters_fixed) {
33+
j["parameters_fixed"].push_back(parameter_id_to_string(it));
34+
}
2635

2736
return j;
2837
}

src/package/pad.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class Pad {
1919
Placement placement;
2020
std::string name;
2121
ParameterSet parameter_set;
22+
std::set<ParameterID> parameters_fixed;
2223

2324
uuid_ptr<class Net> net = nullptr;
2425
bool is_nc = false;

src/parameter/set.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,22 @@ ParameterSet parameter_set_from_json(const json &j)
6666
}
6767
return ps;
6868
}
69+
70+
71+
void copy_param(ParameterSet &dest, const ParameterSet &src, const std::set<ParameterID> &parameters_fixed,
72+
ParameterID id)
73+
{
74+
if (src.count(id) && !parameters_fixed.count(id)) {
75+
dest[id] = src.at(id);
76+
}
77+
}
78+
79+
void copy_param(ParameterSet &dest, const ParameterSet &src, const std::set<ParameterID> &parameters_fixed,
80+
const std::set<ParameterID> &ids)
81+
{
82+
for (const auto id : ids) {
83+
copy_param(dest, src, parameters_fixed, id);
84+
}
85+
}
86+
6987
} // namespace horizon

0 commit comments

Comments
 (0)