【CADプログラミング】STEPファイルを見やすくしてみる

久しぶりにSTEPファイルのネタです。
退職が決まり、STEPファイルのネタがお蔵入りしそうだったので、ある程度今後の私の資産にするために、社内から持ち出してまとめたものを記事にします(機密情報等は特にないです)。

モデルとして扱うSTEPファイル

以前スプロケットでこのネタをやっているのですが、ちょっとだけデータ構造をより深く知るため、実際のデータをあてがえています。


モデルサンプルとして使用するデータ



ただし、当データはLicense CC BY-ND 4.0ライセンス指定となっており、クレジットの表示と改変が不可能な状況ですので、データを俯瞰するのに使用するのみとさせていただきます。
また、規格は一旦簡単化のため、AP203で統一します。

https://jp.misumi-ec.com/vona2/detail/110300431320/

データ構成

公式(ISO-10303)で必須としている項目は以下の通りです。

STEPフォーマットのデータ構成

ちなみに、公式にはこれ以外の内容もあるようです。私が色々ソフトウエアを確認した限りだと、他の項目が入れられているのは見たことがありませんが。

HEADERセクション

HEADERセクションは、STEPファイルのデータの属性を表すパラメータや、発行されたソフトウエアなどを表すものです。

この内容はWikipediaなどには一応載っています。

必須とするのは、FILE_DESCRIPTION, FILE_NAME, FILE_SCHEMAだけなのですが、これ以外の項目の登録も可能です。しかし、これ以外の項目自体も、私は見たことがありません。
ソフトウエアによっても出力方法が大きく異なっているようなのですが、いろいろと無作法な印象を受けます。

例えば、フリーでCADデータの生成や確認が出来るFreeCADと呼ばれるソフトウエアでは、次のように記載されています。

FILE_DESCRIPTION(('FreeCAD Model'),'2;1');
FILE_NAME('D:\simple_shapes_cv.stp','2022-10-27T09:26:35',('Author')
  ,(''),'Open CASCADE STEP processor 7.3','FreeCAD','Unknown');
FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));

他に、ミスミのECサイトのCADのAPIサービスはCadenas社のシステムPARTsolutionsが担っています。記載例は次の通り。

FILE_DESCRIPTION( ( 'STEP AP203' ), '1' );
FILE_NAME( 'BSP35B20-N-12.stp', '2020-10-26T06:46:25', ( 'License CC BY-ND 4.0' ), 
         ( 'CADENAS' ), ' ', 'PARTsolutions', ' ' );
FILE_SCHEMA( ( 'CONFIG_CONTROL_DESIGN' ) );

とまあ、類似はしているのですが、いくつか気になる点があります。

(FILE_DESCRIPTION) FreeCADで、'FreeCAD Model'となっている

(FILE_SCHEMA) スキーマの種類が違う

FreeCADの仕様の可能性が高いです。FreeCADで生成されるデータはAP203と言った規格を適用せず、全て独自のデータ属性を使っているかもしれません。
なお、FreeCADはOpenCascadeというフリーライブラリを使っており、規格に関する議論はあると思うのですが、そのサポートが出来ているかは不明です。

(FILE_NAME) ミスミのECサイトの場合は、Authorの欄がライセンス表記になっている

PARTsolutionsから配布されるデータを見ると、FreeCADで'author'となっているのが、ライセンスの表記になっていることが分かります。これは厳密に言うとPARTsolutionsのシステムで自動的に生成されているためだと思いますし、モデルによって違うと思います。
当然、CADサービスが異なれば、このあたりの事情も異なります。

注意として、このライセンスクレジット次第では、改変に対する対応方法が異なる点があります。
ミスミ社の声明では、著作権がありますので無断で公開して利用することは禁じますとのことですが、実際は自分たちもPARTsolutionsから提供を受けたものを使っているので、このデータ自体には表示と改変禁止以外の規定を設けることは出来ません。この事実、意外と知らないかも?

(FILE_NAME) エクスポートしたサービスやアプリの種類(PARTsolutions、FreeCADなど)が書いてある

STEPデータの読み込み、書き込みの規定は実はSTEPファイルにはありません。それを行なったソフトウエアが紐づけられるため、そのデータに対する表現方法に実はルールがないという状況なのです。
従って、例えばミスミのECサイトでダウンロードしたSTEPデータが、別のCADソフトを読めるとは限らないということです。正式の方法で読めるデータは、STEPsolutionsのサイトにあるプレビュワー以外はないということです(※アプリケーション単位での取り決めをしている場合はその限りではありませんが)。
たまに何もわかってない人が、「ミスミでダウンロードしたSTEPファイルはFusion 360で全部読めるし、変換後のデータも何もしなければ同じ」と勘違いされることがあります。それは大きな間違いで、インポート・エクスポート時に結構大胆なデータの変更が行われます。

ちなみに感覚的にですが、Fusion 360でエクスポートされるSTEPのデータは、元データと比べDATAセクションがぶくぶくに膨れ上がる印象があります。恐らく、相当ややこしい処理をしていて、無駄な要素を追加している分、データ干渉の問題があったとしても回避できるように対処しているのでしょう。データ管理の意味ではあまり問題はないですが、STEPを使ったアプリの連携をやるときには、あまり望ましいやり方とは思えないです。

DATAセクション

DATAセクションは、基本的に構造データや材料のデータなどが含まれている部分でいわゆるモデルパートです。
私は、最近STEPCodeを利用しまして、最も単純な最小的な構造って一体どんなものか?と考えた結果、それは円盤だと思いました。

実際のデータによる検証

そこで、「z=0に、xy平面に半径5の円盤を配置」を表現したSTEPファイル(データ部のみ)を用意してみました。大体このくらいの長さです。

この通り、FreeCADで実行すると、次のような結果となります。

simple_shapes.stpをFreeCADで実行

それぞれの構文の意味については、今後解説する予定です。

DATAセクション解析用のツール

DATAセクションの解析用ツールを作りました。Qiitaの記事を載せておきます。

①STEP→yamlに変換

②yamlから抽出したいidを選んで、stepに再変換

どうやったのかというと、まずはSTEP→yamlファイルに変換します。yamlファイルに変換する理由としては、データツリー構造がどことどういう依存関係になっているのかを知るためです。

先ほどのSTEPファイル、よく見るとインデント(空白)が入っているのが分かりませんか?他の会社が提供するSTEPファイルなどは、こうしたインデントを入れていないので、データを可視化しようと思ったとしても、それがどんな構造になっているのかを予想することが出来ません。
しかし、実際はSTEPファイルが実は単純なノード構造を取っていることが分かれば、そこまで対処は難しくないのです。

ちなみにyamlで変換するとこんな感じになります。

これは先ほどのスプロケットのデータをyamlデータに変換したときの一部のデータです。とてもとても長く、1データにつきyamlが80000行(!)となっていますが、実はこのうち構造を表すデータは70000行となっていて、所詮先ほどのsimple_shapes.stpの

#17=ADVANCED_FACE('',(#18),#31,.T.);
から
#35=DIRECTION('',(1.,0.,0.));

の行までのような「モデルの構造や数値に関するデータ」が大部分になります。なので、実は大量のyamlデータを出力しているように見えて、必要なデータで重要なポイントはほんの少しということです。

ちなみにどんな関数(エンティティ)が与えられているかは、以前の記事で軽く扱いました。

せっかくなので、次以降で、このファイルの中身を解説していったりして、CAD上でいろいろな図面を書くということをやっていきたいと思います。

ツールやプロジェクトについて

気になったらここに随時上げてます。
なお、基本的にSTEPCodeを含むいくつかのライブラリをたくさん使っているので、git submoduleで少し時間がかかる点に注意してください
(boostライブラリが見えますが、今のところ使ってません。いずれ使うと思います)。

IDEはVisual Studio 2019を使っています。・・・が、今であればVSCodeなんかも使えるはずです。Visual Studio 2019でのやり方は以下を参考にしてみてください(基本的にはcmakeさえできれば、すぐ実行出来るようになっているはず)


この記事が気に入ったらサポートをしてみませんか?