先日に引き続き、Pythonを利用してSTEPCodeライブラリをインストールする方法を紹介する。
OSはWindows 10共通で行う。
(Linuxでの導入は別途。Linuxの方が数倍楽。)
STEPファイルについて知りたい人はこちらを見てくれ
Python3ライブラリの経緯
(情報:2021.10.7)
元々Python2での対応であったが、**githubの有志の方@Devonsparksによって、Issue #407**が提示された。
その後、Pull Requestにより本人によってコードが変更されていて、概ねテストも完了しているようだが、
githubのPR Integration(CI環境での統合テスト)で作業が止まっているようだ。
改めて確認したところ、PR Integrationで使用しているサービス(AppVeyor)がWindowsでのcmakeビルドをやっているようだが、古い環境であるとのことで最新の状態では削除されて、ブランチ「check_pr_actions」の状態で、しばらく放置されている。
少なくとも私の環境では@Devonsparksのリポジトリをクローンしても(おそらく)正常に動いているので、試しに使う分には問題ないはず。
このライブラリをPythonサーバーサイドで使うときとかは、注意して使う。
全体的にContributorが少なく、ネイティブなCの環境からゆっくりと移行しているので、最新のPython運用環境やCI環境と比べると着手が遅い。
(なので、盛り上がってくれると、その辺りがさらに良くなると期待できる!)
STEPCodeの採用メリット
STEPCodeは昔からネイティブCで管理されており、"STEPファイルを読み取れるライブラリでかつ制約なく商用利用出来る"意味で、独自のライブラリである。
「中・小規模のPythonのサービスでCADデータを取り扱える」
ある意味、完全に差別化されたメリットである。
ただし、基本コードは独自のスキーマで全て記述されていて、その変換コードはC++で記述されていることからすごくレガシーでもある。
(Python3対応が遅れている現状からみてもご察しかもしれないが・・・)
その他のSTEP CADライブラリ
Open CASCADE
ちなみに、STEP CADデータが扱えるライブラリにOpen CASCADEがある。
こちらはGPLであるなどの制約があったり、どうも未定義動作やテストで課題が出ているようだが、こちらの方がよく使われている印象。
もしかすると、コミュニティにまだ人がいてフリーでコード修正できるようなContributorがいるだけでも、STEPCodeはまだよいかもしれない・・・。。。。
(確認したところ、Open CASCADEの最新アップデートは2018年のようだ。)
ST Developer
このほか、1991年に発案され今も管理されて続けている**ST Viewer (ST Developer)**と呼ばれるものがある。
ただしこちらは現在は無償ではなく(昔は無償だったんだけど)、ライセンス料を支払わなくてはいけない。
このように、CADを扱えるライブラリの選択肢は非常に限られており、高額/有償の環境に頼るか、無償でチープで古臭い環境で頑張るかになる。
なので、こんな状況を少しでも変えて、少しでも布教して、色々な案件に応用出来たら・・・と思うばかりだ。
STEPCodeで提供されているPythonコードの種類
Pythonでは、Parse処理のみ使用する場合と、スキーマを利用する場合と二つの手段がある。
パース処理を利用する場合は、Pythonの固有コードのみで実装できる。非常に単純だ。
一方、AP203とかAP214とかのスキーマを定義する場合は、Generatorを使用して、pyモジュールを生成する必要があるようだ。
パース処理のみの場合はお手軽だが型の厳密性がないので、規格情報を使用する場合はこの過程を必ず挟む必要がある。
インストール① (パース処理のみ)
動作環境
- Windows 10 Professional
- バージョン20H2
- Python 3.7.8, 3.9.7で動作確認
- Visual Studio Code + Python Extensionを使用
1. Githubリポジトリからクローン
今回は@Devonsparksのブランチpy3を使用する。
現状プルリクエストのレビュー中ですので、マージされたらSTEPCode本体のリポジトリからプルすると良い。
git clone https://github.com/devonsparks/stepcode
cd stepcode
git checkout py3
2. Python Build
pipで以下のライブラリをインストール
python -m pip install wheel build
手順にもあるように、PyPAモジュールを使用するのと、インストール時はwheelファイルを使用する点に注意。
PyPIにはまだSTEPCodeはリポジトリとして挙がっていない。
(いつか使えるくらいのレベルになると、とてもうれしい)
次に、リポジトリのルートから**「.\src\exp2python\python」**に移動し、
python -m build
を押すことで、wheelファイルがdistフォルダに生成される。
終了したらこんな感じ
Wheelファイルが出来たら、
cd dist
python -m pip install SCL-0.6.1-py3-none-any.whl
とすることでSCL(STEPCode Library)がインストールされる。
なお、過去にPython2版SCLを入れている場合、SCLがアンインストールできないので、--ignore-installを追加してpip installする。
3. テスト
リポジトリのルートから**「.\src\exp2python\python\test」**に移動し
python test_parser.py
などとしてエラーが発生していなければ完了。
動作確認
C++で実施した機能と同じもの(単にデータ番号と型を並べるだけ)なら、規格の情報がいらないので以下の内容だけで十分実行出来る。
金型データに関しては以下のqiitaの記事を参照
from SCL.Part21 import Parser, SimpleEntity, ComplexEntity
import io
path="F:\\StepData\\BSP35B20-N-12.stp"
step_text = None
with open(path) as f:
step_text = f.read()
parser = Parser()
model = parser.parse(step_text)
with open("log_out.txt", "w") as cout:
for section in model.sections:
for entity in section.entities:
if type(entity) is SimpleEntity:
cout.write("{0},{1}\n".format(entity.ref, entity.type_name))
elif type(entity) is ComplexEntity:
cout.write("{0} ComplexEntity\n".format(entity.ref))
for list_parameter in entity.params:
for parameter in list_parameter:
cout.write("+ {0}\n".format(parameter.type_name))
出力結果
インストール(②スキーマも使う)
何をするか
なんと、規格ファイル(*.expファイル)をPythonで自動してくれる機能があったりする。
これを使って、各規格データをpyコードで生成する。
動作環境
C++でビルド出来る環境が必要です。
追加部分は赤字で記す
- Windows 10 Professional
- バージョン20H2
- Python 3.7.8, 3.9.7で動作確認
- Visual Studio Code + Python Extensionを使用
- cmake gui 3.19.0-rc2
- 現在の最新版は3.21.xなので若干動作が変わる可能性あり
- Visual Studio 2019 Professional
- C++ 14
1. cmake
リポジトリのルートディレクトリをcmakeでビルドする。
流れはVC++編と同じ
入力を終えたらConfigureボタンを押す
Cmake Generatorで使用するIDEを選択する
この記事の作者はあまり詳しくないが、EclipseやKate, Sublimeなども指定できるようだ
終わったら「Finish」押す
終わったら「Generate」を押してプロジェクトを生成する。
2.cmakeしたソリューションを開いてビルドする
ターゲットディレクトリを開くと、直下に"SC.sln"というソリューションファイルが生成されるので、
これをVisual Studio 2019で開く。
そうすると大量のC++のプロジェクトが連なって生成される。
そう、これを全てビルドするのだ。
メモリ16GB, CPU Core-i7-9700を搭載した私のPCでも1時間半ビルドに時間を要した。
それほど長い作業である。
Debugモードでビルドすると、ターゲットディレクトリに「build\bin」というフォルダが出来るはずだ。
この中にあるexp2python.exeを使用する。
とりあえず環境設定を振っておくか、このディレクトリのパスをクリップボードにコピーして、次の作業に移る
3. スキーマのスクリプトをpythonコード化
次に、リポジトリのルートディレクトリの直下に「data」というフォルダがあるので参照する。
そうすると、各規格の一覧がずらっと並んでいるのが分かるはず
ここでは、例えば「ap203」を使用するものとする。
「ap203」を開いて、コマンドプロンプトで次のように書く。
exp2python ap203.exp
すると、ap203のフォルダの中にconfig_control_design.pyというファイルが出来る。
これはC++の規格データからpythonコードに置き換えたものであるので、
これを後は、本体のPythonコードの近くにモジュールとして置いておけばよい。
動作確認
先ほどのkana.pyを少し変更して、
定義されているEntity名がスキーマap203に存在しているならばTrueを返す
という処理を追加しよう。
ただし、スキーマのEntity名は大文字になっているので、これは小文字に変換する。
from config_control_design import *
from SCL.Part21 import Parser, SimpleEntity, ComplexEntity
import io
path="F:\\StepData\\BSP35B20-N-12.stp"
step_text = None
with open(path) as f:
step_text = f.read()
parser = Parser()
model = parser.parse(step_text)
with open('log_out2.txt', 'w') as cout:
for section in model.sections:
for entity in section.entities:
if type(entity) is SimpleEntity:
cout.write("{0},{1},{2}\n".format(entity.ref, entity.type_name, entity.type_name.lower() in globals()))
elif type(entity) is ComplexEntity:
for list_parameter in entity.params:
for parameter in list_parameter:
cout.write("+ {0} {1}\n".format(parameter.type_name, parameter.type_name.lower() in globals()))
実行結果
全数確認したが、Falseになっている項目はなく、全てのスキーマのEntityが定義されていることが判明した。
ソースコード少し解説
ちなみに感覚的には、Pythonの方が扱いやすいと思う。
理由は、クラス名を文字列から動的に名前付けする機能がPythonにはあるため、複数の規格が乱立するときにそれを一本化出来るためだ。
恐らく、Pythonを普通に使ってて、めったに使わないこの機能をガシガシ使う必要がある。
このことを知って、なかなかすごいライブラリだなとは思った。
上記のkana2.pyでいえば、
cout.write("{0},{1},{2}\n".format(entity.ref, entity.type_name, entity.type_name.lower() in globals()))
特にここで言うglobals()とか(先ほどの記事ではgetattrとか)は、普通にプログラミングしている環境だと積極的に使うケースは少ない。
だが、このSTEPCodeではこれなしではやっていけないような気すらする。
なぜこんなことが出来るか?
それは、先ほど見たap203.expにスキーマの定義全てが書いてあるからだ。
そこで、一部抜粋すると
ENTITY representation_map;
mapping_origin : representation_item;
mapped_representation : representation;
INVERSE
map_usage : SET [1:?] OF mapped_item FOR mapping_source;
WHERE
wr1: item_in_context(SELF.mapping_origin,SELF.mapped_representation.
context_of_items);
END_ENTITY; -- representation_map
ENTITY representation_relationship;
name : label;
description : text;
rep_1 : representation;
rep_2 : representation;
END_ENTITY; -- representation_relationship
ENTITY representation_relationship_with_transformation
SUBTYPE OF (representation_relationship);
transformation_operator : transformation;
WHERE
wr1: (SELF\representation_relationship.rep_1.context_of_items :<>:
SELF\representation_relationship.rep_2.context_of_items);
END_ENTITY; -- representation_relationship_with_transformation
こんな感じで、独自のSTEP用の言語仕様で、要素(Entity)、継承関係、属性(Attribute)が記述されているのだ。
これをpythonに変換しているものだから、スキーマとして成立するのである。
このSTEPの独自仕様に関しては、今後取り扱うとして、
このSTEPCodeがどのようなライブラリなのか、若干想像がつくと思う。
独自仕様のXMLなどに似ている形式かもしれない。
つまり、CADデータを一定のスキーマに基づいて管理するためのファイル=STEPファイルである。
そして、そのスキーマはISO10303の規格で取り決めされており、STLなどの形状定義フリーCADの形態と互換性を保っているのである。