fhcd88 发表于 2013-1-1 22:30:53

求高手编写LISP代码

请高手编写LISP代码,实现如下功能:在“”中,当点选图中多线段后,通过代码首先选择插入点在多线段顶点上的图元(名为拐点的块参照),然后再选择与这些图元相隔最近的一串文字,或者是以每个图元为中心框选一定范围内的文字,每个图元仅对应一串文字,最终结果就是,只选择“1、2、3、4、5”这几个文字,而不要把”6、7、8、9、10“这几个文字选进来。谢谢各位高手指教!!!

阿然 发表于 2013-1-1 22:30:54

本帖最后由 阿然 于 2013-1-2 10:27 编辑

(vl-load-com)
(defun c:tt (/ ent ss sstemp el elst txtlst inptlst distlst i)
(if (and (setq ent (car (entsel "\n选择多义线:")))
   (setq elst (entget ent))
   (equal (cdr (assoc 0 elst)) "LWPOLYLINE")
      )
    (progn
      (setq ss (ssadd ent))
      (foreach el elst
(if (equal (car el) 10)
    (progn
      (setq
      sstemp (ssget "C" (cdr el) (cdr el) '((0 . "INSERT")))
      )
      (setq ss (xr:appendss ss sstemp))
      (setq sstemp nil)
    )
)
      )
      (setq i (1- (sslength ss)))
      (setq sstemp (ssget "X" '((0 . "TEXT"))))
      (setq txtlst (Xr:ss->lst sstemp))
      (setq inptlst (mapcar '(lambda (x) (Xr:getobjdxf x 10)) txtlst))
      (setq
distlst(mapcar
      '(lambda (x)
         (distance x (vlax-curve-getClosestPointTo ent x))
       )
      inptlst
    )
      )
      (setq txtlst (mapcar 'cons distlst txtlst))
      (setq txtlst
       (vl-sort txtlst '(lambda (e1 e2) (< (car e1) (car e2))))
      )
      (repeat i
(ssadd (cdr (nth (setq i (1- i)) txtlst)) ss)
      )
      (command "_.copybase" '(0 0 0) ss "")
      (command "_.erase" "all" "")
      (command "_.Pasteclip" '(0 0 0))
      (setq ss nil
      sstemp nil)
    )
)
(princ)
)

(defun Xr:getobjdxf (obj code / result elist)
(setq elist (entget obj))
(setq result (cdr (assoc code elist)))
)

(defun Xr:ss->lst (ss / i l)
(if ss
    (repeat (setq i (sslength ss))
      (setq
l (cons(ssname ss (setq i (1- i)))
    l
    )
      )
    )
)
)
(defun Xr:appendss (ss1 ss2 / i)
(if (and ss1
    ss2
      )
    (progn
      (setq i -1)
      (repeat (sslength ss2)
(ssadd (ssname ss2 (setq i (1+ i))) ss1)
      )
    )
    ss1
)
)
试了一下,不知道能不能用,使用上有点限制:每个图块必须对应一个编号
如果有的图块没有对应的编号,会得不到想要的结果




xyp1964 发表于 2013-1-1 23:56:44

本帖最后由 xyp1964 于 2013-1-1 23:57 编辑



fhcd88 发表于 2013-1-2 05:05:11

附件中,每个图块只是有个编号与之靠得比较近,你所说的图块与编号对应是指的什么?

fhcd88 发表于 2013-1-2 05:14:13

在我这运行出错,不知为什么?

阿然 发表于 2013-1-2 07:36:39

出错是指什么呢?程序运行不了还是结果不正确?
选择块还是比较容易,主要是选择几个文字的处理,我是选择了离多义线最近的n个(n=块个数)文本,假如6离的比5近,那会选择6留下而删除5。

阿然 发表于 2013-1-2 10:26:59

找到出错的地方了,修改了3楼的代码,请重新测试

zwf100 发表于 2014-3-16 22:41:53

需要e派工具箱(XCAD)的支持
页: [1]
查看完整版本: 求高手编写LISP代码