超然A 发表于 2008-7-10 00:11:00

无聊,发几个小程序

最近又要写LISP程序了。
一些小程序,供初学者参考。大侠就不要看了。;用多边形PL线范围窗选图元(DS).lsp
(defun test (en / pt_list info pt_list x)
;(setq en (car (entsel "\nPlease select a polyline")))
(setq info(entget en))

(setq pt_lst (mapcar 'cdr
   (vl-remove-if-not '(lambda (x) (= (car x) 10) ) info      )
)
       )
(setq pt_lst pt_lst)
)
(defun c:ds()
(setq ent (car(entsel "\n选择一个多边形:")))
(setq pt_lst (test ent))
(setq ss(ssget"cp" pt_lst ))
(sssetfirst ss ss)
)

;图面所有圆转多段线.LSP,做GIS数据转换用。
(defun c:zz()
(command "undo" "be")
(setq os(getvar "osmode"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(setq ss(ssget "x" (list(cons 0 "circle"))))
(if ss
    (progn
   (setq ssnum(sslength ss)
i 0)
   (repeat ssnum
   (setq ent(ssname ss i)
    info(entget ent)
    center(cdr(assoc 10 info))
    radius(cdr(assoc 40 info))
    layer(cdr(assoc 8 info))
    i (1+ i)
    )
   (command "layer" "s" layer "")
   (command "polygon" 20 center "i" radius)
   )
   (command "erase" ss "" "")
   (setvar "osmode" os)
   (setvar "cmdecho" 1)
   (command "undo" "e")
   (princ "\n转换完成,共转换")(princ ssnum)(princ "个圆!")
      )
    (princ "\n当前图形中没有圆要素!")
    )
(princ)
)

超然A 发表于 2008-7-10 00:25:00

删除整个图面的重复要素(距离在0.05m以内)(ec)
说明:
1本程序可有效的删除0.05m以内的重复块、文本、圆。
2对于两条重复的线状地物,可删除顶点数目相同,对应顶点距离小于0.05m的重复线。
3如两条靠近的线的顶点数目相同,但对应顶点距离大于0.05m,则将一条线放到“不确定图层”,程序执行完毕后,请检查“不确定图层”内的线。
4本程序只判断相同顶点数目的两条线,故对于一条线重复了另外一条线的一部分的情况(此时这两条线的定点数目不一样),程序无法判断。再者,这种情况也有可能是正确的图形,所以只靠程序无法判断,只能人工检查。
5程序运行过程请不要在对图形执行任何操作,否则图面变动会引起程序出错。(defun c:ec()
(command "undo" "be")
(setvar "cmdecho" 0)
(command "zoom" "e")
(command "layer" "m" "不确定图层" "")
(VL-LOAD-COM)
(setq ss(ssget "x"))
(setq sslen(sslength ss))
(setq i 0)
(repeat sslen
    (setq ent(ssname ss i))
    (setq VOBJ (vlax-ename->vla-object ent))
    (setq Y_N(vlax-erased-p VOBJ))
    (if (= Y_N nil)
      (progn
(setq info(entget ent)
       leixing(cdr(assoc 0 info))
       layer(cdr(assoc 8 info))
       jidian(cdr(assoc 10 info))
       ID (vla-get-handle VOBJ)
)
( vla-getboundingbox VOBJ 'maxzb 'minzb)
(setq maxzb (vlax-safearray->list maxzb))
      (setq minzb (vlax-safearray->list minzb))

(setq ss2(ssget "c" maxzb minzb (list (cons 0 leixing) (cons 8 layer))))
(ssdel ent ss2)
(if (/= ss2 nil)
   (progn
   (setq sslen2(sslength ss2))
   (setq j 0)
   (repeat sslen2
   (setq ent2(ssname ss2 j)
    vobj2(vlax-ename->vla-object ent2)
    id2(vla-get-handle VOBJ2)
    )
   (if (> (16to10 id2) (16to10 id))
       (progn
(setq info2(entget ent2)
             leixing2(cdr(assoc 0 info2))
            layer2(cdr(assoc 8 info2))
            jidian2(cdr(assoc 10 info2))
      )
(setq dist(distance jidian2 jidian))

(if (= leixing2 leixing)
    (if (= layer2 layer)
      (if (< dist 0.05)
      (progn
      ;块类型
   (if (= leixing "INSERT")
   (progn
   (if (equal (assoc 2 info) (assoc 2 info2))
      (command "erase" ent2 "")
   )
   )
   )
      ;圆类型
      (if (= leixing "CIRCLE")
   (if (equal (assoc 40 info) (assoc 40 info2))
   (command "erase" ent2 "")
   )
   )
      ;线类型
      (if (or (= leixing"POLYLINE") (= leixing "LWPOLYLINE"))
               (progn
               (setq vtx (vla-get-Coordinates vobj))
               (setq vtxlst (vlax-safearray->list (vlax-variant-value vtx)))
   (setq vtx2 (vla-get-Coordinates vobj2))
               (setq vtxlst2 (vlax-safearray->list (vlax-variant-value vtx2)))
   (if (= (length vtxlst) (length vtxlst2))
   (progn
               (setq k 0)
   (setq flat 0)
               (repeat (/ (length vtxlst) 2)
                         (setq ptlst (list (nth k vtxlst) (nth (1+ k) vtxlst)))
         (setq ptlst2(list (nth k vtxlst2) (nth (1+ k) vtxlst2)))
       (if (> (distance ptlst ptlst2) 0.05)
      (setq flat 1)
                           (setq k (+ k 2))
      )
   )
   (if (= flat 0)
       (command "erase" ent2 "")
       (command "change" ent2 "" "p" "la" "不确定图层" "")
       )
   )
   )
   )
   )
      ;直线类型
      (if (= leixing "LINE")
   (progn
   (setq point1(cdr(assoc 11 info))
    point2(cdr(assoc 11 info2))
    )
   
   (if (< (distance point1 point2) 0.05)
   (command "erase" ent2 "")
   )
   ))
         ;文本类型
      (if (= leixing "TEXT")
   (if (equal (assoc 1 info) (assoc 1 info2))
   (command "erase" ent2 "")
   )
   )
      ;其他类型
         (if (and (/= leixing "INSERT")(/= leixing "CIRCLE")(/= leixing"POLYLINE") (/= leixing "LWPOLYLINE")(/= leixing "TEXT")(/= leixing "LINE"))
    (command "erase" ent2 "")
    )
      )
);基点距离小于0.05
);同层
      );同型
);progn
       );ent2创建时间迟于ent,ID2大于ID。
       (setq j(1+ j))
      );repeat ss2
   );progn
   );if
);progn
      (setq ss2 null)
      );ent在
   (setq i(1+ i))
    );repeat ss
(setvar "cmdecho" 0)
(command "undo" "e")
(princ "清理完毕!")
(alert "清理完毕!")
(princ)
)


;16进制转换位10进制
(defun 16to10(str / )
(setq len(strlen str))
(setq weizhi 1)
(setq num10 0)
(repeat len
    (setq zifu(substr str weizhi 1))
    (if (or (= zifu "A")(= zifu "a")) (setq zifu (ITOA 10)))
    (if (or (= zifu "B")(= zifu "b")) (setq zifu (ITOA 11)))
    (if (or (= zifu "C")(= zifu "c")) (setq zifu (ITOA 12)))
    (if (or (= zifu "D")(= zifu "d")) (setq zifu (ITOA 13)))
    (if (or (= zifu "E")(= zifu "e")) (setq zifu (ITOA 14)))
    (if (or (= zifu "F")(= zifu "f")) (setq zifu (ITOA 15)))
    (setq num10(+ num10(* (atoi zifu) (expt 16 (- len weizhi)))))
    (setq weizhi(1+ weizhi))
    )
    (setq num10 num10)
)



超然A 发表于 2008-7-10 00:41:00

查两个图层相交的点
;程序说明:程序运行之后不要再动鼠标或操作CAD了,否则程序会中断。
;    程序运行完毕后,会建立“交点图层”。在所有打架的地方画上1.5米半径的圆。
;          请使用“逐一查找”程序来处理打架的地方。
(defun c:dd()
(command "undo" "be")
(setvar "cmdecho" 0)
(vl-load-com)
    (setq ent1 (entsel "\n选择图层1中的任一图元:"))
(setq lay1(cdr(assoc 8 (entget(car ent1)))))(princ "所选择的图层是")(princ lay1)
    (setq ent2 (entsel "\n选择图层2中的任一图元:"))
(setq lay2(cdr(assoc 8 (entget(car ent2)))))(princ "所选择的图层是")(princ lay2)
(command "zoom" "e")
(command "_layer" "m" "交点图层" "c" 1 "" "")
(if (= lay1 lay2)
    (progn
      (print "\n你所选择的两个图元在同一层里,确认查同一层中交叉的情况吗?如果是请输入<Y>确认,否请按<ESC>键退出重来!")
      (setq aa (getstring ))
;;;      (if (or (= aa "Y" ) (= aa "y"))
;;; )
      ))
(princ "\n程序正在运行,请不要再操作CAD,否则会造成程序退出!请休息一下,耐心等候......")
(if (/= lay1 lay2)
   (progn
       (setq ss1(ssget "x" (list (cons 0"*LINE,ARC,CIRCLE,ELLIPSE")(cons 8 lay1))))
       (setq ss2(ssget "x" (list (cons 0"*LINE,ARC,CIRCLE,ELLIPSE")(cons 8 lay2))))
      
(if (< (sslength ss1)(sslength ss2))
    (progn
      (setq ss ss1)
      (setq lay lay2)
      )
    (progn
      (setq ss ss2)
      (setq lay lay1)
      )
    )
(setq i 0)
(repeat (sslength ss)
    (setq ent1(ssname ss i))
      (vla-getboundingbox(vlax-ename->vla-object ent1) 'll 'ur)
(setq ll(vlax-safearray->list ll))
(setq ur(vlax-safearray->list ur))
   
(defun c:zy()
(c:zy)
)
(defun c:zy()
(vl-load-com)
(if (setq ss(ssget "x" '((8 . "交点图层"))))
    (progn
    (setq
ent0(ssname ss 0)
ent(vlax-ename->vla-object ent0))
(vla-getboundingbox ent 'ptmin 'ptmax)
(setq ptmax(vlax-safearray->list ptmax)
ptmin(vlax-safearray->list ptmin)
)
(command "zoom" "w" ptmax ptmin)
    (command "erase" ent0)
)
    (princ"\n交点图层没有圆!")
    )
(princ)
)

dinosaurhxe 发表于 2008-7-10 12:30:00

顶一下

hzj526 发表于 2008-7-10 12:56:00

不错的程序,支持源码共享

llc1968 发表于 2008-7-10 15:43:00

不错,希望您多无聊几次

byghbcx 发表于 2008-7-10 16:44:00

本帖最后由 作者 于 2008-7-10 20:56:45 编辑 <br /><br /> <p>简化一点</p><p>;16进制转换位10进制<br/>(defun 16to10(str / )<br/>&nbsp;&nbsp; (setq len(strlen str))<br/>&nbsp;&nbsp; (setq weizhi 1)<br/>&nbsp;&nbsp; (setq num10 0)<br/>&nbsp;&nbsp; (repeat len<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq zifu (substr str weizhi 1))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (cond<br/>&nbsp;&nbsp;&nbsp;&nbsp; ((and (&gt;= (ascii (strcase zifu)) 65) (&lt;= (ascii (strcase zifu)) 70)) (setq zifu (- (ascii (strcase zifu)) 55)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; ((and (&gt;= (ascii zifu) 48) (&lt;= (ascii zifu) 57)) (setq zifu (atoi zifu)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq num10 (+ (* num10 16) zifu))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq weizhi (1+ weizhi))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; num10<br/>&nbsp;&nbsp; )</p>

CAD83 发表于 2008-7-10 20:09:00

<font face="黑体" size="4">查两个图层相交的点,用不了</font>

xd-xdcad 发表于 2008-7-10 20:21:00

<p>想新建一个简单的标注样式,格式与STANDRAD相同,仅仅是箭头类型是"倾斜",请问LISP怎样写,我是这样先:(command "dimblk" "_oblique")<br/>再建立标注样式:(defun c:TEST ()</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "DIMSCALE" 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "DIMSCALE" 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "DIMASZ" 1.5)....</p><p>问题是若command "dimblk" "_oblique"也在TEST里,仅仅会建立一个<strong>替代</strong>标注样式</p><p><br/></p>

ZZXXQQ 发表于 2008-7-10 21:29:00

xd-xdcad发表于2008-7-10 20:21:00static/image/common/back.gif想新建一个简单的标注样式,格式与STANDRAD相同,仅仅是箭头类型是\"倾斜\",请问LISP怎样写,我是这样先:(command \"dimblk\" \"_oblique\")再建立标注样式:(defun c:TEST ()&nbsp;&nbsp;&nbsp

<p>用:</p><p>(command "-dimstyle" "s" "dimstyle_name")</p>
页: [1] 2 3
查看完整版本: 无聊,发几个小程序