Keith™ 发表于 2008-7-9 14:13:11

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

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

Keith™ 发表于 2008-7-9 14:30:38

您可能需要做的是将ConvertPoints的返回值更改为变量
另一种选择是在函数中创建全局变量,而不是从函数返回值,而是在函数中设置值。这有意义吗?

Atook 发表于 2008-7-9 14:40:19

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

Jeff_M 发表于 2008-7-9 14:45:56

唉,我只是想做一个公共变量:
Public NewArray() As Double
编译人员告诉我,“;。。。数组…不允许作为对象模块的公共成员”

Jeff_M 发表于 2008-7-9 14:53:39

在模块(非表单)中Dim MyArray() As Double
Public Function MyFunction(ByVal PointsArray As Variant)
'do stuff here to fill in MyArray
End Function

Jeff_M 发表于 2008-7-9 15:57:39

Keith是对的,当传递数组时,您需要将其作为变体进行调暗。

Keith™ 发表于 2008-7-9 20:04:41

迈克尔,你的功能有缺陷,因为它不是't创建适当大小的新数组,它是#039;也不能正确填写
试试这个:
Function ConvertPoints(ByRef PointsArray() As Double) As Variant
'function creates a new array to hold three dimensional points and converts 2D points into 3D with z=0
Dim PreviousBound As Integer, NewBound As Integer, NewPoints() As Variant
PreviousBound = (UBound(PointsArray) + 1) / 2
NewBound = (PreviousBound * 3) - 1
ReDim NewPoints(NewBound)
Dim i As Integer
Dim j As Integer
For i = 0 To UBound(PointsArray) Step 2
    NewPoints(j) = PointsArray(i)
    NewPoints(j + 1) = PointsArray(i + 1)
    NewPoints(j + 2) = 0#
    j = j + 3
Next i
ConvertPoints = NewPoints
End Function

Atook 发表于 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

Keith™ 发表于 2008-7-10 10:09:54

Rogue,
如果为多边形获得的对象是一条轻量级多段线,则“坐标”属性将返回一个二维点列表,该列表必须转换为三维点列表。基于迈克尔'在第一篇文章中,他知道图层上的第一个实体是什么,以及坐标返回的是什么,这是一个二维点列表。
页: [1]
查看完整版本: 将点作为数组传递给函数……这应该不难。。。。