明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3293|回复: 12

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

  [复制链接]
发表于 2004-1-2 10:53:00 | 显示全部楼层 |阅读模式
请教:如何使用vba程序将3dsolid实体分解为面

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

我不希望使用vba去调用lisp的子定义函数。
 楼主| 发表于 2004-1-2 13:03:00 | 显示全部楼层
关于我的这个问题我已经找到了一个解决的临时方法:

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

不过我想知道是否有方法解决.
 楼主| 发表于 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"是我图形中的实体句柄,名字改成什么无所谓。
 楼主| 发表于 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

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-1-5 11:45:00 | 显示全部楼层
高手怎么了。我的问题你们没有人遇到吗?
关于在vba中使用lisp命令有参考资料吗?
发表于 2004-1-5 11:51:00 | 显示全部楼层
在VBA中使用VL的时候不能调用Command函数。
直接在VBA中使用SendCommand。
 楼主| 发表于 2004-1-6 08:48:00 | 显示全部楼层
SendCommand 会在命令行留下痕迹,而vl就不会。程序运行时下面命令行一同乱闪会给人一种程序很不成熟的感觉。

谢谢你的回信,这个帖子已经很久了。可能大家对此研究都不多。
发表于 2004-1-6 09:22:00 | 显示全部楼层
VL不是万能的,但AutoCAD的文档中没有相关在VBA中调用VL的内容,所以这些内容只能是自己调试。
目前调试过程中不能使用的常用的VL函数有:
Command
vl-cmdf
vl-acad-defun

大家可以做调试并做些补充。
 楼主| 发表于 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
我可以上传一个例图和我的程序,请大家帮我看一看,谢谢!!!!
 楼主| 发表于 2004-1-6 14:20:00 | 显示全部楼层
对不起,此问题在我制作示例的时候我发现可以解决,问题的关键是运行中将对话框关闭。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 10:57 , Processed in 0.182264 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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