Because Autodesk erase function for alignment positions (balloons) to first fixed selected position and this function missing me, I made a macro for this function. I put the macro here for those who wants. It is with czech notes(green).
Public Sub ZarovnaniPozic()
Dim tentoDokument As DrawingDocument
Set tentoDokument = ThisApplication.ActiveDocument
If tentoDokument.SelectSet.Count < 2 Then
MsgBox ("Předem musí být vybrané pozice. Aspoň dvě.")
End
End If
If tentoDokument.SelectSet.Item(1).Type <> kBalloonObject Then
MsgBox ("První vybraná musí být pozice.")
End
End If
Dim RoztecVertikalni As Double
Dim RoztecHorizontalni As Double
RoztecVertikalni = tentoDokument.SelectSet.Item(1).Style.DefaultOffset / 0.45652 'Pevná hodnota 2.3
RoztecHorizontalni = tentoDokument.SelectSet.Item(1).Style.DefaultOffset / 0.33333 'Pevná hodnota 3.15
Dim VykresovaGeometrie As TransientGeometry
Set VykresovaGeometrie = ThisApplication.TransientGeometry
Dim PrvniPozice As Balloon
Set PrvniPozice = tentoDokument.SelectSet.Item(1) 'První zadaná pozice - výchozí
Dim PocetPozic As Integer
PocetPozic = 0
Dim Vybrabne As Variant
For Each Vybrabne In tentoDokument.SelectSet 'Filtrace pozic od jiných věcí a zjištění počtu
If Vybrabne.Type = kBalloonObject Then
PocetPozic = PocetPozic + 1
End If
Next
Dim Smer As Integer
Dim SeznamPozic() As Balloon
Dim PosunutiPozice() As Double
ReDim SeznamPozic(PocetPozic - 1)
ReDim PosunutiPozice(PocetPozic - 1)
Dim SouradnicePozice As Point2d
Dim Posunuti As Double
Dim a As Double 'koeficient více pozic
Dim i As Integer
Dim j As Integer
i = 0
For Each Vybrabne In tentoDokument.SelectSet 'Načtení seznamu
If Vybrabne.Type = kBalloonObject Then
Set SeznamPozic(i) = Vybrabne
i = i + 1
End If
Next
'Zjistit orientaci horizontálně nebo vertikálně
Dim PosunutiX As Double
Dim PosunutiY As Double
Dim Orientace As Boolean
Orientace = True 'VERTIKALNĚ
PosunutiX = Abs(PrvniPozice.Position.X - SeznamPozic(PocetPozic - 1).Position.X) / RoztecHorizontalni
PosunutiY = Abs(PrvniPozice.Position.Y - SeznamPozic(PocetPozic - 1).Position.Y) / RoztecVertikalni
If PosunutiX > PosunutiY Then
Orientace = False 'HORIZONTALNĚ
End If
'Zjištění kam co posunout
For i = 0 To (PocetPozic - 1)
Posunuti = 0
If Orientace Then 'VERTIKALNĚ
a = 1
If PrvniPozice.Position.Y > SeznamPozic(i).Position.Y Then
Smer = -1 'Dolů
Else
Smer = 1 'Nahoru
End If
For j = 0 To (PocetPozic - 1) 'Zjištění kam posunout
If SeznamPozic(i).Position.Y = PrvniPozice.Position.Y Then
Posunuti = 0
ElseIf Smer = 1 And SeznamPozic(i).Position.Y > SeznamPozic(j).Position.Y And SeznamPozic(j).Position.Y >= PrvniPozice.Position.Y Then 'nahoru
Posunuti = Posunuti + 1
If SeznamPozic(j).BalloonValueSets.Count > 1 And SeznamPozic(j).PlacementDirection = kBottomDirection And j > 0 Then
Posunuti = Posunuti + a * (SeznamPozic(j).BalloonValueSets.Count - 1) 'navíc pro vícepozicovou pozici
End If
ElseIf Smer = -1 And SeznamPozic(i).Position.Y < SeznamPozic(j).Position.Y And SeznamPozic(j).Position.Y <= PrvniPozice.Position.Y Then 'dolu
Posunuti = Posunuti + 1
If SeznamPozic(j).BalloonValueSets.Count > 1 And SeznamPozic(j).PlacementDirection = kBottomDirection Then
Posunuti = Posunuti + a * (SeznamPozic(j).BalloonValueSets.Count - 1) 'navíc pro vícepozicovou pozici
End If
End If
Next
If SeznamPozic(i).BalloonValueSets.Count > 1 And SeznamPozic(i).PlacementDirection = kBottomDirection And i > 0 And Smer = 1 Then
Posunuti = Posunuti + a * (SeznamPozic(i).BalloonValueSets.Count - 1) 'navíc pro vícepozicovou pozici
End If
PosunutiPozice(i) = PrvniPozice.Position.Y + Smer * (RoztecVertikalni * Posunuti)
Else 'HORIZONTALNĚ
a = 0.7
If PrvniPozice.Position.X > SeznamPozic(i).Position.X Then
Smer = -1 'Vlevo
Else
Smer = 1 'Vpravo
End If
For j = 0 To (PocetPozic - 1) 'Zjištění kam posunout
If SeznamPozic(i).Position.X = PrvniPozice.Position.X Then
Posunuti = 0
ElseIf Smer = 1 And SeznamPozic(i).Position.X > SeznamPozic(j).Position.X And SeznamPozic(j).Position.X >= PrvniPozice.Position.X Then
Posunuti = Posunuti + 1
If SeznamPozic(j).BalloonValueSets.Count > 1 And SeznamPozic(j).PlacementDirection = kRightDirection Then
Posunuti = Posunuti + a * (SeznamPozic(j).BalloonValueSets.Count - 1) 'navíc pro vícepozicovou pozici
End If
ElseIf Smer = -1 And SeznamPozic(i).Position.X < SeznamPozic(j).Position.X And SeznamPozic(j).Position.X <= PrvniPozice.Position.X Then
Posunuti = Posunuti + 1
If SeznamPozic(j).BalloonValueSets.Count > 1 And SeznamPozic(j).PlacementDirection = kLeftDirection Then
Posunuti = Posunuti + a * (SeznamPozic(j).BalloonValueSets.Count - 1) 'navíc pro vícepozicovou pozici
End If
End If
Next
If SeznamPozic(i).BalloonValueSets.Count > 1 And i > 0 Then 'navíc pro vícepozicovou pozici
Select Case Smer
Case 1
If SeznamPozic(i).PlacementDirection = kLeftDirection Then
Posunuti = Posunuti + a * (SeznamPozic(i).BalloonValueSets.Count - 1)
End If
Case -1
If SeznamPozic(i).PlacementDirection = kRightDirection Then
Posunuti = Posunuti + a * (SeznamPozic(i).BalloonValueSets.Count)
End If
End Select
End If
PosunutiPozice(i) = PrvniPozice.Position.X + Smer * (RoztecHorizontalni * Posunuti)
End If
Next
'Posunutí kažné pozice
For i = 0 To (PocetPozic - 1)
If Orientace Then
SeznamPozic(i).Position = VykresovaGeometrie.CreatePoint2d(PrvniPozice.Position.X, PosunutiPozice(i))
Else
SeznamPozic(i).Position = VykresovaGeometrie.CreatePoint2d(PosunutiPozice(i), PrvniPozice.Position.Y)
End If
Next
End Sub
No comments:
Post a Comment