;;;リスプが使えるなら、ロードしてコマンドラインに(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))
- zukki-
- 2020/12/21 (Mon) 17:07:45