乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 137|回复: 9

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

[复制链接]

12

主题

135

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
183
发表于 2004-1-2 10:53:00 | 显示全部楼层 |阅读模式
请教:如何使用vba程序将3dsolid实体分解为面
相当于explode命令。但是在vba中3dsolid实体没有Explode方法。
不知有什么方法可以解决。
我不希望使用vba去调用lisp的子定义函数。
回复

使用道具 举报

12

主题

135

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
183
发表于 2004-1-2 13:03:00 | 显示全部楼层
关于我的这个问题我已经找到了一个解决的临时方法:
Set vl = CreateObject("VL.Application.1")
Set VLF = vl.ActiveDocument.functions
VLF.Item("eval").funcall (Sym)
不过我想知道是否有方法解决.
回复

使用道具 举报

12

主题

135

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
183
发表于 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"是我图形中的实体句柄,名字改成什么无所谓。
回复

使用道具 举报

12

主题

135

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
183
发表于 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

zunawmdvusz.jpg

zunawmdvusz.jpg

回复

使用道具 举报

12

主题

135

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
183
发表于 2004-1-5 11:45:00 | 显示全部楼层
高手怎么了。我的问题你们没有人遇到吗?
关于在vba中使用lisp命令有参考资料吗?
回复

使用道具 举报

26

主题

589

帖子

10

银币

中流砥柱

Rank: 25

铜币
693
发表于 2004-1-5 11:51:00 | 显示全部楼层
在VBA中使用VL的时候不能调用Command函数。
直接在VBA中使用SendCommand。
回复

使用道具 举报

12

主题

135

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
183
发表于 2004-1-6 08:48:00 | 显示全部楼层
SendCommand 会在命令行留下痕迹,而vl就不会。程序运行时下面命令行一同乱闪会给人一种程序很不成熟的感觉。
谢谢你的回信,这个帖子已经很久了。可能大家对此研究都不多。
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2004-1-6 09:22:00 | 显示全部楼层
VL不是万能的,但AutoCAD的文档中没有相关在VBA中调用VL的内容,所以这些内容只能是自己调试。
目前调试过程中不能使用的常用的VL函数有:
Command
vl-cmdf
vl-acad-defun
大家可以做调试并做些补充。
回复

使用道具 举报

12

主题

135

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
183
发表于 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
我可以上传一个例图和我的程序,请大家帮我看一看,谢谢!!!!
回复

使用道具 举报

12

主题

135

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
183
发表于 2004-1-6 14:20:00 | 显示全部楼层
对不起,此问题在我制作示例的时候我发现可以解决,问题的关键是运行中将对话框关闭。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 11:43 , Processed in 0.629080 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表