一个关于3d线的问题请大家解决
谢谢大家 有几个问题:
1、是距离黄线,还是与黄线的交点,直线距离还是沿红色线的距离。
2、交点是否用红线与黄线相交来获得比较好? (defun setcolor(sname color / sinf)
(setq sinf (entget sname))
(if (assoc 62 sinf)
(setq sinf (subst (cons 62 color) (assoc 62 sinf) sinf))
(setq sinf (append sinf (list (cons 62 color))))
)
(entmod sinf)
)
(defun c:Brk( / pt1 pt2 pt param1 param2 param ent entv ent2 ent2v)
(setq pt1 (getpoint "\n选择交点一:"))
(setq pt2 (getpoint "\n选择交点二:"))
(prompt "\n选择红线...")
(setq ent (car (entsel)))
(setq entv (vlax-ename->vla-object ent))
(setq param1 (vlax-curve-getParamAtPoint entv pt1))
(setq param2 (vlax-curve-getParamAtPoint entv pt2))
(if (< param2 param1)
(progn
(setq pt pt2
pt2 pt1
pt1 pt)
(setq param param2
param2 param1
param1 param)
)
)
(setq pt1 (vlax-curve-getPointAtDist entv (- (vlax-curve-getDistAtParam entv param1) 0.5)))
(setq pt2 (vlax-curve-getPointAtDist entv (+ (vlax-curve-getDistAtParam entv param2) 0.5)))
(setcolor ent 4)
(command "_.break" (list ent pt1) "f" pt1 "@")
(setcolor (entlast) 1)
(setq ent2 (entlast))
(setq ent2v (vlax-ename->vla-object ent2))
(command "_.break" (list ent2 pt2) "f" pt2 "@")
(setcolor (entlast) 4)
(princ)
) 1、是距离黄线,还是与黄线的交点,直线距离还是沿红色线的距离。
答是:黄线的交点是沿红色线的距离为0.5
2、交点是否用红线与黄线相交来获得比较好?
就是红线与黄线的交点
飞哥刚才我那您的程序试了一下有执行错的时候
黄线两边的线上点的距离都应该为0.5
也就是说不管这0.5中有多少个点方向如何只要是距我们选的交点都距离0.5就好了
这种情况用您的程序就不好是了 飞哥和龙大侠都出手了
惊动的人不少呀
谢谢了 其实并不是出什么错了,就是捕捉交点的问题。由于离得太近,而捕捉功能又是打开的,所以就这样了。。。
(vl-load-com)
(defun err(msg)
(princ msg)
(setq *error* errtmp)
(setvar "osmode" os)
(princ)
)
(defun setcolor(sname color / sinf)
(setq sinf (entget sname))
(if (assoc 62 sinf)
(setq sinf (subst (cons 62 color) (assoc 62 sinf) sinf))
(setq sinf (append sinf (list (cons 62 color))))
)
(entmod sinf)
)
;函数:GetInterPOint
;功能:返回两个对象的所有交点
;参数: ent1、ent2 均为ename对象
(defun GetInterPoint (ent1 ent2 / ax_ent_1 ax_ent_2 intpoints points i)
(setq ax_ent_1 (vlax-ename->vla-object ent1)
ax_ent_2 (vlax-ename->vla-object ent2)
)
(setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
(setq intpoints (vlax-variant-value intpoints))
(setq i 0)
(if (> (vlax-safearray-get-u-bound intpoints 1) 0)
(repeat (/ (+ 1
(- (vlax-safearray-get-u-bound intpoints 1)
(vlax-safearray-get-l-bound intpoints 1)
)
)
3
)
(setq points (append points (list (list
(vlax-safearray-get-element intpoints i)
(vlax-safearray-get-element intpoints (+ i 1))
(vlax-safearray-get-element intpoints (+ i 2))
)))
)
(setq i (+ 3 i))
)
)
points
)
(defun c:Brk( / pt1 pt2 pt param1 param2 param ent entv ent2 ent2v)
;(setq pt1 (getpoint "\n选择交点一:"))
;(setq pt2 (getpoint "\n选择交点二:"))
(setq errtmp *error*)
(setq *error* err)
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(prompt "\n选择线...");这里就是选择两条线,怎么提示我也不清楚,你自己改吧.
(setq ss (ssget '((0 . "polyline"))))
(prompt "\n选择红线...")
(setq ent (car (entsel)))
(setq pt1 (car (getinterpoint (ssname ss 0) ent)))
(setq pt2 (car (getinterpoint (ssname ss 1) ent)))
(setq entv (vlax-ename->vla-object ent))
(setq param1 (vlax-curve-getParamAtPoint entv pt1))
(setq param2 (vlax-curve-getParamAtPoint entv pt2))
(if (< param2 param1)
(progn
(setq pt pt2
pt2 pt1
pt1 pt)
(setq param param2
param2 param1
param1 param)
)
)
(setq pt1 (vlax-curve-getPointAtDist entv (- (vlax-curve-getDistAtParam entv param1) 0.5)))
(setq pt2 (vlax-curve-getPointAtDist entv (+ (vlax-curve-getDistAtParam entv param2) 0.5)))
(setcolor ent 4)
(setvar "osmode" 0)
(command "_.break" (list ent pt1) "f" pt1 "@")
(setcolor (entlast) 1)
(setq ent2 (entlast))
(setq ent2v (vlax-ename->vla-object ent2))
(command "_.break" (list ent2 pt2) "f" pt2 "@")
(setcolor (entlast) 4)
(setq *error* errtmp)
(setvar "osmode" os)
(princ)
)
哦原来如此
麻烦您了
举出这么多的例子
太感谢了 飞哥第3楼
的程序有一点bug有的时候运行返回nil 不可能,除非是出错了,而以前你覆盖了出错函数。。。。
为什么不用7楼的?就是3楼改进版,稍微完善些。唯一不同就是选择方交点的方法不同,你可以自己改过。
7楼的选择是先选两条线,然后选那条红线。注意,先的两条线选中后回车表示确认,而红线的选择就是单击 嘿嘿
因为我喜欢3楼的那个很有特点
我们现在在试生产特别忙天天都不在自己的位子坐
您用这个dwg试一下我用了这个就不好使了
页:
[1]
2