← Blog 一覧

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

3Dプリント ステンシル OpenSCAD 装甲明朝 fonttools DIY スプレー塗装 猫葉Tech

ポストに塗装された「猫葉Tech」のステンシル仕上がり写真

やりたかったこと

玄関のポストに、屋号 「猫葉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 — 印刷用 STL
  • README.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 で作っておけば 再利用可能 + 厚みのおかげで滲み少ない ので、屋号塗装のような少量印字には相性がいい。

この記事をシェア