CAD図面検索システムを自作したら「置いといて」と言われた製造業DXの現実
はじめに
製造業(従業員70名)で組立を担当しながら、一人でDXを推進しています。プログラミングは独学で約1年です。
前回、QRコード×kintoneで部品管理を改善した記事を書きましたが、今回は別の課題に取り組んだ話です。
「あの図面、どこにあったっけ?」
うちの会社では1990年代からCADを導入し、20年以上分のDWG/DXFファイルが社内サーバーに蓄積されています。総数は推定20万件以上。年度別フォルダや客先別フォルダに分かれていますが、エクスプローラーのファイル名検索に頼っている状態でした。
問題は、ファイル名と図面の中身が一致しないケースが多いこと。ファイル名には図番が入っていることが多いですが、表記揺れがあったり、そもそも図番がわからない場合はお手上げです。ファイルの中身(表題欄に書かれた客先名や品名)まで検索できないので、「この客先の過去の案件を探したい」というニーズに応えられません。
そこで、DXFファイルの中のテキストを抽出→AIで構造化→データベースに保存→kintoneから検索というパイプラインを自作しました。
技術構成
[社内サーバー上のDWG/DXF]
↓ ODA File Converter(DWG→DXF変換)
↓ ezdxf(Pythonライブラリ)でテキスト抽出
↓ Claude API(Sonnet)で構造化
↓
[Cloud SQL(PostgreSQL)]
↑
[Cloud Run(FastAPI)]
↑
[kintone(検索UI)+ 社内サーバー(FortiGate VPN内でファイル配信)]
- 言語: Python(バックエンド)、JavaScript(kintoneカスタマイズ)
- テキスト抽出: ezdxf(DXFパーサー)
- AI構造化: Claude API(Sonnet)
- データベース: PostgreSQL(Google Cloud SQL)
- APIサーバー: FastAPI(Google Cloud Run)
- フロントエンド: kintone(JavaScriptカスタマイズで検索フォームを追加)
- ファイル配信: 社内サーバー上のFastAPI(FortiGate VPN内で運用)
- 開発ツール: Claude Code、Neovim、Claude(ブラウザ版)
DXFからテキストを抽出する
ここが一番苦労したポイントです。CAD図面には表題欄があり、図番・品名・客先名・製図者・作成日などが書かれています。これをプログラムで読み取ります。
ezdxfで読める・読めない
ezdxfはDXFファイルのエンティティ(TEXT、MTEXT、INSERT/ATTRIBなど)を読み取れます。表題欄の情報はTEXTエンティティとして取得できました。
import ezdxf
doc = ezdxf.readfile("drawing.dxf")
msp = doc.modelspace()
for entity in msp.query('TEXT MTEXT'):
if entity.dxftype() == 'TEXT':
print(entity.dxf.text)
elif entity.dxftype() == 'MTEXT':
print(entity.text)
ただし、1つのDXFファイルに複数の図面(シート)が含まれているケースがあります。レイアウト空間(ペーパースペース)を使っている場合、モデル空間だけ読んでも全データは取れません。virtual_entities() を使ってINSERTブロックを展開する処理を追加しました。
AIで構造化する
抽出した生テキストは、ただの文字列の羅列です。数字の並びが図番なのか注番なのか、会社名らしき文字列が客先名なのか製図者の所属なのか、プログラムだけでは判断できません。
そこでClaude API(Sonnet)に渡して、JSON形式に構造化してもらっています。
{
"drawing_number": "XX-NNN",
"sheet": "1/3",
"title": "○○搬送装置 組立図",
"customer": "△△株式会社",
"designer": "山田",
"date": "2025-04-01"
}
このAI構造化のステップが入ることで、表記揺れのある図番や日本語の客先名を整理できます。100%の精度ではありませんが、手作業で整理することを考えれば十分実用的です。
kintoneから検索する
検索UIはkintoneのJavaScriptカスタマイズで実装しました。kintone画面上にカスタム検索バーを追加し、入力されたキーワードでCloud Run上のFastAPI経由でPostgreSQLを検索します。
検索結果には図番・品名・客先名・製図者・作成日が表示され、「開く」ボタンを押すと社内VPN内のサーバーから実ファイルにアクセスできます。
ポイントは、kintoneを認証・権限管理のために使っている点です。自前でログイン機能やユーザー管理を作る必要がなく、社内の全員がブラウザからアクセスできます。
現在の状況
登録データ
- DXF図面:約160件
- 受注伝票との紐付け:約150件
- kintone不具合管理アプリとの紐付け:約150件
まだ20万件のごく一部ですが、パイプラインは動いている状態です。
社内の反応
動くものを作り、経営陣、設計幹部にプレゼンしました。
主な反応は、「属人化しないか?」「個人が作ったもののセキュリティは大丈夫か?」 というもので、結論は**「とりあえず置いといて」**でした。
一方で、現場からは**「あったら絶対便利」「そんなことできるのか」**という声もありました。実際に図面を探す苦労を日々感じている人たちの反応は前向きでした。
正直に書きます。技術的には動いているのに、すぐに社内展開にはなりませんでした。指摘された懸念は以下のようなものです。
- 属人化リスク — 作った本人しかメンテできないシステムは、その人がいなくなったら終わり
- セキュリティ — 個人が作ったものに社内の図面データを預けて大丈夫なのか
- 優先度 — 日々の製造業務の方が差し迫っている
どれも正論です。ただ、自分としてはこう思っています。
まず実際に使ってみて効果を確認し、有効だとわかった段階で業者に正式に実装してもらえばいい。 もしくはMVPの段階から業者に相談してテストを進めれば、費用はかかりますが小さく始めて無理ならやめればいい。そうすれば属人化にもならないし、セキュリティも担保される。何より、「本当に効果があるか分からないもの」にいきなり大きな外注費をかけるより、MVPで検証してから発注する方が失敗のリスクが圧倒的に低い。
これは技術の問題ではなく、「組織に新しいものを受け入れてもらうプロセス」 の問題です。製造業のDXをやっている人なら、おそらく多くの方が似た経験をしているのではないでしょうか。
技術的に学んだこと
DXFのテキスト抽出は想像以上に大変
- DWGファイルはまずDXFに変換が必要(ODA File Converter使用)
- 1ファイルに複数シートが入っているケースがある
ハイブリッドクラウド+オンプレ構成の勘所
検索API(Cloud Run)はクラウドに置きつつ、ファイル配信は社内サーバーから行う構成にしました。理由は、会社の図面データをクラウドに上げることに対するセキュリティ面での懸念の声があったためです。
社内のファイル配信サーバーはFortiGate VPN内で運用しています。社内ネットワークに接続していれば、kintoneの検索結果から直接ファイルを開けます。外部に穴を開ける必要がないため、セキュリティの観点でも安心感がある構成です。
製番(注文番号)の正規化は沼
図面DB側の製番と、kintone側の製番では表記体系が異なります。YY-NNN形式、X-YY-NNNNNN形式など複数のパターンが混在しており、正規化ルールを作るのに相当な時間を使いました。ここはデータを大量に見て、パターンを一つずつ潰していくしかありません。
まとめ
- ezdxf + Claude API + PostgreSQL + Cloud Run + kintone という構成で、CAD図面の全文検索システムを自作した
- DXFのテキスト抽出→AI構造化→DB保存→検索のパイプラインは動いている
- 社内プレゼンでは「属人化」「セキュリティ」の懸念で即展開にはならなかったが、技術的な基盤は完成している
- 製造業DXは「作れた」がゴールではなく、「使ってもらえる」までが勝負
- 今後の進め方はまだ模索中です
同じように製造業でDXを推進している方の参考になれば幸いです。質問や「うちも似た課題がある」という方はコメントください。
環境情報
- Python 3.x / ezdxf
- FastAPI / Cloud Run
- PostgreSQL / Cloud SQL
- kintone(JavaScriptカスタマイズ)
- FortiGate VPN(社内ファイル配信)
- ODA File Converter(DWG→DXF変換)
- Claude API(Sonnet)
- 開発ツール: Claude Code、Neovim、Claude(ブラウザ版)