discuss@lists.openscad.org

OpenSCAD general discussion Mailing-list

View all threads

trying to difference text block from cube

J
jordanthompson
Mon, Jul 6, 2020 8:34 AM

Total nube trying to get started with OpenSCAD...
I have the following code that is partially working the way I'd hoped.  If I
run only companyName(), I get what I want (an indented area with raised
letters).
When I try to difference it from a cube, it becomes letters etched into a
two dimensional rectangle positioned away from the cube.
My goal is to be able to create a reusable text block that I can imprint on
my parts.  I want this to be raised text in a recessed rectangle.

Any help would be most appreciated!
use <fontmetrics.scad>;module companyName(x, y, z,height) {
textDepth=1;    border=1;    textSpacing=.5;
usableHeight=height-2border-3textSpacing;    topTextHeight=usableHeight/2;
bottomTextHeight=usableHeight/3;    font = "Arial";    topText = "Top Text";
bottomText = "Bottom Text";    topTextLength = measureText(topText,
font=font, size=topTextHeight);    bottomTextLength =
measureText(bottomText, font=font, size=bottomTextHeight);
echo("topTextLength", topTextLength);    echo("bottomTextLength",
bottomTextLength);        translate([x-2textDepth,y,z]) {
difference() {            if (topTextLength > bottomTextLength) {
cube([2
textDepth, topTextLength+2border+3textSpacing, height]);
} else {                echo("here");                cube([2textDepth,
bottomTextLength+2
border+3textSpacing, height]);            }
translate([textDepth,border, border]) {                if (topTextLength >
bottomTextLength) {                    cube([2
textDepth,
topTextLength+border+textSpacing, height-2border]);                } else {
cube([2
textDepth, bottomTextLength+border+textSpacing, height-2*border]);
}            }        }        translate([textDepth, border+textSpacing,
height-border-topTextHeight-textSpacing]) {            rotate([90,0,90]) {
linear_extrude(textDepth)
drawWrappedText(topText,font=font,size=topTextHeight,halign="justify");
//text(text, size=topTextHeight);            }        }
translate([textDepth, border+textSpacing, border+textSpacing]) {
rotate([90,0,90]) {                linear_extrude(textDepth)
text(bottomText, size=bottomTextHeight);            }        }    }}module
notWorking() {    difference() {      cube([4, 50, 50]);
companyName(4, 0, 0, height=10);    }}module working() {    companyName(4,
0, 0, height=10);}

--
Sent from: http://forum.openscad.org/

Total nube trying to get started with OpenSCAD... I have the following code that is partially working the way I'd hoped. If I run only companyName(), I get what I want (an indented area with raised letters). When I try to difference it from a cube, it becomes letters etched into a two dimensional rectangle positioned away from the cube. My goal is to be able to create a reusable text block that I can imprint on my parts. I want this to be raised text in a recessed rectangle. Any help would be most appreciated! use &lt;fontmetrics.scad&gt;;module companyName(x, y, z,height) { textDepth=1; border=1; textSpacing=.5; usableHeight=height-2*border-3*textSpacing; topTextHeight=usableHeight/2; bottomTextHeight=usableHeight/3; font = "Arial"; topText = "Top Text"; bottomText = "Bottom Text"; topTextLength = measureText(topText, font=font, size=topTextHeight); bottomTextLength = measureText(bottomText, font=font, size=bottomTextHeight); echo("topTextLength", topTextLength); echo("bottomTextLength", bottomTextLength); translate([x-2*textDepth,y,z]) { difference() { if (topTextLength > bottomTextLength) { cube([2*textDepth, topTextLength+2*border+3*textSpacing, height]); } else { echo("here"); cube([2*textDepth, bottomTextLength+2*border+3*textSpacing, height]); } translate([textDepth,border, border]) { if (topTextLength > bottomTextLength) { cube([2*textDepth, topTextLength+border+textSpacing, height-2*border]); } else { cube([2*textDepth, bottomTextLength+border+textSpacing, height-2*border]); } } } translate([textDepth, border+textSpacing, height-border-topTextHeight-textSpacing]) { rotate([90,0,90]) { linear_extrude(textDepth) drawWrappedText(topText,font=font,size=topTextHeight,halign="justify"); //text(text, size=topTextHeight); } } translate([textDepth, border+textSpacing, border+textSpacing]) { rotate([90,0,90]) { linear_extrude(textDepth) text(bottomText, size=bottomTextHeight); } } }}module notWorking() { difference() { cube([4, 50, 50]); companyName(4, 0, 0, height=10); }}module working() { companyName(4, 0, 0, height=10);} -- Sent from: http://forum.openscad.org/
JB
Jordan Brown
Mon, Jul 6, 2020 3:49 PM

On 7/6/2020 1:34 AM, jordanthompson wrote:

Total nube trying to get started with OpenSCAD...

I have the following code that is partially working the way I'd hoped.
If I run only companyName(), I get what I want (an indented area with
raised letters).

When I try to difference it from a cube, it becomes letters etched
into a two dimensional rectangle positioned away from the cube.

My goal is to be able to create a reusable text block that I can
imprint on my parts. I want this to be raised text in a recessed
rectangle.

Any help would be most appreciated!

You have two things going on.

The first is easy.  It's a preview rendering problem called Z-fighting. 
When you difference two objects that share a face, the renderer can't
figure out whether the face is there or not.  The solution is to ensure
that the thing that you are subtracting, the negative space, extends
past the boundary of the thing you're subtracting from. In this
particular case, the easy thing to do is to offset the companyName() by
just a little, perhaps:

module notWorking() {
    difference() {
       cube([4, 50, 50]);
       translate([0.01,-0.01,-0.01])
           companyName(4, 0, 0, height=10);
    }
}

Z-fighting most obviously affects F5 previews rather than F6 renders,
because of the algorithms used.  However, F6 can be vulnerable to
similar effects when the locations of the surfaces involved are derived
from math that can yield imprecise results.

The second and harder, and what I think you're asking about, is that you
aren't thinking of difference() correctly.  Remember what your
companyName() looks like.  You are removing that material from the
cube, so the result is the negative of it.  It sounds like you're
thinking that in

difference() {
    A();
    B();
}

that B will somehow replace a part of A.  (But how could it?  B is an
object and an infinite amount of empty space; how much of that empty
space would replace part of A?)

If you want it to behave the way you're thinking, you have to arrange
that B is the negative of what you want to remain.

That requires a little rearranging.

Simplifying, your current notWorking() is:

difference() {
    cube();        // big cube
    difference() {
        cube();    // A
        cube();    // B
    }
    linear_extrude() text();
}

That is, you are taking a cube A, removing another cube B to form an
inset, and then adding some text, and then subtracting the result from
the big cube.

In arithmetic notation, you've got (bigcube - ((A - B) + text)).  You
want ((bigcube - B) + text), that you're going to take your object,
subtract away an inset, and then put some text into that inset.  That
expression doesn't work for you, because you want the B and "text" to
come together in one module, so you want to algebraically transform it
to (bigcube - (negative - text)).

It doesn't quite work like arithmetic, but it's close.  In arithmetic, a
double negative is a positive.  A-(A-B) is equal to B.  In OpenSCAD CSG,
a result can never be negative, so A-B can be anything from zero to A
and A-(A-B) can't be more than A.  Strictly, it's set differencing
rather than arithmetic differencing.

You need to be subtracting the inset, except the text, like so:

difference() {
    cube();    // big cube
    difference() {
        cube();   // negative
        linear_extrude() text();
    }
}

Note that your first cube, the one I labelled "positive", is not
required.  It's material that you expect to remain from the object being
imprinted; it isn't part of the "negative space".

Here's what you want companyName() to produce:

Note that this scheme is based solely on differencing - you cannot use
it to make text that will extend outside the original "big cube".  Doing
that would require removing the inset as one step, and then adding the text.

Here's what you need.  All I've done is to remove cube A and move the
text inside the difference() so that it's being subtracted from cube B. 
Oh, and I renamed "notWorking" to "nowWorking" :-)

use <fontmetrics.scad>;

module companyName(x, y, z,height) {
    textDepth=1;
    border=1;
    textSpacing=.5;
    usableHeight=height-2*border-3*textSpacing;
    topTextHeight=usableHeight/2;
    bottomTextHeight=usableHeight/3;
    font = "Arial";
    topText = "Top Text";
    bottomText = "Bottom Text";
    topTextLength = measureText(topText, font=font, size=topTextHeight);
    bottomTextLength = measureText(bottomText, font=font, size=bottomTextHeight);
    echo("topTextLength", topTextLength);
    echo("bottomTextLength", bottomTextLength);
    
    translate([x-2*textDepth,y,z]) {

        difference() {
            translate([textDepth,border, border]) {
                if (topTextLength > bottomTextLength) {
                    cube([2*textDepth, topTextLength+border+textSpacing, height-2*border]);
                } else {
                    cube([2*textDepth, bottomTextLength+border+textSpacing, height-2*border]);
                }

            }
            
            translate([textDepth, border+textSpacing, height-border-topTextHeight-textSpacing]) {
                rotate([90,0,90]) {
                    linear_extrude(textDepth)
                    drawWrappedText(topText,font=font,size=topTextHeight,halign="justify");
                    //text(text, size=topTextHeight);
                }
            }
            translate([textDepth, border+textSpacing, border+textSpacing]) {
                rotate([90,0,90]) {
                    linear_extrude(textDepth)
                    text(bottomText, size=bottomTextHeight);
                }
            }

        }
    }
}

module nowWorking() {
    difference() {
       cube([4, 50, 50]);
       translate([0.01,-0.01,-0.01]) companyName(4, 0, 0, height=10);
    }
}

module working() {
    companyName(4, 0, 0, height=10);
}

nowWorking();

Like so:

On 7/6/2020 1:34 AM, jordanthompson wrote: > Total nube trying to get started with OpenSCAD... > > I have the following code that is partially working the way I'd hoped. > If I run only companyName(), I get what I want (an indented area with > raised letters). > > When I try to difference it from a cube, it becomes letters etched > into a two dimensional rectangle positioned away from the cube. > > My goal is to be able to create a reusable text block that I can > imprint on my parts. I want this to be raised text in a recessed > rectangle. > > Any help would be most appreciated! > You have two things going on. The first is easy.  It's a preview rendering problem called Z-fighting.  When you difference two objects that share a face, the renderer can't figure out whether the face is there or not.  The solution is to ensure that the thing that you are subtracting, the negative space, extends past the boundary of the thing you're subtracting from. In this particular case, the easy thing to do is to offset the companyName() by just a little, perhaps: module notWorking() { difference() { cube([4, 50, 50]); translate([0.01,-0.01,-0.01]) companyName(4, 0, 0, height=10); } } Z-fighting most obviously affects F5 previews rather than F6 renders, because of the algorithms used.  However, F6 can be vulnerable to similar effects when the locations of the surfaces involved are derived from math that can yield imprecise results. The second and harder, and what I think you're asking about, is that you aren't thinking of difference() correctly.  Remember what your companyName() looks like.  You are *removing* that material from the cube, so the result is the negative of it.  It sounds like you're thinking that in difference() { A(); B(); } that B will somehow replace a part of A.  (But how could it?  B is an object and an infinite amount of empty space; how much of that empty space would replace part of A?) If you want it to behave the way you're thinking, you have to arrange that B is the negative of what you want to remain. That requires a little rearranging. Simplifying, your current notWorking() is: difference() { cube(); // big cube difference() { cube(); // A cube(); // B } linear_extrude() text(); } That is, you are taking a cube A, removing another cube B to form an inset, and then adding some text, and then subtracting the result from the big cube. In arithmetic notation, you've got (bigcube - ((A - B) + text)).  You want ((bigcube - B) + text), that you're going to take your object, subtract away an inset, and then put some text into that inset.  That expression doesn't work for you, because you want the B and "text" to come together in one module, so you want to algebraically transform it to (bigcube - (negative - text)). It doesn't quite work like arithmetic, but it's close.  In arithmetic, a double negative is a positive.  A-(A-B) is equal to B.  In OpenSCAD CSG, a result can never be negative, so A-B can be anything from zero to A and A-(A-B) can't be more than A.  Strictly, it's set differencing rather than arithmetic differencing. You need to be subtracting the inset, except the text, like so: difference() { cube(); // big cube difference() { cube(); // negative linear_extrude() text(); } } Note that your first cube, the one I labelled "positive", is not required.  It's material that you expect to remain from the object being imprinted; it isn't part of the "negative space". Here's what you want companyName() to produce: Note that this scheme is based solely on differencing - you cannot use it to make text that will extend outside the original "big cube".  Doing that would require removing the inset as one step, and then adding the text. Here's what you need.  All I've done is to remove cube A and move the text inside the difference() so that it's being subtracted from cube B.  Oh, and I renamed "notWorking" to "nowWorking" :-) use <fontmetrics.scad>; module companyName(x, y, z,height) { textDepth=1; border=1; textSpacing=.5; usableHeight=height-2*border-3*textSpacing; topTextHeight=usableHeight/2; bottomTextHeight=usableHeight/3; font = "Arial"; topText = "Top Text"; bottomText = "Bottom Text"; topTextLength = measureText(topText, font=font, size=topTextHeight); bottomTextLength = measureText(bottomText, font=font, size=bottomTextHeight); echo("topTextLength", topTextLength); echo("bottomTextLength", bottomTextLength); translate([x-2*textDepth,y,z]) { difference() { translate([textDepth,border, border]) { if (topTextLength > bottomTextLength) { cube([2*textDepth, topTextLength+border+textSpacing, height-2*border]); } else { cube([2*textDepth, bottomTextLength+border+textSpacing, height-2*border]); } } translate([textDepth, border+textSpacing, height-border-topTextHeight-textSpacing]) { rotate([90,0,90]) { linear_extrude(textDepth) drawWrappedText(topText,font=font,size=topTextHeight,halign="justify"); //text(text, size=topTextHeight); } } translate([textDepth, border+textSpacing, border+textSpacing]) { rotate([90,0,90]) { linear_extrude(textDepth) text(bottomText, size=bottomTextHeight); } } } } } module nowWorking() { difference() { cube([4, 50, 50]); translate([0.01,-0.01,-0.01]) companyName(4, 0, 0, height=10); } } module working() { companyName(4, 0, 0, height=10); } nowWorking(); Like so:
JB
Jordan Brown
Mon, Jul 6, 2020 4:10 PM

On 7/6/2020 8:49 AM, Jordan Brown wrote:

On 7/6/2020 1:34 AM, jordanthompson wrote:

Total nube trying to get started with OpenSCAD...

I have the following code that is partially working the way I'd
hoped. If I run only companyName(), I get what I want (an indented
area with raised letters).

When I try to difference it from a cube, it becomes letters etched
into a two dimensional rectangle positioned away from the cube.

My goal is to be able to create a reusable text block that I can
imprint on my parts. I want this to be raised text in a recessed
rectangle.

Any help would be most appreciated!

You have two things going on.

The first is easy.  It's a preview rendering problem called
Z-fighting.  When you difference two objects that share a face, the
renderer can't figure out whether the face is there or not.  The
solution is to ensure that the thing that you are subtracting, the
negative space, extends past the boundary of the thing you're
subtracting from. In this particular case, the easy thing to do is to
offset the companyName() by just a little, perhaps:

 module notWorking() {
     difference() {
        cube([4, 50, 50]);
        translate([0.01,-0.01,-0.01])
            companyName(4, 0, 0, height=10);
     }
 }

Z-fighting most obviously affects F5 previews rather than F6 renders,
because of the algorithms used.  However, F6 can be vulnerable to
similar effects when the locations of the surfaces involved are
derived from math that can yield imprecise results.

The second and harder, and what I think you're asking about, is that
you aren't thinking of difference() correctly.  Remember what your
companyName() looks like.  You are removing that material from the
cube, so the result is the negative of it.  It sounds like you're
thinking that in

 difference() {
     A();
     B();
 }

that B will somehow replace a part of A.  (But how could it?  B is an
object and an infinite amount of empty space; how much of that empty
space would replace part of A?)

If you want it to behave the way you're thinking, you have to arrange
that B is the negative of what you want to remain.

That requires a little rearranging.

Simplifying, your current notWorking() is:

 difference() {
     cube();        // big cube
     difference() {
         cube();    // A
         cube();    // B
     }
     linear_extrude() text();
 }

That is, you are taking a cube A, removing another cube B to form an
inset, and then adding some text, and then subtracting the result from
the big cube.

In arithmetic notation, you've got (bigcube - ((A - B) + text)).  You
want ((bigcube - B) + text), that you're going to take your object,
subtract away an inset, and then put some text into that inset.  That
expression doesn't work for you, because you want the B and "text" to
come together in one module, so you want to algebraically transform it
to (bigcube - (negative - text)).

It doesn't quite work like arithmetic, but it's close.  In arithmetic,
a double negative is a positive.  A-(A-B) is equal to B.  In OpenSCAD
CSG, a result can never be negative, so A-B can be anything from zero
to A and A-(A-B) can't be more than A.  Strictly, it's set
differencing rather than arithmetic differencing.

You need to be subtracting the inset, except the text, like so:

 difference() {
     cube();    // big cube
     difference() {
         cube();   // negative
         linear_extrude() text();
     }
 }

Note that your first cube, the one I labelled "positive", is not
required.  It's material that you expect to remain from the object
being imprinted; it isn't part of the "negative space".

Sigh.  I changed the labels as I wrote the message, and missed one. 
Should be "Note that your first cube, the one I labelled A, is not
required".

Here's what you want companyName() to produce:

Note that this scheme is based solely on differencing - you cannot use
it to make text that will extend outside the original "big cube". 
Doing that would require removing the inset as one step, and then
adding the text.

Here's what you need.  All I've done is to remove cube A and move the
text inside the difference() so that it's being subtracted from cube
B.  Oh, and I renamed "notWorking" to "nowWorking" :-)

 use <fontmetrics.scad>;

 module companyName(x, y, z,height) {
     textDepth=1;
     border=1;
     textSpacing=.5;
     usableHeight=height-2*border-3*textSpacing;
     topTextHeight=usableHeight/2;
     bottomTextHeight=usableHeight/3;
     font = "Arial";
     topText = "Top Text";
     bottomText = "Bottom Text";
     topTextLength = measureText(topText, font=font, size=topTextHeight);
     bottomTextLength = measureText(bottomText, font=font, size=bottomTextHeight);
     echo("topTextLength", topTextLength);
     echo("bottomTextLength", bottomTextLength);
     
     translate([x-2*textDepth,y,z]) {

         difference() {
             translate([textDepth,border, border]) {
                 if (topTextLength > bottomTextLength) {
                     cube([2*textDepth, topTextLength+border+textSpacing, height-2*border]);
                 } else {
                     cube([2*textDepth, bottomTextLength+border+textSpacing, height-2*border]);
                 }

             }
             
             translate([textDepth, border+textSpacing, height-border-topTextHeight-textSpacing]) {
                 rotate([90,0,90]) {
                     linear_extrude(textDepth)
                     drawWrappedText(topText,font=font,size=topTextHeight,halign="justify");
                     //text(text, size=topTextHeight);
                 }
             }
             translate([textDepth, border+textSpacing, border+textSpacing]) {
                 rotate([90,0,90]) {
                     linear_extrude(textDepth)
                     text(bottomText, size=bottomTextHeight);
                 }
             }

         }
     }
 }

 module nowWorking() {
     difference() {
        cube([4, 50, 50]);
        translate([0.01,-0.01,-0.01]) companyName(4, 0, 0, height=10);
     }
 }

 module working() {
     companyName(4, 0, 0, height=10);
 }

 nowWorking();

Like so:


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

On 7/6/2020 8:49 AM, Jordan Brown wrote: > On 7/6/2020 1:34 AM, jordanthompson wrote: >> Total nube trying to get started with OpenSCAD... >> >> I have the following code that is partially working the way I'd >> hoped. If I run only companyName(), I get what I want (an indented >> area with raised letters). >> >> When I try to difference it from a cube, it becomes letters etched >> into a two dimensional rectangle positioned away from the cube. >> >> My goal is to be able to create a reusable text block that I can >> imprint on my parts. I want this to be raised text in a recessed >> rectangle. >> >> Any help would be most appreciated! >> > > You have two things going on. > > The first is easy.  It's a preview rendering problem called > Z-fighting.  When you difference two objects that share a face, the > renderer can't figure out whether the face is there or not.  The > solution is to ensure that the thing that you are subtracting, the > negative space, extends past the boundary of the thing you're > subtracting from. In this particular case, the easy thing to do is to > offset the companyName() by just a little, perhaps: > > module notWorking() { > difference() { > cube([4, 50, 50]); > translate([0.01,-0.01,-0.01]) > companyName(4, 0, 0, height=10); > } > } > > Z-fighting most obviously affects F5 previews rather than F6 renders, > because of the algorithms used.  However, F6 can be vulnerable to > similar effects when the locations of the surfaces involved are > derived from math that can yield imprecise results. > > > The second and harder, and what I think you're asking about, is that > you aren't thinking of difference() correctly.  Remember what your > companyName() looks like.  You are *removing* that material from the > cube, so the result is the negative of it.  It sounds like you're > thinking that in > > difference() { > A(); > B(); > } > > that B will somehow replace a part of A.  (But how could it?  B is an > object and an infinite amount of empty space; how much of that empty > space would replace part of A?) > > If you want it to behave the way you're thinking, you have to arrange > that B is the negative of what you want to remain. > > That requires a little rearranging. > > Simplifying, your current notWorking() is: > > difference() { > cube(); // big cube > difference() { > cube(); // A > cube(); // B > } > linear_extrude() text(); > } > > That is, you are taking a cube A, removing another cube B to form an > inset, and then adding some text, and then subtracting the result from > the big cube. > > In arithmetic notation, you've got (bigcube - ((A - B) + text)).  You > want ((bigcube - B) + text), that you're going to take your object, > subtract away an inset, and then put some text into that inset.  That > expression doesn't work for you, because you want the B and "text" to > come together in one module, so you want to algebraically transform it > to (bigcube - (negative - text)). > > It doesn't quite work like arithmetic, but it's close.  In arithmetic, > a double negative is a positive.  A-(A-B) is equal to B.  In OpenSCAD > CSG, a result can never be negative, so A-B can be anything from zero > to A and A-(A-B) can't be more than A.  Strictly, it's set > differencing rather than arithmetic differencing. > > You need to be subtracting the inset, except the text, like so: > > difference() { > cube(); // big cube > difference() { > cube(); // negative > linear_extrude() text(); > } > } > > Note that your first cube, the one I labelled "positive", is not > required.  It's material that you expect to remain from the object > being imprinted; it isn't part of the "negative space". Sigh.  I changed the labels as I wrote the message, and missed one.  Should be "Note that your first cube, the one I labelled A, is not required". > > Here's what you want companyName() to produce: > > > > > Note that this scheme is based solely on differencing - you cannot use > it to make text that will extend outside the original "big cube".  > Doing that would require removing the inset as one step, and then > adding the text. > > Here's what you need.  All I've done is to remove cube A and move the > text inside the difference() so that it's being subtracted from cube > B.  Oh, and I renamed "notWorking" to "nowWorking" :-) > > use <fontmetrics.scad>; > > module companyName(x, y, z,height) { > textDepth=1; > border=1; > textSpacing=.5; > usableHeight=height-2*border-3*textSpacing; > topTextHeight=usableHeight/2; > bottomTextHeight=usableHeight/3; > font = "Arial"; > topText = "Top Text"; > bottomText = "Bottom Text"; > topTextLength = measureText(topText, font=font, size=topTextHeight); > bottomTextLength = measureText(bottomText, font=font, size=bottomTextHeight); > echo("topTextLength", topTextLength); > echo("bottomTextLength", bottomTextLength); > > translate([x-2*textDepth,y,z]) { > > difference() { > translate([textDepth,border, border]) { > if (topTextLength > bottomTextLength) { > cube([2*textDepth, topTextLength+border+textSpacing, height-2*border]); > } else { > cube([2*textDepth, bottomTextLength+border+textSpacing, height-2*border]); > } > > } > > translate([textDepth, border+textSpacing, height-border-topTextHeight-textSpacing]) { > rotate([90,0,90]) { > linear_extrude(textDepth) > drawWrappedText(topText,font=font,size=topTextHeight,halign="justify"); > //text(text, size=topTextHeight); > } > } > translate([textDepth, border+textSpacing, border+textSpacing]) { > rotate([90,0,90]) { > linear_extrude(textDepth) > text(bottomText, size=bottomTextHeight); > } > } > > } > } > } > > module nowWorking() { > difference() { > cube([4, 50, 50]); > translate([0.01,-0.01,-0.01]) companyName(4, 0, 0, height=10); > } > } > > module working() { > companyName(4, 0, 0, height=10); > } > > nowWorking(); > > > Like so: > > > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
J
jordanthompson
Mon, Jul 6, 2020 8:11 PM

Genius!!!  Thanks very much for your help and spoon-feeding (we Jordan's have
to help each other out :-).)

--
Sent from: http://forum.openscad.org/

Genius!!! Thanks very much for your help and spoon-feeding (we Jordan's have to help each other out :-).) -- Sent from: http://forum.openscad.org/