他社に依頼して設計してもらった時、stpデータでの納品もままあります。
修正が出るたびにSTEPファイルを開いて、何が変わったのか比較して図面を修正する作業が発生します。
もちろんBOMが変わることも。
部品が100個を超えると、それだけで想定外の作業が膨らんでいきます。
転記ミスも出ますし、前回の修正がどこだったかもわからなくなる始末です。
何とかこれを自動化できないかと思い、Pythonで設計に必要な情報を一気に抜くスクリプトを書き始めました。
そこでよく使っているライブラリが5つあります。
調べた限り、どれもよく使われているもののようです。
1. CadQuery — STEP読み込みと寸法・形状の抽出
STEPファイルを読み込んで、部品の寸法・形状情報を抽出するためのライブラリです。
これなしでは始まらない。
CadQueryを使うと、STEPの読み込みはもちろん、バウンディングボックスや面数、体積なんかも自動で取得できます。
import cadquery as cq
# STEPを読み込む
result = cq.importers.importStep("assembly.step")
shape = result.val() # Compoundを取得
# 部品(ソリッド)を抽出
solids = shape.Solids()
for solid in solids:
bb = solid.BoundingBox()
print(f"幅: {bb.xlen:.2f}mm, 奥行: {bb.ylen:.2f}mm, 高さ: {bb.zlen:.2f}mm")
print(f"体積: {solid.Volume():.1f}mm³, 面数: {len(solid.Faces())}")
修正前後のSTEPを比較して「この部品の何が変わったのか」を自動判定するのに使っています。
バウンディングボックスの変化で形状変更を検出し、体積差で材料の変更も捕捉可能です。
精度は1mmオーダーあれば十分。
ただし、インストールが環境依存なので、ビルド済みバイナリを使うのが楽でした。
2. pdfplumber — 仕様書PDFから寸法・部品表を抽出
設計変更と一緒に上がってくるのが、修正内容を書いたPDF仕様書です。
そこに変更寸法と部品構成が書いてあります。
pdfplumberを使うと、PDFのテーブルやテキストを構造化して抽出できます。
import pdfplumber
with pdfplumber.open("spec_sheet.pdf") as pdf:
first_page = pdf.pages[0]
# テーブルを抽出
tables = first_page.extract_tables()
for table in tables:
for row in table:
print(row) # 行ごとの処理
# テキストを抽出
text = first_page.extract_text()
print(text)
「寸法: 100mm」「BOM」みたいなキーワードで正規表現マッチングして値を抜いています。
かなり雑ですが、実務の設計変更通知書は大体フォーマットが決まっているので、これで十分でした。
仕様書がない場合はSTEPの寸法だけで判定していますが、仕様書があるとバリデーションの信頼度が上がります。
3. openpyxl — 抽出結果をExcelに落とす
STEPから抜いた寸法やBOMをExcelに出力するためのライブラリです。
openpyxlを使えば、PythonでExcelファイルの作成・編集ができます。
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
ws = wb.active
ws.title = "BOM"
# ヘッダー
headers = ["部品番号", "部品名", "幅(mm)", "奥行(mm)", "高さ(mm)"]
ws.append(headers)
# ヘッダーのスタイル(背景色・太字)
header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
header_font = Font(bold=True, color="FFFFFF")
for cell in ws[1]:
cell.fill = header_fill
cell.font = header_font
# データを追加
for i, part in enumerate(parts, 1):
ws.append([i, part["name"], part["width"], part["depth"], part["height"]])
wb.save("BOM.xlsx")
最初はcsv出力を考えていましたが、営業や調達に渡すファイルなので見栄えも必要でした。
openpyxlなら色付けや列幅調整も簡単です。
10秒で数十部品のBOMが出てくるので、修正が入るたびに生成し直せるのが地味にありがたい。
4. pandas — CSV/Excelデータの整形と比較
設計変更の前後で、部品の追加・削除・変更を自動検出する時に使っています。
pandasでDataFrameに落とし込んで、dfのmulti-indexやmergeで差分を取る形です。
import pandas as pd
# 修正前後のBOMをDataFrameに読み込む
df_before = pd.read_csv("BOM_v0.csv")
df_after = pd.read_csv("BOM_v1.csv")
# 部品名でマージして、寸法の変化を検出
merged = pd.merge(df_before, df_after, on="部品名", how="outer", suffixes=("_v0", "_v1"))
# 差分のある行だけフィルタ
changed = merged[merged["幅_v0"] != merged["幅_v1"]]
print(changed)
# CSVで出力
changed.to_csv("変更部品一覧.csv", index=False)
本当はNumPyで配列演算した方が速いですが、データがテーブル形式なのでpandasの方がコードが短くて読みやすい。
Excelも直接読み込めるのが便利です。
修正が月に何度も入る時期はこのスクリプトを毎回回しています。
人手で照合するより圧倒的に速いですし、見落としも少ないです。
5. pyvista — 3Dビューアで変更部品を可視化
ここまでやっていると「図で見たい」となってきます。
pyvista + stpyvistaで、ブラウザ上に3Dモデルを表示して変更部品をハイライトできます。
pv.wrap() にCadQueryオブジェクトをそのまま渡しても動かないので、一度STLに書き出してから pv.read() で読み込む必要があります。
import tempfile
from pathlib import Path
import cadquery as cq
import pyvista as pv
import stpyvista as stpv
import streamlit as st
# STEPをSTLに変換(一時ファイル経由)
result = cq.importers.importStep("assembly.step")
with tempfile.NamedTemporaryFile(suffix=".stl", delete=False) as f:
tmp_stl = f.name
cq.exporters.export(result, tmp_stl, exportType="STL")
# STLをPyVistaで読み込む
mesh = pv.read(tmp_stl)
Path(tmp_stl).unlink() # 一時ファイルを削除
# Plotter でレンダリング → stpyvistaでStreamlitに埋め込む
plotter = pv.Plotter(window_size=[500, 400])
plotter.add_mesh(mesh, color="#4a90d9", show_edges=False)
plotter.background_color = "white"
plotter.view_isometric()
stpv.stpyvista(plotter, backend="panel", key="viewer")
stpyvistaはStreamlitコンテキスト内でないとimport時にクラッシュするので、Streamlitアプリの中で呼び出してください。
修正前後のモデルを並べて表示すれば、視覚的に何が変わったかがパッとわかります。
目視でSTEPを比較していた頃は30分かかっていましたが、3Dビューアで並べると5分で済みました。
同じビューで両方を見られるのが強みです。
これらのライブラリの組み合わせで、STEPの読み込みから寸法抽出、変更検出、3D表示まで一通り自動化できました。
最初は各ステップで手作業が入っていましたが、やってくうちに「この作業も自動化できないか」と考えるようになったものです。
今は設計者向けのツール「ドコカワ」として、こういう処理をUIに組み込んでいます。
STEP読み込みからBOM生成、差分検出まで、ブラウザで完結する仕組みです。
興味があれば、こちらで使ってみてください。
#Python #CAD #STEP #BOM #機械設計