2025年5月13日火曜日

OpenSCADのお話し テキストを発生させる

はじめに

 去年から、仕事がらみで3Dプリンターに食わせる3Dモデルの作り方を勉強する必要があって、やったことを忘れないようにここに残しておきます。これからたまに出てくると思いますが、備忘録みたいなものなので、系統だって書く、なんていうつもりはありません。悪しからず。

以前、必要に迫られてC#の勉強をしたときは、C#の事に限って1つのブログを作りましたが、3Dモデルに関しては、そこまではしないつもりです。ちなみに、C#は55歳の時だったらしいので、すでに8年経ってるんだなぁ。


OpenSCADでテキストを発生させる

OpenSCADで文字を扱う方法には、text文で文字を作って、それだけだと厚さ0の文字列の形状になってしまって、形のあるものにならないので、linear_extrudeで厚みを持たせて、3Dプリンターで造型出来る形状にする、という手順を踏みます。

具体的には、    

text( "Shout it out loud !",font="Papyrus:style=Regular", size=4, halign="center", valign="center");

という文でテキストを発生させたのが下の図になります。

これは、OpenSCADのスクリーンショットですが、厚さがあるように見ているものの、実際は厚さは0です。これにlinear_extrude文で厚みを持たせて、実際に存在することが可能な図形を作ります。下の例では、8mmの厚みを持たせています。

linear_extrude( 8 ) { 
    text( "Shout it out loud !", font="Papyrus:style=Regular", size=4, halign="center", valign="center");
}


 造型の一番寸法の小さなところが、3Dプリンターの最小寸法スペックに収まっていれば、造型が可能と思います。

文字列をくぼみ状に作る


先ほど作った文字列形状を何かの形状から引き算してあげると、文字列を溝の形にして造型することが出来ます。

    difference () { 
        translate([0,0,-5])
            cube([100, 30, 10], center=true);
        translate([0,0,-4])
            linear_extrude( 8 ) {
                text( "Shout it out loud !",
                    font="Papyrus:style=Regular", size=4, halign="center",
                    valign="center");
            }
    };

これをレンダリングすると、
となります。平板から、文字列の形状を引き算したものです。これは、横100mm、縦30mm、厚さ10mmの板を中心からZ軸方向に5mm下げて、これから縦横方向にセンタリングした文字列をZ軸方向に4mm下げたものを引き算して、文字列のくぼみが出来ています。

ただ、くぼみを実際に作ろうとすると、文字列に厚みを付けないと、うまく造型できません。文字列に厚みを付けるためには、一番簡単なのは座標を少しずつ変えて重ね書きしてあげることだと思います。

文字に厚みを加える


座標を少しずつ変えて重ね書き、ということを最初は1回1回記述していましたが、こういう記述こそコンピューターにやらせるべきだろうと思うので、モジュール定義をしてみたのが、下記です。

module wrtstr(x, y, z, str, fnt, fntsize, lx, stp, dlt) { 
     for(i=[0:stp ]) { 
         translate([x + i * dlt, y, z]) { 
             linear_extrude( lx ) { 
                 text( str, font=fnt, size=fntsize, halign="center", valign="center"); 
             
         
     
}
 
difference () { 
     translate([0,0,-5]) 
         cube([100, 30, 10], center=true); 
     wrtstr( 0, 0, -4, "Shout it out loud!", 
        "Papyrus:style=Regular", 8, 4, 3, 0.2); 
};

モジュール定義では、引数dltで与える刻みの大きさで座標を少しずつずらし、引数stpで与える回数分forループを使って文字列を重ね書きします。forループ内でがLinear_extrudeで文字列に厚みを与えることも同時にやっています。

これを下のdifference文以降の文で呼び出していて、100mm X 30mm X 10mmの板からforループを使って重ね書きした文字列の立体形状を引き算しています。

リストだと、刻みを0.2mmにして、3回の重ね書きをしています。これをレンダリングすると、以下のようになります。
これ、レンダリングに結構時間がかかります。僕が使っているcore i9のMac Book Pro 2019で、5分10秒ほどかかりました。

プリンターの最小寸法スペックによりますが、このぐらいの幅が出ていれば、造型できるんじゃないかと思います。

というわけでまた。


0 件のコメント:

コメントを投稿

何か一言頂ければ・・・