danielk 发表于 2022-7-5 18:33:57

三维实体管道需要Lisp

我正在寻找一个lisp来汇总三维管道实体的值,每个管道都有自己的层,代表不同的直径。
该信息存在于“特性”选项板中。(见所附图片-“长度”)
 
谢谢

marko_ribar 发表于 2022-7-5 18:39:05

此属性似乎无法通过VLisp ActiveX使用。。。
 
试试这个。。。
 
(defun c:sumsweeplengths ( / TMatrixFromTo ss i sum ent dir1 dir2 dir3 pm zdir tmat ll ur len )

(vl-load-com)

(defun TMatrixFromTo ( from to )
   (append
   (mapcar
       (function
         (lambda    (v o)
         (append (trans v from to T) (list o))
         )
       )
       (list '(1. 0. 0.) '(0. 1. 0.) '(0. 0. 1.))
       (trans '(0. 0. 0.) to from)
   )
   (list '(0. 0. 0. 1.))
   )
)

(command "_.ucs" "_w")
(prompt "\nSelect 3D SOLIDS created with SWEEP command")
(setq ss (ssget '((0 . "3DSOLID"))))
(setq i -1 sum 0.0)
(while (setq ent (ssname ss (setq i (1+ i))))
   (if ent (setq ent (vlax-ename->vla-object ent)))
   (if (vlax-property-available-p ent 'SolidType)
   (if (eq (vla-get-SolidType ent) "Sweep")
       (progn
         (setq dir1 (mapcar '+ (vlax-safearray->list (vlax-variant-value (vla-get-principaldirections ent))) '(0.0 0.0 0.0)))
         (setq dir2 (cdddr (mapcar '+ (vlax-safearray->list (vlax-variant-value (vla-get-principaldirections ent))) '(0.0 0.0 0.0 0.0 0.0 0.0))))
         (setq dir3 (cdddr (cdddr (mapcar '+ (vlax-safearray->list (vlax-variant-value (vla-get-principaldirections ent))) '(0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0)))))
         (setq pm (vlax-safearray->list (vlax-variant-value (vla-get-principalmoments ent))))
         (cond
         ( (equal (cadr pm) (caddr pm) 1.0)
             (setq zdir dir1)
         )
         ( (equal (car pm) (caddr pm) 1.0)
             (setq zdir dir2)
         )
         ( (equal (car pm) (cadr pm) 1.0)
             (setq zdir dir3)
         )
         )
         (command "_.ucs" "_za" '(0.0 0.0 0.0) zdir)
         (setq tmat (TMatrixFromTo 1 0))
         (vla-transformby ent (vlax-tmatrix tmat))
         (vla-getboundingbox ent 'll 'ur)
         (setq ll (vlax-safearray->list ll))
         (setq ur (vlax-safearray->list ur))
         (cond
         ( (and (> (caddr ur) 0) (> (caddr ll) 0) (> (caddr ur) (caddr ll)))
             (setq len (abs (- (caddr ur) (caddr ll))))
         )
         ( (and (> (caddr ur) 0) (> (caddr ll) 0) (< (caddr ur) (caddr ll)))
             (setq len (abs (- (caddr ll) (caddr ur))))
         )
         ( (and (< (caddr ur) 0) (< (caddr ll) 0) (< (caddr ur) (caddr ll)))
             (setq len (abs (- (caddr ur) (caddr ll))))
         )
         ( (and (< (caddr ur) 0) (< (caddr ll) 0) (> (caddr ur) (caddr ll)))
             (setq len (abs (- (caddr ll) (caddr ur))))
         )
         ( (and (< (caddr ur) 0) (> (caddr ll) 0))
             (setq len (abs (- (caddr ll) (caddr ur))))
         )
         ( (and (> (caddr ur) 0) (< (caddr ll) 0))
             (setq len (abs (- (caddr ur) (caddr ll))))
         )
         )
         (setq tmat (TMatrixFromTo 0 1))
         (vla-transformby ent (vlax-tmatrix tmat))
         (command "_.ucs" "_p")
       )
   )
   )
   (setq sum (+ len sum))
)
(prompt "\nSum of all lengths of 3D SOLIDS created with SWEEP command is : ")(princ (rtos sum 2 20))
(princ)
)

(defun c:ssl nil (c:sumsweeplengths))
HTH,M.R。

danielk 发表于 2022-7-5 18:46:07

不知道为什么,但总和值不正确,使用此lisp扫描管道im
(defun c:xpipe(/ ACTDOC ACTLAY ACTSP BASELINE
         BASESET CIRENT DICOUNT DIVDID
         EXCIR LAYST OBJTYPE OLDDIA
         OLDECHO STARTPT XORD YORD
         ZORD *ERROR*)
(vl-load-com)

(defun *error* (msg)
   (vla-put-Lock actLay laySt)
   (setvar "CMDECHO" oldEcho)
   (vla-EndUndoMark actDoc)
   (princ)
   ); end of *error*

(if(not pipe:exDia)(setq pipe:exDia 40.0))
(setq actDoc
   (vla-get-ActiveDocument
   (vlax-get-Acad-object))
actLay(vla-get-ActiveLayer actDoc)
       oldDia pipe:exDia
       oldEcho(getvar "CMDECHO")
); end setq
(vla-StartUndoMark actDoc)
(setvar "CMDECHO" 0)
(if(= 0(vla-get-ActiveSpace actDoc))
   (setq actSp(vla-get-PaperSpace actDoc))
   (setq actSp(vla-get-ModelSpace actDoc))
   ); end if
(setq laySt(vla-get-Lock actLay))
(vla-put-Lock actLay :vlax-false)
(setq pipe:exDia
   (getreal
   (strcat
       "\nSpecify pipe diameter <"(rtos pipe:exDia)">: ")))
(if(null pipe:exDia)(setq pipe:exDia oldDia))
(initget "Yes No")
(setq delFlag
         (getkword "\nDelete extrude path(s)? <No>: "))
   (if(null delFlag)(setq delFlag "No"))
(princ "\n<<< Select objects to extrude and press Enter >>>")
(if
   (setq baseSet
   (ssget '((-4 . "<OR")(0 . "*LINE")(0 . "CIRCLE")
          (0 . "ARC")(0 . "ELLIPSE")(-4 . "OR>")
          (-4 . "<NOT")(-4 . "<OR")(0 . "SPLINE")
               (0 . "MLINE")(-4 . "OR>")(-4 . "NOT>"))))
   (progn
   (setq baseSet(vl-remove-if 'listp
                           (mapcar
         'cadr
         (ssnamex baseSet))))
   (foreach pathEnt baseSet
   (setq baseLine
       (vlax-ename->vla-object pathEnt)
      objType(vla-get-ObjectName baseLine)
         startPt(vlax-curve-getStartPoint baseLine)
         3dPos
       (vlax-curve-getFirstDeriv baseLine
         (vlax-curve-getParamAtPoint baseLine startPt))
          diCount(strlen
         (itoa
      (apply 'max
         (mapcar 'abs
          (mapcar 'fix startPt)))))
      divDid "1"
      ); end setq
   (repeat diCount
(setq divDid(strcat divDid "0"))
); end repeat
   (setq divDid(atoi divDid))
   (if(/= 0.0(car 3dPos))
(setq XOrd(/(car 3dPos)divDid))
(setq XOrd (car 3dPos))
); end if
   (if(/= 0.0(cadr 3dPos))
(setq YOrd(/(cadr 3dPos)divDid))
(setq YOrd (cadr 3dPos))
); end if
   (if(/= 0.0(nth 2 3dPos))
(setq ZOrd(/(nth 2 3dPos)divDid))
(setq ZOrd (nth 2 3dPos))
); end if
   (setq 3dPos(list XOrd YOrd ZOrd))
(setq exCir
   (vla-addCircle actSp
   (vlax-3d-Point startPt)
   (/ pipe:exDia 2)))
(vla-put-Normal exCir(vlax-3D-point 3dPos))
(setq cirEnt(vlax-vla-object->ename exCir))
(command "_.extrude" cirEnt "" "_p" pathEnt)
(command "_.erase" cirEnt "")
(if(= "Yes" delFlag)
   (vla-delete baseLine)
      ); end if
); end foreach
   (vla-put-Lock actLay laySt)
   (setvar "CMDECHO" oldEcho)
   (vla-EndUndoMark actDoc)
      ); end progn
   ); end if
   (princ)
   ); endof c:xpipe

marko_ribar 发表于 2022-7-5 18:53:41

警告注释。。。若你们打算认真使用我的代码,请确保扫描的形状明显小于“线性”路径。。。路径必须是线性的-我只在圆柱和直棱镜上测试过。。。
 
您好,M.R。

danielk 发表于 2022-7-5 18:57:16

是否可以创建一个忽略所有其他对象的程序,除非它们在“几何体”下具有“长度”数据的属性?

marko_ribar 发表于 2022-7-5 18:59:54

我不知道,我试过了,但没有成功。。。我已经更改了我的初始代码,应该可以正确工作,但只适用于线性扫描。。。
 
此处更改:
http://www.cadtutor.net/forum/showthread.php?88563-Need-A-Lisp-for-3d-solid-pipe-length&p=607317#post607317
 
M、 R。

marko_ribar 发表于 2022-7-5 19:08:46

我必须恢复这条线。。。它没有得到应有的解决。。。如果有人知道如何访问3DSOLID实体的几何特性,请回复。。。问题是以曲线作为路径的扫描,如果访问几何体属性,则该信息可能对所有其他类型的3DSOLID实体有用。。。
 
谢谢,你好,马尔科·里巴。。。

marko_ribar 发表于 2022-7-5 19:11:55

再次复活。。。如果你很聪明,请回复。。。
 
M、 R。

danielk 发表于 2022-7-5 19:18:17

我也在等待,如果有人能做到这一点。。。如果这些信息存在于属性中,那么一定有办法!

GP_ 发表于 2022-7-5 19:23:42

@丹尼尔克
可以附着DWG文件的副本吗?
页: [1] 2
查看完整版本: 三维实体管道需要Lisp