明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: gyl

这个程序用到VLAX类及曲线操作,为什么出错?

  [复制链接]
发表于 2003-10-9 22:32:00 | 显示全部楼层
可能是内存溢出等问题,因为每引用一次曲线类中的某个函数都会新建一次vl对象,所以计算量会很大。
你试试改为不使用VLAX和CURVE类,而直接写程序,只一次引用VL类型库,并通过类型库自己写几个函数来计算,这样就只引用一次VL,计算量会少很多。
 楼主| 发表于 2003-10-12 01:36:00 | 显示全部楼层
这次没有使用类模块,错误依旧(不一定每次都出错,且数据量越大越会出错):

  1. Sub GetAllLength()

  2.     Dim SsetObj As AcadSelectionSet  '选择集对象
  3.     Dim SsetName As String           '选择集名称
  4.     Dim gpCode(0) As Integer
  5.     Dim dataValue(0) As Variant
  6.     Dim i As Integer
  7.    
  8.     Dim VL As Object
  9.     Dim VLF As Object
  10.     Dim sym As Object
  11.     Dim ret As Variant
  12.    
  13.     ThisDrawing.SendCommand "(vl-load-com)" & vbCr
  14.     Set VL = Application.GetInterfaceObject("VL.Application.1")
  15.     Set VLF = VL.ActiveDocument.Functions
  16.    
  17.     '选择集名称
  18.     SsetName = "SplineSet"
  19.     '建立选择集
  20.     On Error Resume Next
  21.     Set SsetObj = ThisDrawing.SelectionSets.Add(SsetName)
  22.     If Err Then
  23.         Set SsetObj = ThisDrawing.SelectionSets.Item(SsetName)
  24.         SsetObj.Clear
  25.         Err.Clear
  26.     End If
  27.     On Error GoTo 0
  28.    
  29.     '将全部曲线添加到选择集
  30.     gpCode(0) = 0
  31.     dataValue(0) = "PolyLine"
  32.     SsetObj.Select acSelectionSetAll, , , gpCode, dataValue
  33.    
  34.     '打开文件
  35.     Open "D:\curve.txt" For Output As #1
  36.     Print #1, "曲线数目:" & SsetObj.Count
  37.    
  38.     '将曲线长度写入文件
  39.     For i = 1 To SsetObj.Count
  40.         Set sym = VLF.Item("read").funcall("handle")
  41.         ret = VLF.Item("set").funcall(sym, SsetObj.Item(i - 1).Handle)
  42.         Set sym = VLF.Item("read").funcall("(setq curve (handent handle))")
  43.         Set ret = VLF.Item("eval").funcall(sym)
  44.         Set sym = VLF.Item("read").funcall("(vlax-curve-getDistAtParam curve (vlax-curve-getEndParam curve))")
  45.         ret = VLF.Item("eval").funcall(sym)
  46.         Print #1, "第"; i; "条曲线长度: "; Format(ret, "0.000")
  47.     Next i
  48.         
  49.     Close 1
  50.     SsetObj.Delete
  51.     Set VLF = Nothing
  52.     Set VL = Nothing
  53.    
  54.     MsgBox "成功"
  55.    
  56. End Sub


这是试验数据。

本帖子中包含更多资源

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

x
 楼主| 发表于 2003-10-14 00:19:00 | 显示全部楼层
谁能够解决这个问题?
发表于 2003-10-30 21:46:00 | 显示全部楼层
在程序中加上AutoLISP的函数(gc)应该可以解决,我刚写了个程序使用了该函数是可以解决多次调用曲线类函数的问题
 楼主| 发表于 2003-10-30 23:40:00 | 显示全部楼层
本帖最后由 作者 于 2003-10-31 0:16:37 编辑

真的可以执行了。但速度非常慢。函数(gc)什么时候调用最合适呢?
发表于 2003-10-31 06:38:00 | 显示全部楼层
看看出错的频率,调整(GC)的使用频率。
发表于 2003-11-1 10:28:00 | 显示全部楼层
计算量很大,速度慢已是在所难免的,这在曲线多的时候尤为突出.
为了让操作者了解进度,可以在开始时显示一个非模态的窗体,在该窗体上动态显示进度,这样就可以操作者知道运行的情况.
发表于 2007-2-26 11:37:00 | 显示全部楼层
ThisDrawing.SendCommand "(vl-load-com)" & vbCr  不要在过程中多次调用 打开窗体时调用 就可以了 
发表于 2011-1-18 15:32:46 | 显示全部楼层
AutoLISP的函数(gc)怎么使用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 21:27 , Processed in 0.290857 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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