xbkxbk 发表于 2007-2-20 17:31:00

[求助] 计算3D实体体积,调用massprop出现的问题.

本帖最后由 作者 于 2007-2-20 18:48:05 编辑 <br /><br /> <p>以下是我在lisp中调用massprop的一行代码:</p><p>(command "massprop"&nbsp;(ssget) "" "y" "c:\\xx.mpr")</p><p>以上代码执行是,Autocad界面中老是弹出一个"按ENTER键继续"的对话框,有没有办法不弹出这个对话框????</p>

xbkxbk 发表于 2007-2-20 18:38:00

本帖最后由 作者 于 2007-2-20 18:41:38 编辑 <br /><br /> <p>还没有人知道怎么处理吗?</p><p>原来我做一个计算3D实体边界框的体积,用了vla-getboundingbox,但是对于一些不规则的3D实体却计算错误,所以才用massprop来计算体积,可以成功,但老是弹出"按ENTER键继续",如果选择1000个3D实体,就要按1000次enter键,有办法去掉吗??</p><p>附:以下是我用vla-getboundingbox编写的LISP,但是对于附件(20070220.dwg)中的模型,计算就会出错.</p><p>(DEFUN C:XBK (/ ent ll ur sall pp x0y0 x1y1 l w h total totale ocezin)<br/>&nbsp; (setvar "cmdecho" 0)<br/>&nbsp; (vl-load-com)<br/>&nbsp; (setq total 0 totale 0)<br/>&nbsp; (prompt "\n选择要计算体积的3D实体:")<br/>&nbsp; (setq sall (ssget '((0 . "3DSOLID"))) n 0)<br/>&nbsp; (while (setq ent (ssname sall n))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (vla-getboundingbox (vlax-ename-&gt;vla-object ent) 'll 'ur)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq pp (mapcar 'vlax-safearray-&gt;list (list ll ur)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq x0y0 (car pp) x1y1 (cadr pp))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq l (abs (- (car x1y1) (car x0y0))))&nbsp;&nbsp;&nbsp;&nbsp; ;长<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq w (abs (- (cadr x1y1) (cadr x0y0))))&nbsp;&nbsp; ;宽<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq h (abs (- (caddr x1y1) (caddr x0y0)))) ;高<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq total (* l w h))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq totale (+ totale total))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq n (1+ n))<br/>&nbsp; )<br/>&nbsp; (setq ocezin (getvar "dimzin"))<br/>&nbsp; (setvar "dimzin" 1)<br/>&nbsp; (setq totale (rtos (/ totale 1000000000) 2 3))<br/>&nbsp; (setvar "dimzin" ocezin)<br/>&nbsp; (princ (strcat "\n所选3D实体的总体积为:" totale "立方米"))<br/>&nbsp; (setvar "cmdecho" 1)<br/>&nbsp; (princ)<br/>)</p>

alin 发表于 2007-2-20 21:18:00

<p>;;;;Set QAFLAGS to 2 or use routine below....</p><p>(defun C:test (/ vol idx)<br/>&nbsp; (setq vol 0)<br/>&nbsp; (if (setq ss (ssget '((0 . "3DSOLID"))))<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq idx 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (while (&lt;= idx (1- (sslength ss)))<br/>&nbsp;(setq vol (+ vol<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-get-volume<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vlax-ename-&gt;vla-object (ssname ss idx))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;)<br/>&nbsp;(setq idx (1+ idx))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (alert (strcat "Volume = " (rtos (/ vol 1000000000) 2 3)))<br/>&nbsp; (princ)<br/>)</p>

xbkxbk 发表于 2007-2-20 22:01:00

<p>alin 你好:</p><p>&nbsp; 你写的lisp,我测试了,对于立方体计算体积是正确的,但是对于有造形的3D实体计算就有问题,如附件中的20070220.dwg,我所要计算的是3D实体的<font color="#ff0000">[边界框]</font>体积,而不是3D实体的实际体积.</p>

alin 发表于 2007-2-21 10:10:00

<p>用MASSPROP得到的边界框和你程序得到的边界框是一样的,关键是看实体相对于坐标系的位置。</p><p>回到你的问题,上面已提到,将变量QAFLAGS设为2,使用MASSPROP就不用按回车。</p>

xbkxbk 发表于 2007-2-21 12:51:00

<p>谢谢,原来跟坐标系有关,没有注意到,lisp还是有点不过关,努力中.....</p><p>顺便介绍一下那个LISP的用途,因为CAD自带的massprop都是计算实际体积,工作中每次画完整套墓石都会计算才数(体积*36),以便增减,那个LISP可是画墓石的设计员都应该要有的东东,只要再改造一下小数点的精度就OK了....嘿嘿嘿,大家也都学一下lisp蛮有用的.</p>
页: [1]
查看完整版本: [求助] 计算3D实体体积,调用massprop出现的问题.