Hippe013 发表于 2022-7-6 22:23:28

在AeccSurfa上调用方法

我希望有人能让我走上正确的方向。我想创建一个命令:
 
1.提示用户选择AECC曲面
 
2、提示用户选择行
 
3.调用IntersectPointWithSurface方法,使用直线的起点作为起点,直线的起点和终点作为方向向量。
 
4、返回点
 
我尝试过vlisp,但一直出现错误:
 
; 错误:发生未知异常
; 警告:未知异常时跳过了展开
 
我想在VBA中尝试一下,看看是否会出现同样的错误。我对VBA太陌生了,甚至都无法开始。任何帮助都将不胜感激。
 
当做
 
hippe013

BlackBox 发表于 2022-7-6 22:39:37

两件事。。。。
 
你说你用Visual LISP试过这个。。。你能发代码吗?
 
至于VBA。。。跳过它,除非你已经熟练掌握了它,因为它不再受微软的支持。相反,考虑学习。NET(无论是VB.NET还是C#)。

BlackBox 发表于 2022-7-6 22:45:33

如果您坚持使用VBA,请考虑以下博客:
 
VBA相交点与曲面

Hippe013 发表于 2022-7-6 22:50:35

我确实弄明白了。我将变体作为论据传递给该方法。它需要有一个点的列表形式。ie’(0)
我的工作代码如下:
 
 

(defun c:day ()
;Please note that there is not any error trapping

;Load Visual Lisp Extensions
(vl-load-com)

;Prompt User for the Line Object
(setq line-obj (vlax-ename->vla-object (car (entsel "\nSelect Line Object: "))))
;Prompt User for the Surface Object
(setq surface-obj (vlax-ename->vla-object (car (entsel "\nSelect Surface Object: "))))
;Define the Point to Vector function
(defun pnt->vec (p1 p2 / vx vy vz)
   (if (equal p1 p2)
   (list 0 0 0)
   (progn
(setq dist (distance p1 p2))
       (setq vx (/ (- (nth 0 p2)(nth 0 p1)) dist))
       (setq vy (/ (- (nth 1 p2)(nth 1 p1)) dist))
       (setq vz (/ (- (nth 2 p2)(nth 2 p1)) dist))
       (list vx vy vz))
   )
   )
;Return the StartPoint of the Line
(setq p1 (vlax-safearray->list (vlax-variant-value (vla-get-startpoint line-obj))))
;Return the Vector using the Start and End Point of the Line
(setq vec
(pnt->vec
   (vlax-safearray->list (vlax-variant-value (vla-get-startpoint line-obj)))
   (vlax-safearray->list (vlax-variant-value (vla-get-endpoint line-obj)))
   )
)
;Invoke the IntersectPointWithSurface Method
(setq p (vlax-invoke surfobj 'IntersectPointWithSurface p1 vec))
)

 
 
好啊因此,在做了一些进一步的测试后,我发现上述代码在Civil 3D 2011上同样有效。然后,我使用了该代码并在Civil 3D 2009上进行了尝试,该方法期望该争论是变体。我没有收到我第一次描述的解卷错误。很抱歉在VBA和中发布此代码。NET论坛,但第一次寻找VBA/。这个谜题的答案。我似乎在使用这段代码时没有得到一致的结果。
 
 
当做
 
Hippe013

BlackBox 发表于 2022-7-6 23:01:48

我工作时有两种版本,所以我会在周一午休时再次查看。。。同时,要注意(vlax ename->vla object nil):
 

BIGAL 发表于 2022-7-6 23:08:28

不确定,但经验表明,我不会在defun名称“pnt->vec”中加一个>,即使*似乎工作正常,通常某些键可以直接插入你的程序,解释器就是不喜欢它们。还有其他人有问题吗?

BlackBox 发表于 2022-7-6 23:23:11

我同意命令应该很容易输入,一般来说。。。使用时,我通常将“->”留给子函数,如我在这里所示:
 
http://www.cadtutor.net/forum/showthread.php?57570-Layer Creater Lisp例程问题&p=390543&viewfull=1#post390543
 
一个内置示例是vlax ename->vla object等。

Hippe013 发表于 2022-7-6 23:29:09

 
谢谢你调查此事!
 
我知道使用(vlax ename->vla object nil)不是一种好的做法。我的代码写得很快,只是为了便于阅读。我注意到代码中没有任何错误捕捉。我通常不会在自己使用的代码中放置错误捕捉。如果我为其他人写文章,我将放置所有必要的错误捕捉,因为该用户将不了解可能导致的潜在错误。我经常为这样一个特定的任务编写代码,然后它就会被扔进代码墓地。
 
至于在子程序名称中使用“->”。我不知道这会潜在地引起问题。我想,如果内置函数使用它们,我也可以。ie vlax safearray->列表或vlax ename->vla对象。
页: [1]
查看完整版本: 在AeccSurfa上调用方法