4
$\begingroup$

I want to put relief text on curved surface but can't find way to do that in OpenSCAD. I'm aware it's possible to bend text in Blender and then import stl, but I don't like this workflow. I found sort of working solution but it's not perfect.

$fn=50;

module bend_text(caption, angle, text_height, text_width, text_depth, steps=10, k=1) {
    dh = text_height / steps;
    r = text_height / (angle * PI / 180);
    h0 = - text_height / 2;
    translate([0, 0, -r])
    rotate([angle / 2, 0, 0])
    for(i=[0:steps-1]) {
        rotate([-i * angle/steps, 0, 0])
        translate([0, -(dh * i + h0), r / k])
        intersection() {
            linear_extrude(text_depth) 
                text(caption, valign="center", halign="center");
            translate([0, dh * i + h0, 0]) 
                cube([text_width, dh, text_width], center=true);
        }
    }
}

bend_text("test", angle=90, text_height=9, text_width=30, text_depth=1, steps=10, k=1.1);

test

Is there better way?

$\endgroup$
1
  • $\begingroup$ This is a 3DPrinting stack not a CAD stack, mentioning the relevance to 3D printing is required, from on-topic :If a CAD question is related to 3D printing then it is on-topic. However, general CAD questions, unrelated to 3D printing, are not on-topic. Very interesting question though! Mentioning that bending the text is required when text is projected onto small radii else there might be gaps under the letters that prevent proper printing. $\endgroup$
    – 0scar
    Commented May 16, 2022 at 11:46

3 Answers 3

4
$\begingroup$

another way may be a simple intersection() (inspired by this discussion: How to a make a curved sheet (cube) in OpenSCAD?)

$fn=200;
w = 30;       // width of rectangle
h = 1;       // height of rectangle
l = 10;      // length of chord of the curve
dh = 10;           // delta height of the curve

module curve(width, height, length, dh) {
    r = (pow(length/2, 2) + pow(dh, 2))/(2*dh);
    a = 2*asin((length/2)/r);
    translate([-(r -dh), 0, -width/2]) rotate([0, 0, -a/2])         rotate_extrude(angle = a) translate([r, 0, 0]) square(size = [height, width], center = true);
}

intersection(){
    rotate([0,270,0]) curve(w, h, l, dh);
    translate([2,-3,0]) linear_extrude (height = 15) text("TEST", size = 6 );
}

before intersection final result

$\endgroup$
3
$\begingroup$

I can't say if this is better than your method, but it is a library resource specific to your requirements.

Text_on OpenSCAD

The library covers various shapes, including cylindrical:

text on cylinders

Image from linked site. Also from the site: "Only works with OpenSCAD v 2014.xx and later..."

Pursuant to the comments, another step may provide the desired result. Thinking for the cylinder primitive, once the text is placed and protruding a sufficient amount, creating a difference() with the inner cut location an appropriate distance from the primary cylinder should create curved surfaces to the text.

Envision a cylinder slightly smaller in diameter than an appropriate piece of pipe. As the pipe is lowered onto the cylinder, the text is "shaved" away. The "shaving pipe" outer diameter is insignificant, as long as it's not too thin, and the inner diameter of that pipe is dependent on the diameter of the primitive and the desired height of the curved text.

$\endgroup$
3
  • 1
    $\begingroup$ As far as I can see it doesn't bend characters, it just puts each character on it's own plane, that's not what I want. $\endgroup$ Commented May 12, 2022 at 22:04
  • 1
    $\begingroup$ That's a distinction I overlooked, thanks for the clarification. It makes your creation all the more impressive. Is there a means to remove the slices from the creation? $\endgroup$
    – fred_dot_u
    Commented May 12, 2022 at 22:45
  • 1
    $\begingroup$ yes, slices can be removed, I have used cube to split text to pieces, I should've used triangle prism $\endgroup$ Commented May 13, 2022 at 7:43
2
$\begingroup$

The workflow you're using is the only way I'm aware of, and it's at least respectable. You can abstract it as a module to apply to arbitrary children to make it somewhat less ugly and more reusable.

In theory, I think it should be possible to make an openscad transformation (in openscad itself, not in the scad language) that applies to arbitrary 3D objects by performing a 2D conformal map in each cross section perpendicular to a given axis, to achieve effects like this, without the possibility of breaking geometry. But I'm not aware of anyone working on that. I'll probably propose it at some point, and hopefully it won't get shot down as mathematically unsound (which it might be; I'm not sure).

$\endgroup$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .