0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

STEPから寸法まで自動で抜いてるPythonライブラリ5つ

0
Posted at

他社に依頼して設計してもらった時、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生成、差分検出まで、ブラウザで完結する仕組みです。

興味があれば、こちらで使ってみてください。

ドコカワ v1.0(Windows用・無料)

#Python #CAD #STEP #BOM #機械設計

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?