明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: dcg553496180

[已解答] 新手菜鸟求助vla-intersectwith命令的问题

[复制链接]
发表于 2013-10-11 16:02 | 显示全部楼层
dcg553496180 发表于 2013-10-11 15:41
我是一只一条曲线,然后自己做一条直线求交点,在程序中 (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)
    )
  )
)
 楼主| 发表于 2013-10-11 17:20 | 显示全部楼层
自贡黄明儒 发表于 2013-10-11 16:02
(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
输入点:*取消*
不知道为啥,希望您继续指点
 楼主| 发表于 2013-10-12 09:10 | 显示全部楼层
自贡黄明儒 发表于 2013-10-11 16:02
(defun c:cs (/ OBJ1 OBJ2 PT1 PT6)
  (setq obj1 (vlax-ename->vla-object (car (entsel "\n 选择对象: ...

今天经过测试,是能用的,谢谢大师指点,万分感谢
发表于 2013-10-18 17:35 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-10-18 17:52 编辑
dcg553496180 发表于 2013-10-11 15:25
(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去做,不过我个人认为那比理解图元数据更头痛,但掌握好了的话好处很明显的。至少写程序的过程会快很多,以上仅仅是我的个人意见

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

这个好!赞一个!!!
 楼主| 发表于 2014-1-23 09:18 | 显示全部楼层
llsheng_73 发表于 2013-10-18 17:35
(defun c:cs ()
     (setq sel_dd (entsel "\n 选择对象:")) ;;;通过ENTSEL得到的sel_dd它是一个表图元 ...

之前问题解决掉以后今天才看见这个回复,十分感谢您的解答,在此感谢
发表于 2014-5-15 17:35 | 显示全部楼层
错误: ActiveX 服务器返回错误: 无效索引。

cs我试了不行,为什么?
发表于 2015-7-7 00:19 来自手机 | 显示全部楼层
mark一下 回头慢慢研究
发表于 2016-10-2 13:07 | 显示全部楼层
自贡黄明儒 发表于 2013-10-11 16:02
(defun c:cs (/ OBJ1 OBJ2 PT1 PT6)
  (setq obj1 (vlax-ename->vla-object (car (entsel "\n 选择对象: ...

这个确实不错,但是如果有两个交点的话他返回的是一个表,不知道能不能让他返回成一个点表

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-10 09:33 , Processed in 0.150517 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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