AVAX-software.com Forums: GetHandlesUnderSelectCursor are very slow - AVAX-software.com Forums

Jump to content

Page 1 of 1

GetHandlesUnderSelectCursor are very slow

#1 User is offline   MarioRainer Icon

  • Advanced Member
  • PipPipPip
  • Group: Members
  • Posts: 43
  • Joined: 11-May 08
  • Location:Germany

Posted 25 May 2008 - 10:39 AM

Dear Athanasios,

I use the method GetHandlesUnderSelectCursor to the key characteristics select. But AVX becomes then so slow that one cannot work actually any longer.

Look at the Attachment.

Still waiting for the help!

If you have any news, please reply.

thanks a lot
Mario Rainer

Private Sub cAvax1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    On Local Error Resume Next
    Dim h() As Long, lMax As Long
    Dim sKey As String
    
    Call RefreshRulers
        lMax = cAvax1.GetHandlesUnderSelectCursor(h())
        If lMax > 0 Then
           sKey = cAvax1.GetHandleKey(h(1))
        
            If Len(Trim$(sKey)) > 0 Then
               StatusBar1.Panels(3).Text = sKey
            Else
               StatusBar1.Panels(3).Text = ""
            End If
        End If
End Sub


#2 User is offline   Athanasios Gardos Icon

  • Administrator
  • Icon
  • Group: Admin
  • Posts: 333
  • Joined: 21-March 05
  • Gender:Male

Posted 26 May 2008 - 11:30 AM

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

Athanasios Gardos
Avax-Software.com

Page 1 of 1


Fast Reply

  

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users