明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2617|回复: 16

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

  [复制链接]
发表于 2004-1-9 12:51:00 | 显示全部楼层 |阅读模式

谢谢大家

本帖子中包含更多资源

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

x
发表于 2004-1-9 14:23:00 | 显示全部楼层
有几个问题:
1、是距离黄线,还是与黄线的交点,直线距离还是沿红色线的距离。
2、交点是否用红线与黄线相交来获得比较好?
发表于 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)
)
 楼主| 发表于 2004-1-9 14:58:00 | 显示全部楼层
1、是距离黄线,还是与黄线的交点,直线距离还是沿红色线的距离。
答是:黄线的交点是沿红色线的距离为0.5


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

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



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

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-1-9 15:17:00 | 显示全部楼层
飞哥和龙大侠都出手了
惊动的人不少呀
谢谢了
发表于 2004-1-9 15:42:00 | 显示全部楼层
其实并不是出什么错了,就是捕捉交点的问题。由于离得太近,而捕捉功能又是打开的,所以就这样了。。。


  1. (vl-load-com)

  2. (defun err(msg)
  3.   (princ msg)
  4.   (setq *error* errtmp)
  5.   (setvar "osmode" os)
  6.   (princ)
  7. )


  8. (defun setcolor(sname color / sinf)
  9.   (setq sinf (entget sname))
  10.   (if (assoc 62 sinf)
  11.     (setq sinf (subst (cons 62 color) (assoc 62 sinf) sinf))
  12.     (setq sinf (append sinf (list (cons 62 color))))
  13.   )
  14.   (entmod sinf)
  15. )

  16. ;函数:GetInterPOint
  17. ;功能:返回两个对象的所有交点
  18. ;参数:        ent1、ent2        均为ename对象

  19. (defun GetInterPoint (ent1 ent2 / ax_ent_1 ax_ent_2 intpoints points i)
  20.   (setq ax_ent_1 (vlax-ename->vla-object ent1)
  21.         ax_ent_2 (vlax-ename->vla-object ent2)
  22.   )
  23.   (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
  24.   (setq intpoints (vlax-variant-value intpoints))
  25.   (setq i 0)
  26.   (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
  27.     (repeat (/ (+ 1
  28.               (- (vlax-safearray-get-u-bound intpoints 1)
  29.                  (vlax-safearray-get-l-bound intpoints 1)
  30.               )
  31.            )
  32.            3
  33.         )
  34.       (setq points (append points (list (list
  35.                       (vlax-safearray-get-element intpoints i)
  36.                       (vlax-safearray-get-element intpoints (+ i 1))
  37.                       (vlax-safearray-get-element intpoints (+ i 2))
  38.                     )))
  39.       )
  40.       (setq i (+ 3 i))
  41.     )
  42.   )
  43.   points
  44. )


  45. (defun c:Brk( / pt1 pt2 pt param1 param2 param ent entv ent2 ent2v)
  46.   ;(setq pt1 (getpoint "\n选择交点一:"))
  47.   ;(setq pt2 (getpoint "\n选择交点二:"))
  48.   (setq errtmp *error*)
  49.   (setq *error* err)
  50.   (setq os (getvar "osmode"))
  51.   (setvar "osmode" 0)
  52.   (setvar "cmdecho" 0)
  53.   (prompt "\n选择线...");这里就是选择两条线,怎么提示我也不清楚,你自己改吧.  
  54.   (setq ss (ssget '((0 . "polyline"))))  
  55.   (prompt "\n选择红线...")
  56.   (setq ent (car (entsel)))
  57.   (setq pt1 (car (getinterpoint (ssname ss 0) ent)))
  58.   (setq pt2 (car (getinterpoint (ssname ss 1) ent)))
  59.   (setq entv (vlax-ename->vla-object ent))
  60.   (setq param1 (vlax-curve-getParamAtPoint entv pt1))
  61.   (setq param2 (vlax-curve-getParamAtPoint entv pt2))
  62.   (if (< param2 param1)
  63.     (progn
  64.       (setq pt pt2
  65.             pt2 pt1
  66.             pt1 pt)
  67.       (setq param param2
  68.             param2 param1
  69.             param1 param)
  70.     )
  71.   )
  72.   (setq pt1 (vlax-curve-getPointAtDist entv (- (vlax-curve-getDistAtParam entv param1) 0.5)))
  73.   (setq pt2 (vlax-curve-getPointAtDist entv (+ (vlax-curve-getDistAtParam entv param2) 0.5)))
  74.   (setcolor ent 4)
  75.   (setvar "osmode" 0)
  76.   (command "_.break" (list ent pt1) "f" pt1 "@")
  77.   (setcolor (entlast) 1)
  78.   (setq ent2 (entlast))
  79.   (setq ent2v (vlax-ename->vla-object ent2))
  80.   (command "_.break" (list ent2 pt2) "f" pt2 "@")
  81.   (setcolor (entlast) 4)
  82.   (setq *error* errtmp)
  83.   (setvar "osmode" os)
  84.   (princ)
  85. )
 楼主| 发表于 2004-1-9 16:18:00 | 显示全部楼层
哦原来如此

麻烦您了
举出这么多的例子
太感谢了
 楼主| 发表于 2004-1-9 17:11:00 | 显示全部楼层
飞哥第3楼
的程序有一点bug有的时候运行返回nil
发表于 2004-1-9 17:29:00 | 显示全部楼层
不可能,除非是出错了,而以前你覆盖了出错函数。。。。

为什么不用7楼的?就是3楼改进版,稍微完善些。唯一不同就是选择方交点的方法不同,你可以自己改过。
7楼的选择是先选两条线,然后选那条红线。注意,先的两条线选中后回车表示确认,而红线的选择就是单击
 楼主| 发表于 2004-1-9 17:41:00 | 显示全部楼层
嘿嘿
因为我喜欢3楼的那个很有特点
我们现在在试生产特别忙天天都不在自己的位子坐
您用这个dwg试一下我用了这个就不好使了


本帖子中包含更多资源

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

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-27 12:39 , Processed in 0.183397 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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