gcode-to-text について
GCODE Text Extraction は、GCODE のツールパス形状に埋め込まれた文字を復元するスキルです。3D プリンターや CNC のファイルを対象に、コメントやメタデータよりも X/Y 移動の解析と可視化を重視します。
主な機能
- 01M117 コマンドとコメントの確認
- 02G1 移動から X/Y 座標を抽出
- 03ツールパスを描画して文字形状を確認
- 04移動パターンによる文字の分割
- 05座標範囲による読み取りの検証
活用シーン
- 01GCODE の刀路に刻まれた文字の読み取り
- 02CTF 課題に隠された文字の解析
- 03印刷動作から文字形状を復元
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ letta-ai/ skills --skill gcode-to-textインストール後、Claude Code で/gcode-to-textを入力して読み込まれたか確認します。
詳細
GCODE テキスト抽出
このスキルでは、GCODE ファイル内に幾何学的にエンコードされたテキストコンテンツを抽出するための方法を説明します。GCODE ファイルには、3D プリンターや CNC マシンのツールパスを定義する移動座標が含まれています。テキストが浮き彫り、刻印、または印刷されている場合、文字の形状は人が読めるメタデータではなく、X/Y 座標の移動にエンコードされています。
基本原則
GCODE 内のテキストはメタデータではなく、幾何学的にエンコードされています。 文字の形状は、G0/G1 移動コマンドの座標データに存在します。コメント、M117 の表示メッセージ、またはファイル名のヒントを検索しても、実際のテキストコンテンツが見つかることはほとんどありません。
推奨されるアプローチ
フェーズ 1:簡単なメタデータ確認(時間をかけすぎない)
明示的なテキストの手がかりがないか簡単に確認します。ただし、ここに過度な時間を費やさないでください。
- M117(LCD メッセージ)コマンドを確認します:
grep "M117" file.gcode - ファイルヘッダーのコメントに明示的なテキストラベルがないか確認します
- オブジェクト名を示している可能性のあるスライサーのメタデータを探します
2~3 回試してメタデータ検索で結果が得られなければ、ただちにフェーズ 2 に進みます。同様のメタデータ検索を繰り返さないでください。
フェーズ 2:幾何学的分析(主要なアプローチ)
座標データを抽出して分析し、テキストを視覚的に再構成します。
-
関連するセクションを特定する:オブジェクトマーカー(PrusaSlicer/SuperSlicer の M486 コマンド)、レイヤーの切り替わり、または「text」や「embossed」機能を示すコメントを探します。
-
X/Y 座標を抽出する:G1 移動コマンドを解析して座標のペアを収集します:
grep -E "^G1.*X.*Y" file.gcode | sed 's/.*X\([0-9.-]*\).*Y\([0-9.-]*\).*/\1 \2/' -
ツールパスを可視化する:抽出した座標をプロットします。
- Python と matplotlib を使って X/Y 点を散布図にします
- すばやく可視化するには ASCII アートでプロットします
- 座標のクラスターを分析して文字の境界を特定します
-
移動パターンを分析する:
- トラベル移動(G0)は文字間の移行を示すことがよくあります
- 押し出し移動(E パラメーターを含む G1)は実際の形状をたどります
- Z 軸のリフトやリトラクションは文字の境界を示す場合があります
フェーズ 3:パターン認識
プロットした座標を分析する際は、次の点に注目します。
- 個々の文字に対応する、はっきりとしたクラスターを探します
- Y 座標の範囲からベースラインと文字の高さを特定します
- 分離した領域の数を数え、文字数を推定します
- 形状を既知の文字の形と比較します
可視化スクリプトのテンプレート
テキスト抽出のために GCODE の座標をプロットするには、次を使います。
import re
import matplotlib.pyplot as plt
def extract_coordinates(gcode_file, section_filter=None):
coords = []
in_section = section_filter is None
with open(gcode_file, 'r') as f:
for line in f:
if section_filter and section_filter in line:
in_section = True
if in_section:
match = re.search(r'G1.*X([\d.-]+).*Y([\d.-]+)', line)
if match:
coords.append((float(match.group(1)), float(match.group(2))))
return coords
coords = extract_coordinates('file.gcode')
if coords:
x, y = zip(*coords)
plt.figure(figsize=(15, 5))
plt.plot(x, y, 'b-', linewidth=0.5)
plt.scatter(x, y, s=1, c='red')
plt.axis('equal')
plt.title('GCODE Toolpath')
plt.savefig('toolpath.png', dpi=150)
plt.show()
検証方法
-
文字数の検証:期待される出力形式が分かっている場合(例:
flag{...}のような CTF フラグ形式)、個別の文字形状の数が一致するか確認します。 -
座標範囲の分析:テキストでは通常、文字の高さと間隔が一定です。検出された文字間で Y 座標の範囲が一貫しているか確認します。
-
目視による確認:ツールパスを 2D 投影として表示したとき、プロットが読み取れるテキストに見えるはずです。
よくある落とし穴
落とし穴 1:メタデータへの過度な依存
実際の座標データを分析せず、コメント、M117 メッセージ、ファイル名のヒントの検索に時間をかけすぎることです。メタデータ検索を 2~3 回試しても見つからなければ、幾何学的分析に進みます。
落とし穴 2:幾何学的分析を諦める
座標を可視化したりプロットしたりせずに、テキストは「判別できない」と結論づけることです。GCODE には常に完全な幾何学情報が含まれています。
落とし穴 3:タスクの文脈を見落とす
CTF 形式のチャレンジでは、テキストは意図的に形状の中に隠されています。単純なメタデータ検索ではなく、デコードやリバースエンジニアリングを想定したタスクであることを見極めましょう。
落とし穴 4:利用可能なツールを使わない
専用の GCODE ビューアーがなくても、基本的な Python のプロットや座標分析でテキストのパターンを見つけられます。タスクを不可能だと決めつけず、簡単な可視化スクリプトを作成しましょう。
落とし穴 5:オブジェクトの境界を無視する
M486 コマンド(オブジェクトのラベル付け)やトラベル移動は、個々の文字を区切ることがよくあります。これらの境界を使って、座標データを個々の文字に分割します。
このスキルの主な指標
- GCODE 内の「浮き出し文字」「刻印された文字」「印刷された文字」に関するタスク
- GCODE ファイルを使った CTF チャレンジ
- 「どのような文字が印刷/表示されるか」を尋ねる質問
- オブジェクトセクションの名前が一般的で、実際の文字が分からない GCODE ファイル
出力に関する考慮事項
タスクで GCODE から文字列を求められた場合、特定できない理由を説明するのではなく、実際にデコードした文字列を提示してください。可視化によって読み取れる文字が確認できた場合は、それを書き起こしてください。CTF 形式のタスクでは、flag{...} や CTF{...} のようなフラグ形式のパターンを探してください。