Parasolidの紹介

# パラソリッドとは
ジオメトリモデラー

メジャーなジオメトリモデラー(CAD Kernel)とCAD
- PARASOLID, Unigraphics Solutions Inc(Siemens Software): UG(NX), IDEAS, SolidEdge, Solidworks
- ACIS, Spatial Technology(Dassault Systèmes):AutoCAD，CADKEY，Mechanical Desktop，Bravo
- CAS.CADE, MDTV(Matra Datavision): Euclid-IS, QU ANTUM

正確な境界表現(B-rep) ジオメトリモデラー
- 固体オブジェクトの構築と操作
- 質量特性（質量中心、慣性）を計算する
- 多くの方法でオブジェクトを出力する
- オブジェクトをディスク上のファイルに保存し、後で取得する
- Clash検出

カーネルの機能
- ハードウェアに依存しない Windows NT、UNIX、Linux
- OS、GUIに依存しない
- C言語

PKインターフェース
- Parasolidのメインインターフェース
- アプリケーションがオブジェクトをモデル化および操作し、モデラーの機能を制御する⼿段です。


下向きインターフェース
- これらは、データ集約型またはシステム タイプの操作を実⾏するためにモデラーによって呼び出されます。
- Frustrum, Graphical Output (GO)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/478b2e9d-a02c-ae62-bf48-0f55366135f5.png)

# PK Interface

PKインターフェース（通常はPKと呼ばれる）は、Parasolidへのアクセスを提供します。

4の構成
1. 部品構成(Part construction) : パーツの構築、変更、組み合わせの機能
1. Enquiry : パーツのプロパティに関する情報を返したり、質量プロパティ、幾何学情報、レンダリング情報を計算したりするための関数。
1. Kernel management : 報、フラストラム関数、セッションパラメータなど、カーネルの特性を管理するための機能
1. Part management : パーツ ファイルの読み込みと保存、および属性の管理を⾏う機能

PK Interfaceを使い始める
- セッションを開始する：PK_SESSION_start
- セッションを終了する：PK_SESSION_stop

PK Interface関数のクラス
PK インターフェース関数は次のサブクラスに分類されます。
- CLASS : クラス階層のナビゲート
- SESSION : セッション管理
- ERROR : エラー処理
- MEMORY : メモリ管理
- PARTITION, PMARK, MARK, DELTA : Rollback

PK関数形式:`PK_<OBJECT>_<text>`
- `<OBJECT>` : 関数が操作するエンティティクラス。BODY、FACE
- `<text>` : 操作を説明する動詞と名詞の組み合わせ。例：create, make, delete 
- 例：`PK_BODY_create_solid_block`

PK関数への引数:
- 単純な値、配列、および構造体
- オプションにオプション構造を使用する

エラー処理
- 戻り値 PK_ERROR_no_errors は成功を意味します
- エラー処理⽅法: エラーハンドラを登録するか、各関数の戻り値をチェックして自分で⾏う

PK関数の例
```c++
PK_BODY_create_solid_block
( --- received arguments ---
double x, --- block extent in local x direction (>0)
double y, --- block extent in local y direction (>0)
double z, --- block extent in local z direction (>0)
const PK AXIS2 sf t*basis_set, --- position and orientation
--- returned arguments ---
PK BODY t *const body --- solid body returned
)
```

# 下向きのインターフェース（frustrum）
The frustrum
- フラストラムは、アプリケーション プログラマーが記述する必要がある関数のセットです。これらは、次のタスクを実⾏するために Parasolid によって呼び出されます。
    - フラストラム制御
    - ファイル（パーツデータ）処理：Parasolid パーツファイルおよびその他のデータの保存と取得。
    - メモリ管理: 内部計算とデータ構造の保存用にメモリを割り当てます
    - グラフィカル出力

- Parasolid Kernelを使用するためのセッションを開始する前に、フラストラムを登録します

提供する必要がある可能性のある Frustrum 関数
- FSTART:フラストラムを初期化する
- FMALLO:仮想メモリの連続領域を割り当てる
- FMFREE:仮想メモリの領域を解放する (FMALLO から)
- FFOPRD/FFOPWR: Frustrum ファイルのすべての形式を開く
- FFREAD/FFWRIT:許可されている場合、ファイルからの読み取り/ファイルへの書き込み
- FFCLOS:フラストラムファイルを閉じる
- FABORT:中⽌された操作の後の整理/ロングジャンプ
- FTMKEY: TESTFR に必要なキー ネーム サーバー
- FSTOP:フラストラムを閉じる


Graphical Output （GO）：モデルを表⽰するために必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/4f6a9775-8c1b-e9ba-76e6-ab60a8ab14aa.png)

ラインデータを⽣成するレンダリング機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/4d221607-ea41-000f-2ed3-ba2b12a57fef.png)

GO Functions
- GOOPSG:階層セグメントを開きます。
- GOSGMT:単⼀レベルのセグメントを出力します。
- GOCLSG:階層セグメントを閉じます

# ファイルタイプとファイル拡張⼦
ファイル名拡張⼦
- text-based: .*_t
- binary-based: .*_b (推奨)

ファイルタイプ (FAT)
- Transmit (Part): .x_t , .x_b
- Schema: .s_t,.s_b
- Journal: .j_t, .j_b
- Snapshot: .n_t .n_b
- Partition: .p_t , .p_b

# Parasolid Entity
エンティティは主に 3 つのタイプに分類されます。
- Geometrlc Entitles
- Topologlcal Entltles
- Other Entltles
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/2ebed550-f862-2891-07bb-1dbbb5274e26.png)

## Topological Entities 
すべての実体から成り、モデルの構造または骨組みを構成する
1. Body
    - Acorn : 孤⽴した頂点。
    - Wire : 接続されたエッジ(manifold)
    - Sheet : 接続された面
    - Solid : ソリッド領域
    - General
1. Region
    - 3D 空間のサブセット
    - 物体には常に無限の空隙領域があり、物体内のすべての領域が3D 空間全体を構成します。
1. Shell : 領域の境界とみなすことができる
1. Face : Surfaceサブセット
1. Loop : 
    - 面境界の接続されたコンポーネント
    - ループの⽅向は、面の上からループの⽅向を見たときに、面がループの左側に局所的に位置するようにします
1. Fin : ループによるエッジの⽅向付けされた使用を表す
1. Edge : エッジは単⼀の曲線の境界部分です
    - A laminar : one fin
    - A manifold : two fins
    - A general edge : more than 2 fins
1. Vertex : 頂点は空間内の点を表し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/97d25ce8-d251-1b4c-7e89-971b3ddc0a78.png)


## Manifold Body

Minimal body
- ゼロ次元
- 空間内の点
- 1つのボイド領域、シェル、ループ、頂点
- ポイントを使用して作成`PK_POINT_make_minimum_body`

Wire
- ⼀次元的
- 単純に接続されたエッジのセット
- どの頂点にも2つ以上の辺がない
- 1 つのボイド領域、1 つのシェル

Acorn
- 複数の頂点を持つことができる点を除いて、最小ボディと同じです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/d4453091-4ec1-09d2-70a6-378ddd585950.png)


Sheetシェル
- ⼆次元
- 単純に）接続された面の集合（少なくとも 1 つの面)
- 厚さゼロ
- どのエッジにも2面以上は不可
- オープン」または「クローズド」にすることができます
- 1つまたは2つのボイド領域と1つまたは2つのシェル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/e54f0b6c-fe8b-d96d-e4c4-2cba38a29132.png)

Solid
- 3次元
- 連続した有限の体積を占める
- 少なくとも 2 つの領域(two regions)
    - 1つの固体領域
    - 任意の数の空隙領域
    - 1 つの空隙領域は無限

## Geometrical Entities

manifold bodies
デフォルトタイプ、エイコーンボディ、ワイヤボディ、シートボディ、ソリッドボディ

general bodies

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/5839d1c3-8ef1-86bd-b142-fba4132c02bb.png)


1. セルボディ ‑ 内部面で区切られた⼀般的なボディ 
1. 混合次元ボディ 
1. ⾮多様体ボディ ‑ 2 つのボス間のエッジが⾮多様体 
1. 分離ボディ ‑ 4 つの分離したピースから構成されます

# Geometrical Entities
Orphan geometry: 孤⽴ジオメトリは、どの位相エンティティにも接続されて
いないジオメトリです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/4b5ab897-0c1a-e97f-4f77-d848c1af63ae.png)

# Entity related
- セッション内の特定のエンティティの識別⼦。
- 1回のセッションでユニークであること
- 整数PK関数はエンティティへのポインタとして使用します
- 存続期間: 参照するエンティティがまだ存在している間
- カーネル内でのみ作成され、以下からのみ取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/058406b4-21e9-cef4-1e63-4d5cebfa9b5e.png)

# パラソリッド機能
Model representation
• Geometry & Topology
• General Topology
• Tolerant modeling

Creation & editing
• Primitives
• Lofting & sweeping
• Blending
• Hole Filling
• Booleans & patterning
• Offset, hollow, thicken
• Face Change
• Model Simplification
• Tapering

Enquiries
• Data structure enquiries
• Mass properties
• Closest Approach
• Clashing & Containment

Rendering & Selection
• Wire frame, hidden line
• Faceting

Application support
• Attributes
• Session & partitioned rollback

Data import/export
• XT format
• Trimmed surface & B-rep support

# Creating Manifold Bodies
ボディを作成する 4 つの⽅法
1. make a primitive body from raw data : ⼀連の PK 関数を使用して、ブロック、円錐、円柱、⾓柱、球、トーラスに必要なすべてのトポロジとジオメトリを⽣成できます
    - examples: PK_BODY_create_solid_block, PK_BODY_create_sheet_circl
e
1. make a body from geometry : PK関数は既存のジオメトリからボディを作成するためにも使用できます
    - Example: PK_SURF_make_sheet_body
1. make a body from topology : ⼀部のローカル操作では、既存のトポロジからボディを作成できます。
    - Example: PK_FACE_make_sheet_body
1. make a body from an existing body
    - copy body : 
    - ⼀般体から多様体を抽出する : PK_BODY_make_manifold_bodies

# 単純体から複雑体へSimple to Complex body
いくつかの操作により、より複雑なタイプのボディを⽣成できます。
- Sweep and spin(スイープして回転させる)
- Imprint(刻印)
- Thicken(厚み)
- Change region type
- Add rubber face
- Pierce

Sweep and spin:ボディのタイプを変更する
`PK_<ENTITY>_sweep`, `PK_<ENTITY>_spin`

Original & resultant entities
- minimum bodies - wire bodies
- wire bodies - sheet body
- sheet bodies - solid body
- faces of solid bodies - an extension to the solid
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/13249a95-6ffd-b1bb-ac08-482469fcdbee.png)

Imprint
PK_BODY_imprint_curve, PK_FACE_imprint_curve
PK_REGION_imprint_curve
- to create new faces
- to create a profile
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/7fd6a636-3bf8-8da5-7ad0-1a2a31e1a02d.png)

Thicken : シートボディをソリッドボディに厚くする
`PK_BODY_thicken`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/a04b182c-05dd-0c6a-da69-69fba7ddedc4.png)

Change region type
PK_REGION_make_solid : 3D space defined by sheet body
PK_REGION_make_void : solid convert to sheet body

Add rubber face
PK_EDGE_make_faces_from_wire
イヤ ボディ内のワイヤフレーム エッジのループにゴム面をアタッチして、シート ボディを作成するために使用できます

Pierce
PK_FACE_delete_from_sheet_body
ロファイルから穴が開いたソリッドを作成するために使用できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/e7b22fdd-3ad6-9c6a-c4bd-8e7742493b1d.png)

Boolean Operation
- Union連合
- Intersection交差
- Subtraction減算

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/3f94217a-a94e-9916-6c77-128004ead206.png)

# Inquiriesお問い合わせ
Class Structureクラス構造
- PK_ENTITY_is, PK_ENTITY_is_<object>
- PK_ENTITY_ask_class

Data Connectionsデータ接続
- Topological Relationships
- Topological/Geometric Relationships
- Session management relationships

Data Relationshipsデータ関係
- PK_FACE_ask_oriented_surf

Topological
- PK_REGION_is_solid
- PK_BODY_ask_type
- PK_SHELL_find_sign

Geometric
- PK_CURVE_eval ; returns points and derivatives
- PK_SURF_eval_with_normal ; returns surface normal
- PK_SURF_ask_param ; returns parameters of surface

Mass Properties
- PK_TOPOL_eval_mass_props