Fix diff/intersect when some tags are hidden

When the first operand is hidden, some strange things happen, so this guards
against that.

Example:

    include <BOSL2/std.scad>

    part_to_show = "A"; // [A,B,C]
    part_to_hide = "B"; // [A,B,C]

    module my_part() {
        tags("A") left(10) cuboid(10);
        tags("B") diff("neg", "B") right(10) {
            cuboid(10);
            cyl(d=10, h=10, $tags="neg");
        }
        tags("C") fwd(10) cuboid(10);
    }

    show(part_to_show) hide(part_to_hide) my_part();

Tag "B" here acts very strangely when it is supposed to be hidden, and never
hides completely.
This commit is contained in:
Kelvie Wong 2020-08-22 16:09:28 -07:00
parent 92d9c49b90
commit e5a0a3cad7

View file

@ -1235,17 +1235,20 @@ module show(tags="")
// } // }
module diff(neg, pos=undef, keep=undef) module diff(neg, pos=undef, keep=undef)
{ {
difference() { // Don't perform the operation if the current tags are hidden
if (pos != undef) { if (attachment_is_shown($tags)) {
show(pos) children(); difference() {
} else { if (pos != undef) {
if (keep == undef) { show(pos) children();
hide(neg) children();
} else { } else {
hide(str(neg," ",keep)) children(); if (keep == undef) {
hide(neg) children();
} else {
hide(str(neg," ",keep)) children();
}
} }
show(neg) children();
} }
show(neg) children();
} }
if (keep!=undef) { if (keep!=undef) {
show(keep) children(); show(keep) children();
@ -1280,17 +1283,20 @@ module diff(neg, pos=undef, keep=undef)
// } // }
module intersect(a, b=undef, keep=undef) module intersect(a, b=undef, keep=undef)
{ {
intersection() { // Don't perform the operation if the current tags are hidden
if (b != undef) { if (attachment_is_shown($tags)) {
show(b) children(); intersection() {
} else { if (b != undef) {
if (keep == undef) { show(b) children();
hide(a) children();
} else { } else {
hide(str(a," ",keep)) children(); if (keep == undef) {
hide(a) children();
} else {
hide(str(a," ",keep)) children();
}
} }
show(a) children();
} }
show(a) children();
} }
if (keep!=undef) { if (keep!=undef) {
show(keep) children(); show(keep) children();