zzl9105 发表于 2011-10-20 09:44 
那就不知道你在9楼时说的什么意思了?算法是没有问题的,你自己好好体会吧。
反正我的程序已经实现打断了 ...
仔细看了看,我在9楼的帖子意思表达得很清楚啊。如果说一定有什么不准确的地方,就是我少了一句状语:“在未对点表中的点进行特定排序的条件下”。可这是论坛发贴子,不是学报投论文,不需要添加这么一句吧?况且楼顶的帖子并没有说明ptlist已经经过特定的排序了。我在这个前提下作出“算法有问题”的结论,有什么问题?
至于我的思路的实现代码,贴在下面了 - (defun c:dd( / ss ss1 ii jj pt5 pt3 pt4 pl ename1 ell1 type echo os)
- (setq ss (ssget '((0 . "*LINE,ARC")))
- pl (getinterptlist ss)
- ii 0
- os (getvar "OSMODE")
- echo (getvar "CMDECHO")
- );setq
- (setvar "OSMODE" 0)
- (setvar "CMDECHO" 0)
- (repeat (length pl)
- (setq pt5 (nth ii pl)
- ii (1+ ii)
- pt3 (polar (trans pt5 0 1) (* pi 0.75) 0.0001)
- pt4 (polar (trans pt5 0 1) (* pi 1.75) 0.0001)
- ss1 (ssget "c" pt3 pt4)
- jj 0
- pt5 (trans pt5 0 1)
- );setq
- (repeat (sslength ss1)
- (setq ename1 (ssname ss1 jj)
- ell1 (entget ename1)
- jj (1+ jj)
- type (cdr (assoc 0 ell1))
- );setq
- (if (and (ssmemb ename1 ss) (member type (list "LINE" "LWPOLYLINE" "SPLINE" "ARC")))
- (progn
- (vl-cmdf "_break" ename1 pt5 pt5)
- (setq ss (ssadd (entlast) ss))
- );progn
- );if
- );repeat
- );repeat
- (setvar "OSMODE" os)
- (setvar "CMDECHO" echo)
- (princ)
- )
- (defun getinterptlist( ss / i j datalist ptlist pt e1 e2 k)
- (setq i 0 ptlist '())
- (repeat (sslength ss)
- (setq e1 (vlax-ename->vla-object (ssname ss i))
- i (1+ i)
- j i
- );setq
- (repeat (- (sslength ss) i)
- (setq e2 (vlax-ename->vla-object (ssname ss j))
- j (1+ j)
- datalist (vlax-invoke e1 'intersectwith e2 0)
- );setq
- (if datalist
- (progn
- (setq k 0)
- (while (nth k datalist)
- (setq pt (list (nth k datalist) (nth (1+ k) datalist))
- ptlist (append ptlist (list pt))
- k (+ 3 k)
- );setq
- );while
- );progn
- );if
- );repeat
- );repeat
- ptlist
- )
另:算法不是我说有问题就有问题,更不是你说没问题就没问题的。我也不会奉劝别人“好好体会”。 |