mccad 发表于 2003-10-9 22:32:00

可能是内存溢出等问题,因为每引用一次曲线类中的某个函数都会新建一次vl对象,所以计算量会很大。
你试试改为不使用VLAX和CURVE类,而直接写程序,只一次引用VL类型库,并通过类型库自己写几个函数来计算,这样就只引用一次VL,计算量会少很多。

gyl 发表于 2003-10-12 01:36:00

这次没有使用类模块,错误依旧(不一定每次都出错,且数据量越大越会出错):

Sub GetAllLength()

    Dim SsetObj As AcadSelectionSet'选择集对象
    Dim SsetName As String         '选择集名称
    Dim gpCode(0) As Integer
    Dim dataValue(0) As Variant
    Dim i As Integer
   
    Dim VL As Object
    Dim VLF As Object
    Dim sym As Object
    Dim ret As Variant
   
    ThisDrawing.SendCommand "(vl-load-com)" & vbCr
    Set VL = Application.GetInterfaceObject("VL.Application.1")
    Set VLF = VL.ActiveDocument.Functions
   
    '选择集名称
    SsetName = "SplineSet"
    '建立选择集
    On Error Resume Next
    Set SsetObj = ThisDrawing.SelectionSets.Add(SsetName)
    If Err Then
      Set SsetObj = ThisDrawing.SelectionSets.Item(SsetName)
      SsetObj.Clear
      Err.Clear
    End If
    On Error GoTo 0
   
    '将全部曲线添加到选择集
    gpCode(0) = 0
    dataValue(0) = "PolyLine"
    SsetObj.Select acSelectionSetAll, , , gpCode, dataValue
   
    '打开文件
    Open "D:\curve.txt" For Output As #1
    Print #1, "曲线数目:" & SsetObj.Count
   
    '将曲线长度写入文件
    For i = 1 To SsetObj.Count
      Set sym = VLF.Item("read").funcall("handle")
      ret = VLF.Item("set").funcall(sym, SsetObj.Item(i - 1).Handle)
      Set sym = VLF.Item("read").funcall("(setq curve (handent handle))")
      Set ret = VLF.Item("eval").funcall(sym)
      Set sym = VLF.Item("read").funcall("(vlax-curve-getDistAtParam curve (vlax-curve-getEndParam curve))")
      ret = VLF.Item("eval").funcall(sym)
      Print #1, "第"; i; "条曲线长度: "; Format(ret, "0.000")
    Next i
      
    Close 1
    SsetObj.Delete
    Set VLF = Nothing
    Set VL = Nothing
   
    MsgBox "成功"
   
End Sub


这是试验数据。

gyl 发表于 2003-10-14 00:19:00

谁能够解决这个问题?

mccad 发表于 2003-10-30 21:46:00

在程序中加上AutoLISP的函数(gc)应该可以解决,我刚写了个程序使用了该函数是可以解决多次调用曲线类函数的问题

gyl 发表于 2003-10-30 23:40:00

本帖最后由 作者 于 2003-10-31 0:16:37 编辑

真的可以执行了。但速度非常慢。函数(gc)什么时候调用最合适呢?

mccad 发表于 2003-10-31 06:38:00

看看出错的频率,调整(GC)的使用频率。

zeng29 发表于 2003-11-1 10:28:00

计算量很大,速度慢已是在所难免的,这在曲线多的时候尤为突出.
为了让操作者了解进度,可以在开始时显示一个非模态的窗体,在该窗体上动态显示进度,这样就可以操作者知道运行的情况.

cangcang 发表于 2007-2-26 11:37:00

ThisDrawing.SendCommand "(vl-load-com)" & vbCr  不要在过程中多次调用 打开窗体时调用 就可以了 

yyk1yyk1 发表于 2011-1-18 15:32:46

AutoLISP的函数(gc)怎么使用?
页: 1 [2]
查看完整版本: 这个程序用到VLAX类及曲线操作,为什么出错?