dwg-extraction について
施工図面を扱うチーム向けのスキルで、Civil 3D を含む AutoCAD DWG を構造化されたプロジェクトデータに変換します。libredwg と独自パーサーで標準エンティティを抽出し、独自オブジェクトの制限も明記します。
主な機能
- 01DWG から DXF への変換
- 02エンティティと属性の解析
- 03レイヤー別の施工データ分類
- 04近接テキストから構造情報をグループ化
- 05空間データのセクション整理
- 06Civil 3D 独自オブジェクトの制限を明記
活用シーン
- 01測量点と標高の抽出
- 02ユーティリティや構造物の注記整理
- 03図面から敷地と地形情報をまとめる
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mgoodman60/ foreman-os-plugin --skill dwg-extractionインストール後、Claude Code で/dwg-extractionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/integration-guide.mdscripts/compile_libredwg.shparse_dxf.py詳細
DWG ファイルの抽出
AutoCAD DWG ファイル(Civil 3D を含む)から、構造化された建設情報を抽出します。 DWG は、専用のツールを必要とする独自のバイナリ形式です。このスキルでは、未加工の .dwg から構造化されたプロジェクトデータまで、全工程を処理します。
パイプラインの概要
抽出は、次の 4 つの段階で行われます。
- libredwg のコンパイル — オープンソースの DWG リーダーをソースからビルドします(初回実行後はキャッシュされます)
- DWG → DXF の変換 — コンパイル済みの
dwg2dxfバイナリを使って、テキストベースの DXF ファイルを生成します - DXF エンティティの解析 — カスタム Python パーサーが、すべてのエンティティタイプを完全な属性データとともに抽出します
- 構造化と保存 — 抽出したデータを 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 座標、レイヤー分類 |
| テキスト注記 | TEXT | 1 行のラベル(標高、構造物 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 エンティティとして保存されています。パーサーは近接分析を使用して、これらをグループ化します。
- ユーティリティレイヤー上のすべての TEXT エンティティを収集します
- 各テキストについて、設定可能な半径(既定値:ステートプレーン座標系のフィートで 15 単位)内にある他のすべてのテキストを検索します
- 近くにあるテキストを構造物レコードにグループ化します
- 標高のパターンを解析します(例:「RIM=739.90'」、「INV=736.62'(12")」)
この方法は、CAD 図面には正式な「構造物オブジェクト」がなく、個別のテキストエンティティを互いに近くに視覚的に配置して構成されているという点に対応します。
ステージ 4:構成と保存
解析後、抽出したデータを plans-spatial.json 用のセクションに整理します。
データセクション
| セクションキー | 内容 | ソースエンティティ |
|---|---|---|
dwg_survey_data | XYZ、標高統計、基準点を含むすべての測量点 | 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_control | BMP のキーノート、侵食防止設備 | 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 に書き出すよう依頼してください。
- Civil 3D で、
SAVEAS DXFではなくEXPORTTOAUTOCADコマンドを使用します - これにより、Civil 3D オブジェクトが標準の AutoCAD エンティティに「分解」されます。
- 線形は、測点ラベルをテキストとして含むポリラインになります
- サーフェスは、3D 面または等高線ポリラインになります
- 管路網は、属性データを含む線や円になります
- 生成された 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 が使用されます。座標変換は行われません。