ポストに屋号「猫葉Tech」をスプレー塗装するため、装甲明朝でステンシルを 3D プリントした話

やりたかったこと
玄関のポストに、屋号 「猫葉Tech」 をスプレー塗装したい。シールでもよかったけど、雨ざらしになる場所なので塗装の方が長持ちする。となるとステンシル (型紙) が必要で、これを 3D プリンタで PLA の薄板として作る ことにした。
塗装エリアは 横 320mm × 縦 65mm。その中央に屋号を配置する。
全体方針
最終的に落ち着いた構成:
- フォント: 装甲明朝 (Soukou Mincho、SIL OFL ライセンスの明朝体)
- 設計: OpenSCAD で .scad を書いて STL 出力
- 板厚: 1.0mm
- ノズル: 0.4mm、PLA
- 塗装: マスキングテープで仮固定 → スプレー → 乾いてから慎重に剥がす
OpenSCAD は fontconfig 経由で OS にインストールされた TTF を直接 text() で読み込めるので、Inkscape を介さずに TTF → STL が一気通貫で完結する。和文の DIY 用途には相性がいい。
SCAD のベース
最小実装はこんな感じ:
PLATE_W = 200; // 板の横 (mm)
PLATE_H = 65; // 板の縦 (mm)
PLATE_T = 1.0; // 板厚 (mm)
TEXT_STR = "猫葉Tech";
TEXT_SIZE = 30;
TEXT_FONT = "SoukouMincho:style=Regular";
$fn = 60;
difference() {
cube([PLATE_W, PLATE_H, PLATE_T]);
translate([PLATE_W / 2, PLATE_H / 2, -0.1])
linear_extrude(height = PLATE_T + 0.2)
text(
text = TEXT_STR,
size = TEXT_SIZE,
font = TEXT_FONT,
halign = "center",
valign = "center"
);
}
fc-list | grep -i soukou でフォントが認識されているか確認しておくと安心。
/Users/kazuha/Library/Fonts/SoukouMincho.ttf: SoukouMincho,装甲明朝:style=Regular
これだけで、薄板から「猫葉Tech」が型抜きされた STL が出る。ただしこの素直版を印刷すると、いろいろ落とし穴が出てくる。
ハマりどころと対策
1. 板からはみ出る → fonttools で advance を実測
最初は板幅 170mm で発注したら、両サイドの文字が切れた。明朝体は bearing (左右の余白) が advance を超えて出っ張ることがあるので、見た目の advance だけだと足りない。
そこで fonttools で advance を実測:
from fontTools.ttLib import TTFont
font = TTFont('/Users/kazuha/Library/Fonts/SoukouMincho.ttf')
cmap = font['cmap'].getBestCmap()
upm = font['head'].unitsPerEm
hmtx = font['hmtx']
text = '猫葉Tech'
size_mm = 30
total = 0
for ch in text:
g = cmap[ord(ch)]
adv, _ = hmtx[g]
adv_mm = adv / upm * size_mm
total += adv_mm
print(f'{ch}: {adv_mm:.2f} mm')
print(f'total = {total:.2f} mm')
結果:
猫: 30.00 mm
葉: 30.00 mm
T: 21.42 mm
e: 17.58 mm
c: 17.37 mm
h: 21.00 mm
total = 137.37 mm
総合 137.4mm。これ + bearing 余裕 + 左右マージン 30mm くらいで、板幅 200mm に落ち着いた。
2. 「猫」の横線が潰れる → offset で太らせる
装甲明朝は明朝体らしく 横線が細く縦線が太い。これを 0.4mm ノズルでそのまま印刷すると、横線が潰れて読めない箇所が出る。特に「猫」のような筆画の多い字。
対策は offset() で文字全体を外側に膨らませる:
linear_extrude(height = PLATE_T + 0.2)
offset(r = 0.4) // ★ 全方向に 0.4mm 膨らむ
text(
text = TEXT_STR,
size = TEXT_SIZE,
font = TEXT_FONT,
halign = "center",
valign = "center"
);
r = 0.4 で横線が約 0.8mm 太る (両側に 0.4mm ずつ)。装甲明朝の縦横コントラストは少し弱まるが、シャープな雰囲気は残る。0.2 だと足りない、0.6 以上だと隣接文字が触れるリスク、というレンジ。
3. 漢字の「島」が落ちる → 横ブリッジ + ピンポイントブリッジ
ステンシル特有の問題。「猫」の田の中、「葉」のくさかんむり下、「e」のループなど、閉じた領域の中の小さい白部分は印刷後に島として落ちる。これを救うために 文字穴を貫通する細い梁 (ブリッジ) を残す 必要がある。
OpenSCAD で intersection() を使うと、文字穴の中だけにブリッジが残る (= 文字外には影響しない) のが綺麗:
// 文字 cutout を module 化して 2 回使う
module text_cutout() {
translate([PLATE_W / 2, PLATE_H / 2, -0.1])
linear_extrude(height = PLATE_T + 0.2)
offset(r = 0.4)
text(text = TEXT_STR, size = TEXT_SIZE, font = TEXT_FONT,
halign = "center", valign = "center");
}
union() {
difference() {
cube([PLATE_W, PLATE_H, PLATE_T]);
text_cutout();
}
// 全文字を貫通する横ブリッジ 2 本 (下と上)
for (y = [23, 38]) {
intersection() {
text_cutout();
translate([0, y, 0])
cube([PLATE_W, 0.8, PLATE_T]);
}
}
}
これで上下 2 本の横ブリッジ (太さ 0.8mm) が全文字を貫通する形で残る。
4. それでも「猫」の田の上の口が落ちる → fonttools で contour 解析してピンポイントブリッジ
横ブリッジ 2 本でほとんどの島は救えるが、「猫」のくさかんむり下の閉じ口だけがブリッジから外れて落ちた。位置決めのために、fonttools で 「猫」の全 contour の bounding box を mm 単位で取り出す:
from fontTools.pens.recordingPen import RecordingPen
glyph_name = cmap[ord('猫')]
pen = RecordingPen()
glyph_set[glyph_name].draw(pen)
# 各 contour の bbox を計算...
# 結果 (板上座標、y は上が大):
# c0: 偏 (けものへん) x=[32.4, 41.7] y=[18.3, 46.5]
# c1: 田の上の口・右 x=[52.1, 60.5] y=[36.9, 46.2] ← ここを救う
# c2: 田の上の口・左 x=[45.0, 49.5] y=[36.9, 46.1] ← ここも救う
# c5: 田 (旁の下半分) x=[42.7, 59.8] y=[18.5, 36.9]
これで「田の上の口」 = c1, c2 の位置が分かったので、ピンポイントブリッジを足す:
LOCAL_BRIDGES = [
[30, 34.5, 32], // [x, y, width] = 「猫」の田の上の口を両側カバー
];
for (b = LOCAL_BRIDGES) {
intersection() {
text_cutout();
translate([b[0], b[1], 0])
cube([b[2], 0.8, PLATE_T]);
}
}
intersection(text_cutout) のおかげで、ブリッジ範囲を多少広めに取っても文字外に飛び出す心配はない。雑に書ける。
5. 剥がす時にちぎれる注意
板厚 1.0mm で印刷すると、塗装後に剥がす時に文字間の細い部分が割れることがある。板厚を 1.5mm まで上げると剛性は明らかに上がるが、印刷時間がほぼ 1.5 倍になる ので、自分は 1.0mm のまま、塗料が完全に乾くのを待ってからゆっくり剥がす 運用に落ち着いた。1 回使い切りで運用する前提なら 1.0mm で十分。再利用したいならブリッジ太さを 0.8 → 1.2mm にしたり、板厚を 1.5mm に上げる方が安心。
位置決めのための V 字ノッチ
ポストの塗装エリア中央にステンシルを当てる時、目視合わせがズレやすいので、ステンシル板の上下辺の中央に V 字ノッチを彫った:
// 上辺中央
translate([PLATE_W / 2 - 3, PLATE_H - 2, -0.1])
linear_extrude(PLATE_T + 0.2)
polygon([[0, 0], [6, 0], [3, 2]]);
// 下辺中央
translate([PLATE_W / 2 - 3, 0, -0.1])
linear_extrude(PLATE_T + 0.2)
polygon([[0, 2], [3, 0], [6, 2]]);
ポスト側にマスキングテープでエリア中央線を一本引いておいて、ステンシルの V 字頂点を合わせれば一発で位置決め完了。これがあるとないとで作業時間が全然違う。
仕上がり
最終的にできたのが冒頭の写真。装甲明朝のシャープな起筆・終筆がちゃんと残り、ブリッジで切れている横線はスプレーの滲みで視覚的に繋がって、ステンシル感も主張しすぎず良いバランスに収まった。
ファイル一式は /Users/kazuha/ai/projects/catea-tech/stencil/ に置いてある:
catea-tech-stencil.scad— 設計データcatea-tech-stencil.stl— 印刷用 STLREADME.md— 印刷手順 + Fusion 360 / 他環境への移植メモ
教訓
- OpenSCAD は和文 + 3DP の DIY に強い。fontconfig 経由で TTF を直接
text()できるので、Inkscape を介する必要がない - 明朝体は 3DP でそのままだと細線が潰れる。
offset(r = 0.3〜0.5)で太らせるのが手っ取り早い - 漢字の島落ち対策は intersection + cube が綺麗。文字穴の中だけにブリッジを残せる。グリフ contour の位置は fonttools で実測すると一発で決まる
- 板厚は剥がし強度と印刷時間のトレードオフ。1 回使い切りなら 1.0mm + 慎重に剥がす、再利用するなら 1.5mm にしておくと安心
- V 字ノッチで位置決め補助。「中央を合わせる」は意外と難しいので、物理マーカーがあると作業が劇的に楽になる
紙のステンシルや市販のカッティングシートだと一回切りの消耗品だが、3DP で作っておけば 再利用可能 + 厚みのおかげで滲み少ない ので、屋号塗装のような少量印字には相性がいい。