Autocadに関する内容です。
DynamoもしくはVBA,Lispなどで、Autocadのポリラインの頂点位置情報を取り出し保存する方法を探しています。
調べている限りでは、LIST [オブジェクト情報] コマンドを用いて、一つずつ行うやり方があるようなのですが、大量のポリラインがある場合に1つずつやるには向いていません。
プログラミングを用いてJSONデータの様な記述で情報を取り出し保存できれば,,,と思うのですが、そもそもAutocad上のポリラインの頂点情報にアクセスすることは可能なのでしょうか。
取り出したい情報と保存したい形式のイメージ
ポリライン1 記述スタート
頂点1 x1,y1,z1
頂点2 x2,y2,z2
…………
頂点n xn,yn,zn
ポリライン1 記述終わり
ポリライン2に続く
行いたい処理のイメージ
① 図面内のポリラインを取得
② 取得したポリラインを画層や色などで仕分け
③ 仕分けしたポリライン群に対して、各ポリラインの頂点情報を取り出し保存する処理を繰り返す
④ 結果は階層のあるデータの読み書きに適したフォーマットで保存
よろしくお願いいたします。
解決済! 解決策の投稿を見る。
回答者: YuriHaga. 解決策の投稿を見る。
例によってPython Scriptです。
CountColor.dynは色が指定したインデックスであるポリラインの個数を勘定します。
LayerCoord.dynは3種の画層に設定されたポリラインの頂点座標を出力します。
お世話になっております。
Pythonでの記述ありがとうございます。
LayerCoord.dynを確認しました。
こちらでは、Dynamoノードを介さずPythonでAutocadのActiveXに書かれている関数を利用している状態でしょうか。
https://help.autodesk.com/view/OARX/2023/JPN/?guid=GUID-5D302758-ED3F-4062-A254-FB57BAB01C44
また、Pythonの中での質問になるのですが、処理順としては以下のような手順になっているのでしょうか。
空間内にあるオブジェクトを取得し、それがポリラインであれば目的の作業を実施
for ID in model_space:
obj = t.GetObject(ID, OpenMode.ForRead)
if isinstance(obj, Polyline):
pl = obj
lpts = None
画層名毎に格納箇所を仕分け
if pl.Layer == 'C-ROAD-PROF-TEXT':
lpts = lpts0
elif pl.Layer == 'C-ROAD-SCTN-TEXT':
lpts = lpts1
elif pl.Layer == 'D-BGD-HICN':
lpts = lpts2
if lpts != None:
ポリラインの頂点数取得
object.NumberOfVertices
ポリラインのある頂点の座標取得
Polyline.GetPoint2dAt Method
ポリラインのある頂点の座標のX,Y座標取得
Point2d.X Property
Point2d.Y Property
Autocadだけでなく、Pythonでも今まで知らなかった記述方法が沢山あってすごく参考になります。
「AutoCAD VBA 非推奨」で検索すると プラットフォーム差による VBA の問題と AutoCAD 2014 という2013年の記事が出てきて,「VBA の言語仕様は、十数年前の Visual Basic 6.0 のままです。VBA が持つ COM との互換性があり、.NET Framework ベースの新しい VB.NET を使うことが可能な AutoCAD .NET API が移植先として最適なのです。」と書かれております。ヘルプのVBAの項にはっきり「非推奨」と書いてほしいです。書いてあるのかな。