---
title: HoudiniでGコードを編集する
date: 2024-12-11T01:10:25.000Z
updated: 2026-01-08T14:50:58.150Z
tags:
  - addsub
url: https://baku89.com/Houdini%E3%81%A7G%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B
---

# HoudiniでGコードを編集する

![](https://wp.baku89.com/wp-content/uploads/2026/07/scrapbox-6685806380c13f001d777bb6.png)

- Gコード関係のHDAまとめ

  - [GitHub - baku89/nops: Digital Assets to supplement non-procedural features of Houdini](https://github.com/baku89/nops)

    - Load G-Code: Gコードからポリライン
    - Save G-Code: まだ作ってない

* **ポリラインのフォーマット**

  - **[サンプル bgeoです！！！](https://www.dropbox.com/scl/fi/upvdw2oqfjw6fja0ny55e/gcode_polyline.bgeo?rlkey=cb4sj10mqf9ophmkcbroh8hum\&dl=0)**
  - 全てG0, G1（リニア移動）と見做す
  - G3, G4（円弧移動）はsubdivideしてリニア移動に
  - リニア移動の度に頂点追加
  - それ以外のフィードレートを変える、温度を変えるといったコマンドは無視する
  - なるたけロスレスでGコードのデータを抑えられるよう、頂点に関係のないGコード、Mコードや、コメントは`pre_gcode`、`post_gcode` に文字列として突っ込む
    - `pre_gcode + (P, E, F属性などに保存されている頂点データ) + post_gcode` みたいな感じで連結していくと、（円弧コマンドを除き）完全に元のGコードが復元される
  - 最後の頂点以降のテキストは、Detail attributeに`after_gcode`として追加
  - この辺を見てもらえたら...
  - ```
       # GeometryにGコード関連の属性を追加
        attribRefs = {
            # E軸 = エクストルーダー
            'E': geo.addAttrib(hou.attribType.Point, "E", 0.0),

            # F = FeedRate
            'F': geo.addAttrib(hou.attribType.Point, "F", 0.0),

            # 進捗（%）
            'progress': geo.addAttrib(hou.attribType.Point, "progress", 0.0),

            # 残り分数（min）
            'remaining': geo.addAttrib(hou.attribType.Point, "remaining", 0.0),

            # G Codeのタイプ（Skirt/Brim, Perimeter, External perimeter, Internal infill...)
            'feature_type': geo.addAttrib(hou.attribType.Point, "feature_type", ""),

            # ノズル幅
            'nozzle_diameter': geo.addAttrib(hou.attribType.Point, "nozzle_diameter", 0.0),

            # 最後のコマンドの次の行の頭から、現在のコマンドまで。最後の改行 \n を含む
            'pre_gcode': geo.addAttrib(hou.attribType.Point, "pre_gcode", ""),

            # 現在の行から
            'post_gcode': geo.addAttrib(hou.attribType.Point, "post_gcode", "\n"),

            # レイヤー
            'layer_index': geo.addAttrib(hou.attribType.Point, "layer_index", 0),
        }
    ```

  *
