明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1314|回复: 9

[提问] 相同群码值怎么获得元素

[复制链接]
发表于 2014-9-17 19:04 | 显示全部楼层 |阅读模式
本帖最后由 a4587332 于 2014-9-17 19:40 编辑

这个是 leader (引线标注)
使用assoc函数 只能 获得第 一个 关于10的群码的元素~

请问 怎么样 获得其他的元素~


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2014-9-17 19:34 | 显示全部楼层
自己顶一下~~~~
发表于 2014-9-17 19:58 | 显示全部楼层
忘记是哪位大侠的源码了?
(defun get-pl-ptlst (plent / ptlst);;;取得多段线顶点的最短代码
   (vl-load-com)
   (setq        ptlst (vl-remove-if
                '(lambda (x)
                   (/= 10 (car x))
                 )
                (entget plent)
              )
   )
   (mapcar 'cdr ptlst)
)

点评

polyline实体没有10码  发表于 2014-9-17 20:33

评分

参与人数 1明经币 +1 收起 理由
xyp1964 + 1 赞一个!

查看全部评分

 楼主| 发表于 2014-9-17 21:16 | 显示全部楼层
vlisp2012 发表于 2014-9-17 19:58
忘记是哪位大侠的源码了?
(defun get-pl-ptlst (plent / ptlst);;;取得多段线顶点的最短代码
   (vl-loa ...

这个好晦涩难懂阿
发表于 2014-9-17 21:27 | 显示全部楼层
a4587332 发表于 2014-9-17 21:16
这个好晦涩难懂阿

先练基本功,打好基础!
 楼主| 发表于 2014-9-17 21:39 | 显示全部楼层
Gu_xl 发表于 2014-9-17 21:27
先练基本功,打好基础!

哈哈~~ 目前还在lisp 没接触vlisp的层面
谢谢
但是一定会看懂它的
发表于 2014-9-17 22:25 | 显示全部楼层
本帖最后由 llsheng_73 于 2014-9-17 23:04 编辑

  1. (defun lwplxy(e)(vl-remove'nil(mapcar'(lambda(x)(if(=(car x)10)(cdr x)))(entget e))))

  1. (defun lwplxy(e)(mapcar'cdr(vl-remove-if'(lambda(x)(/=(car x)10))(entget e))))

两个办法没本质区别,也没测试过哪一种会更快或者没多大出入

  1. ((defun Plinexy(e / p a b n ob q et d d1 en et) ;;多线段节点坐标(滤掉了多余点,未处理假闭合)
  2.    (setq a(entget e)ob(vlax-ename->vla-object e)et(cdr(assoc 0 a))n 0 p nil d nil)
  3.    (cond((="LWPOLYLINE"et)
  4.          (repeat(length a)(setq b (nth n a) n (+ n 1))
  5.            (if (= 10 (car b))(progn
  6.                                (setq q(list (cadr b) (caddr b))d1(vlax-curve-getDistAtPoint ob q))
  7.                                (if p (if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))
  8.                                  (setq p (list q))))
  9.              )))
  10.         ((="POLYLINE"et)
  11.          (SETQ EN (ENTGET (SETQ E (ENTNEXT E))))
  12.          (WHILE (/= (CDR (ASSOC 0 EN)) "SEQEND")
  13.            (SETQ q (CDR (ASSOC 10 EN))d1(vlax-curve-getDistAtPoint ob q)q(reverse(cdr(reverse q))))
  14.            (if p(if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))
  15.              (setq p (list q)))
  16.            (SETQ EN (ENTGET (SETQ E (ENTNEXT E)))))
  17.          (setq p(reverse p))))
  18.    P)

如果不考虑去除相邻点完全重合的话简单很多
  1. (defun Plinexy(e / p a ltype )
  2.    (setq a(entget e)ltype(cdr(assoc 0 a)))
  3.   (if(assoc 90 a)(vl-remove'nil(mapcar'(lambda(x)(if(=(car x)10)(cdr x)))(entget e)))
  4.     (progn(while(/=(cdr(assoc 0(setq p(cons(cdr(assoc 10 a))p)e(entnext e)a(entget e))))"SEQEND"))
  5.       (cdr(reverse p)))))
 楼主| 发表于 2014-9-17 22:42 | 显示全部楼层
llsheng_73 发表于 2014-9-17 22:25
两个办法没本质区别,也没测试过哪一种会更快或者没多大出入

努力查书在~估计看懂还需要点时间
不过谢谢热心解答

点评

把代码弄去控制台一句句的运行,对照运行结果查看自带帮助,比什么书都管用  发表于 2014-9-17 23:07
 楼主| 发表于 2014-9-17 23:35 | 显示全部楼层
a4587332 发表于 2014-9-17 22:42
努力查书在~估计看懂还需要点时间
不过谢谢热心解答

谢谢你的学习方法~~~
发表于 2014-9-18 07:50 | 显示全部楼层
另一种方式:
;...
(setq ent (entget e))
(setq plst (list))
(foreach x ent (if (= (car x) 10) (setq plst (cons (cdr x) plst))))
(setq plst (reverse plst))
;...

点评

赞一个,这种估计比较容易理解 但用lambda真是lsp的精髓  发表于 2014-9-18 11:15
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 02:39 , Processed in 0.233177 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表