GetHandlesUnderSelectCursor is slow as the zoom in AVAX.
You have to use your own method to have faster results.
Please, have a look at the code bellow:
Option Explicit
Dim oMath As cAvaxMath
Dim BHandles() As Long
Dim BxMin() As Single, ByMin() As Single, BzMin() As Single
Dim BxMax() As Single, ByMax() As Single, BzMax() As Single
Dim BsKeys() As String
Private Sub cAvax1_Change()
Call PrepareData
End Sub
Private Sub cAvax1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim x1 As Single, y1 As Single
Dim x2 As Single, y2 As Single
Dim xMin As Single, yMin As Single
Dim xMax As Single, yMax As Single
Dim lCnt As Long, p As Long, s As Single
p = cAvax1.GetAvaxProperty(SelectCursorSize_p)
s = cAvax1.UnitX * CSng(p)
If cAvax1.CurrentXY(x1, y1) = True Then
xMin = x1 - s
yMin = y1 - s
xMax = x1 + s
yMax = y1 + s
Label1.Caption = ""
For lCnt = 1 To UBound(BxMin())
x1 = BxMin(lCnt)
y1 = ByMin(lCnt)
x2 = BxMax(lCnt)
y2 = ByMax(lCnt)
If oMath.ClipLine(xMin, yMin, xMax, yMax, x1, y1, x2, y2) = True Then
Label1.Caption = BHandles(lCnt) & ":" & BsKeys(lCnt)
Label1.Refresh
Exit For
End If
Next lCnt
End If
End Sub
Private Sub Form_Load()
Set oMath = New cAvaxMath
Call cAvax1.StartAvax(App.Path & "\RailMap.AVX")
Call PrepareData
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set oMath = Nothing
cAvax1.EndAvax
End Sub
Private Function PrepareData() As Boolean
Dim iType() As AvaxItemType
Dim vItemProperties() As Variant
Dim vData() As Variant, xyz() As Single
Dim xV() As Single, yV() As Single, zV() As Single
Dim lCnt As Long, lMax As Long, kCnt As Long
Dim xMin1 As Single, yMin1 As Single, zMin1 As Single
Dim xMax1 As Single, yMax1 As Single, zMax1 As Single
Dim x1() As Single, y1() As Single, z1() As Single
Dim x2() As Single, y2() As Single, z2() As Single
On Local Error GoTo Lab_Error
lMax = cAvax1.GetAllHandlesArr(BHandles())
If lMax = 0 Then Exit Function
ReDim BxMin(lMax) As Single, ByMin(lMax) As Single, BzMin(lMax) As Single
ReDim BxMax(lMax) As Single, ByMax(lMax) As Single, BzMax(lMax) As Single
ReDim BsKeys(lMax) As String
If cAvax1.GetProperties(BHandles(), iType(), vItemProperties(), vData()) = True Then
Call cAvax1.GetKeyArrByHandlesArr(BHandles(), BsKeys())
For lCnt = 1 To lMax
Select Case iType(lCnt)
Case AvaxItemType.Ellipse_i
xyz() = vData(lCnt)
BxMin(lCnt) = xyz(1)
ByMin(lCnt) = xyz(2)
BzMin(lCnt) = xyz(3)
BxMax(lCnt) = xyz(4)
ByMax(lCnt) = xyz(5)
BzMax(lCnt) = xyz(6)
Case AvaxItemType.Polyline_i
xyz() = vData(lCnt)
BxMin(lCnt) = xyz(1)
ByMin(lCnt) = xyz(2)
BzMin(lCnt) = xyz(3)
BxMax(lCnt) = xyz(4)
ByMax(lCnt) = xyz(5)
BzMax(lCnt) = xyz(6)
For kCnt = 1 To UBound(xyz()) Step 6
Call FindMaxMinXYZ(xyz(kCnt), xyz(kCnt + 1), xyz(kCnt + 2), BxMax(lCnt), BxMin(lCnt), ByMax(lCnt), ByMin(lCnt), BzMax(lCnt), BzMin(lCnt))
Call FindMaxMinXYZ(xyz(kCnt + 3), xyz(kCnt + 4), xyz(kCnt + 5), BxMax(lCnt), BxMin(lCnt), ByMax(lCnt), ByMin(lCnt), BzMax(lCnt), BzMin(lCnt))
Next kCnt
Case AvaxItemType.Shape_i
xyz() = vData(lCnt)
BxMin(lCnt) = xyz(1)
ByMin(lCnt) = xyz(2)
BzMin(lCnt) = xyz(3)
BxMax(lCnt) = xyz(4)
ByMax(lCnt) = xyz(5)
BzMax(lCnt) = xyz(6)
If oMath.GetAvaxShapeVertices(xyz(), xV(), yV(), zV()) = True Then
For kCnt = 1 To UBound(xV())
Call FindMaxMinXYZ(xV(kCnt), yV(kCnt), zV(kCnt), BxMax(lCnt), BxMin(lCnt), ByMax(lCnt), ByMin(lCnt), BzMax(lCnt), BzMin(lCnt))
Next kCnt
End If
Case AvaxItemType.Line_i, AvaxItemType.Text_i, AvaxItemType.Block_i
xyz() = vData(lCnt)
BxMin(lCnt) = xyz(1)
ByMin(lCnt) = xyz(2)
BzMin(lCnt) = xyz(3)
BxMax(lCnt) = xyz(4)
ByMax(lCnt) = xyz(5)
BzMax(lCnt) = xyz(6)
Case AvaxItemType.Point_i
xyz() = vData(lCnt)
BxMin(lCnt) = xyz(1)
ByMin(lCnt) = xyz(2)
BzMin(lCnt) = xyz(3)
BxMax(lCnt) = xyz(1)
ByMax(lCnt) = xyz(2)
BzMax(lCnt) = xyz(3)
Case AvaxItemType.Curve_i
xyz() = vData(lCnt)
Call cAvax1.GetCurveLines(BHandles(lCnt), x1(), y1(), z1(), x2(), y2(), z2())
BxMin(lCnt) = x1(1)
ByMin(lCnt) = y1(1)
BzMin(lCnt) = z1(1)
BxMax(lCnt) = x2(1)
ByMax(lCnt) = y2(1)
BzMax(lCnt) = z2(1)
For kCnt = 1 To UBound(x1())
Call FindMaxMinXYZ(x1(kCnt), y1(kCnt), z1(kCnt), BxMax(lCnt), BxMin(lCnt), ByMax(lCnt), ByMin(lCnt), BzMax(lCnt), BzMin(lCnt))
Call FindMaxMinXYZ(x2(kCnt), y2(kCnt), z2(kCnt), BxMax(lCnt), BxMin(lCnt), ByMax(lCnt), ByMin(lCnt), BzMax(lCnt), BzMin(lCnt))
Next kCnt
End Select
Next lCnt
PrepareData = True
End If
Lab_Error:
End Function
Private Sub FindMaxMin(ax1, amaxx, aminx)
On Local Error Resume Next
If ax1 > amaxx Then amaxx = ax1
If ax1 < aminx Then aminx = ax1
End Sub
Private Sub FindMaxMinXYZ(x1, y1, z1, dmaxx, dminx, dmaxy, dminy, dmaxz, dminz)
Call FindMaxMin(x1, dmaxx, dminx)
Call FindMaxMin(y1, dmaxy, dminy)
Call FindMaxMin(z1, dmaxz, dminz)
End Sub