找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1532|回复: 21

[VBA函数]:为什么这段vb代码对acad2002有效,对acad2004却无效呢?

[复制链接]
发表于 2003-5-21 11:38:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
为什么这段vb代码对acad2002有效,对acad2004却无效呢?
我在vb中建立下列代码,通过vb来控制acad,引用了acad2000的对象库,能实现对2002的控制,但Set AcadApp = GetObject(, "autocad.application")  只能找到2002,找不到2004,后来我取消2000的对象库的引用,改成引用2004的type library,还是不能通过,出现图示的提示,这是怎么回事呢?哪位高手帮忙想想。


    Dim AcadApp As AutoCAD.AcadApplication '建立Application对象
    Dim AcadDoc As AcadDocument '建立Document对象
    Dim AcadMod As AcadModelSpace '建立Model Space 对象
   
    On Error Resume Next
    Set AcadApp = GetObject(, "autocad.application")   '若AutoCad已启动 , 则直接得到
    If Err Then
        MsgBox "请先运行2000以上版本的AutoCAD。", vbOKOnly + vbInformation, "注意":  Exit Sub
        Err.Clear
       ' Set AcadApp = CreateObject("autocad.application")   '若AutoCad未启动,则运行它
        If Err Then
            MsgBox Err.Description, , "错误"
            Exit Sub
        End If
    End If
  '  AcadApp.Visible = True  '使AutoCad可见
    Set AcadDoc = AcadApp.ActiveDocument   '设acaddoc为当前图形文件
    Set AcadMod = AcadDoc.ModelSpace  '设AcadMod为当前图形文件的模型空间
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-5-21 12:11:22 | 显示全部楼层
Dim AcadApp As AutoCAD.AcadApplication '建立Application?象
Dim AcadDoc As AcadDocument '建立Document?象
Dim AcadMod As AcadModelSpace '建立Model Space ?象
Private Sub Command2_Click()
    On Error Resume Next
    Set AcadApp = AcadApplication
    If Err Then
        MsgBox "error:" + Err.Description
        Exit Sub
    End If
    AcadApp.Visible = True
    Set AcadDoc = AcadApp.ActiveDocument
    Set AcadMod = AcadDoc.ModelSpace
End Sub

你的程序可以在我这里的2004上运行,也试试上面的程序
你的图片显示,可能原因
1.机子性能不够,跑不动.
2.2004正在运行某些操作
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-21 13:41:00 | 显示全部楼层
你的代码可以用,我发现和引用的acad类型库有关,如果vb中引用的是2000的类型库,就只对2002有效,如果引用的是2004的类型库,就只对2004有效。不知你的是不是这样?
如果是这样,那不是挺麻烦吗?一个程序要编译成两个版本。怎么办?
我的机子去年3月买的,p4 1.8的组装机,配置还可以。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-21 15:52:54 | 显示全部楼层
应该是这样的
如果vb中引用的是2000的类型库,就只对2002有效,如果引用的是2004的类型库,就只对2004有效。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-5-21 20:37:27 | 显示全部楼层
最初由 god 发布
[B]你的代码可以用,我发现和引用的acad类型库有关,如果vb中引用的是2000的类型库,就只对2002有效,如果引用的是2004的类型库,就只对2004有效。不知你的是不是这样?
如果是这样,那不是挺麻烦吗?一个程序要编译成... [/B]


去掉AutoCAD的类型库,将所用的AutoCAD对象声明为Object类型,即可达到通用,这种编写的程序在R14下也可运行。但是要注意的是由于没有引用类型库,常量的定义也就没关联了,因而必须用数字来代替。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-22 15:02:17 | 显示全部楼层
噢,请问有现成的代码吗?参考参考。
“常量的定义也就没关联”指的是那些常量?比如AcadApp.ActiveDocument 这种用法还能用吗?

还有件事,我的回复通知不起作用了,个人设置里都设了的。不知道是怎么回事?你能帮我看看吗?

找到一段代码,经测试有效。

Dim a As Object '//应用程序对象声明
Dim b As Object '//属性设置对象声明
Dim c As Object '//CAD文档对象声明
Dim d As Object '//模型空间对象声明
Dim e As Object '//图纸空间对象声明

Private Sub Command1_Click()
    Set a = GetObject(, "AutoCAD.Application") '//自动启动autocad程序
    a.Visible = True '//将autocad在前台显示
    Set b = a.Preferences '//属性设置对象初始化
    Set c = a.ActiveDocument '/'/文档对象初始化
    Set d = c.ModelSpace '//模型空间对象初始化
    Set e = c.PaperSpace '//图纸空间对象初始化
    Dim dd(0 To 2) As Double '//给定绘制文字的起始坐标
    dd(0) = 1
    dd(1) = 10
    dd(2) = 0
    Dim tt As String
    tt = "水工结构工程"
    Dim high As Double '//设置文字的高度
    high = 30
    Dim ttt As Object
    Set ttt = d.AddText(tt, dd, high) '//绘制文字
End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-5-22 22:37:29 | 显示全部楼层
就像你上面的例子,这已经实现了在各个版本的通用性,当然在后期版本中新增或者修改的功能不能使用。而对于常量,是指那么枚举类型的,比如单位(AcUnits)枚举类型,有acDefaultUnits、acScientific 、acDecimal、acEngineering、acArchitectural、
acFractional,那么由于没有引用了类型库,这些枚举类型当然也没有声明了,故只能使用数字,比如acDecimal=0,那么就用0代替等。
回复通知,论坛默认的已经取消,因为有时候都会收到好几百条的邮件。现在可能要手动设置,自己了解一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-23 15:42:19 | 显示全部楼层
看了god的帖子,受益非浅。
关于efan2000提到的[在后期版本中新增或者修改的功能不能使用]的问题,我想可以如下方法解决。
Dim a As Object '//应用程序对象声明
Dim b As Object '//属性设置对象声明
Dim c As Object '//CAD文档对象声明
Dim d As Object '//模型空间对象声明
Dim e As Object '//图纸空间对象声明
'------------------------------------
Dim myVer As Double'//版本号声明
'------------------------------------


Private Sub Command1_Click()
Set a = GetObject(, "AutoCAD.Application") '//自动启动autocad程序
a.Visible = True '//将autocad在前台显示
Set b = a.Preferences '//属性设置对象初始化
Set c = a.ActiveDocument '/'/文档对象初始化
Set d = c.ModelSpace '//模型空间对象初始化
Set e = c.PaperSpace '//图纸空间对象初始化

'------------------------------------
myVer = Val(a.Version) '//获取版本号
'------------------------------------

Dim dd(0 To 2) As Double '//给定绘制文字的起始坐标
dd(0) = 1
dd(1) = 10
dd(2) = 0
Dim tt As String
tt = "My Ver. is:" + Str(myVer)
Dim high As Double '//设置文字的高度
high = 30
Dim ttt As Object
Set ttt = d.AddText(tt, dd, high) '//绘制文字
End Sub

根据版本号,确定新增功能实现与否。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-26 10:34:23 | 显示全部楼层
我把对象命名改了一下,看起来直观一点。

把acad声明为object在编码时有个缺点,比如在AcadApp后键入小数点,不会自动出现关键词选择框,引用类型库声明为AutoCAD.AcadApplication就有关键词选择框,用起来不方便。

    Dim AcadApp As Object '//应用程序对象声明
    Dim AcadPre As Object '//属性设置对象声明
    Dim AcadDoc As Object '//CAD文档对象声明
    Dim AcadMod As Object '//模型空间对象声明
    Dim AcadPap As Object '//图纸空间对象声明

'Private Sub Command1_Click()
    Set AcadApp = GetObject(, "AutoCAD.Application") '//自动启动autocad程序
    AcadApp.Visible = True '//将autocad在前台显示
    Set AcadPre = AcadApp.Preferences '//属性设置对象初始化
    Set AcadDoc = AcadApp.ActiveDocument '//文档对象初始化
    Set AcadMod = AcadDoc.ModelSpace '//模型空间对象初始化
    Set AcadPap = AcadDoc.PaperSpace '//图纸空间对象初始化
   
    Dim dd(0 To 2) As Double '//给定绘制文字的起始坐标
    dd(0) = 1
    dd(1) = 10
    dd(2) = 0
    Dim tt As String
    tt = "zzz"
    Dim high As Double '//设置文字的高度
    high = 30
    Dim ttt As Object
    Set ttt = AcadMod.AddText(tt, dd, high) '//绘制文字
'End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-26 14:34:42 | 显示全部楼层
把acad声明为object在编码时有个缺点,比如在AcadApp后键入小数点,不会自动出现关键词选择框,引用类型库声明为AutoCAD.AcadApplication就有关键词选择框,用起来不方便。


这是后期引用(声明为object)和前期引用(声明为AutoCAD.AcadApplication)的一个显著区别,因为后期引用无法判断引用的OBJECT的具体类型.
可以用先声明为AutoCAD.AcadApplication,编程完成后再改为后期引用,声明为object,来解决不会自动出现关键词选择框的问题.:6
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-5 21:54:06 | 显示全部楼层

我也正在研究这个问题,把我加为好友吧

我这些天正在研究如何在VB中调用ACAD,正如两位所说的,我也遇到这些问题,可惜没人交流,请两位多多指点。

我的QQ:1381157

我在VB中引用了ACAD2000的类型库后,在程序中用GetObject ("AutoCAD.Application")语句可以调用ACAD2002,但是怎么样让调用的再ACAD自动打开运行SCR脚本文件呢??

我是先用VB生成了SCR脚本文件,在ACAD中用SCRIPT命令或“运行批处理...”功能都可运行脚本,但是怎么让VB调用的ACAD在打开ACAD的同时,同时自动运行SCR脚本呢?

请各位高手指教。。。。不胜感谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-21 11:52:59 | 显示全部楼层
試試 Set AcadApp = GetObject(, "AutoCAD.Application.16")
我在adt2004的hlep檔找到,我也有同樣問題,我用此解決
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-25 11:25:55 | 显示全部楼层
wlcsuperman :  你试试AcadDoc.SendCommand "(command " & Chr(34) & "script" & Chr(34) & "" & Chr(34) & "myscr.scr" & Chr(34) & ") "

我有个问题请教大家,我单位有几十台电脑,都用同样的方法装了acad2002,我在软件中使用Set AcadApp = GetObject(, "AutoCAD.Application") 调用acad2002,有的机子上调用不成功,不知道是什么原因,有台机子调不到acad2002,但是能调到acad2004,也不知道是怎么回事。哪位高手能解释一下吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-25 12:24:39 | 显示全部楼层
是在一台机子上同时装有ACAD2002,ACAD2004?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-25 14:05:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
对,是在一台机子上同时装有ACAD2002,ACAD2004,2002没反应,2004有,挺奇怪的吧?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 17:55 , Processed in 0.245712 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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