【VC++＆STEP CADデータ】yamlファイルを使ってSTEPファイル(AP203)を簡単にする


# 過去記事

これの続き

https://qiita.com/belre/items/063aa02a2328b8eddd49

# AP203データフォーマット

AP203のSTEPファイルは、こんなフォーマットになっている。

```KANA_NK35B10D9_K.stp
ISO-10303-21;
HEADER;
FILE_DESCRIPTION( ( 'STEP AP203' ), '1' );
FILE_NAME( 'p:/temp/worker_7/temp/exporttempdir_4092_1410_eV1Z3/format_0/KANA_NK35B10D9_K-_0-N_A_(H 720 N_A  0 0 N_A N_A).stp', '2020-10-28T10:44:47', ( 'License CC BY-ND 4.0' ), ( 'CADENAS' ), ' ', 'PARTsolutions', ' ' );
ENDSEC;
DATA;
#1 = DESIGN_CONTEXT( '', #27, 'design' );
#2 = APPLICATION_PROTOCOL_DEFINITION( 'international standard', 'config_control_design', 1994, #27 );
#3 = PRODUCT_CATEGORY_RELATIONSHIP( 'NONE', 'NONE', #28, #29 );
#4 = DATE_AND_TIME( #30, #31 );
...
ENDSEC;
END-ISO-10303-21;
```

つまり、こんな構成だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/c8bb35bd-2e11-2380-cf54-78f4c81331fa.png)

詳しくはここを参照。

https://docs.fileformat.com/3d/step/

なお、実際はANCHOR, REFERENCE, SIGNATUREと言ったセクションも入れられるらしい。

こうしたセクションが使われるのを見たことはないが、
恐らくSTEPデータを取り扱うソフトウエアでこれが埋め込まれているのを見たことがないので、
まともに実装されていない可能性もある。

## HEADERセクション

HEADERセクションにはこのSTEPファイルの説明を書く。

wikipedia程度の記事を参考にすると
https://en.wikipedia.org/wiki/ISO_10303-21

```
FILE_DESCRIPTION( ( 'STEP AP203' ), '1' );
FILE_NAME( 'simple_shapes.stp', '2022-10-26T06:46:25', ('o yucho'), 
         ( 'Hoge Inc.' ), 'Piyo App', 'Huga App', 'o yuchoの上司:aaa@bbb.com' );
FILE_SCHEMA( ( 'CONFIG_CONTROL_DESIGN' ) );
```

まあ、スキーマやタイムスタンプ、名前、STEPファイルを出力したアプリケーション名、そういったものを書くみたいだ。

FreeCADで出力しているのを見ると

https://www.freecadweb.org/index.php?lang=ja

```
FILE_DESCRIPTION(('FreeCAD Model'),'2;1');
FILE_NAME(
  '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 }'));
```

とは出ているので、一応ちゃんとソフトウエアごとの管理などはされていると思ってよい。

まあ最近CADクラウドサービスなどをやっている某大手が、FreeCADと書いてあるところにPARTsolutionsと書いてあったのは内緒だ。

https://partsolutions.com/

つまり、ECサイト運営の管理は自社であるが、CADデータのエクスポートは自社でやっているわけではなく、他社のサービスを活用し、そのルールに基づいてCADデータを生成しているということがよく分かる。
CADサービスのインフラ保守・運用費がバカ高くなるのはこのせいだな・・・。

## DATAセクション

さて、このDATA部がなかなかの問題で、STEPファイルの形式を分かりづらくさせている。
とりあえず、上手くハックして、xy平面に薄い半径5の円盤を描くことに成功した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/d07c2af3-bc88-f97e-1fd6-9d41570fe492.png)

このハックに、yamlデータの抽出が結構役立ったので、まとめる。

### プロジェクト

AP203→YAMLは以前の記事の通り

https://github.com/belre/STEP_AP203_Preview/tree/main/src/AP203toYaml

今回の記事は、
YAMLデータを加工して、
AP203のデータの一部を抽出して、
データとして取り扱いやすいようにインデント付与を行なうようにした。

https://github.com/belre/STEP_AP203_Preview/tree/main/src/FormatTool


## AP203→YAMLへの変換

前回の記事と同じCADモデル(STEP:ap203)を使用した。
それをYAMLで変換した結果

https://raw.githubusercontent.com/belre/STEP_AP203_Preview/main/src/FormatTool/YamlData/BSP35B20-N-12.yaml

・・・なんだが、このデータは８万行近く存在している。
STEPファイル5000要素に対して、yamlファイルが80000行あるようでは、そもそもSTEPファイルの基本的なフォーマットを理解するにはあまりにも多すぎるであろう。

それをギアのみだけ抽出したのがこちら。

https://raw.githubusercontent.com/belre/STEP_AP203_Preview/main/src/FormatTool/YamlData/BSP35B20-N-12-gear.yaml

80000行から、70000行に変わった程度で、大きな違いが・・・という感じだが、
これがCADモデルの構成要素のyamlルート3つをまとめたものになった。

そのyamlファイルを、
FormatToolを使って必要な項目だけを読み取るようにし、
そのままSTEPファイルに変換したものがこちら

https://github.com/belre/STEP_AP203_Preview/blob/main/src/FormatTool/StepData/BSP35B20-N-12-gear.step

行数はあまり変わらず。
複雑さもあまり変わらず。

## 円盤だけをFreeCADで表示させるデータで表現

そこから、なんやかんや行なった結果、
円盤だけを表示する、という簡単なものでも一苦労だったが、
次のようなフォーマットに変換することが出来た。

YAMLファイル：

https://github.com/belre/STEP_AP203_Preview/blob/main/src/FormatTool/YamlData/simple_shapes.yaml

STEPファイル：

https://github.com/belre/STEP_AP203_Preview/blob/main/src/FormatTool/StepData/simple_shapes.stp

大幅に行数が減り、STEPファイルのDATA部を40個程度に減らすことが出来た。

これにより、xy平面による円盤を表現することが出来る。

### このファイルの生成をしたときにやったこと

重複なし、重複あり版のSTEPのDATA部のみを抽出するプログラムを作成。

重複なし：

https://github.com/belre/STEP_AP203_Preview/blob/main/src/FormatTool/StepData/simple_shapes.indent.step.txt

重複あり：

https://github.com/belre/STEP_AP203_Preview/blob/main/src/FormatTool/StepData/simple_shapes.indent_duplicated.step.txt

重複ありというのは、#～と書かれているのが複数回登場している場合に、
それを省略しないということ。

STEPにおいては、基本的には重複なしが基本なのだが、
重複なしだとデータに何が紐づけられているか分かりづらかったので、
重複ありも加えて評価するようにした。

## 最終的に使われているスキーマ

スキーマの中で、ルートとして使われているのは、以下の２つであることが判明。
以降の記事で、それぞれの項目や階層について、何を意味しているかを説明していきたい。

- APPLICATION_PROTOCOL_DEFINITION
- SHAPE_DEFINITION_REPRESENTATION

なお、STEPファイルはあくまでモデリングデータの「入れ物(Container)」なので
それをどう取り扱うべきかはソフトウエア側で選択する必要があると思われる

（※正直ソフトウエアに全部丸投げしている感がしていて、
　あまり好ましい対応ではないのだが・・・）