wb0815 发表于 2004-1-9 12:51:00

一个关于3d线的问题请大家解决


谢谢大家

meflying 发表于 2004-1-9 14:23:00

有几个问题:
1、是距离黄线,还是与黄线的交点,直线距离还是沿红色线的距离。
2、交点是否用红线与黄线相交来获得比较好?

meflying 发表于 2004-1-9 14:51:00

(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)
)

wb0815 发表于 2004-1-9 14:58:00

1、是距离黄线,还是与黄线的交点,直线距离还是沿红色线的距离。
答是:黄线的交点是沿红色线的距离为0.5


2、交点是否用红线与黄线相交来获得比较好?
就是红线与黄线的交点

飞哥刚才我那您的程序试了一下有执行错的时候
黄线两边的线上点的距离都应该为0.5
也就是说不管这0.5中有多少个点方向如何只要是距我们选的交点都距离0.5就好了



这种情况用您的程序就不好是了

wb0815 发表于 2004-1-9 15:17:00

飞哥和龙大侠都出手了
惊动的人不少呀
谢谢了

meflying 发表于 2004-1-9 15:42:00

其实并不是出什么错了,就是捕捉交点的问题。由于离得太近,而捕捉功能又是打开的,所以就这样了。。。


(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)
)

wb0815 发表于 2004-1-9 16:18:00

哦原来如此

麻烦您了
举出这么多的例子
太感谢了

wb0815 发表于 2004-1-9 17:11:00

飞哥第3楼
的程序有一点bug有的时候运行返回nil

meflying 发表于 2004-1-9 17:29:00

不可能,除非是出错了,而以前你覆盖了出错函数。。。。

为什么不用7楼的?就是3楼改进版,稍微完善些。唯一不同就是选择方交点的方法不同,你可以自己改过。
7楼的选择是先选两条线,然后选那条红线。注意,先的两条线选中后回车表示确认,而红线的选择就是单击

wb0815 发表于 2004-1-9 17:41:00

嘿嘿
因为我喜欢3楼的那个很有特点
我们现在在试生产特别忙天天都不在自己的位子坐
您用这个dwg试一下我用了这个就不好使了


页: [1] 2
查看完整版本: 一个关于3d线的问题请大家解决