my_computer 发表于 2004-1-2 10:53:00

请教:如何使用vba程序将3dsolid实体分解为面

请教:如何使用vba程序将3dsolid实体分解为面

相当于explode命令。但是在vba中3dsolid实体没有Explode方法。
不知有什么方法可以解决。

我不希望使用vba去调用lisp的子定义函数。

my_computer 发表于 2004-1-2 13:03:00

关于我的这个问题我已经找到了一个解决的临时方法:

Set vl = CreateObject("VL.Application.1")
Set VLF = vl.ActiveDocument.functions
VLF.Item("eval").funcall (Sym)

不过我想知道是否有方法解决.

my_computer 发表于 2004-1-2 14:07:00

Private Sub Explode_3DSolid()

Dim vl As Object
Dim VLF As Object, Ttt

Set vl = CreateObject("VL.Application.1")
Set VLF = vl.ActiveDocument.functions

Dim Sym As Object, Retval
'Set Sym = VLF.Item("read").funcall("(command ""_.Explode"" (handent """ & "C5DE" & """))")

Set Sym = VLF.Item("read").funcall("(handent""" & "C5DE" & """)")

Ttt = VLF.Item("eval").funcall(Sym)

End Sub

以上是我的源程序,可是执行会报错,是“类型不匹配”。望高手指教。

其中"C5DE"是我图形中的实体句柄,名字改成什么无所谓。

my_computer 发表于 2004-1-2 15:23:00

Private Sub Explode_3DSolid()

Dim vl As Object
Dim VLF As Object, Ttt

Set vl = CreateObject("VL.Application.1")
Set VLF = vl.ActiveDocument.functions

Dim Sym As Object, Retval

Set Sym = VLF.Item("read").funcall("(command ""circle"" (list 0 0) 5)")

Set Ttt = VLF.Item("eval").funcall(Sym)

End Sub

以上程序同样不可运行,附件为错误信息。
内容是:invalid AcadCAD command:nil

my_computer 发表于 2004-1-5 11:45:00

高手怎么了。我的问题你们没有人遇到吗?
关于在vba中使用lisp命令有参考资料吗?

efan2000 发表于 2004-1-5 11:51:00

在VBA中使用VL的时候不能调用Command函数。
直接在VBA中使用SendCommand。

my_computer 发表于 2004-1-6 08:48:00

SendCommand 会在命令行留下痕迹,而vl就不会。程序运行时下面命令行一同乱闪会给人一种程序很不成熟的感觉。

谢谢你的回信,这个帖子已经很久了。可能大家对此研究都不多。

mccad 发表于 2004-1-6 09:22:00

VL不是万能的,但AutoCAD的文档中没有相关在VBA中调用VL的内容,所以这些内容只能是自己调试。
目前调试过程中不能使用的常用的VL函数有:
Command
vl-cmdf
vl-acad-defun

大家可以做调试并做些补充。

my_computer 发表于 2004-1-6 14:19:00

以上问题先告一段落吧!开发软件不成熟,没办法。
vl好像本来就不喜欢有参数的调用,我先做了一个功能型的lisp函数,然后使用vba来调用结果是一样的,所以我没有什么更好的解释。

我使用了许多方法失败后,决心使用sendcommand命令。(至少不好看强于不能用)

我的工作是将3dsolid转换为line,于是本人的方法是:
先将3dsolid转换为region,然后在使用region.explode成line。

程序:
'记录起始时模型空间的实体数
Dim FaceNumber As Double
FaceNumber = ThisDrawing.ModelSpace.Count
'分解3dsolid
Dim TempObj As AcadEntity, ObjIndex As Double
For ObjIndex = 0 To ThisDrawing.ModelSpace.Count - 1
    Set TempObj = ThisDrawing.ModelSpace(ObjIndex)
    If TypeOf TempObj Is IAcad3DSolid Then
      ThisDrawing.SendCommand "_explode (handent """ & TempObj.Handle & """)" & vbCr & vbCr
    End If
Next
'分解region
For ObjIndex = FaceNumber To ThisDrawing.ModelSpace.Count - 1
    Set TempObj = ThisDrawing.ModelSpace(ObjIndex)
    If TypeOf TempObj Is AcadRegion Then
      TempObj.Explode
    End If
Next
以上程序看似可以。实际上运行到分解region处,由于此程序使用的是lisp与vba混用的方式,由lisp语句创建的实体在vba没有退出之前没有添加到thisdrawaing.modelspace中所以
分解region处的modelspace实体数与没有执行分解3dsolid前的实体数相同,因此以上程序不可以将3dsolid分解为line
我可以上传一个例图和我的程序,请大家帮我看一看,谢谢!!!!

my_computer 发表于 2004-1-6 14:20:00

对不起,此问题在我制作示例的时候我发现可以解决,问题的关键是运行中将对话框关闭。
页: [1] 2
查看完整版本: 请教:如何使用vba程序将3dsolid实体分解为面