大铲 发表于 2020-9-27 11:23:31

请教统计长度TJCD和统计图块TJTK这两个lisp在cad2020不能使用

请教大神,请教统计长度TJCD和统计图块TJTK这两个lisp在cad2020不能使用,请大神帮忙看看问题在什么地方,怎么修改?
;;--------------------------------------------------------------------

;计算所选择对象的线的总长度
(defun C:TJCD ( / &k1 i l1 l2 n1 ss)
   (if (null vlax-dump-object) (vl-load-com) )
       (if (setq SS (ssget '((0 . "CIRCLE,ELLIPSE,LINE,*POLYLINE,SPLINE,ARC"))))
         (progn   (setq i 0 n1 "计算公式:" L1 0)
               (while (setq &k1 (ssname ss i))   
                  (setq L2 (vlax-curve-getDistAtParam &k1 (vlax-curve-getEndParam &k1)))
                  (setq L1 (+ L1 L2) L2 (rtos L2))
                      (if (= i 0)   
                        (setq n1 (strcat n1 L2))   
                        (setq n1 (strcat n1 "+" L2))
                      )
               (setq i (1+ i))
                )
             while
                     (setq i (rtos i 2 0) L1 (rtos L1))   
                     (princ (strcat "\n总共选中:" i "根线"))   
                     (princ (strcat "\n总长度是:" L1))   
                     (princ (strcat "\n" n1))
             )
         )
         (princ)
)

;;;统计图块
(defun C:TJTK (/ ss1 ss2 NamLst BList str1 str2)
(prompt "\n命令为: TJTK ,用法如下: ")
(prompt "\n先选择要统计的块,然后选择要统计的区域,结束后按F2显示出统计数量.")
(graphscr)
(prompt "\n请选择要统计的块:")
(if (setq ss1 (ssget '((0 . "INSERT"))))
    (progn
      (prompt "\n请选择要统计的区域:")
      (if (setq ss2 (ssget '((0 . "INSERT"))))
      (progn
          (setq NamLst (Name-list ss1))
          (setq BList (Name-count ss2 NamLst))
          (princ "\n块名")
          (princ (setq str1 "..............................."))
          (princ "数量")
          (princ "\n--------------------------------------")
          (foreach n BList
          (princ "\n")
            (princ (setq str2 (car n)))
          (princ (substr str1 (1+ (strlen str2)) (strlen str1)))
          (princ "....")
          (princ (cdr n))
          )
        )
        (princ "\n所选区域没有要统计的块!")
      )
    )
    (princ "\n你没有选择要统计的块!")
)
(princ)
)
;;;图块名列表函数
(defun Name-list (ss1 / i l EName EList BName NList)
(setq l (sslength ss1))            
(setq i 0 NList nil)
(while (< i l)
    (setq EName (ssname ss1 i))       ;取得图元名
    (setq EList (entget EName))       ;取得图元表
    (setq BName (cdr (assoc 2 EList)));取得图块名
    (if (not (member BName NList))    ;如果表中没有图块名
      (setq NList (cons BName NList)) ;添加到表中
    )
    (setq i (1+ i))                   ;计数器加1
)
NList
)
;;;计数函数
(defun Name-count (ss2 NamLst / blist i l ename elist bname oldcount newcount)
(setq Blist (mapcar '(lambda (x) (cons x 0)) NamLst))       ;计数器归零
(setq i 0 l (sslength ss2))
(while (< i l)                                              ;对选择区域循环
    (setq ename (ssname ss2 i))                               ;取得图元名
    (setq elist (entget ename))                               ;取得图元表
    (setq bname (cdr (assoc 2 elist)))                        ;取得图块名
    (if (member bname NamLst)                                 ;如果是要统计的块
      (setq OldCount (assoc bname Blist)                      ;取得块数量
          NewCount (1+ (cdr OldCount))                      ;计数器加1
          Blist (subst (cons bname NewCount) OldCount Blist);替代原数量
      )      
    )
    (setq i (1+ i))
)
BList
)
(defun C:sum ( / CurObj CurSet FltLst TmpLgt TotLgt)
(if (< (atof (getvar "ACADVER")) 15.0)
(alert " VxJoinLines requires AutoCAD 2000(i) or higher. ")
(progn
(vl-load-com)
(setq FltLst '((0 .
"3DPOLY,ARC,CIRCLE,ELLIPSE,LINE,LWPOLYLINE,POLYLINE,SPLINE")
(-4 . "<NOT")
(-4 . "<OR")
(-4 . "&=") (70 . 16)
(-4 . "&=") (70 . 64)
(-4 . "OR>")
(-4 . "NOT>")
)
CurSet (cond ((ssget "I" FltLst)) ((ssget FltLst)))
TotLgt 0
)
(if CurSet
(progn
(while (setq CurEnt (ssname CurSet 0))
(setq CurObj (vlax-ename->vla-object CurEnt)
TmpLgt (vlax-curve-getDistAtParam CurObj
(vlax-curve-getEndParam CurObj)
)
TotLgt (+ TotLgt TmpLgt)
CurSet (ssdel CurEnt CurSet)
)
)
(alert (strcat "Total length of selected object(s) " (rtos TotLgt) "."))
)
)
)
)
(princ)
)
页: [1]
查看完整版本: 请教统计长度TJCD和统计图块TJTK这两个lisp在cad2020不能使用