LoginSignup
5
5

More than 1 year has passed since last update.

【Python&STEP CADデータ】STEPCodeをPython3&Windows環境で利用する(※注意)

Last updated at Posted at 2021-10-07

先日に引き続き、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フォルダに生成される。
終了したらこんな感じ

image.png

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の記事を参照

kana.py
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))

出力結果

image.png

インストール(②スキーマも使う)

何をするか

なんと、規格ファイル(*.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ボタンを押す

image.png

Cmake Generatorで使用するIDEを選択する
この記事の作者はあまり詳しくないが、EclipseやKate, Sublimeなども指定できるようだ
終わったら「Finish」押す

image.png

終わったら「Generate」を押してプロジェクトを生成する。

image.png

2.cmakeしたソリューションを開いてビルドする

ターゲットディレクトリを開くと、直下に"SC.sln"というソリューションファイルが生成されるので、
これをVisual Studio 2019で開く。

image.png

そうすると大量のC++のプロジェクトが連なって生成される。
そう、これを全てビルドするのだ。
メモリ16GB, CPU Core-i7-9700を搭載した私のPCでも1時間半ビルドに時間を要した。
それほど長い作業である。

Debugモードでビルドすると、ターゲットディレクトリに「build\bin」というフォルダが出来るはずだ。
この中にあるexp2python.exeを使用する。
とりあえず環境設定を振っておくか、このディレクトリのパスをクリップボードにコピーして、次の作業に移る

image.png

3. スキーマのスクリプトをpythonコード化

次に、リポジトリのルートディレクトリの直下に「data」というフォルダがあるので参照する。
そうすると、各規格の一覧がずらっと並んでいるのが分かるはず

image.png

ここでは、例えば「ap203」を使用するものとする。
「ap203」を開いて、コマンドプロンプトで次のように書く。

exp2python ap203.exp

すると、ap203のフォルダの中にconfig_control_design.pyというファイルが出来る。
これはC++の規格データからpythonコードに置き換えたものであるので、
これを後は、本体のPythonコードの近くにモジュールとして置いておけばよい。

動作確認

先ほどのkana.pyを少し変更して、
定義されているEntity名がスキーマap203に存在しているならばTrueを返す
という処理を追加しよう。

ただし、スキーマのEntity名は大文字になっているので、これは小文字に変換する。

kana2.py
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()))

実行結果

image.png

全数確認したが、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にスキーマの定義全てが書いてあるからだ。

そこで、一部抜粋すると

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の形態と互換性を保っているのである。

5
5
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
5
5