在交点处插入点
大家好,我是这个网站的新手,有没有lisp程序可以在每一条直线的交点和端点插入点?
这里我附上样品图纸。请提供lisp。
谢谢
点在交点和线的端点处插入。图纸 我丢失了一个解决方案,或者我把它叫做其他东西,所以找不到,所以现在,唯一的问题是,在多条线相交的地方,你们会得到很多点,所以版本二将删除重复项。
; notested
(defun c:test ( / ss x obj stpt endpt)
(setq ss (ssget '((0 . "line"))))
(repeat (setq x (sslength ss))
(setq obj (vlax-ename->vla-object(ssname ss (setq x (- x 1)))))
(setq stpt (vlax-safearray->list (vlax-variant-value(vla-get-startpoint obj))))
(setq endpt (vlax-safearray->list (vlax-variant-value (vla-get-endpoint obj))))
(command "point" stpt "point" endpt)
)
)
好的,回答BIGAL,
是,生成了重复点。
代码对于行的起点和终点都很好。但缺少交点。请看一下交点。
谢谢
这是可能的,但在大文件上效率很低。
[列表]
[*]所有实体都是二维线吗?
[*]所有线路的标高是否相同?
[*]您需要指定公差值
[*]如果PDMODE=0,该点将不可见
[/列表]
-大卫 尊敬的DAVID:,
[列表]
[*]所有实体都是二维线吗?>对
[*]所有线路的标高是否相同?>对
[*]您需要指定一个公差值>零公差
[*]如果PDMODE=0,该点将不可见>Ok
[/列表]
谢谢 由于实数的存储方式,您必须具有某种类型的容差。
可能是这样的:
(defun c:line-pt (/ f pl ss i en ed p10 p11 c cn cd c10 c11 ip)
;;;ROUND WITH PRECESSION
(defun rnd (n m)
(* m (fix ((if (minusp n) - +) (/ n m) 0.5))))
(defun rp3 (p f)
(list (rnd (nth 0 p) f)
(rnd (nth 1 p) f)
(rnd (nth 2 p) f)))
(initget 6)
(setq f (getdist "\nFuzz Tolerance <1e-4>: "))
(or f (setq f 1e-4))
(while (not ss)
(setq ss (ssget (list (cons 0 "LINE")))))
(setq i 0)
(while (setq en (ssname ss i))
(setq ed (entget en)
p10 (rp3 (cdr (assoc 10 ed)) f)
p11 (rp3 (cdr (assoc 11 ed)) f))
(if (not (member p10 pl))
(setq pl (cons p10 pl)))
(if (not (member p11 pl))
(setq pl (cons p11 pl)))
(setq i (1+ i)))
(princ "\nSearching For Intersections...\n")
(setq i 0)
(while (setq en (ssname ss i))
(princ "\r")
(prin1 en)
(setq ed (entget en)
p10 (cdr (assoc 10 ed))
p11 (cdr (assoc 11 ed))
c 0)
(while (setq cn (ssname ss c))
(setq cd (entget cn)
c10 (cdr (assoc 10 cd))
c11 (cdr (assoc 11 cd)))
(and (setq ip (inters p10 p11 c10 c11))
(setq ip (rp3 ip f))
(not (member ip pl))
(setq pl (cons ip pl)))
(setq c (1+ c)))
(setq i (1+ i)))
(setvar "PDMODE" 3)
(foreach p pl
(entmake (list (cons 0 "POINT")(cons 10 p))))
(prin1))
我在400条线上试了一下,大约花了5秒钟。
-大卫 尊敬的DAVID:,
谢谢你的Lisp程序。现在所有的点都产生了。但点不是在精确的角点和端点处产生的。请查看附件中的图片。
为什么要问你的Lisp程序模糊容忍度?不用问。请将其设置为应在线路的每个起点、终点和交点处形成的点。并建立了重复点。请修改。
谢谢
尝试将公差设置为1e-14。比较点并不是一个精确的过程。特别是当其中一个点值由另一个计算调用确定时。即(inters)或(polar)或修剪或延伸功能已应用。(成员)测试必须精确等于才能返回T
-大卫 尊敬的DAVID:,
改为1e-14后,分数表现良好。但在某些相交区域,会出现重复点。请看一看。请删除命令提示框中的模糊容差选项,以指导点的开发。
谢谢 你没听懂
试试这个:
理论上,这些点是相等的:
(setq p1 (list 1000 3000 0))
(setq tp (inters
(polar (list 1000 3000 0) (* pi0.5) 1000)
(polar (list 1000 4000 0) (* pi -0.5) 1000)
(polar (list 1000 2000 0) pi 500)
(polar (list 1500 2000 0) (* pi0.5) 2000)
))
(princ "\nEqual p1 tp : ") (prin1 (equal p1 tp))
(princ "\nEqual p1 tp 1e-1: ") (prin1 (equal p1 tp 1e-1))
(princ "\nEqual p1 tp 1e-3: ") (prin1 (equal p1 tp 1e-3))
(princ "\nEqual p1 tp 1e-5: ") (prin1 (equal p1 tp 1e-5))
(princ "\nEqual p1 tp 1e-7: ") (prin1 (equal p1 tp 1e-7))
(princ "\nEqual p1 tp 1e-9: ") (prin1 (equal p1 tp 1e-9))
(princ "\nEqual p1 tp 1e-11 : ") (prin1 (equal p1 tp 1e-11))
(princ "\nEqual p1 tp 1e-13 : ") (prin1 (equal p1 tp 1e-13))
(princ "\nEqual p1 tp 1e-14 : ") (prin1 (equal p1 tp 1e-14))
但1e-13和1e-14返回零
这是计算机存储超过14位有效数字的方式。否则,你会得到看起来重复但实际上很接近但不精确的点。
页:
[1]
2