【！CADデータからデータを取り出す！】STEPcodeの紹介と*.stp形式のファイルについて


# 概要

　需要があるかはわからないが、以前、CAD点群データの抽出のために、*.stpファイルを使ったシステムの構築をしていたことがあって、簡単にメモ書き程度にその構文を残しておく。
　なお、*.stpファイルはSTEPファイルと呼ばれ、CADデータから得られる中間的なデータに相当します。

# 目次

※今後追加します

## インストール

https://qiita.com/belre/items/aeab3ba4b0a579927029

https://qiita.com/belre/items/10835be99677d4079374

# ライブラリ

米国NIST認定の無料ライブラリがありますので、こちらを使用します。
そして、なんとこちらはMITライセンスです。通常STEP系を含むCADデータの読み取りを扱ったライブラリはライセンスが煩く、GPL/LGPLであることが多いのですが、こちらはMITライセンスなので一応商用などで扱いやすいメリットがあります。

https://github.com/stepcode/stepcode

日本国内では、コミュニティが全くないような状況ですので、もし興味があってSTPE中間データでプログラミングしたいなぁ〜と思うようなものがあれば、一緒にやりましょう！！

# どんな応用をしたか

![スクリーンショット 2021-03-13 23.56.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/ad56d40a-8af3-b721-826f-42dcec8c3cc8.png)


こんな構造をした構造をした「スプロケット」と呼ばれる部品を、点群データで構成して、そのデータと三角測量方式のセンサを一緒に紐付けて、どのように観察されるかを検討しました。



## 環境

Windows 10及びDebianでインストール可能です。

Windows 10の場合はVisual Studio C++が必携になるのと、VS2017以降に導入されたcmakeを使ってインストールする必要がある点に注意します。

言語はC++またはPythonです。Python版の使い方は実はまだ調査できていないのですが、需要があるかな？と思ったらまとめたりしてみたいな〜と思っています。

また確か、Windows 10のインストールの場合は、詰まりポイントがあって、例えばSTEPファイルの中にも規格データが多様に用意されていて、例えばAP204とかAP213と言った規格が存在するのですが、そのスキーマを別々に読み込まないとインストールできない、という現象がありました。



# *.stpファイルの構文

これだけ知っていれば、とりあえず「点群データの点」だけは抽出可能です
なお、以下のサイトから出してますが、noteのやつも私が書いているので、転載には問題なしです。

https://note.com/belre9/n/n1cd5ee507a77

```
#1833 = CARTESIAN_POINT( '', 1.00, 2.00, 3.00)
```

直交座標系の固定座標点です。

```
# 1832 = VECTOR('', # 2199, 1000.0)
```
ベクトルを表します。第二引数は方向、第三引数はベクトルの長さを表します。

```
# 2199 = DIRECTION('', (0.00, 1.00, 0.00))
```
方向を表します。この場合の方向は、y軸に並行な正規化単位ベクトルになりますね。

```
# 1225 = LINE('', # 1543, # 1544)
```
線を表します。直線を定義するには、第二引数を表す直線の中に含まれる一つの点と、第三引数を表す並進ベクトルがあれば定義できますね。

```
# 1242 = CIRCLE('', # 1584, 17.5)
```
円ですね。第二引数の#1584は基準面、第三引数は円の半径を表します。

```
# 1584 = AXIS2_PLACEMENT_3D('', # 2146, # 2147, # 2148)
```
円は円の方程式(X-X0)^2+(Y-Y0)^2=R^2の形式で表されますね。この円の方程式を定義するのに必要なものは、円の中心と円の法線ベクトルが必要になります。この場合、第二引数は直行座標、第三引数は法線ベクトル、第四引数は法線ベクトルと垂直な方向の１本目のベクトルになります。例えば、

```
# 1242 = CIRCLE( '', # 1584, 17.5)
# 1584 = AXIS2_PLACEMENT_3D('', # 2146, # 2147, # 2148)
# 2146 = CARTESIAN_POINT( '', 3.5, 0, 0)
# 2147 = DIRECTION( 0.0, 0.0, 1.0)
# 2148 = DIRECTION( 1.0, 0.0, 0.0)
```
とかけば、z軸に垂直で、x軸を一番目の平行なベクトルとした、(3.5, 0, 0)の座標が中心の円を、半径17.5で描画しなさい、と言うことになります。プログラミングと似ていますね。

```
# 3166 = B_SPLINE_CURVE_WITH_KNOTS( '', 3, ( ... ), ..., ..., ..., ...)
```
Bスプライン曲線で表されたカーブをあらわします。

```
# 1033 = EDGE_CURVE('', # 1223, # 1224, # 1225, T. );
```

辺を表します。# 1223, # 1224には、最初に示した”頂点”が定義されます。また、# 1225はカーブの形状（直線？円弧？Bスプライン曲線？などなど）が入ります。


# データ読み込み時に注意

以前、製造部品関連大手のミスミ社のCADデータを使って、簡単にデータが読めるかを試したのですが、実はエラーが発生していました。
理由としては、裏にST-Developerと呼ばれるCADのクラウドアプリケーションと連携がされているみたいで、ST-Developerで管理されているSTEPファイルを読み取る際には、ちょっとした注意がいるようです。

https://jp.misumi-ec.com/

※注意！　ミスミ社のSTEPファイルは原則許可なく外にリソースとして出力してシステム化することは認められておりません。CADデータの著作権には十分注意しましょう。

例えば、とあるCADデータでは、このような表記がされています。

```
#46 =  ( NAMED_UNIT( #64 )PLANE_ANGLE_UNIT(  )SI_UNIT( $, .RADIAN. ) );
#47 =  ( NAMED_UNIT( #64 )SI_UNIT( $, .STERADIAN. )SOLID_ANGLE_UNIT(  ) );
```

こちらを、

```
#46 =  ( NAMED_UNIT( * )PLANE_ANGLE_UNIT(  )SI_UNIT( $, .RADIAN. ) );
#47 =  ( NAMED_UNIT( * )SI_UNIT( $, .STERADIAN. )SOLID_ANGLE_UNIT(  ) );
```

とすることで、CADデータを無事STEPCodeで読み取ることができます。