明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3976|回复: 10

VLAX类调用请教!!!

[复制链接]
发表于 2003-9-29 21:16:00 | 显示全部楼层 |阅读模式
下面程序为什么总在
Class_Initialize中语句:(cad2000)
Set VL = ThisDrawing.Application.GetInterfaceObject("VL.Application.1")

发生错误呢?
(把
Set VL = ThisDrawing.Application.GetInterfaceObject("VL.Application.1")
改成
Set VL = ThisDrawing.Application.GetInterfaceObject("VL.Application.15")
也不行)

'''''''''''''''''''''''''''''''''''''''
Sub test()
Dim acaddoc As AcadDocument
Set acaddoc = ThisDrawing
Dim entry As AcadEntity
Dim pp As Variant

acaddoc.Utility.GetEntity entry, pp, "select a polyline"

MsgBox GetCurveLength(entry)

End Sub
Public Function GetCurveLength(curve As AcadEntity) As Double

    Dim obj As VLAX, retval
   
    Set obj = New VLAX
    obj.EvalLispExpression "(setq curve (handent " & Chr(34) & curve.Handle & Chr(34) & "))"
    obj.EvalLispExpression "(setq curvelength (vlax-curve-getDistAtParam curve " & "(vlax-curve-getEndParam curve)))"
    retval = obj.GetLispSymbol("curvelength")
    obj.NullifySymbol "curve", "curvelength"
    Set obj = Nothing
    GetCurveLength = CDbl(retval)

End Function
发表于 2003-9-29 21:18:00 | 显示全部楼层
把VL.Application.1中的".1" 去掉试试。
 楼主| 发表于 2003-9-29 21:19:00 | 显示全部楼层
也不行,我得vlax类是下载中心下载的
发表于 2003-9-29 21:23:00 | 显示全部楼层
那可能是VL.Application控件还没注册好。
你看看AutoCAD目录下有没有象vl*.tlb的文件,如果有就使用注册功能把它注册了。
 楼主| 发表于 2003-9-29 21:35:00 | 显示全部楼层
我的cad目录下就又VL.tlb,
用下面注册了也还是不行:

Private Sub Command1_Click()
AutoRegFile ("c:\R2000\vl.tlb")
End Sub
Function AutoRegFile(FileName As String)
Dim reged As Boolean
Dim RegFile1 As String
Dim RegFile2 As String
Dim BeReg As String
Dim RetVal
BeReg = Dir(FileName)
If BeReg <> "" Then
  RegFile1 = Environ("windir") & "\system\regsvr32.exe "
  RegFile2 = Environ("windir") & "\system32\regsvr32.exe "
  If Dir(RegFile1) <> "" Or Dir(RegFile2) <> "" Then
       If Dir(RegFile1) <> "" Then
            RegFile1 = RegFile1 & "/s" & " " & BeReg
            RetVal = Shell(RegFile1, 1)
        Else
            RegFile2 = RegFile2 & "/s" & " " & BeReg
            RetVal = Shell(RegFile2, 1)
        End If
  Else
        MsgBox "找不到regsvr32.exe文件,你可能无法使用本软件!", vbCritical, "无法自动注册控件"
  End If
Else
  MsgBox "找不到控件文件!", vbCritical, "无法自动注册控件"
End If
End Function
发表于 2003-9-30 19:06:00 | 显示全部楼层
发生错误的提示是什么?
发表于 2003-9-30 19:40:00 | 显示全部楼层
应该是没有加载的缘故吧。如果没有启动VL,它不是会自动加载的。
在VBA中可以使用SendCommand "(vl-load-com)",先试试,如果不行的话再查看看代码的原因吧。还有引用的是:R2000使用VL.Application.1,而R2004使用VL.Application.16,不要搞混了。
 楼主| 发表于 2003-10-1 12:04:00 | 显示全部楼层
发生错误的提示是:
实时错误‘-2147221164(80040154)

用SendCommand "(vl-load-com)"解决了,谢谢mccad版主 和efan2000 版主的热心帮助
 楼主| 发表于 2003-10-1 12:19:00 | 显示全部楼层
还有一个问题想请教,如果我在VB里面调用vlax类时,由于Class_Initialize事件中要用到ThisDrawing,我在VB里面定义了acaddoc全局变量,把类的ThisDrawing替换承acaddoc也不行,请问有什么办法可以让vlax也可以在vb里面调用吗?
发表于 2003-10-1 13:06:00 | 显示全部楼层
全局变量只有在模块中定义的才有效。
不过最好的还是增加一个赋值的过程,将初始化的设置放入这个过程。
如:

Public Property Set Application(ByVal vData As AcadApplication)
   
    On Error GoTo ErrTrap
    Set VL = vData.GetInterfaceObject("VL.Application.16")
    Set VLF = VL.ActiveDocument.Functions
    Exit Property
   
ErrTrap:
    On Error GoTo 0
End Property

Private Sub Class_Initialize()
End Sub

使用时,先创建类,然后再set vlax.Application=acaddoc.application,完成接口,接着就可以使用其中的函数了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 04:23 , Processed in 0.178274 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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