明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4388|回复: 13

不定维数组

  [复制链接]
发表于 2002-7-12 09:39:00 | 显示全部楼层 |阅读模式
vba中有无方法建立二维不定维数组,问题是这样的:我需要依次从当前图形中选在几个选择集,然后取出其控制点排序后重生成图形,首先用户选取几个选择集是不确定的,其次,每个选择集中所含控制点数也是不确定的,这样,我起初打算使用二维数组,在读取选择集中每一对象控制点的过程中来redim其维数,但是是行不通的,因为该数组第二维无法统一,就是说每个选择集的点数是不同的.请问如何解决?
发表于 2002-7-15 13:23:00 | 显示全部楼层

对你的问题还有些不明白

对你的问题还有些不明白:
1、用户提供的地形线是什么对象类型(例如:AcadSpline)?
2、RayObj在你的程序中是什么类型(你的Dim语句)?
3、我个人理解,版主的意思是IntersectWith函数前那个Set不需要,而不是说不用地形线集合(Set)。
 楼主| 发表于 2002-7-12 11:45:00 | 显示全部楼层

对上述问题的初步解决方法:

不知这样好不好:仍采用双重循环,第一重由用户选择集数目确定,不存在问题,第二维需从图形中提取数据,如果是首次第一重循环或该次提取数据量(本程序中为点数)大于当前的第二维的上界,这时方可用redim preserve语句对当前第二维进行扩充,则之前的第二维数据自动补零,之后程序中控制,如数据为0则不进行原定操作.缩短程序如下:
For k = 0 To UBound(LayerLineSele)
  For Each entry In LayerLineSele(k)
     ......
     ElseIf (TypeOf entry Is AcadPolyline) Then
       Dim plctrlpnts As Variant
       plctrlpnts = entry.Coordinates
       If k = 0 Or i + UBound(plctrlpnts) > UBound(LayerlinePoints, 2) Then
         ReDim Preserve LayerlinePoints(k, i + UBound(plctrlpnts))
       End If
       For t = 0 To UBound(plctrlpnts)
          LayerlinePoints(k, i + t) = plctrlpnts(t)
       Next t
       i = i + UBound(plctrlpnts) + 1
       ......
    Next
Next k
End Sub
发表于 2002-7-12 12:25:00 | 显示全部楼层

把几个选择集合并成一个选择集再做吧,实用函数栏目中的相应函数

 楼主| 发表于 2002-7-12 16:28:00 | 显示全部楼层

不能合并

本帖最后由 作者 于 2002-7-12 16:28:56 编辑

因为对程序功能的要求,不能把几个选择集合并起来做,因为要分别对几个选择集中的控制点排序,然后重现.今天按上次帖子上的方法做了以后,应该可以成功,只是还有一些小问题过不去:首先dim points() as double,而后再以变量将其redim为二维,程序均可通过.只是在外循环进行到第二次时,总是提示下标越界,通过观察程序,我觉得问题好像出在对第一维的redim上,但无论怎么修改,都过不去.不知是什么原因?用不用我把程序发过去呢?不好意思,问的都是vb中的问题,但确实是因为与cad图形相关,才出现了如此多的不确定因素.


 楼主| 发表于 2002-7-12 17:40:00 | 显示全部楼层

solved

版主,该问题已解决,问题出在:redim语句只能应用于二维及以上数组的最后一维,还是因为没有仔细阅读帮助文件.认识到这一点,程序中略加修改,就可通过了
 楼主| 发表于 2002-7-12 22:00:00 | 显示全部楼层

问:

本帖最后由 作者 于 2002-7-12 22:00:54 编辑

1、为什么用thisdrawing.modelspace.objectname.delete无法删除掉对象,而直接用objectname.delete就可以删掉呢?
2、求一条射线与一个选择集的交点,用下列语句实现,却显示错误,应该怎么实现呢?
dim landformsele as acadselectionset
dim entry as acadobject
dim intpnt as variant
landformsele.selectonscreen
for each entry in landformsele
Set IntPnt = RayObj.IntersectWith(Entry, acExtendBoth) '该句显示类型不匹配错误
next



[此贴子已经被作者于2002-7-12 21:00:38编辑过]
发表于 2002-7-12 22:30:00 | 显示全部楼层

objectname本身就是你需要的对象,为什么还要加那么多的前缀

至于第二个问题,不要用set应该可能,因为set对于对象才有效
 楼主| 发表于 2002-7-12 23:09:00 | 显示全部楼层

可是真的必须用set才能实现我想要的功能

发表于 2002-7-12 23:18:00 | 显示全部楼层

为什么,你需要什么样的功能?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 22:53 , Processed in 0.192033 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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