【CADプログラミング】 STEP中間ファイル Dependencies(DLL関数ダンプツール)を使ってSCL Libraryを解読する
〇 概要
STEPCodeの基礎ライブラリクラス(STEP Class Library = SCL)について紹介します。
Dependenciesを使って、どうやってレガシーなプログラムを分析するか?についても、ここで触れます。
〇 SCL Libraryとは
STEPCodeは、STEP中間データのParser(解読器)の機能を提供してくれるのですが、この基礎コードがSCL Libraryといいます。
こちらは、githubのドキュメントから引っ張ってきたもので、"Validation Test System"の説明となります。初版が1991年、実際に更新されたドキュメントが1992年に用意されているので、相当レガシーなシステムで動いています。
このFIGURE2という図の、赤印で記載したところが、大元になる部分で、これらのファイルがモジュールとして動くようになっています。
SCLは、STEP Class Libraryの略のことで、ちょうどFIGURE2にも表記があることが分かりますね。
〇 SCL Libraryの構成をDependenciesを使って明かしてみる
本来はLinuxをベースに考えるのが筋ですが、Windowsでは各ファイルがDLL化されていて、構成されているファイルが一目でわかるので、こちらを使ってちょっとした関数ダンプを取ってみましょう。
C++のDLLの関数ダンプは、2020年段階ではDependenciesというツールがおすすめです。こちらをダウンロードしてきましょう。
ソフトウエアを使うだけであれば、使い方は簡単。"Download Here"とありますので、そのファイルを展開して、適当なディレクトリに置くだけです。実行ファイルは"DependenciesGui.exe"となります。
上図は、最近私がSTEPを使用した検査装置を取り扱うときに使用したexeファイルの中身となります。ここから、DLLの最小構成は以下のようになります。
・sdai_ap203.dll
・stepeditor.dll
・stepcore.dll
・stepdai.dll
・steputils.dll
〇 それぞれのDLLを辿ってみよう
だいたいの内容は、githubに書いてある通りです。ただ、cl~という名前付けが、cmakeを使ってMSVC用のDLLに変換されるときに、step~という名称に変わっていることから、若干の変化があります。
さきほどの"Validation Test System"のドキュメントに、このモジュールの役割が分かりますので、原始的なものから一つ一つ読み解きましょう。
clutils (steputils.dll)
・STEPデータで使用する共通のデータ構造を表します。
・STEPデータには”基礎データ構造”と呼ばれるものがあります。例えば、リスト構造、文字列処理などが(C++98が出来る以前の段階から)必要とされていて、その基礎プログラムが入っています。
・エラー状態を表すErrorDescriptor、リスト構造を表すgennodelist, 配列構造を表すgennodearrayや、その子ノードであるgennodeなどが含まれています。
・そのため、大変レガシーなコードです。現代のC++では、STLライブラリなどの台頭により、Iterator、operator[]などが便利に活用できますが、このコードはそんなものはなく、例えばエラーチェックとかを無視して頭から3つ分のデータを読み出す処理を書きたいときは、以下のように記載します。
geometry->_first_ref_vector._coordinate =
{ ((const RealNode*)direction_ref_aggr->GetHead())->value,
((const RealNode*)direction_ref_aggr->GetHead()->next)->value,
((const RealNode*)direction_ref_aggr->GetHead()->next->next)->value
};
・逆に言えば、C言語くらいしか載らないような環境であれば、このコードを最大限に生かせるという意味でもありますね・・・、と言いつつ、ほかのソースコードではvirtualでオーバーライドすることを期待しているサブクラスを定義しているので、C言語的な記載が許せるのは実はこのモジュールだけではあります。
cldai(stepdai.dll)
・レガシーなプログラムをリカバーするために定義されているラッパー?のようなもので、本プログラムについては詳細な説明はgithubに説明はありません。
文字列をconst char*やstd::stringの形式で取り扱うSDAI_Binary, SDAI_stringや、列挙型SDAI_enum, 論理型SDAI_LOGICAL, SDAI_BOOLEAN、固有Process IDのようなものを保持して半永久的にオブジェクトとして残すSDAI_PIDなど多様な種類があるようです。
clstepcore(stepcore.dll)
・STEPファイルにはあらゆる”規格”が存在しますが、その規格を表すベースクラスが格納されています。各定義の構文別にvirtual指定でオーバーライドしています。
・主要なクラスとしてRegistryクラス、InstMgrクラスがあります。
・Registryクラスは、規格ごとでの”すでに定義済みの”構文を表すクラスとなっています。このクラスを使用すると、規格の中に定義されているすべての構造にアクセス可能になります。具体的には、以下のサイトに定義されている構文すべてにアクセス可能になります。
・InstMgrクラスは、現在定義されているSTEPファイルのインスタンスを表しています。データを紐解いていくときは、こちらを使用することになるでしょう。
cleditor(stepeditor.dll)
・STEPファイルを編集するために必要なクラスライブラリです。
・clstepcoreの関数をラップしているようなイメージです。
・最初に使用するクラスにSTEPFileクラスと呼ばれるものがありますが、これを使用することで、STEPファイルの読み込み・書き込み・編集操作を自在に行うことが出来ます。
sdai_ap203.dll
・各規格のうち、ap203のモジュールを表すファイルです。
・具体的には、上記のファイルに含まれている規格のフォルダがあり、そこからcmakeを使って展開されます。
・このファイルの中には、*.expファイルというものが格納されており、このファイルをParserが展開することで、各規格ごとのモジュールがインストールできるようなイメージです。
---
以上、Dependenciesにより、Windows版のSTEPCodeでどのようなモジュールがどのような役割を果たしているかを説明していきました。
一つ一つ理解すると、レガシーなコードながらも、かなり苦心して作られているのがよく分かります。古いコードというのは、こんな感じで移植しながらも随時更新をしていくイメージで独特な読み方があると思います。