自贡黄明儒 发表于 2013-10-11 16:02:46

dcg553496180 发表于 2013-10-11 15:41 static/image/common/back.gif
我是一只一条曲线,然后自己做一条直线求交点,在程序中 (setq sel_dd (entsel "\n 选择对象:")) 就是选择 ...

(defun c:cs (/ OBJ1 OBJ2 PT1 PT6)
(setq obj1 (vlax-ename->vla-object (car (entsel "\n 选择对象:"))))
(setq pt1 (getpoint "\n 请选择一个点:"))
(setq pt6 (getpoint "\n 请选择一个点:"))
(command "line" pt6 pt1 "")
(setq obj2 (vlax-ename->vla-object (entlast)))
(vlax-safearray->list
    (vlax-variant-value
      (vla-IntersectWith obj1 obj2 acExtendNoNe)
    )
)
)

dcg553496180 发表于 2013-10-11 17:20:28

自贡黄明儒 发表于 2013-10-11 16:02 static/image/common/back.gif
(defun c:cs (/ OBJ1 OBJ2 PT1 PT6)
(setq obj1 (vlax-ename->vla-object (car (entsel "\n 选择对象: ...

运行的结果:
命令: test
选择实体:para=1000.0,dist=1000.000000,pa=(26753.46,18658.66),pb=(45232.23,32576
.32)
dist1=0.00,dist2=23133.66,startparam=0.00,endparam=23133.66
输入点:p1=(43309.84,20504.20),dist1=14335.27,param1=14335.27
p2=(38204.23,27283.04),dist2=14335.27,param2=14335.27
p3=(38204.23,27283.04),dist3=14335.27,param3=14335.27
输入点:*取消*
不知道为啥,希望您继续指点

dcg553496180 发表于 2013-10-12 09:10:08

自贡黄明儒 发表于 2013-10-11 16:02 static/image/common/back.gif
(defun c:cs (/ OBJ1 OBJ2 PT1 PT6)
(setq obj1 (vlax-ename->vla-object (car (entsel "\n 选择对象: ...

今天经过测试,是能用的,谢谢大师指点,万分感谢

llsheng_73 发表于 2013-10-18 17:35:37

本帖最后由 llsheng_73 于 2013-10-18 17:52 编辑

dcg553496180 发表于 2013-10-11 15:25 static/image/common/back.gif
(defun c:cs ()
    (setq sel_dd (entsel "\n 选择对象:"))
    (setq pt1 (getpoint "\n 请选择一个点 ...
(defun c:cs ()
   (setq sel_dd (entsel "\n 选择对象:")) ;;;通过ENTSEL得到的sel_dd它是一个表图元名和坐标组成的表,要先通过(CAR sel_dd)得到图元名
   (setq pt1 (getpoint "\n 请选择一个点:"))
   (setq pt6 (getpoint "\n 请选择一个点:"))
   (command "line" pt6 pt1 "")
   (setq sel_l (entlast));;;通过ENTlast得到的sel_l它不是前边SEL_DD那样的表,直接就是图元名
   (setq pt_int (jd sel_dd sel_l))
   ! pt_int
)

你的两个参数是完全不一样的,但你在过程中都进行了(CAR....)处理,导致第二个参数行不通,解决办法是过程中不作(CAR ...)处理,在主程序中把它们按需要处理好 (setq pt_int (jd sel_dd sel_l))可以改为 (setq pt_int (jd (car sel_dd) sel_l))
把过JD里边的 (setq a (car se_1))(setq b (car se_2))两句去掉,这样就OK了
(defun jd (se_1 se_2)
   (vl-load-com)
   (setq a (car se_1))
   (setq b (car se_2));;;把参数定义为图元名后,这两句不要
   (setq pts (vla-IntersectWith (vlax-ename->vla-object a) (vlax-ename->vla-object b) 3))
)

另外,类似于 (vl-load-com)等不宜在过程中出现,你可以在主程序中一开始就写上它,至于所有别的过程中就都不要它了,以免没必要的重复运行

建议尽量不要用COMMAND去画东西,尽量用ENTMAKE去画,用ENTMOD去改,这样有助于对CAD图元数据结构加深理解,当然最后也可以用VLA去做,不过我个人认为那比理解图元数据更头痛,但掌握好了的话好处很明显的。至少写程序的过程会快很多,以上仅仅是我的个人意见

c961806787 发表于 2013-10-19 13:20:40

自贡黄明儒 发表于 2013-10-11 16:02 static/image/common/back.gif
(defun c:cs (/ OBJ1 OBJ2 PT1 PT6)
(setq obj1 (vlax-ename->vla-object (car (entsel "\n 选择对象: ...

这个好!赞一个!!!

dcg553496180 发表于 2014-1-23 09:18:16

llsheng_73 发表于 2013-10-18 17:35 static/image/common/back.gif
(defun c:cs ()
   (setq sel_dd (entsel "\n 选择对象:")) ;;;通过ENTSEL得到的sel_dd它是一个表图元 ...

之前问题解决掉以后今天才看见这个回复,十分感谢您的解答,在此感谢

hisum 发表于 2014-5-15 17:35:14

错误: ActiveX 服务器返回错误: 无效索引。

cs我试了不行,为什么?

鸟_志 发表于 2015-7-7 00:19:19

mark一下 回头慢慢研究

fangmin723 发表于 2016-10-2 13:07:11

自贡黄明儒 发表于 2013-10-11 16:02
(defun c:cs (/ OBJ1 OBJ2 PT1 PT6)
(setq obj1 (vlax-ename->vla-object (car (entsel "\n 选择对象: ...

这个确实不错,但是如果有两个交点的话他返回的是一个表,不知道能不能让他返回成一个点表
页: 1 [2]
查看完整版本: 新手菜鸟求助vla-intersectwith命令的问题