将点作为数组传递给函数……这应该不难。。。。
大家好,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似乎不知道如何将数组传递给函数。有人能告诉我吗;我要去任何地方,哪怕是接近正确的方式
非常感谢你的帮助。
您可能需要做的是将ConvertPoints的返回值更改为变量
另一种选择是在函数中创建全局变量,而不是从函数返回值,而是在函数中设置值。这有意义吗? 基思,谢谢你的快速回复
I';我做了你建议的更改:
Function ConvertPoints(ByRef PointsArray() As Double) As Variant
然而,当我尝试使用此命令进行选择时:
mySelectionSet.SelectByPolygon mode, ConvertPoints(varPoints())
我得到了一个信息:“我知道你在做什么。”;类型不匹配,应为数组或用户定义的类型
如果我尝试以下操作(例如,使用不带括号的数组名称),我会收到相同的消息
ConvertPoints(varPoints)
我觉得我';我的语法有问题。无论如何,我';我将尝试创建一个全局函数,看看是否可行
要做到这一点,我';d ass Public NewArray()在代码的常规部分中为double;然后在函数中重拨,对吗
唉,我只是想做一个公共变量:
Public NewArray() As Double
编译人员告诉我,“;。。。数组…不允许作为对象模块的公共成员”
在模块(非表单)中Dim MyArray() As Double
Public Function MyFunction(ByVal PointsArray As Variant)
'do stuff here to fill in MyArray
End Function
Keith是对的,当传递数组时,您需要将其作为变体进行调暗。 迈克尔,你的功能有缺陷,因为它不是';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
对我来说,似乎太像工作了。我不认为有必要改变任何东西;我不知道为什么你的日常工作不起作用-你选择了一条线作为一个对象?因为一条直线或只有一个子图元的多段线只有2个点(坐标),这不足以描述要选择的多边形
此外,您还意识到,在很多情况下,您希望用来选择的多边形也不会选择,例如,带有您用来描述多边形的坐标的多段线?因为多边形将处于打开状态,而不是在selectionset polygonal窗口中
试试下面的代码。ts是从帮助文件的复制/粘贴中快速生成的;它创建一条三角形多段线和其中的一个圆,然后根据多段线坐标创建selectionset边界。请注意,选择的是圆,而不是多段线snip-----------snip------snip----------snip-------
Sub Main()
 ' 创建多段线。然后使用坐标 ' 属性返回多段线中的所有坐标
 
 ;将plineObj设置为AcadPolyline ' 创建类似三角形的多段线 ;暗点(作为双点(0)=-10:点(1)=0:点(2)=0 ;点(3)=10:点(4)=0:点(5)=0 ;点(6)=0:点(7)=7:点(=0)。设置plineObj=ThisDrawing。模型空间。添加多段线(点) ' 返回多段线的所有坐标 ;Dim retCoord作为变体 ;retCoord=plineObj。坐标 
 ' 在三角形中间画一个圆 ;将MyCircle暗显为AcadCircle ;将中心点(2)变暗为双 ;中心点(0)=0:中心点(1)=3:中心点(2)=0 ;设置MyCircle=ThisDrawing.ModelSpace。添加圆(中心点,1) ;此图纸。Regen acActiveViewport 
 ' 创建选择集 ;Dim模式为整数 ;模式=acSelectionSetWindowPolygon ;将我的选择集暗显为AcadSelectionSet ;设置mySelectionSet=ThisDrawing.SelectionSets。添加(“TEST\u SSET”)
 
 ' 使用多段线中的点选择实体 ;我的选择集。选择多边形模式,重新协调 ;如果我的选择集。计数(>)-1然后   ;Dim acEnt As AcadObject   ;对于我的选择集,i=0。计数-1     ;设置acEnt=mySelectionSet。第(i)项     ;消息框>       ;MsgBox“;“项目”&;i&&引用 &引用&;阿森特。对象名称   ;下一步 ;其他   ;MsgBox“;“选择集中无任何内容”
 ;如果结束 ;我的选择集。删除 ;设置mySelectionSet=Nothing 
End Sub Rogue,
如果为多边形获得的对象是一条轻量级多段线,则“坐标”属性将返回一个二维点列表,该列表必须转换为三维点列表。基于迈克尔';在第一篇文章中,他知道图层上的第一个实体是什么,以及坐标返回的是什么,这是一个二维点列表。
页:
[1]