找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8390|回复: 53

[求助] 拾取一条线,相连线均亮显----已经解决,谢谢众乡亲!

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-5-5 09:19:18 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 /db_自贡黄明儒_ 于 2014-5-6 10:36 编辑

;这些线均在可视范围内,可老提示repeat 后为nil,即使用if判断后执行repeat也不行。以前觉得简单,可写起来就不是那么回事了。哪位高手指点一下?
;;点线显示相连的线
(defun C:W2 (/ E N P SS SS0)
  (defun HH:EndPtEnts (p e fuzz / E1 N PT SS)
    (setq ss (ssget "_C" p p '((0 . "*LINE,ARC"))))
    (repeat (setq n (sslength ss))
      (setq e1 (ssname ss (setq n (1- n))))
      (cond
        ((ssmemb e1 ss0) nil)
        (T
         (setq pt (vlax-curve-getStartPoint e))
         (cond ((equal p pt fuzz) nil)
               (T (HH:EndPtEnts pt e1 fuzz))
         )
         (setq pt (vlax-curve-getEndPoint e))
         (cond ((equal p pt fuzz) nil)
               (T (HH:EndPtEnts pt e1 fuzz))
         )
         (ssadd e1 ss0)
        )
      )
    )
  )
  (setq ss0 (ssget "_+.:E:S" '((0 . "*LINE,ARC"))))
  (setq e (ssname ss0 0))
  (setq p (vlax-curve-getStartPoint e))
  (HH:EndPtEnts p e 0.1)
  (setq p (vlax-curve-getEndPoint e))
  (HH:EndPtEnts p e 0.1)
  (repeat (setq n (sslength ss0)) (redraw (ssname ss0
Rn) 3) (setq n (1-  n)))
)

w2.LSP

843 Bytes, 下载次数: 52

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

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2014-5-6 13:09:59 | 显示全部楼层
ll_j 发表于 2014-5-6 11:15
那个问题要求不清晰,换句话说,关联表不是那样用的。
比如表中有'(5 6)和'(6 5),岂不要死循环,如果re ...

这个是群里网友的求助,处理直线端点表什么的可以是扩展功能,就这个表'((6 7)(1 2)(3 4)(6 5)(2 3)(7 8)),凡是x或y有一项相同就分为同一组,这个用递归写我就绕不过来...拜托长老用递归法解决下,谢谢了....即使表中有'(5 6)和'(6 5)...也没关系...加入同一组内的表就不在查找范围内了,不会死循环..也无所谓顺序的....只要分成一组就行.....

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

使用道具 举报

已领礼包: 8612个

财富等级: 富甲天下

发表于 2014-5-5 09:24:11 | 显示全部楼层
只是首尾相连的?相交和相切的怎么判断?

点评

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-5-5 09:29:27 | 显示全部楼层
liuyj 发表于 2014-5-5 09:24
只是首尾相连的?相交和相切的怎么判断?

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-5 11:10:03 来自手机 | 显示全部楼层
本帖最后由 csharp 于 2014-5-5 11:11 编辑

1子函数中点选择也用"_:E"加过滤,然后判断是否相连
2 亮显试试sssetfirst

点评

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-5-5 11:36:49 | 显示全部楼层
csharp 发表于 2014-5-5 11:10
1子函数中点选择也用"_:E"加过滤,然后判断是否相连
2 亮显试试sssetfirst

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2014-5-5 11:50:29 | 显示全部楼层
G版的....
;;选择直线相连 By Gu_xl
(defun c:tt(/ gxl-Sel-ReDrawSel gxl-Sel-SSsub gxl-Sel-SSJoin gxl-sel-SSgetLineatPoint getline)
  (defun gxl-Sel-ReDrawSel (Sel mode / m n)
    (setq m (sslength Sel)
   n 0)
    (repeat m
(redraw (ssname Sel n) mode)
(setq n (1+ n))
);repeat
    )
  (defun gxl-Sel-SSsub(ss1 ss2 / ss n)
(cond
((and ss1 ss2)
  (setq n 0)
  (repeat (sslength ss2)
    (ssdel (ssname ss2 n) ss1)
    (setq n (1+ n))
    )
)
((and ss1 (not ss2))
  ss1
)
(T
  (setq ss1 nil)
)
)
ss1
)
  (defun gxl-Sel-SSJoin ( ss1 ss2 / ename ss cnt )
(if ss1
(progn
(if (= (type ss1) 'ENAME)
(progn
  (setq
   ename ss1
   ss1   (ssadd)
  )
  (ssadd ename ss1)
))
))
(if ss2
(progn
(if (= (type ss2) 'ENAME)
(progn
  (setq
   ename ss2
   ss2   (ssadd)
  )
  (ssadd ename ss2)
))
))
(setq ss (ssadd))
(if (and ss1 ss2)
(progn
;(setq ss ss2 cnt 0)
        (setq  cnt 0)
        (repeat (sslength ss2)
  (ssadd (ssname ss2 cnt) ss)
  (setq cnt (1+ cnt))
)
        (setq  cnt 0)
(repeat (sslength ss1)
  (ssadd (ssname ss1 cnt) ss)
  (setq cnt (1+ cnt))
)
))
(if (and ss1 (not ss2))
(setq ss ss1))
(if (and ss2 (not ss1))
(setq ss ss2))
(if (> (sslength ss) 0)
  ;;(eval ss)
ss
nil
)
)
  (defun gxl-sel-SSgetLineatPoint (pt jd /  px py px0 px1 py0 py1 ss  pz)
(setq px (car pt)
      px0 (- px jd)
      px1 (+ px jd)
      py (cadr pt)
      py0 (- py jd)
      py1 (+ py jd)
      pz (caddr pt)
      )
  (setq ss
(ssget "x" (list '(0 . "line")
   '(-4 . "<or")
   '(-4 . "<and")
   '(-4 . ">=,>=,=")
   (list 10 px0 py0 pz)
   '(-4 . "<=,<=,=")
   (list 10 px1 py1 pz)
   '(-4 . "and>")
   
   '(-4 . "<and")
   '(-4 . ">=,>=,=")
   (list 11 px0 py0 pz)
   '(-4 . "<=,<=,=")
   (list 11 px1 py1 pz)
   '(-4 . "and>")
   
   '(-4 . "or>")
   )
       )
  )
  (if ss(GXL-SEL-REDRAWSEL ss 3))
  ss
  )
  (defun getline (pt jd / s s1 n p1 p2)
   
    (setq s (gxl-sel-SSgetLineatPoint pt jd))
    (if s
      (progn
(setq s1 (GXL-SEL-SSSUB s ssrtl)
       ssrtl (GXL-SEL-SSJOIN ssrtl s1)
       )
(if s1
   (progn
     (setq n 0)
     (repeat (sslength s1)
       (setq p1 (cdr (assoc 10 (entget (ssname s1 n))))
      p2 (cdr (assoc 11 (entget (ssname s1 n))))
      )
       (getline p2 jd)
       (getline p1 jd)
       (setq n (1+ n))
       )
     )
   )
)
      )
   
    )
  ;;;程序开始
    (princ "\n选择直线:")
  (setq enline (car (entsel)))
  (initget 5 "  ")
  (setq jd (getreal "输入容差精度:<0.001>"))
  (if (= jd "")(setq jd 0.001))
  (setq pt1 (cdr (assoc 10 (entget enline))))
  (setq pt2 (cdr (assoc 11 (entget enline))))
(setq ssrtl (ssadd enline))
  (getline pt1 jd)
  (getline pt2 jd)
  (sssetfirst nil ssrtl)
  )

点评

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-5-5 12:59:25 | 显示全部楼层
q3_2006 发表于 2014-5-5 11:50
G版的....
;;选择直线相连 By Gu_xl
(defun c:tt(/ gxl-Sel-ReDrawSel gxl-Sel-SSsub gxl-Sel-SSJoin gxl ...

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-5-5 13:20:12 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2014-5-5 13:36 编辑

选线,取首尾点,:E靶框内所有线选集,遍历选集,判断各首尾点是否为选点,是取另一个端点循环
1 点是否在屏幕内
2 用递归可能简化
3 还可以将第一次的首尾点构造一个list 然后用 while cdr 这个表去选,相连线的另一个端点再cons 进来

点评

长老,我用的是第二,递归,为什么就是不行呢?帮看看呀!  详情 回复 发表于 2014-5-5 14:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-5-5 14:08:15 | 显示全部楼层
st788796 发表于 2014-5-5 13:20
选线,取首尾点,:E靶框内所有线选集,遍历选集,判断各首尾点是否为选点,是取另一个端点循环
1 点是否在 ...

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-5-5 14:58:42 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2014-5-5 15:20 编辑
/db_自贡黄明儒_ 发表于 2014-5-5 14:08
长老,我用的是第二,递归,为什么就是不行呢?帮看看呀!


主程序的repeat 是 ss0
子函数中首尾是平行条件,都要执行,不是只执行一个
另外增加判断点是否在屏幕内判断, :E 只能用于拾取选择,不接受点参数, c p p不保障能全选到,最好用当前靶框构造,另外你只考虑了一一连接,如果有一端连接多个线时这个算法不适用

点评

长老,你这个回答还是不痛不痒的。关键是我这个运行不了,找不到原因。 即使我确保这些线都在可视范围内也不行。显示错误为:子函数repeat 后为nil  详情 回复 发表于 2014-5-5 15:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-5-5 15:47:15 | 显示全部楼层
st788796 发表于 2014-5-5 14:58
主程序的repeat 是 ss0
子函数中首尾是平行条件,都要执行,不是只执行一个
另外增加判断点是否在屏 ...

长老呀,你这个回答还是不痛不痒的。关键是我这个运行不了,找不到原因。
即使我确保这些线都在可视范围内也不行。显示错误为:子函数repeat 后为nil
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-5-5 16:16:43 来自手机 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2014-5-5 15:47
长老呀,你这个回答还是不痛不痒的。关键是我这个运行不了,找不到原因。
即使我确保这些线都在可视范围 ...

nil 就是ssget为 空啊,去掉捕捉,用当前靶框大小构造 C 参数,然后筛选出来连接线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2014-5-5 18:03:46 | 显示全部楼层
最后的(1+ n)是不是该(1- n)?

点评

谢谢指正!估计还是运行不了  详情 回复 发表于 2014-5-5 19:07
元老呀,后面亮显语句是错了°主要还是那个递归子函数运行不了,我百思不得其解,郁闷几天了  详情 回复 发表于 2014-5-5 19:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-5-5 19:03:21 来自手机 | 显示全部楼层
ll_j 发表于 2014-5-5 18:03
最后的(1+ n)是不是该(1- n)?

元老呀,后面亮显语句是错了°主要还是那个递归子函数运行不了,我百思不得其解,郁闷几天了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-5-5 19:07:41 来自手机 | 显示全部楼层
ll_j 发表于 2014-5-5 18:03
最后的(1+ n)是不是该(1- n)?

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 05:18 , Processed in 0.431569 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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