你试试改为不使用VLAX和CURVE类,而直接写程序,只一次引用VL类型库,并通过类型库自己写几个函数来计算,这样就只引用一次VL,计算量会少很多。 这次没有使用类模块,错误依旧(不一定每次都出错,且数据量越大越会出错):
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
这是试验数据。 谁能够解决这个问题? 在程序中加上AutoLISP的函数(gc)应该可以解决,我刚写了个程序使用了该函数是可以解决多次调用曲线类函数的问题 本帖最后由 作者 于 2003-10-31 0:16:37 编辑
真的可以执行了。但速度非常慢。函数(gc)什么时候调用最合适呢? 看看出错的频率,调整(GC)的使用频率。 计算量很大,速度慢已是在所难免的,这在曲线多的时候尤为突出.
为了让操作者了解进度,可以在开始时显示一个非模态的窗体,在该窗体上动态显示进度,这样就可以操作者知道运行的情况. ThisDrawing.SendCommand "(vl-load-com)" & vbCr 不要在过程中多次调用 打开窗体时调用 就可以了 AutoLISP的函数(gc)怎么使用?
页:
1
[2]