AutoCADマクロ屋本舗 掲示板


3Dソリッドモデルの体積抽出について

1:kobuta :

2020/12/21 (Mon) 09:47:31

3Dモデリング機能からソリッドモデルを作成して、そのモデルから体積を抽出する際はいつも「MASSPROP(マス プロパティ)」コマンドを使用して抽出しています。
しかし、そのコマンドではモデルを1つ1つ選択し、その度に表示されるリストから必要な情報だけをコピーして・・・と手順が多く、どうにか簡略化できないものかと
思っています。

理想は、モデルを選択すると体積情報が抽出され、それをモデル空間上に文字化できるようにする。
もしくは、モデルを選択するとオブジェクトプロパティ管理に体積が表示されるようにする。
選択したモデル順に一覧で体積がリスト化されるなど・・・

上記の方法でなくとも、少しでも簡略化される方法があれば教えて頂きたいです。
お知恵をお貸しください。宜しくお願い致します。
2:chibi-tom :

2020/12/21 (Mon) 12:15:40

3Dは全く分かりませんが
ヘルプを見る限りでは

MEASUREGEOM[ジオメトリ計測] (コマンド)を使用してみるのはどうでしょう

https://help.autodesk.com/view/ACDLT/2021/JPN/?guid=GUID-5D5B0EE1-DD90-47AE-8A55-642FBFF5E4E4


見当違いはスルーしてください
3:kobuta :

2020/12/21 (Mon) 13:56:52

chibi-tom様

ご回答ありがとうございます!
ご紹介頂いた方法、知っているコマンドでしたがすっかり失念しておりました。
確かにこの方法なら、1つ1つリスト表示されてコピー・・するより、連続して体積だけが
コマンドラインに表示されるので簡略化できますね!!

いくつか挙げた方法をマクロを使用して出来るのが理想ではありますが、この方法でも
だいぶ簡略化することが出来ます。
ありがとうございます!
4:zukki- :

2020/12/21 (Mon) 15:57:10

;;;リスプが使えるなら、ロードしてコマンドラインに(fun-name)エンター
;;;ソリッドを選ぶと重心に重心の座標、体積、ソリッドのタイプが
;;;書かれます。
;;;体積の単位が問題のときは、ソースの体積の単位を変える場合のところの
;;;(expt 1 3.0)の1を1000とかに変えてください


(vl-load-com)
(defun fun-name nil
(setq sset (ssget '((0 . "3DSOLID"))))

(if (null sset)
(exit))

(setq i 0
sld-lis nil)

(repeat (sslength sset)
(setq sld-lis (cons (ssname sset i) sld-lis))
(setq i (1+ i)))

(setq sld-lis (mapcar 'vlax-ename->vla-object sld-lis))

(setq sld-lis (mapcar
'(lambda (arg /)
(list
(cons "object" arg)
;;; (cons
;;; "position"
;;; (progn
;;; (setq catch (vl-catch-all-apply 'vlax-get-property (list arg 'position)))
;;; (if (vl-catch-all-error-p catch)
;;; "undef"
;;; (vlax-safearray->list (vlax-variant-value catch)))))
(cons
"centroid"
(vlax-safearray->list (vlax-variant-value (vlax-get-property arg 'centroid))))
(cons
"volume"
(vlax-get-property arg 'volume))
(cons
"solidtype"
(progn
(setq catch (vl-catch-all-apply 'vlax-get-property (list arg 'solidtype)))
(if (vl-catch-all-error-p catch)
"例外"
catch)))))
sld-lis))


(mapcar '(lambda (arg /)
(command "-text"
"non"
(cdr (assoc "centroid" arg))
""
""
(strcat "centroid:"
(vl-princ-to-string (cdr (assoc "centroid" arg)))))
(command "-text"
""
(strcat "volume:"
(rtos (/ (cdr (assoc "volume" arg))
(expt 1 3.0)))));体積の単位を変える場合
(command "-text"
""
(strcat "solidetype:"
(cdr (assoc "solidtype" arg)))))
sld-lis)


(princ))

5:zukki- :

2020/12/21 (Mon) 17:07:45

;;;リスプが使えるなら、ロードしてコマンドラインに(fun-name)エンター
;;;ソリッドを選ぶと重心に重心の座標、体積、ソリッドのタイプが
;;;書かれます。
;;;体積の単位が問題のときは、ソースの体積の単位を変える場合のところの
;;;(expt 1 3.0)の1を1000とかに変えてください
;;;ついでにエクセルに書き出し、セミコロンで区切っているので区切り位置で区切ってください。


(vl-load-com)
(defun fun-name nil
(setq sset (ssget '((0 . "3DSOLID"))))

(if (null sset)
(exit))

(setq i 0
sld-lis nil)

(repeat (sslength sset)
(setq sld-lis (cons (ssname sset i) sld-lis))
(setq i (1+ i)))

(setq sld-lis (mapcar 'vlax-ename->vla-object sld-lis))

(setq sld-lis (mapcar
'(lambda (arg /)
(list
(cons "object" arg)
;;; (cons
;;; "position"
;;; (progn
;;; (setq catch (vl-catch-all-apply 'vlax-get-property (list arg 'position)))
;;; (if (vl-catch-all-error-p catch)
;;; "undef"
;;; (vlax-safearray->list (vlax-variant-value catch)))))
(cons
"centroid"
(vlax-safearray->list (vlax-variant-value (vlax-get-property arg 'centroid))))
(cons
"volume"
(vlax-get-property arg 'volume))
(cons
"solidtype"
(progn
(setq catch (vl-catch-all-apply 'vlax-get-property (list arg 'solidtype)))
(if (vl-catch-all-error-p catch)
"例外"
catch)))))
sld-lis))


(mapcar '(lambda (arg /)
(command "-text"
"non"
(cdr (assoc "centroid" arg))
""
""
(strcat "centroid:"
(vl-princ-to-string (cdr (assoc "centroid" arg)))))
(command "-text"
""
(strcat "volume:"
(rtos (/ (cdr (assoc "volume" arg))
(expt 1 3.0))))) ;体積の単位を変える場合
(command "-text"
""
(strcat "solidtype:"
(cdr (assoc "solidtype" arg)))))
sld-lis)

(setq xl (vlax-get-or-create-object "excel.application"))
(vlax-put-property xl 'visible :vlax-true)
(vlax-invoke-method
(vlax-get-property xl 'workbooks)
'add)

(foreach sld sld-lis
(mapcar '(lambda (sld /)
(vlax-put-property
(vlax-get-property xl 'activecell)
'value2
(strcat (car sld)
";"
(vl-princ-to-string (cdr sld))))
(vlax-invoke-method
(vlax-get-property
(vlax-get-property xl 'activecell)
'offset
1 0)
'activate))

sld)

(vlax-invoke-method
(vlax-get-property
(vlax-get-property xl 'activecell)
'offset
1 0)
'activate))

(princ))
6:kobuta :

2020/12/21 (Mon) 18:27:56

zukki-様

短時間でこんなにすごいご回答、驚愕しております!!
ありがとうございます!!
すぐには確認できませんが、不慣れながらリスプでやってみたいと思います!
上手くいかない場合は、またご質問してしまうかもしれませんがその際は
宜しくお願い致します。

取り急ぎ、お礼の返信をさせて頂きました。

  • 名前: E-mail(省略可):
  • 画像:

Copyright © 1999- FC2, inc All Rights Reserved.