乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 169|回复: 8

将点作为数组传递给函数……这应该不难。。。。

[复制链接]

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-7-9 14:13:11 | 显示全部楼层 |阅读模式
大家好,
I'我正在开发一个VBA程序,该程序将为用户提供一个图层列表,允许用户选择一个图层,自动选择该图层上的第一个(也是唯一一个)对象,然后使用acselectionsetWindowPolygon方法选择该对象内的所有项
现在,我可以让Autocad选择我想要的对象,但我'我很难让它把点传递给选择函数
I'm使用以下代码获取对象的点:
[代码然后,据我所知,我需要将这个二维点集转换为三维点。为此,我编写了一个函数:
  1. Function ConvertPoints(ByRef PointsArray() As Double) As Double
  2. 'function creates a new array to hold three dimensional points and converts 2D points into 3D with z=0
  3. Dim PreviousBound As Integer, NewBound As Integer
  4. PreviousBound = (UBound(PointsArray) + 1) / 2
  5. NewBound = PreviousBound * 3
  6. ReDim ConvertPoints(NewBound) As Double
  7. Dim i As Integer
  8. For i = 0 To UBound(PointsArray)
  9.     If i Mod 3 = 0 Then ConvertPoints(i) = 0
  10.     Else: ConvertPoints(i) = PointsArray(i)
  11. Next i
  12. End Function
当然,我想用这样的方法进行实际的选择:
  1. dim mode as integer
  2. mode = acselectionsetWindowPolygon
  3. mySelectionSet.SelectByPolygon mode, ConvertPoints(varPoints())
然而,我可以't似乎不知道如何将数组传递给函数。有人能告诉我吗;我要去任何地方,哪怕是接近正确的方式
非常感谢你的帮助。
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-7-9 14:30:38 | 显示全部楼层
您可能需要做的是将ConvertPoints的返回值更改为变量
另一种选择是在函数中创建全局变量,而不是从函数返回值,而是在函数中设置值。这有意义吗?
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2008-7-9 14:40:19 | 显示全部楼层
基思,谢谢你的快速回复
I'我做了你建议的更改:
  1. Function ConvertPoints(ByRef PointsArray() As Double) As Variant
然而,当我尝试使用此命令进行选择时:
  1. mySelectionSet.SelectByPolygon mode, ConvertPoints(varPoints())
我得到了一个信息:“我知道你在做什么。”;类型不匹配,应为数组或用户定义的类型
如果我尝试以下操作(例如,使用不带括号的数组名称),我会收到相同的消息
  1. ConvertPoints(varPoints)
我觉得我'我的语法有问题。无论如何,我'我将尝试创建一个全局函数,看看是否可行
要做到这一点,我'd ass Public NewArray()在代码的常规部分中为double;然后在函数中重拨,对吗
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-7-9 14:45:56 | 显示全部楼层
唉,我只是想做一个公共变量:
  1. Public NewArray() As Double
编译人员告诉我,“;。。。数组…不允许作为对象模块的公共成员”
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-7-9 14:53:39 | 显示全部楼层
在模块(非表单)中
  1. Dim MyArray() As Double
  2. Public Function MyFunction(ByVal PointsArray As Variant)
  3. 'do stuff here to fill in MyArray
  4. End Function
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-7-9 15:57:39 | 显示全部楼层
Keith是对的,当传递数组时,您需要将其作为变体进行调暗。
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-7-9 20:04:41 | 显示全部楼层
迈克尔,你的功能有缺陷,因为它不是't创建适当大小的新数组,它是#039;也不能正确填写
试试这个:
  1. Function ConvertPoints(ByRef PointsArray() As Double) As Variant
  2. 'function creates a new array to hold three dimensional points and converts 2D points into 3D with z=0
  3. Dim PreviousBound As Integer, NewBound As Integer, NewPoints() As Variant
  4. PreviousBound = (UBound(PointsArray) + 1) / 2
  5. NewBound = (PreviousBound * 3) - 1
  6. ReDim NewPoints(NewBound)
  7. Dim i As Integer
  8. Dim j As Integer
  9. For i = 0 To UBound(PointsArray) Step 2
  10.     NewPoints(j) = PointsArray(i)
  11.     NewPoints(j + 1) = PointsArray(i + 1)
  12.     NewPoints(j + 2) = 0#
  13.     j = j + 3
  14. Next i
  15. ConvertPoints = NewPoints
  16. End Function
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2008-7-10 06:07:31 | 显示全部楼层
对我来说,似乎太像工作了。我不认为有必要改变任何东西;我不知道为什么你的日常工作不起作用-你选择了一条线作为一个对象?因为一条直线或只有一个子图元的多段线只有2个点(坐标),这不足以描述要选择的多边形
此外,您还意识到,在很多情况下,您希望用来选择的多边形也不会选择,例如,带有您用来描述多边形的坐标的多段线?因为多边形将处于打开状态,而不是在selectionset polygonal窗口中
试试下面的代码。ts是从帮助文件的复制/粘贴中快速生成的;它创建一条三角形多段线和其中的一个圆,然后根据多段线坐标创建selectionset边界。请注意,选择的是圆,而不是多段线snip-----------snip------snip----------snip-------
Sub Main()
&nbsp' 创建多段线。然后使用坐标&nbsp' 属性返回多段线中的所有坐标
&nbsp
 将plineObj设置为AcadPolyline&nbsp' 创建类似三角形的多段线 暗点(作为双点(0)=-10:点(1)=0:点(2)=0 点(3)=10:点(4)=0:点(5)=0 点(6)=0:点(7)=7:点(=0)。设置plineObj=ThisDrawing。模型空间。添加多段线(点)&nbsp' 返回多段线的所有坐标 Dim retCoord作为变体 retCoord=plineObj。坐标&nbsp
&nbsp' 在三角形中间画一个圆 将MyCircle暗显为AcadCircle 将中心点(2)变暗为双 中心点(0)=0:中心点(1)=3:中心点(2)=0 设置MyCircle=ThisDrawing.ModelSpace。添加圆(中心点,1) 此图纸。Regen acActiveViewport&nbsp
&nbsp' 创建选择集 Dim模式为整数 模式=acSelectionSetWindowPolygon 将我的选择集暗显为AcadSelectionSet 设置mySelectionSet=ThisDrawing.SelectionSets。添加(“TEST\u SSET”)
&nbsp
&nbsp' 使用多段线中的点选择实体 我的选择集。选择多边形模式,重新协调 如果我的选择集。计数(&gt)-1然后&nbsp&nbsp Dim acEnt As AcadObject&nbsp&nbsp 对于我的选择集,i=0。计数-1&nbsp&nbsp&nbsp&nbsp 设置acEnt=mySelectionSet。第(i)项&nbsp&nbsp&nbsp&nbsp 消息框> &nbsp&nbsp&nbsp&nbsp&nbsp MsgBox“;“项目”&i&amp&引用&nbsp&引用&阿森特。对象名称&nbsp&nbsp 下一步 其他&nbsp&nbsp MsgBox“;“选择集中无任何内容”
 如果结束 我的选择集。删除 设置mySelectionSet=Nothing&nbsp
End Sub
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-7-10 10:09:54 | 显示全部楼层
Rogue,
如果为多边形获得的对象是一条轻量级多段线,则“坐标”属性将返回一个二维点列表,该列表必须转换为三维点列表。基于迈克尔'在第一篇文章中,他知道图层上的第一个实体是什么,以及坐标返回的是什么,这是一个二维点列表。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-4 10:08 , Processed in 0.428432 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表