找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 672|回复: 2

[求助] [求助]:请高手解决等分点一次连成线的程序

[复制链接]
发表于 2005-4-5 19:54:12 | 显示全部楼层 |阅读模式

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

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

×
如图1所示,每次要连成上百个点很麻烦,请高手帮编个程,能一次或分上下二次就形成如图2所示,先谢谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-4-5 20:04:53 | 显示全部楼层
这个程序比较简单,你可以自己考虑一下
想问一下你的线是不是一条复线?如果是
给你个编程思路:
1...取得所有顶点做成一个列表
2...按奇偶数分为两个列表
3...把两个列表的点串起来就好了,
如果你的线有可能是分开的可以在
程序前面补一个判断程序:
  1....点选第一条线判断是否是复线.
2..如果是就直接进入上面所说的程序如果不时可以根据端点相关性将所有
线串为复线..然后进入程序..
你可以自己先动一下脑和手写一下,不难的..
写程序也就这样..多想多写就会熟的......
不知道我说的你明不明白.现帮你随便写了一下不知道
能不能符合你的要求...
(defun c:linkline(/ en lisp 13list i 24list )
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(WHILE (not(setq en (car(entsel "\n請選擇一段線"))))
(setq en (car(entsel "\n請選擇一段線"))))
(hy_apline en)
(setq lisp (hy_polpoint (entlast)))
(setq i 0)
(setq 13list '())
(setq 24list '())
(foreach item lisp (if i (progn (if (and (= (rem i 2) 0) (/= i 1))
(setq 13list (cons item 13list))
(setq 24list (cons item 24list))
)
(setq i (1+ i))
)
)
)
(command "pline")
(foreach item 13list (command item))
(command "")
(command "change" (entlast) "" "p" "color" "1" "")
(command "pline")
(foreach item 24list (command item))
(command "")
(command "change" (entlast) "" "p" "color" "1" "")
(princ "-------->> pline ok!! <<--------")
(prin1)
)
(defun hy_polpoint(object / endata i endata_li)
(setq point_list '())
(setq endata (entget object))
(setq i 0)
(while (< i (length endata))
(setq endata_li (nth i endata))
(if (= (car endata_li) 10) (setq point_list (cons (cdr endata_li) point_list)))
(setq i (1+ i))
)
(setq point_list (reverse point_list))
)
(defun hy_apline(ename1 / vla-obj endpoint ename startpoint i ss1 nn ssm ssn itemx);;;選擇一條線串接與之相聯的圖元為多義線
(if (= "LWPOLYLINE" (cdr(assoc 0 (entget ename1)))) (command "._explode" ename ""))
(setq ename (entlast))
(setq vla-obj (vlax-ename->vla-object ename))
(setq startpoint (vlax-curve-getstartpoint vla-obj)
endpoint (vlax-curve-getendpoint vla-obj))
;(safearray-value(vlax-variant-value(vla-get-endpoint vla-obj))))
(if (OR (= "POLYLINE" (cdr(assoc 0 (entget ename))))
(= "LWPOLYLINE" (cdr(assoc 0 (entget ename)))))
(setq i 1)(SETQ I 0))
(setq j 0);;計數器歸0
(setq nn 0)
(princ " ─── \r")
(while (> (distance startpoint endpoint) 0.0000001);(= (vla-get-closed vla-obj) :vlax-false)
;(setq ss1 (ssget "x" (list (cons -4 " (setq ss1 (ssadd))
(setq ssn (ssget "f" (list endpoint (polar endpoint 0.8 0.1))))
(foreach itemx (ap-sslist ssn)
(if (or (< (distance endpoint (vlax-curve-getstartpoint (vlax-ename->vla-object itemx))) 0.0000001)
(< (distance endpoint (vlax-curve-getendpoint (vlax-ename->vla-object itemx))) 0.0000001))
(setq ss1 (ssadd itemx ss1))
)
)
(setq ss2 (ssadd))
(setq ssm (ssget "f" (list startpoint (polar startpoint 0.8 0.1))))
(foreach itemx (ap-sslist ssm)
(if (or (< (distance startpoint (vlax-curve-getstartpoint (vlax-ename->vla-object itemx))) 0.0000001)
(< (distance startpoint (vlax-curve-getendpoint (vlax-ename->vla-object itemx))) 0.0000001))
(setq ss2 (ssadd itemx ss2))
)
)
(setq ssg (addss ss1 ss2))
(if (= 0 i)(command "pedit" ename "y" "j" ssg "" "")
(command "pedit" ename "j" ssg "" ""))
(setq ename (entlast))
(setq vla-obj (vlax-ename->vla-object ename))
(setq startpoint (vlax-curve-getstartpoint vla-obj)
endpoint (vlax-curve-getendpoint vla-obj))
(setq i (1+ i))
(setq nn (1+ nn))
(cond ((= nn 15)(princ (strcat "線很長..正在串接中,請稍侯 ...... ───" "\r")))
((= nn 30)(princ (strcat "線很長..正在串接中,請稍侯 ...... ﹨﹨﹨" "\r")))
((= nn 45)(princ (strcat "線很長..正在串接中,請稍侯 ...... │││" "\r")))
((= nn 60)(princ (strcat "線很長..正在串接中,請稍侯 ...... ∕∕∕" "\r")))
)
(if (> nn 60) (setq nn 1))
(setq j (1+ j))
(IF (and (= 1 (sslength ssg))(= (vla-get-closed vla-obj) :vlax-false))
(setq startpoint '(0 0 0) endpoint '(0 0 0)));(alert "\n請注意!****串接不線不能封閉!")
)
(if (> j 1000)(prompt (strcat "\n恭喜你一共把" (itoa (+ (* 2 j) 3)) "條線串接成了一個封閉的復線!")))
)
执行LINKLINE....
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-6 05:08:20 | 显示全部楼层
舟自横您好!
您的贴子,等于发了二次,我也没法出于礼貌,我也重复回贴了
谢谢您的帮助,不好意思我没讲清楚,我一点都不懂编程,
我要的这个程序已经有狂刀兄圆满的解决了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 02:31 , Processed in 0.183954 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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