明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5082|回复: 18

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

  [复制链接]
发表于 2003-10-9 00:55:00 | 显示全部楼层 |阅读模式
我想实现这样一个功能:搜索当前图形中的所有样条曲线,对于每条曲线,从起点开始,每隔一定距离取一个点,然后将点的坐标写入文件,即将连续的样条曲线离散化。因此,写了这个程序,程序中的类和求曲线长的函数以及取曲线上一个点坐标的函数都是从本版下载的,只有宏函数是自己编的。该程序极不稳定,偶尔可以运行成功,多数情况下显示一个只有一个红叉的空白错误框,CAD命令行显示“参数太少”;如果出错后再次运行此宏,CAD必定崩溃退出。程序和图形文件都在此,程序内有详细注释。希望各位高手帮忙看一下毛病究竟出在什么地方。

本帖子中包含更多资源

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

x
发表于 2003-10-9 06:57:00 | 显示全部楼层
这种出错应属选择集的BUG。而不是曲线的错误。
记得2000版的SsetObj.Delete就有问题,再试试现在的2004版本,其实也有这个BUG,所以不要使用该方法来清除选择集,应改用其它方法。

  1.     On Error Resume Next
  2.     Set SsetObj = ThisDrawing.SelectionSets.Add(SsetName)
  3.     If Err Then
  4.         Set SsetObj = ThisDrawing.SelectionSets.Item(SsetName)
  5.         SsetObj.Clear
  6.         Err.Clear
  7.     End If
复制代码
发表于 2003-10-9 06:59:00 | 显示全部楼层
另外,最后一个点坐标你可以直接使用曲线类的终点,而不必计算总长,再使用总长来找到最后一点,这样可能会由于偏差页找不到点。
你虽然程序中引用了曲线类,但却没有用到。
 楼主| 发表于 2003-10-9 12:37:00 | 显示全部楼层
对于曲线类的使用,我的确不太理解。站长能否简单介绍一下方法步骤,结合实例更好。什么地方可以找到这方面的资料啊?VBA的随机帮助里好象没有这部分内容。
发表于 2003-10-9 12:45:00 | 显示全部楼层
它是Visual Lisp提供的,在VBA中当然找不到了。
查看VL的帮助吧,其中以vlax开头,中间带有curve的几个函数就是它的说明了。
 楼主| 发表于 2003-10-9 13:40:00 | 显示全部楼层
用曲线类重写了程序,错误依旧。毛病出在Pt = ObjCurve.GetPointAtDistance(dist)这一句,而且每次出错时写入文件的点数都不一样,有多有少。真是百思不得其解!

  1. Sub GetPointAtSpline()

  2.     Const ds As Double = 20          '曲线上的取点间隔
  3.     Dim dist As Double               '点至曲线端点的距离
  4.     Dim SsetObj As AcadSelectionSet  '选择集对象
  5.     Dim SsetName As String           '选择集名称
  6.     Dim LengthOfCurve As Double      '曲线全长
  7.     Dim Pt As Variant                '点坐标
  8.     Dim i As Integer, j As Integer, num As Integer

  9.     Dim gpCode(0) As Integer
  10.     Dim dataValue(0) As Variant
  11.     Dim groupCode As Variant, dataCode As Variant
  12.    
  13.     ThisDrawing.SendCommand "(vl-load-com)" & vbCr
  14.    
  15.     '定义引用曲线类模块
  16.     Dim ObjCurve As Curve
  17.     Set ObjCurve = New Curve
  18.    
  19.     '选择集名称
  20.     SsetName = "SplineSet"
  21.     '建立选择集
  22.     On Error Resume Next
  23.     Set SsetObj = ThisDrawing.SelectionSets.Add(SsetName)
  24.     If Err Then
  25.         Set SsetObj = ThisDrawing.SelectionSets.Item(SsetName)
  26.         SsetObj.Clear
  27.         Err.Clear
  28.     End If
  29.     On Error GoTo 0
  30.    
  31.     '将全部样条曲线添加到选择集
  32.     gpCode(0) = 0
  33.     dataValue(0) = "Spline"
  34.     groupCode = gpCode
  35.     dataCode = dataValue
  36.     SsetObj.Select acSelectionSetAll, , , groupCode, dataCode
  37.    
  38.     '打开文件用于存储样条曲线离散化后的点的坐标
  39.     Open "D:\curve.txt" For Output As #1
  40.     Print #1, "样条曲线数目:" & SsetObj.Count
  41.    
  42.     '在样条曲线上每隔一定距离取一个点,依次将点的坐标写入文件
  43.     For i = 1 To SsetObj.Count
  44.         Set ObjCurve.Entity = SsetObj.Item(i - 1)
  45.         '取得曲线全长
  46.         LengthOfCurve = ObjCurve.length
  47.         '计算要分的整段数
  48.         num = Int(LengthOfCurve / ds)
  49.         Print #1, "第" & i & "样条曲线长度:" & LengthOfCurve & "    曲线点数:" & num + 2
  50.         '起点
  51.         Pt = ObjCurve.StartPoint
  52.         Print #1, "1: "; Format(Pt(0), "0.000"); " "; Format(Pt(1), "0.000"); " "; Format(Pt(2), "0.000")
  53.         '中间各点
  54.         For j = 1 To num
  55.             dist = ds * j
  56.             Pt = ObjCurve.GetPointAtDistance(dist)
  57.             Print #1, j + 1 & ": "; Format(Pt(0), "0.000"); " "; Format(Pt(1), "0.000"); " "; Format(Pt(2), "0.000")
  58.         Next j
  59.         '终点
  60.         Pt = ObjCurve.EndPoint
  61.         Print #1, num + 2 & ": "; Format(Pt(0), "0.000"); " "; Format(Pt(1), "0.000"); " "; Format(Pt(2), "0.000")
  62.     Next i
  63.     Close 1
  64.     SsetObj.Delete
  65.    
  66.     MsgBox "坐标提取成功"
  67.    
  68. End Sub
发表于 2003-10-9 21:36:00 | 显示全部楼层
我VLAX类的那个程序我调试了很多次都没有问题?就是后面这段贴出来的程序用Curve类会出现
“参数太少"崩溃退出.

本帖子中包含更多资源

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

x
 楼主| 发表于 2003-10-9 21:40:00 | 显示全部楼层
在我的机器上,两种程序出错的几率差不多。而且曲线越多,出错可能越大。会不会是因为同时装了2002和2004的缘故呢?
发表于 2003-10-9 21:44:00 | 显示全部楼层
不是的,可能是内存的问题。
 楼主| 发表于 2003-10-9 21:52:00 | 显示全部楼层
内存问题?硬件问题还是软件问题?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 20:46 , Processed in 0.166520 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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