CAD几个实用的lisp程序

1.计算所有线段总长度(加载后只需框选所有线段便可得出这些线段的总长度)  (defun c:LL ()(setvar "cmdecho" 1)(setq en (ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE"))))(setq i...
1.计算所有线段总长度(加载后只需框选所有线段便可得出这些线段的总长度) 

(defun c:LL ()
(setvar "cmdecho" 1)
(setq en (ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE"))))
(setq i 0)
(setq ll 0)
(repeat (sslength en)
  (setq ss (ssname en i))
  (setq endata (entget ss))
  (command "lengthen" ss "")
  (setq dd (getvar "perimeter"))
(setq ll (+ dd ll))
  (setq i (1+ i))
)
  (princ "所选线条总长为:")(princ ll)(princ)
)

2.标注所有线段(加载后只需框选所有线段便可得标注这些线段) 
(defun c:LLL ()
(COMMAND "UCS" "")
(setvar "cmdecho" 1)
(SETVAR "OSMODE" 0)
(setq    AcadObject   (vlax-get-acad-object)
   AcadDocument (vla-get-ActiveDocument Acadobject)
   mSpace       (vla-get-ModelSpace Acaddocument)
)
;;选取需要测量的样条曲线、圆弧、直线、椭圆
(setq en (ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE"))))
(setq i 0)
;;获取系统参数textsize
(setq shh (getvar "textsize"))
(setq str_hh (strcat "\n文字高度 <" (rtos shh 2) ">: "))
(setq hh (getdist str_hh))
(while hh
(setvar "textsize" hh)
(setq hh nil))
;;输入标注文字高度
;;循环开始
(repeat (sslength en)
  (setq ss (ssname en i))
  (setq endata (entget ss))
  (command "lengthen" ss "")
  (setq dd (getvar "perimeter"))
  (princ (strcat "\n长度=" (rtos dd 2)))
  ;;寻找代表图层的字符串
  (setq aa (assoc 0 endata))
  ;;获取图层名称
  (setq aa1 (cdr aa))
  ;;判断线条种类
  (cond
    ((= aa1 "SPLINE")
    ;;如果是spline
    (progn
    (setq arcObj (VLAX-ENAME->VLA-OBJECT ss))
    (setq startPnt1 (vla-get-ControlPoints arcObj))
    (setq p1
       (vlax-safearray->list (vlax-variant-value startPnt1))
    )
    (setq x1 (car p1))
    (setq y1 (cadr p1))
    (setq z1 (caddr p1))
    (setq pp1 (list x1 y1 z1))
    (repeat (- (/ (length p1) 3) 1)
      ;;循环,寻找最后一个控制点
      (setq p1 (cdddr p1))
      (setq x2 (car p1))
      (setq y2 (cadr p1))
      (setq z2 (caddr p1))
    )
    (setq pp2 (list x2 y2 z2))
    )
    )
    ((= aa1 "LWPOLYLINE")
    ;;如果是LWPOLYLINE
    (progn
    (setq arcObj (VLAX-ENAME->VLA-OBJECT ss))
  (setq startPnt1 (vla-get-Coordinates arcObj))
  (setq p1
      (vlax-safearray->list (vlax-variant-value startPnt1))
  )
    (setq x1 (car p1))
    (setq y1 (cadr p1))
    (setq z1 (caddr p1))
    (setq pp1 (list x1 y1 z1))
    (repeat (- (/ (length p1) 3) 1)
      ;;循环,寻找最后一个控制点
      (setq p1 (cdddr p1))
      (setq x2 (car p1))
      (setq y2 (cadr p1))
      (setq z2 (caddr p1))
    )
    (setq pp2 (list x2 y2 z2))
    )
    )
    (t
    ;;如果是其他种类线条
    (progn
    (setq arcObj (VLAX-ENAME->VLA-OBJECT ss))
    (setq startPnt1 (vla-get-StartPoint arcObj))
    ;;获取起点
    (setq endPnt1 (vla-get-EndPoint arcObj))
    ;;获取终点
    (setq pp1
       (vlax-safearray->list (vlax-variant-value startPnt1))
    )
    (setq
      pp2 (vlax-safearray->list (vlax-variant-value endPnt1))
    )
    )
    )
  )
  (setq x1 (car pp1))
  (setq y1 (cadr pp1))
  (setq z1 (caddr pp1))
  (setq x2 (car pp2))
  (setq y2 (cadr pp2))
  (setq z2 (caddr pp2))
  (setq x (/ (+ x1 x2) 2))
  (setq y (/ (+ y1 y2) 2))
  (setq z (/ (+ z1 z2) 2))
  (setq pt (list x y z))
  ;;取得线段两端的中点
  (setq ang (angle pp1 pp2))
  ;;获取角度
  (if    (> (* (/ ang pi) 180) 180)
    (setq ang (+ ang pi))
  )
  (command "text"
      "j"
      "bc"
      pt
      ""
      (* (/ ang pi) 180)
      (strcat "" (rtos dd 2))
      ""
  )
  (setq i (1+ i))
)
(prin1)
)
(prompt "\n <>在图中直接写出长度")
(prin1)

3.连续打断程序 
(defun c:br1 ()
  (command "break" pause "f" pause "@")
)

4.将CAD文字导入Excel表格 
(defun c:Q2()
(setq ffn (getfiled "写出文件" "" "xls" 1))
(princ "\n选取文字...")
(setq ss (ssget))
(setq ff (open ffn "w"))
(setq i 0)
(repeat (sslength ss)
(setq ssn (ssname ss i))
(setq ssdata (entget ssn))
(setq sstyp (cdr (assoc 0 ssdata)))
(if (or (= sstyp "TEXT") (= sstyp "MTEXT"))
(progn
(setq txt (cdr (assoc 1 ssdata)))
(princ txt ff)
(princ "\n" ff)
)
)
(setq i (1+ i))      
)
(close ff)
(princ (strcat "\n写出文件: " ffn))
(prin1)
)  

5 删除带颜色图元

以下程序在别人的贴子里贴过.为了说明问题,今天再贴一次.
改颜色的LISP程序

(defun c:c1()(ssget)(command "chprop" "p" "" "c" "1" "") (princ))
(defun c:c2()(ssget)(command "chprop" "p" "" "c" "2" "") (princ))
(defun c:c3()(ssget)(command "chprop" "p" "" "c" "3" "") (princ))
(defun c:c4()(ssget)(command "chprop" "p" "" "c" "4" "") (princ))
(defun c:c5()(ssget)(command "chprop" "p" "" "c" "5" "") (princ))
(defun c:c6()(ssget)(command "chprop" "p" "" "c" "6" "") (princ))
(defun c:c7()(ssget)(command "chprop" "p" "" "c" "7" "") (princ))
(defun c:c8()(ssget)(command "chprop" "p" "" "c" "8" "") (princ))

你用C1 命令就可以将图元改为红色了.其余类似.

删除红色图元

(defun C:D1 (/ m A M)
             (setq m:err *error* *error* *merr*)
             (setvar "cmdecho" 0)
             (command "UNDO" "G")
             (prompt "选择图形")
             (setq A (ssget '((62 . 1)) ))
             (if (/= A nil)(progn
             (setq M (sslength A))
             (command "erase" A "")
             (princ "\n共删除红色图元<")(princ M)(princ ">个")
             ))
             (command "UNDO" "E")  
             (princ)  )  

这样,键入 D1 命令,就可以删除红色的图元了.

  • 发表于 2019-03-30 13:48
  • 阅读 ( 1136 )
  • 分类:CAD插件

你可能感兴趣的文章

相关问题

1 条评论

请先 登录 后评论
陈KK
陈KK

10 篇文章

作家榜 »

  1. admin 184 文章
  2. 老Y 39 文章
  3. 晨曦 13 文章
  4. 陈KK 10 文章
  5. 胡亮 9 文章
  6. 肖肖 6 文章
  7. 通测工作室 4 文章
  8. boyving 3 文章