AutoCAD 上の 3D ソリッドや 3D サーフェス、リージョン の 3D オブジェクトは、ポリメッシュなどの一部を除いて、 ソリッドカーネルの 1 つである Autodesk Shape Manager を利用して作成されています。ソリッドカーネルは、複雑な演算処理を隠蔽して、 3rd party の開発者側の高度な演算を必要とせずに 3D オブジェクトの処理を実行出来るようにする 3D CAD の要です。オートデスク製品では、AutoCAD 以外にも、Inventor や Revit なども Autodesk Shape Manager を利用しています。
複雑な演算処理を「隠蔽」というと少しおおげさですが、分かりやすい例として、AutoLISP で 3D ソリッドの情報を取得を見てみましょう。下記は、BOX[直方体] コマンドを使って100×100×100 の立方体を作成、(entsel) 関数で選択、(entget) 関数から返されるエンティティ リストの例です。
AutoCAD メニュー ユーティリティ がロードされました。
コマンド:
コマンド: BOX最初のコーナーを指定 または [中心(C)]: 0,0,0
別のコーナーを指定 または [立方体(C)/長さ(L)]: 100
高さを指定 または [2 点(2P)] <490.3857>: 100
コマンド: (entget (car (entsel)))
オブジェクトを選択: ((-1 . <図形名: 20dafe20f20>) (0 . “3DSOLID”) (330 . <図形名: 20dab34a1f0>) (5 . “362”) (100 . “AcDbEntity”) (67 . 0) (410 . “Model”) (8 . “0”) (100 . “AcDbModelerGeometry”) (70 . 1) (1 . “mmloo nnl m k “) (1 . “ni ^*+0;:,4 ^*+0\\^[ mo ^LR mmhqoqoqijjlj QK o “) (1 . “n fqfffffffffffffffjkh:roh nqooooooooooooooooli:rno “) (1 . “>,27:>;:- {rn rn _nl mmhqoqoqijjlj |”) (1 . “=0;& {rn rn {rn {m {rn {l |”) (1 . “3*2/ {rn rn {rn {rn {k {n |”) (1 . “+->1,90-2 {rn rn n o o o n o o o n jo kfqffffffffffffffmgf jo n 10@-0+>+: 10@-:93:<+ 10@,7:>- |”) (1 . “,7:33 {rn rn {rn {rn {rn {j {rn {m |”) (1 . “9><: {i rn {rn {h {g {k {rn {f 90-(>-; ,6183: |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {j n n n o |”) (1 . “9><: {no rn {rn {nn {nm {k {rn {nl -:):-,:; ,6183: |”) (1 . “300/ {rn rn {rn {rn {nk {j |”) (1 . “/3>1:r,*-9><: {rn rn {rn o o jo o o n n o o 90-(>-;@) V V V V |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {h n n m o |”) (1 . “9><: {nj rn {rn {ni {nh {k {rn {ng -:):-,:; ,6183: |”) (1 . “300/ {rn rn {rn {rn {nf {h |”) (1 . “/3>1:r,*-9><: {rn rn {rn o o rjo o o n n o o 90-(>-;@) V V V V |”) (1 . “<0:;8: {rn rn {rn {mo {mn {mm {ml 90-(>-; {g o {rn |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {nn n n l o |”) (1 . “9><: {mk rn {rn {mj {mi {k {rn {mh -:):-,:; ,6183: |”) (1 . “300/ {rn rn {rn {rn {mg {nn |”) (1 . “/3>1:r,*-9><: {rn rn {rn o rkfqffffffffffffffmgf o o n ro ro o n 90-(>-;@) V V V V |”) (1 . “<0:;8: {rn rn {rn {mf {lo {ln {lm 90-(>-; {nm o {rn |”) (1 . “<0:;8: {rn rn {rn {ll {nk {lk {lj 90-(>-; {g o {rn |”) (1 . “<0:;8: {rn rn {rn {nk {ll {li {lh 90-(>-; {g o {rn |”) (1 . “<0:;8: {rn rn {rn {lg {lf {nk {ml -:):-,:; {ko o {rn |”) (1 . “:;8: {kn rn {rn {km rkfqffffffffffffffmgf {kl kfqffffffffffffffmgf {mm {kk 90-(>-; _h *1410(1 |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {ni n n i o |”) (1 . “9><: {kj rn {rn {ki {kh {k {rn {kg -:):-,:; ,6183: |”) (1 . “300/ {rn rn {rn {rn {kf {ni |”) (1 . “/3>1:r,*-9><: {rn rn {rn rjo o o n o o o o rn 90-(>-;@) V V V V |”) (1 . “<0:;8: {rn rn {rn {jo {li {jn {jm 90-(>-; {nh o {rn |”) (1 . “<0:;8: {rn rn {rn {jl {nf {jo {jk 90-(>-; {nm o {rn |”) (1 . “<0:;8: {rn rn {rn {nf {jl {jj {ji 90-(>-; {nm o {rn |”) (1 . “<0:;8: {rn rn {rn {lf {lg {nf {lm -:):-,:; {ko o {rn |”) (1 . “:;8: {jh rn {rn {jg rkfqffffffffffffffmgf {jf kfqffffffffffffffmgf {ln {io 90-(>-; _h *1410(1 |”) (1 . “<0:;8: {rn rn {rn {mn {mo {in {im 90-(>-; {g o {rn |”) (1 . “<0:;8: {rn rn {rn {il {ik {mo {lj -:):-,:; {kh o {rn |”) (1 . “:;8: {ij rn {rn {kl rjo {ii jo {lk {ih 90-(>-; _h *1410(1 |”) (1 . “<0:;8: {rn rn {rn {mg {ig {mn {lh -:):-,:; {nh o {rn |”) (1 . “:;8: {if rn {rn {ho rjo {km jo {li {hn 90-(>-; _h *1410(1 |”) (1 . “<0:;8: {rn rn {rn {ln {mm {ig {hm 90-(>-; {ko o {rn |”) (1 . “<0:;8: {rn rn {rn {mm {ln {il {hl -:):-,:; {ko o {rn |”) (1 . “300/ {rn rn {rn {rn {lg {ki |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {ml n n mk o |”) (1 . “):-+:’ {hk rn {rn {ml o {hj |”) (1 . “):-+:’ {hi rn {rn {ml n {hh |”) (1 . “,+->687+r<*-): {rn rn {rn jo o jo o n o V V |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {mj n n nm o |”) (1 . “9><: {hg rn {rn {rn {ko {k {rn {hf -:):-,:; ,6183: |”) (1 . “300/ {rn rn {rn {rn {il {mj |”) (1 . “/3>1:r,*-9><: {rn rn {rn o kfqffffffffffffffmgf o o rn o o o rn 90-(>-;@) V V V V |”) (1 . “<0:;8: {rn rn {rn {go {in {ik {gn 90-(>-; {mi o {rn |”) (1 . “<0:;8: {rn rn {rn {ig {mg {mf {jk -:):-,:; {nh o {rn |”) (1 . “<0:;8: {rn rn {rn {in {go {mg {jm -:):-,:; {mi o {rn |”) (1 . “:;8: {gm rn {rn {ho rjo {gl jo {jn {gk 90-(>-; _h *1410(1 |”) (1 . “<0:;8: {rn rn {rn {lo {mf {go {gj 90-(>-; {nm o {rn |”) (1 . “:;8: {gi rn {rn {jf rjo {gl jo {jo {gh 90-(>-; _h *1410(1 |”) (1 . “<0:;8: {rn rn {rn {ik {il {lo {ji -:):-,:; {kh o {rn |”) (1 . “:;8: {gg rn {rn {gf rjo {jg jo {jj {fo 90-(>-; _h *1410(1 |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {lm n n mn o |”) (1 . “):-+:’ {fn rn {rn {lm o {fm |”) (1 . “):-+:’ {fl rn {rn {hm n {fk |”) (1 . “,+->687+r<*-): {rn rn {rn jo o rjo o rn o V V |”) (1 . “<0:;8:
{rn rn {rn {kf {jn {ll {im -:):-,:; {mi o {rn |”) (1 . “:;8: {fj rn {rn {ii rkfqffffffffffffffmgf {ho kfqffffffffffffffmgf {in {fi 90-(>-; _h *1410(1 |”) (1 . “<0:;8: {rn rn {rn {jj {lk {lf {hl 90-(>-; {kh o {rn |”) (1 . “<0:;8: {rn rn {rn {lk {jj {kf {gn -:):-,:; {kh o {rn |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {lj n n ni o |”) (1 . “):-+:’ {fh rn {rn {lj n {fg |”) (1 . “,+->687+r<*-): {rn rn {rn o kfqffffffffffffffmgf jo rn o o V V |”) (1 . “<0:;8: {rn rn {rn {li {jo {lg {hm -:):-,:; {nh o {rn |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {lh n n j o |”) (1 . “):-+:’ {ff rn {rn {im n {noo |”) (1 . “,+->687+r<*-): {rn rn {rn o rkfqffffffffffffffmgf jo n o o V V |”) (1 . “:;8: {non rn {rn {km rjo {jf jo {lg {nom 90-(>-; _h *1410(1 |”) (1 . “:;8: {nol rn {rn {kl rjo {jg jo {lf {nok 90-(>-; _h *1410(1 |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {km n n mj o |”) (1 . “/061+ {rn rn {rn jo rkfqffffffffffffffmgf jo |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {kl n n mi o |”) (1 . “/061+ {rn rn {rn jo kfqffffffffffffffmgf jo |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {ki n n ng o |”) (1 . “/3>1:r,*-9><: {rn rn {rn jo o o rn o o o ro n 90-(>-;@) V V V V |”) (1 . “<0:;8: {rn rn {rn {jn {kf {jl {gj -:):-,:; {mi o {rn |”) (1 . “:;8: {noj rn {rn {ii rjo {gf jo {ik {noi 90-(>-; _h *1410(1 |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {jm n n f o |”) (1 . “):-+:’ {noh rn {rn {gj o {nog |”) (1 . “,+->687+r<*-): {rn rn {rn rjo rkfqffffffffffffffmgf o o o rn V V |”) (1 . “:;8: {nof rn {rn {gl rkfqffffffffffffffmgf {gf kfqffffffffffffffmgf {go {nno 90-(>-; _h *1410(1 |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {jk n n k o |”) (1 . “,+->687+r<*-): {rn rn {rn o rkfqffffffffffffffmgf rjo rn o o V V |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {ji n n nl o |”) (1 . “):-+:’ {nnn rn {rn {ji o {nnm |”) (1 . “,+->687+r<*-): {rn rn {rn o kfqffffffffffffffmgf rjo n o o V V |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {jg n n mm o |”) (1 . “/061+ {rn rn {rn jo kfqffffffffffffffmgf rjo |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {jf n n mo o |”) (1 . “/061+ {rn rn {rn jo rkfqffffffffffffffmgf rjo |”
) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {im n n no o |”) (1 . “,+->687+r<*-): {rn rn {rn rjo o jo o rn o V V |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {ii n n nh o |”) (1 . “/061+ {rn rn {rn rjo kfqffffffffffffffmgf jo |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {ho n n nn o |”) (1 . “/061+ {rn rn {rn rjo rkfqffffffffffffffmgf jo |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {hm n n nf o |”) (1 . “,+->687+r<*-): {rn rn {rn jo rkfqffffffffffffffmgf o o o rn V V |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {hl n n ml o |”) (1 . “,+->687+r<*-): {rn rn {rn jo kfqffffffffffffffmgf o o o rn V V |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {gn n n nj o |”) (1 . “,+->687+r<*-): {rn rn {rn rjo kfqffffffffffffffmgf o o o rn V V |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {gl n n g o |”) (1 . “/061+ {rn rn {rn rjo rkfqffffffffffffffmgf rjo |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {gj n n h o |”) (1 . “,+->687+r<*-): {rn rn {rn rjo o rjo o n o V V |”) (1 . “/:-,*=:1+r><>;L036;W6,+0-&r>++-6= {rn rn {rn {rn {gf n n nk o |”) (1 . “/061+ {rn rn {rn rjo kfqffffffffffffffmgf rjo |”) (290 . 1) (2 . “{2962df33-1abe-9546-8b25-ccee59f21cbd}”) (100 . “AcDb3dSolid”) (350 . <図形名: 20dafe20f50>))
ご覧のとおり、情報が隠されて見えないのではなく、見てもよくわからない状態になっていることがわかります。線分や円を選択した際には、DXF グループコードで区別されたドットペアで、始点、終点、中心点、半径などの情報を読み取ることが出来るのをご存じと思います。
もし、API で 3D ソリッドや 3D サーフェスの意味のある情報にアクセスする必要がある場合には、境界表示ライブラリ(BRep)を用いてトポロジー情報(位相情報)と呼ばれる論理構造にアクセスしてから、トポロジーに対応する幾何情報を得る必要があります。
AutoCAD API の中で境界表示ライブラリを利用出来るのは、ObjectARX と AutoCAD .NET API のみです。
複数の面から構成される 3D ソリッドの場合、境界表示の構成要素(サブエンティティ)は、Brep、Complex、Shell、Loop、Face、Edge、Vertex に分けられ、それぞれ、トポロジー本体(Brep)、ループ(Loop)、面(Face)、エッジ(Edge)、頂点(Vertex)情報を保持しています。このうち、Complex と Shell は、AutoCAD ではサブエンティティタイプとして公開されていないため、ユーザが直接選択することが出来ず、API 走査時にアクセスする抽象レベルの情報となります。

3D オブジェクトは、ソリッド カーネルが自動的に最適化してトポロジー情報を維持しています。このため、ブール演算などの編集操作の前後では、トポロジー情報が変化する可能性があります。このため、残念ながら、「何番目の面」が必ず「この面」のような前提は利用出来ません。
次のカスタム コマンド例は、選択した 3Dソリッドのトポロジー構造を走査して、各構成面と、その面を囲むエッジを順番にハイライトしていくものです。ワイヤフレーム表示スタイルを使用していますが、面自体のハイライトは面が表を向いている(法線ベクトルがこちらを向いている)ものだけ表現されます。裏面になる場合は、面のエッジのみがハイライト表現されています。また、ハイライトする面の順番は、あくまで列挙された順番になります。

上記のコード例は、次の Autodesk Knowledge Network 記事でご紹介しています。
AutoCAD .NET API :トポロジー情報のアクセス

トポロジー情報を使った応用例には、次のようなものがあります。
AutoCAD .NET API :点がサーフェス上に位置しているか?
最後に少し補足です。トポロジー情報そのものではありませんが、面(Face)、エッジ(Edge)、頂点(Vertex)に対応するサブエンティティを選択する目的で、[選択] リボンパネルにサブエンティティ選択フィルタが用意されています。
このように、Autodesk Shape Manager を利用する 3D オブジェクトは、位相と呼ばれる構成要素の相関関係を維持するトポロジー情報によって管理、最適化されています。
API から座標や大きさ(長さ、高さ、面積、体積など)の幾何情報を取得する場合には、まず、このトポロジー情報をインターフェースにアクセスすることが必須になります。
このアプローチは、Autodesk Shape Manager を採用する他のオートデスク製品のアドイン用 API でも同様です(具体的なクラス名やメソッド、プロパティ名は当然異なります)。
By Toshiaki Isezaki

You must be logged in to post a comment.