明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1742|回复: 9

Meflying And 龍龍仔, 我寫的一個串聯選對象幫看看

[复制链接]
发表于 2004-11-4 11:48:00 | 显示全部楼层 |阅读模式
介绍:



        本程序是用来选一个对象后, 程序就自动找出这个对象相交的其他对象选到组成一个新的选集,         所以意思串联选择对象程序,


        附一个DWG文件和LISP程序一份1, 这个程序是刚完成的, 对我很有用. 只是有时候出错. 我看了很久发现不了不足的地方, 所以传一份上来请教两位, 看看怎么改进.


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2004-11-4 11:50:00 | 显示全部楼层
本帖最后由 作者 于 2006-9-14 13:50:31 编辑

程序代码

[Power=1]; 程序开发: 包达勇  [ BDYCAD ]
; 日期:     2004-10-29
; 开发时间   8:00~10.33 共用了两个小时33分
; 功能: 串联选择相交的SPLINE
;;;(Strand-SelectObject [曲线对象]  [图层] )
;(Strand-SelectObject (car (entsel))  "0" )
; (setq 1-SPLINE (car (entsel)) lays "0")
(DEFUN Strand-SelectObject (1-SPLINE lays  / SSS End-Sel dib Slength S-p STP-1 STP-2 STP-3 STP-4  STP-5 STP-6 STP-7
        ttod S-del i is 2-SPLINE spt1 spt2 ept2)
  (defun xl-div-Strand (lst x / lst2)
    (foreach n lst
    (if (and  lst2 (/= x (length (car lst2))))
    (setq lst2 (cons (append (car lst2) (list n)) (cdr lst2)))
    (setq lst2 (cons (list n) lst2))))
    (reverse lst2))
  (defun x@_int-Strand-SelectObject (e1 e2 / obj1 obj1 ptlst ptints)
    (setq obj1 (vlax-ename->vla-object e1)
    obj2 (vlax-ename->vla-object e2)
       ptlst (append ptlst (xl-div-Strand (vlax-invoke obj1 'IntersectWith obj2 0) 3)))
  ptlst)
  (setq SSS (SSADD)  End-Sel 1-SPLINE dib 1.0 Slength (vlax-curve-getEndParam 1-SPLINE))
  (if (< Slength 30) (setq S-p (/ Slength 5))(setq S-p 12.0))
  (setq STP-1 (vlax-curve-getPointAtParam 1-SPLINE (vlax-curve-getstartparam 1-SPLINE)))
  (setq STP-2 (vlax-curve-getPointAtParam 1-SPLINE(- (vlax-curve-getstartparam 1-SPLINE) dib)))
  (setq STP-3 (vlax-curve-getPointAtParam 1-SPLINE (+ (vlax-curve-getstartparam 1-SPLINE) S-p)))
  (setq STP-4 (polar STP-2 (+ (* 0.5 pi) (angle STP-2 STP-1)) dib))
  (setq STP-5 (polar STP-4 (angle STP-4 STP-2) (* 2 dib)))
  (setq STP-6 (polar STP-4 (angle STP-2 STP-3) S-p))
  (setq STP-7 (polar STP-5 (angle STP-2 STP-3) S-p))
  (SSADD End-Sel SSS)
  (setq ttod 0 S-del (ssget "CP" (list STP-4  STP-5 STP-7 STP-6 STP-4 )
       (list (cons 0  "SPLINE") (cons 8 lays))))
  ;(vl-cmdf ".pline" STP-4 STP-5 STP-7 STP-6 "c")
  (ssdel 1-SPLINE S-del )
  (while (and S-del (/=(SSLENGTH S-del)0) (< ttod 100))
  (if (> (sslength S-del) 1)
    (progn
      (setq i 0)
    (repeat (sslength S-del)
      (setq is (ssname S-del i) i (1+ i))
      (if (=(x@_int-Strand-SelectObject is 1-SPLINE) nil) (ssdel is S-del)))))
  (if (= (sslength S-del) 1) (PROGN (SETQ 2-SPLINE (ssname S-del 0 )) (ssadd 2-SPLINE SSS)))
  (setq spt1 (vlax-curve-getstartpoint 1-SPLINE))
  (setq spt2 (vlax-curve-getstartpoint 2-SPLINE))
  (setq ept2 (vlax-curve-getendpoint 2-SPLINE))
  (if (> (distance STP-1 ept2) (distance spt1 spt2))
    (vl-cmdf ".splinedit" 2-SPLINE "E" "x"))
    (setq 1-SPLINE 2-SPLINE ttod (1+ ttod)Slength (vlax-curve-getEndParam 1-SPLINE))
   (if (< Slength 30) (setq S-p (/ Slength 5))(setq S-p 12.0))
  (setq STP-1 (vlax-curve-getPointAtParam 1-SPLINE (vlax-curve-getstartparam 1-SPLINE)))
  (setq STP-2 (vlax-curve-getPointAtParam 1-SPLINE(- (vlax-curve-getstartparam 1-SPLINE) dib)))
  (setq STP-3 (vlax-curve-getPointAtParam 1-SPLINE (+ (vlax-curve-getstartparam 1-SPLINE) S-p)))
  (setq STP-4 (polar STP-2 (+ (* 0.5 pi) (angle STP-2 STP-1)) dib))
  (setq STP-5 (polar STP-4 (angle STP-4 STP-2) (* 2 dib)))
  (setq STP-6 (polar STP-4 (angle STP-2 STP-3) S-p))
  (setq STP-7 (polar STP-5 (angle STP-2 STP-3) S-p))
    (setq S-del (ssget "f" (list STP-4  STP-5 STP-7 STP-6 STP-4) (list (cons 0  "SPLINE") (cons 8 lays))))
    ;(vl-cmdf ".pline" STP-4 STP-5 STP-7 STP-6 "c")
    (if (ssmemb End-Sel S-del) (setq S-del nil) (ssdel 1-SPLINE S-del ))
    )
  SSS)
(PRINC)[/Power]
发表于 2004-11-4 13:50:00 | 显示全部楼层
(setq TTOD 0
S-DEL (ssget "CP" ;S-DEL有可能为NIL,定义点有问题
(list STP-4 STP-5 STP-7 STP-6 STP-4)
(list (cons 0 "SPLINE") (cons 8 LAYS))
)
)
 楼主| 发表于 2004-11-4 14:01:00 | 显示全部楼层
龙龙仔, 关建就是选用这个方式的时有时选不到就出事了, 例出点的位置超出绘图区也会造成s-del变量为nil的. 还有就是有时候我发现(list STP-4 STP-5 STP-7 STP-6 STP-4)这几个点有时程序里面计算了会出错. 不知如何解决哦. .. .
发表于 2004-11-4 14:14:00 | 显示全部楼层
使用选择前先ZOOM A 一下, 我也写了一个,,,跟你有点类似,不过选择方式上不同...
  1. (vl-load-com)
  2. (defun sscat(ss1 ss2 / i)
  3.    (setq i 0)
  4.    (cond
  5.        ((not ss1) ss2)
  6.        ((not ss2) ss1)
  7.        (t (while (< i (sslength ss2))
  8.    (ssadd (ssname ss2 i) ss1)
  9.    (setq i (1+ i)))
  10.          ss1)
  11.    )
  12. )
  13. (defun ssred(ss1 ss2 / i)
  14.    (setq i 0)
  15.    (cond
  16.        ((not ss1) nil)
  17.        ((not ss2) ss1)
  18.        (t (while (< i (sslength ss2))
  19.    (ssdel (ssname ss2 i) ss1)
  20.    (setq i (1+ i)))
  21.          ss1)
  22.    )
  23. )
  24. (defun HasInters (ent_1 ent_2 / ax_ent_1 ax_ent_2 intpoints)
  25.    (setq ax_ent_1 (vlax-ename->vla-object ent_1)
  26.                ax_ent_2 (vlax-ename->vla-object ent_2)
  27.    )
  28.    (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendboth))
  29.    (setq intpoints (vlax-variant-value intpoints))
  30.    (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
  31.        t
  32.        nil
  33.    )
  34. );用法:(Strand-SelectObject (car (entsel))   "0" nil)
  35. (DEFUN Strand-SelectObject (1-SPLINE lays ssOld / ss ssnew i ent ssnew)
  36.    (vla-getboundingbox (vlax-ename->vla-object 1-spline) 'pt1 'pt2)
  37.    (setq ss (ssget "c" (vlax-safearray->list pt1) (vlax-safearray->list pt2) (list '(0 . "SPLINE") (cons 8 lays))))
  38.    ;(setq ss (ssget "x" (list '(0 . "spline") (cons 8 lays)));使用这个比较准确,但速度将减慢很多
  39.    (setq i 0 ssnew (ssadd 1-spline))
  40.    (repeat (sslength ss)
  41.        (setq ent (ssname ss i))
  42.        (if (HasInters ent 1-spline)
  43.            (ssadd ent ssnew)
  44.        )
  45.        (setq i (1+ i))
  46.    )
  47.    (setq ssnew (ssred ssnew ssOld))
  48.    (setq ssOld (sscat ssOld ssnew))
  49.    (setq i 0)
  50.    (repeat (sslength ssnew)
  51.        (setq ssOld (Strand-SelectObject (ssname ssnew i) lays ssOld))
  52.        (setq i (1+ i))
  53.    )
  54.    ssOld
  55. )
 楼主| 发表于 2004-11-4 14:34:00 | 显示全部楼层
(DEFUN Strand-SelectObject (1-SPLINE lays ssOld / ss ssnew i ent ssnew)


使用时SSOLD不知你的用意呢? 可给个示例看看吧. 
发表于 2004-11-4 14:37:00 | 显示全部楼层
已经更新了,


(Strand-SelectObject (car (entsel))         "0" nil)
发表于 2004-11-4 15:38:00 | 显示全部楼层
记得以前也提过EXPRESSTOOLS中指令 指令: FS Use 'FSMODE to control chain selection.
FSMODE = ON
Select touching object: 4 object(s) found.
Exiting Fastsel
 楼主| 发表于 2004-11-4 16:22:00 | 显示全部楼层
原来这里早有了

发表于 2004-11-4 17:52:00 | 显示全部楼层
命令: (Strand-SelectObject (car (entsel)) "0" nil)
选择对象:
错误: 参数类型错误: lselsetp nil
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-18 09:25 , Processed in 0.301745 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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