找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3177|回复: 19

[原创] 相同线长成功了

[复制链接]
发表于 2014-11-29 16:33:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 amwkto2011 于 2014-11-29 18:08 编辑

  1. (defun c:tcc(/ sel get0 obj rt len ss gth n add name obj2 len2 )
  2.   (princ "\n功能 [选择相同线长]")
  3.   (setq sel (car (entsel "\n点取参照对象:"))
  4.   get0 (assoc 0 (entget sel)))  
  5.   (setq obj (vlax-ename->vla-object sel))
  6.   (setq rt (rtos (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj))2 2))
  7.   (prompt (strcat "\n参照对象长度<" rt "> 过滤容差<0.3>"))
  8.   (setq len (atof rt ))
  9.   (setq ss (ssget (list get0)))
  10.   (setq gth (sslength ss)
  11.   n 0)
  12.   (setq add (ssadd))
  13.   (repeat gth
  14.     (setq name (ssname ss n))
  15.     (setq obj2 (vlax-ename->vla-object name))
  16.     (setq len2 (atof (rtos (vlax-curve-getdistatparam obj2 (vlax-curve-getendparam obj2))2 2)))
  17.     (if (equal len len2 0.3) (ssadd name add))
  18.     (setq n (1+ n))
  19.     );while
  20.   (if add (sssetfirst nil add))
  21.   (princ)
  22.   )
  23.   
  24.   


  25.   

感谢st788796指点,相同线长弄出来了,需要的拿去用吧
也希望指点不足的,我再学习下,谢谢哦

过滤线长

过滤线长

评分

参与人数 1D豆 +10 收起 理由
XDSoft + 10 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2014-11-29 16:44:42 | 显示全部楼层
:)vlax-curve... 函数不需要转VLA
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2014-11-29 16:46:26 | 显示全部楼层
  1. (defun c:tcc ( / add get0 gth len len2 n name obj obj2 rt sel ss)
  2.   (princ "\n功能 [选择相同线长]")
  3.   (setq obj (car (entsel "\n点取参照对象:"))
  4.         get0 (assoc 0 (entget sel))
  5.   )
  6.   (setq rt (rtos (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj)) 2 2))
  7.   (prompt (strcat "\n参照对象长度<" rt "> 过滤容差<0.3>"))
  8.   (setq len (atof rt))
  9.   (setq ss (ssget (list get0)))
  10.   (setq gth (sslength ss)
  11.         n 0
  12.   )
  13.   (setq add (ssadd))
  14.   (repeat gth
  15.     (setq obj2 (ssname ss n))
  16.     (setq len2 (atof (rtos (vlax-curve-getdistatparam obj2 (vlax-curve-getendparam obj2)) 2 2)))
  17.     (if (equal len len2 0.3)
  18.       (ssadd name add)
  19.     )
  20.     (setq n (1+ n))
  21.   );while
  22.   (if add
  23.     (sssetfirst nil add)
  24.   )
  25.   (princ)
  26. )

点评

感谢,炫哥指导  详情 回复 发表于 2014-11-29 17:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-11-29 17:00:15 | 显示全部楼层
做个动画就更完美了。

点评

好的,等下弄个动画  详情 回复 发表于 2014-11-29 17:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-29 17:27:13 | 显示全部楼层
XDSoft 发表于 2014-11-29 17:00
做个动画就更完美了。

好的,等下弄个动画
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-29 17:27:48 | 显示全部楼层

感谢,炫哥指导
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-29 18:18:04 | 显示全部楼层
本帖最后由 st788796 于 2014-11-29 18:19 编辑

可以这样写
  1. (defun c:tcc (/ obj get0 rt len ss sl el e add s)
  2.   (princ "\n功能 [选择相同线长]")
  3.   (if (and (progn
  4.              (princ "\n点取参照对象...")
  5.              (setq s (ssget ":S" '((0 . "*Line,arc,circle,ellipse"))))
  6.              (setq obj (ssname s 0))
  7.            )
  8.            (setq get0 (assoc 0 (entget obj)))
  9.            (setq rt
  10.                   (rtos
  11.                     (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj))
  12.                     2
  13.                     2
  14.                   )
  15.            )
  16.            (progn
  17.              (prompt (strcat "\n参照对象长度<" rt "> 过滤容差<0.3>"))
  18.              (setq len (atof rt))
  19.              (setq ss (ssget (list get0)))
  20.            )
  21.       )
  22.     (progn
  23.       (setq sl (sslength ss))
  24.       (while (setq e (ssname ss (setq sl (1- sl))))
  25.         (setq el (cons e el))
  26.       )
  27.       (if (setq        el (vl-remove-if-not
  28.                      '(lambda (x)
  29.                         (equal (vlax-curve-getdistatparam
  30.                                  x
  31.                                  (vlax-curve-getendparam x)
  32.                                )
  33.                                len
  34.                                0.3
  35.                         )
  36.                       )
  37.                      el
  38.                    )
  39.           )
  40.         (progn
  41.           (setq add (ssadd))
  42.           (foreach x el (ssadd x add))
  43.           (sssetfirst nil add)
  44.         )
  45.       )
  46.     )
  47.   )
  48.   (princ)
  49. )

点评

'(lambda (x) 这是什么意思,看帮助看不懂它的用法 举个简单的例子给我看下,它的用法  详情 回复 发表于 2014-11-30 10:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-29 19:44:38 | 显示全部楼层
本帖最后由 newer 于 2014-11-29 19:46 编辑

用API写,就是这样
  1. (defun c:tt()
  2.    (if (and (setq fuzz (getreal "\n容差<退出>:"))
  3.             (setq e (car (xdrx_entsel "\n样本实体<退出>:" '((0 . "*line,arc,ellipse,circle")))))
  4.             (progn
  5.                (prompt "\n选取实体<退出>:")
  6.                (setq ss (ssget '((0 . "*line,arc,ellipse,circle"))))
  7.             )
  8.        )
  9.      (progn
  10.         (setq len (xdrx_getpropertyvalue e "length"))
  11.         (setq lst (mapcar '(lambda(x)(list (xdrx_getpropertyvalue x "length") x))(xdrx_pickset->ents ss))
  12.               lst1 (xd::list:groupbyindex lst fuzz)
  13.         )
  14.         (sssetfirst nil (XD::Entity->Pickset(cdar (vl-member-if '(lambda (x)(equal (car x) len fuzz)) lst1))))
  15.      )
  16.    )
  17.    (princ)
  18. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-29 19:52:27 | 显示全部楼层
再简化些:

  1. (defun c:tt()
  2.    (if (and (setq fuzz (getreal "\n容差<退出>:"))
  3.             (setq e (car (xdrx_entsel "\n样本实体<退出>:" '((0 . "*line,arc,ellipse,circle")))))
  4.             (progn
  5.                (prompt "\n选取实体<退出>:")
  6.                (setq ss (ssget '((0 . "*line,arc,ellipse,circle"))))
  7.             )
  8.        )
  9.      (progn
  10.         (setq len (xdrx_getpropertyvalue e "length"))
  11.         (setq ss1 (ssadd))
  12.         (mapcar '(lambda(x)(if (equal len (xdrx_getpropertyvalue x "length") fuzz)(ssadd x ss1)))(xdrx_pickset->ents ss))
  13.         (sssetfirst nil ss1)
  14.      )
  15.    )
  16.    (princ)
  17. )


点评

(mapcar '(lambda(x) 看不懂这个,帮助也一下理解不了,能给讲解下不,谢谢了  详情 回复 发表于 2014-11-30 11:06
还有一种直接操作选择集方法  详情 回复 发表于 2014-11-30 10:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-11-30 10:02:06 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-11-30 10:03 编辑


还有一种直接操作选择集方法
  1. (defun c:tt (/ _Curve:Length s e filter len i e1 ss fuzz)
  2.   (defun _Curve:Length (curve /)
  3.     (vlax-curve-getdistatparam
  4.       curve
  5.       (vlax-curve-getendparam curve)
  6.     )
  7.   )
  8.   (if (and (setq fuzz (getreal "\nInput tolerance: "))
  9.            (progn
  10.              (prompt "\nPick Curve...")
  11.              (setq s (ssget ":S" '((0 . "*Line,arc,circle,ellipse"))))
  12.            )
  13.            (setq e (ssname s 0))
  14.            (setq filter (assoc 0 (entget e)))
  15.            (progn
  16.              (prompt "\nSelect Curves ...")
  17.              (setq ss (ssget (list filter)))
  18.            )
  19.       )
  20.     (progn
  21.       (setq len        (_Curve:Length e)
  22.             i        -1
  23.       )
  24.       (while (/= i (- (sslength ss) 2))
  25.         (if
  26.           (not
  27.             (equal len
  28.                    (_Curve:Length (setq e1 (ssname ss (setq i (1+ i)))))
  29.                    0.3
  30.             )
  31.           )
  32.            (progn
  33.              (ssdel e1 ss);_删除实体后,选集内后面实体计数前移
  34.              (setq i (1- i));_计数器要回退
  35.            )
  36.         )
  37.       )
  38.       (if ss
  39.         (sssetfirst nil ss)
  40.       )
  41.     )
  42.   )
  43.   (princ)
  44. )

点评

学习了,感谢指导 有点看不懂这个了,要慢慢消化下,有点高深了  详情 回复 发表于 2014-11-30 11:04
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-30 10:58:53 | 显示全部楼层

'(lambda (x)  这是什么意思,看帮助看不懂它的用法
举个简单的例子给我看下,它的用法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-30 11:04:15 | 显示全部楼层
Free-Lancer 发表于 2014-11-30 10:02
还有一种直接操作选择集方法

学习了,感谢指导 有点看不懂这个了,要慢慢消化下,有点高深了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-30 11:06:31 | 显示全部楼层

(mapcar '(lambda(x) 看不懂这个,帮助也一下理解不了,能给讲解下不,谢谢了

点评

(mapcar '(lambda(x) .....) lst) lst 是表,把表LST的每一个元素作为lambda的参数X,进入到lambda求值, 结果是每个求值结果 组成的表。 比如: lst = '(1 2 3 4 5) (mapcar '(lambda(x) (1+ x)) lst) =  详情 回复 发表于 2014-11-30 11:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-11-30 11:40:57 | 显示全部楼层
amwkto2011 发表于 2014-11-30 11:06
(mapcar '(lambda(x) 看不懂这个,帮助也一下理解不了,能给讲解下不,谢谢了

(mapcar '(lambda(x) .....) lst)

lst 是表,把表LST的每一个元素作为lambda的参数X,进入到lambda求值, 结果是每个求值结果 组成的表。

比如: lst = '(1 2 3 4 5)

(mapcar '(lambda(x) (1+ x)) lst)  ===> (2 3 4 5 6)

相当于:
(foreach n lst
    (setq lst1 (cons (1+ n) lst1))
)
(reverse lst1)

你理解 (lambda(x) (1+ x)) lst) 的 lambda相当于一个没有名字的临时函数。

点评

谢谢老大,有点感觉了,写程序来试下去  详情 回复 发表于 2014-11-30 11:44
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-30 11:44:04 | 显示全部楼层
XDSoft 发表于 2014-11-30 11:40
(mapcar '(lambda(x) .....) lst)

lst 是表,把表LST的每一个元素作为lambda的参数X,进入到lambda求 ...

谢谢老大,有点感觉了,写程序来试下去

点评

LISP要写好,mapcar 是必须要过的关,他能让你的更高效,也更可读。mapcar 也可以嵌套,你只要记住 没个LISP表,左括号第一个都是函数,每个表都由这个函数求值,得到的值作为上一层括号的参数,继续求职,知道最外  详情 回复 发表于 2014-11-30 11:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 05:12 , Processed in 0.229178 second(s), 70 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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