mcpField
D
dwg-extraction

dwg-extraction

github.com/mgoodman60ドキュメント144 回インストール34 週間前に更新
リポジトリ

dwg-extraction について

施工図面を扱うチーム向けのスキルで、Civil 3D を含む AutoCAD DWG を構造化されたプロジェクトデータに変換します。libredwg と独自パーサーで標準エンティティを抽出し、独自オブジェクトの制限も明記します。

主な機能

  1. 01DWG から DXF への変換
  2. 02エンティティと属性の解析
  3. 03レイヤー別の施工データ分類
  4. 04近接テキストから構造情報をグループ化
  5. 05空間データのセクション整理
  6. 06Civil 3D 独自オブジェクトの制限を明記

活用シーン

  1. 01測量点と標高の抽出
  2. 02ユーティリティや構造物の注記整理
  3. 03図面から敷地と地形情報をまとめる

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mgoodman60/foreman-os-plugin --skill dwg-extraction

インストール後、Claude Code で/dwg-extractionを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
integration-guide.md
scripts/
compile_libredwg.sh
parse_dxf.py

詳細

DWG ファイルの抽出

AutoCAD DWG ファイル(Civil 3D を含む)から、構造化された建設情報を抽出します。 DWG は、専用のツールを必要とする独自のバイナリ形式です。このスキルでは、未加工の .dwg から構造化されたプロジェクトデータまで、全工程を処理します。

パイプラインの概要

抽出は、次の 4 つの段階で行われます。

  1. libredwg のコンパイル — オープンソースの DWG リーダーをソースからビルドします(初回実行後はキャッシュされます)
  2. DWG → DXF の変換 — コンパイル済みの dwg2dxf バイナリを使って、テキストベースの DXF ファイルを生成します
  3. DXF エンティティの解析 — カスタム Python パーサーが、すべてのエンティティタイプを完全な属性データとともに抽出します
  4. 構造化と保存 — 抽出したデータを plans-spatial.json のセクションに整理します

パッケージマネージャーを使わずソースからコンパイルするのは、ほとんどの環境で libredwg が apt パッケージとして提供されておらず、Python の DXF ライブラリ(ezdxf など)は、独自オブジェクトに由来する不正な MATERIAL エントリが原因で、Civil 3D の DXF 出力の処理に失敗することが多いためです。このスキルに含まれる手動パーサーは、こうしたエッジケースを適切に処理します。

ステージ 1:libredwg のコンパイル

まず、バイナリがすでに存在するか確認します。存在しない場合は、コンパイルします。

# Check for cached binary
if [ -f /tmp/libredwg/dwg2dxf ]; then
    echo "dwg2dxf binary found, skipping compilation"
else
    # Clone and compile
    cd /tmp
    git clone --depth 1 https://github.com/LibreDWG/libredwg.git
    cd libredwg

    # Write the config.h that works (this was developed through trial and error
    # to handle missing autotools, cmake, and various header conflicts)
    cat > src/config.h << 'CONFIGEOF'
#define PACKAGE "libredwg"
#define PACKAGE_VERSION "0.13"
#define PACKAGE_STRING "libredwg 0.13"
#define LIBREDWG_SO_VERSION "0:13:0"
#define HAVE_STDINT_H 1
#define HAVE_STDLIB_H 1
#define HAVE_STRING_H 1
#define HAVE_STRINGS_H 1
#define HAVE_INTTYPES_H 1
#define HAVE_UNISTD_H 1
#define HAVE_CTYPE_H 1
#define HAVE_WCHAR_H 1
#define HAVE_WCTYPE_H 1
#define HAVE_MEMCHR 1
#define HAVE_MEMMEM 1
#define HAVE_SCANDIR 1
#define IS_RELEASE 1
#define PACKAGE_NAME "libredwg"
#define HAVE_SYS_STAT_H 1
CONFIGEOF

    # Compile library object files
    # Skip in_json.c (needs jsmn.h submodule) and out_geojson.c (additional errors)
    # These are not needed for DWG→DXF conversion
    gcc -c -I. -Iinclude -Isrc -DHAVE_CONFIG_H \
      src/bits.c src/common.c src/classes.c src/codepages.c \
      src/decode.c src/decode_r11.c src/decode_r2007.c \
      src/dwg.c src/dwg_api.c src/hash.c src/dynapi.c \
      src/dxfclasses.c src/out_dxf.c src/out_json.c \
      src/print.c src/free.c src/encode.c -w

    # Compile the dwg2dxf program
    gcc -c -I. -Iinclude -Isrc -DHAVE_CONFIG_H programs/dwg2dxf.c -w

    # Link everything together
    gcc -o dwg2dxf *.o -lm -w

    echo "Compilation complete: $(ls -la dwg2dxf)"
fi

トラブルシューティング:libredwg のリポジトリ構成が変更されている場合、必要な主要ファイルは次のとおりです。

  • src/*.c — コアライブラリ(bits、common、classes、codepages、decode、decode_r11、decode_r2007、dwg、dwg_api、hash、dynapi、dxfclasses、out_dxf、out_json、print、free、encode)
  • programs/dwg2dxf.c — 変換プログラム
  • include/ — ヘッダーファイル
  • src/config.h — 手動で作成する必要があります(上記を参照)

ステージ 2:DWG → DXF の変換

/tmp/libredwg/dwg2dxf -o /tmp/output.dxf "/path/to/input.dwg"

未処理の Civil 3D オブジェクト(AcDbSurface、AcDbAlignment など)に関する警告が表示されますが、これは正常であり、標準エンティティの抽出には影響しません。変換によって、1 行ずつ解析できるテキストベースの DXF が生成されます。

出力ファイルが存在し、妥当なサイズであることを確認してください(一般的な土木敷地計画図の場合、数 MB になるはずです)。

ステージ 3:DXF エンティティの解析

同梱のパーサースクリプトを実行します。建設土木図面で一般的に見られる、次のすべてのエンティティタイプを処理します。

python3 /path/to/dwg-extraction/scripts/parse_dxf.py /tmp/output.dxf /tmp/dxf_extracted.json

パーサーは次のエンティティカテゴリを抽出します。

抽出されるエンティティタイプ
エンティティDXF タイプ含まれる内容
測量点INSERT + ATTRIB + SEQEND点番号、XYZ 座標、レイヤー分類
テキスト注記TEXT1 行のラベル(標高、構造物 ID、パイプ径)
複数行テキストMTEXT建設注記、キーノート、凡例
ポリラインLWPOLYLINE等高線、敷地境界、ユーティリティ配管経路
線LINEグリッド線、寸法線、引出線
円弧ARC半径方向の戻り、曲線状の地物
円CIRCLEマンホール、清掃口、ユーティリティ記号
点POINT基準点、スポット標高
ハッチングHATCH舗装区域、建物の輪郭、材料の塗りつぶし
ブロック挿入INSERT記号(マンホール、バルブ、メーター、樹木、設備)
レイヤー命名規則(Civil 3D)

Civil 3D では、階層型のレイヤー命名システムが使用されています。パーサーはレイヤーのプレフィックスに基づいてエンティティを分類し、抽出データを整理します。

レイヤーパターンカテゴリ一般的な内容
C-STRM-*雨水下水道管、構造物、集水口、集水桝
C-SSWR-*汚水下水道マンホール、管路、掃除口
C-WATR-*上水道本管、給水管、メーター、消火栓
C-TOPO-*地形既存の等高線、標高点
C-PROP-*土地境界、方位、地役権
C-ROAD-*道路縁石、舗装、区画線
C-EROS-*侵食防止沈砂フェンス、集水口の保護、BMP
C-BLDG-*建物建物外形、FFE、セットバック
C-SITE-*敷地整地、舗装、造園
C-SV$*測量測量点、基準点、ベンチマーク
C-ANNO-*注釈寸法、ラベル、注記
V-*既存(表示)既存のユーティリティ、地物
0 / Defpointsシステム既定レイヤー、定義点

これらのパターンに一致しないレイヤーも抽出され、「その他」に分類されます。

測量点の抽出詳細

Civil 3D の測量点は、測量点レイヤー(通常、レイヤー名に SV または PNT を含む)上の INSERT エンティティとして保存されています。各 INSERT には、点番号を保持する子 ATTRIB エンティティがあります。XYZ 座標は INSERT の挿入点(グループコード 10/20/30)から取得します。

パーサーは INSERT → ATTRIB → SEQEND のシーケンスを追跡し、属性を親ブロックに正しく関連付けます。単純なエンティティ単位のパーサーでは親子関係が失われるため、これは重要です。

構造物の近接グループ化

ユーティリティ構造物(マンホール、集水桝、接合箱)の属性(縁石標高、管底標高、管径)は、構造物記号の近くに配置された個別の TEXT エンティティとして保存されています。パーサーは近接分析を使用して、これらをグループ化します。

  1. ユーティリティレイヤー上のすべての TEXT エンティティを収集します
  2. 各テキストについて、設定可能な半径(既定値:ステートプレーン座標系のフィートで 15 単位)内にある他のすべてのテキストを検索します
  3. 近くにあるテキストを構造物レコードにグループ化します
  4. 標高のパターンを解析します(例:「RIM=739.90'」、「INV=736.62'(12")」)

この方法は、CAD 図面には正式な「構造物オブジェクト」がなく、個別のテキストエンティティを互いに近くに視覚的に配置して構成されているという点に対応します。

ステージ 4:構成と保存

解析後、抽出したデータを plans-spatial.json 用のセクションに整理します。

データセクション
セクションキー内容ソースエンティティ
dwg_survey_dataXYZ、標高統計、基準点を含むすべての測量点SV/PNT レイヤー上の INSERT+ATTRIB
dwg_storm_sewer縁石/グレーチング/管底標高、管データを含む雨水構造物C-STRM レイヤー上の TEXT、近接グループ化
dwg_sanitary_sewer縁石/管底標高、管径、流向を含む汚水マンホールC-SSWR レイヤー上の TEXT、近接グループ化
dwg_water水道メーター、消火栓、本管サイズC-WATR レイヤー上の TEXT/INSERT
dwg_property土地境界、方位、面積、所有者、地図参照C-PROP レイヤー上の TEXT、境界を示す LWPOLYLINE
dwg_other_utilitiesガス、電気、通信、現地確認事項の注記V-* およびユーティリティレイヤー上の TEXT
dwg_erosion_controlBMP のキーノート、侵食防止設備C-EROS/KYN レイヤー上の MTEXT
dwg_grading標高点、建物基礎面、地形解析、舗装断面C-SITE/C-BLDG レイヤー上の TEXT
dwg_contours頂点数と標高範囲を含む等高線データC-TOPO レイヤー上の LWPOLYLINE
plans-spatial.json への読み込み

既存の plans-spatial.json を読み込み、新しい dwg_* セクションをマージし(再処理の場合は以前の DWG データを上書き)、書き戻します。次のメタデータを含めます。

{
  "dwg_survey_data": {
    "source_file": "filename.dwg",
    "extraction_date": "2026-02-20",
    "coordinate_system": "Kentucky State Plane NAD83 (US Survey Feet)",
    "total_points": 598,
    "elevation_range": {"min": 736.41, "max": 750.20, "unit": "ft"},
    "points": [...]
  }
}

また、project-config.json の documents_loaded を更新し、どのデータセクションが設定されたかを参照しながら DWG 抽出を記録します。

他のスキルとの連携

このスキルは、Foreman OS の複数のスキルにデータを提供します。

  • quantitative-intelligence: DWG のジオメトリは、数量計算における優先度 1(正確な)データソースです
  • project-data: 抽出されたすべてのセクションは、plans-spatial.json スキーマに準拠します
  • document-intelligence: /process-docs の実行中に DWG ファイルが検出されると、このスキルが起動します
  • construction-takeoff: DWG の測量点と等高線は、実測値を提供します

/process-docs または /set-project から呼び出された場合、このスキルはプロジェクトフォルダー内で見つかったすべての .dwg ファイルに対して自動的に実行されます。抽出されたデータは、他のドキュメント形式(PDF、仕様書、スケジュール)のデータと シームレスに統合されます。

Civil 3D の独自オブジェクトに関する制限

DWG 抽出パイプラインでは、libredwg(オープンソース)を使用して DWG を DXF に変換し、その後 parse_dxf.py でエンティティを抽出します。libredwg は、文書化されていない内部形式を使用する Autodesk Civil 3D の独自オブジェクトをデコードできません。

影響を受けるオブジェクトの種類
Civil 3D オブジェクトDWG エンティティの種類含まれる情報影響
線形AcDbAlignment道路の中心線、曲線データ、測点道路のジオメトリや測点値を抽出できません
サーフェスAcDbSurface / AcDbTinSurface地形モデル、等高線、標高点既存地盤/計画地盤のデータを抽出できません
管路網AcDbPipeNetwork雨水・汚水管の配管経路、構造物ネットワークオブジェクトから管径、管底高、マンホールを抽出できません
コリドーAcDbCorridor道路の横断面、アセンブリ道路設計の詳細を抽出できません
区画AcDbParcel敷地境界、区画線区画データを抽出できません
縦断図ビューAcDbProfileView縦断線形、縦断勾配縦断図/勾配情報を抽出できません
圧力管AcDbPressurePipe配水ネットワークネットワークオブジェクトから配水システムのレイアウトを抽出できません
対応している機能
  • 標準 DXF エンティティ(LINE、POLYLINE、CIRCLE、ARC、TEXT、MTEXT、INSERT、ATTRIB)はすべてサポートされています
  • Civil 3D の図面には通常、独自オブジェクトと標準エンティティ(ラベル、注釈、ハッチング)の両方が含まれています
  • Civil 3D ファイルでも、標準エンティティの画層名、テキストラベル、属性データは抽出可能です
  • ブロック挿入(ブロックとしてのマンホール、バルブ、消火栓)は通常どおり機能します
回避策 — AutoCAD からクリーンな DXF に書き出す

設計チームが AutoCAD Civil 3D を使用している場合は、次の設定で DXF に書き出すよう依頼してください。

  1. Civil 3D で、SAVEAS DXF ではなく EXPORTTOAUTOCAD コマンドを使用します
  2. これにより、Civil 3D オブジェクトが標準の AutoCAD エンティティに「分解」されます。
    • 線形は、測点ラベルをテキストとして含むポリラインになります
    • サーフェスは、3D 面または等高線ポリラインになります
    • 管路網は、属性データを含む線や円になります
  3. 生成された DXF は parse_dxf.py で完全に解析できます
代替案:PDF と DXF の両方を依頼する
  • 設計チームに、DXF(空間データ用)と PDF 図面(注釈/詳細用)の両方を依頼します
  • document-intelligence は PDF からテキスト/表を抽出します
  • dwg-extraction は DXF からジオメトリを抽出します
  • ユーティリティの照合(cross-reference-patterns.md のパターン 7)によって、両方のデータソースを統合します
検出

parse_dxf.py が不明なエンティティの種類に遭遇すると、警告としてログに記録します。

WARNING: Skipped entity type 'AcDbAlignment' at handle 0x1A3 (Civil 3D proprietary)
WARNING: Skipped entity type 'AcDbTinSurface' at handle 0x2B7 (Civil 3D proprietary)

ファイル内のエンティティの 20% を超える数が、スキップされた独自オブジェクトである場合は、設計チームに EXPORTTOAUTOCAD で DXF を書き出すよう依頼することを推奨し、現場監督に通知してください。

制限事項

  • Civil 3D の独自オブジェクト:詳細については上記のセクションを参照してください。つまり、AcDb* オブジェクトとして保存されたサーフェス、線形、コリドー、パイプネットワークは libredwg ではデコードされません。このスキルは、Civil 3D がこれらのオブジェクトと併せて書き出す標準の DXF エンティティを抽出します。通常、これらにはすべての注釈データ(標高、ラベル、キーノート)が含まれています。回避策として EXPORTTOAUTOCAD を使用してください。
  • 3D ソリッド:複雑な 3D ジオメトリ(ACIS ソリッド、メッシュ)は目録に記録されますが、詳細な解析は行われません。
  • 外部参照(XREF):このスキルが処理するのはホスト DWG のみです。重要なデータが XREF にある場合は、バインドするか、別ファイルとして提供する必要があります。
  • ブロック定義:標準ブロックは名前と挿入点によって抽出されます。カスタムブロックのジオメトリ(内部エンティティ)は再帰的に解析されません。
  • 座標系:このスキルは DWG が使用する座標系をそのまま保持します。ケンタッキー州のプロジェクトでは、通常 State Plane NAD83 が使用されます。座標変換は行われません。

コメント