- Сообщения
- 425
- Реакции
- 1
Вперед декларируем новый тип:
По вертикали:
По горизонтали:
Кстати, если беспорядочно раскиданым объектам применить стыковку по вертикали и горизонтали одновременно, то получится картина некого правильного хаоса... Мне как математику на такое смотреть было очень весело...
PHP:
Public Type mySh
X As Double
Y As Double
w As Double
h As Double
mySh As Shape
number As Integer
End Type
PHP:
Sub stykovka_vert()
If Documents.Count = 0 Then
MsgBox "Нет открытых документов"
GoTo myEnd
End If
If ActiveSelection.Shapes.Count = 0 Then
MsgBox "Нет выделеных объектов"
GoTo myEnd
End If
ActiveDocument.Unit = cdrMillimeter
ActiveDocument.ReferencePoint = cdrTopLeft
Dim Sh() As mySh
N = ActiveSelection.Shapes.Count
ReDim Sh(1 To N)
For i = 1 To N
Set Sh(i).mySh = ActiveSelection.Shapes(i)
Sh(i).mySh.GetPosition Sh(i).X, Sh(i).Y
Sh(i).mySh.GetSize Sh(i).w, Sh(i).h
Sh(i).number = 0
Next i
Max = 1
For i = 1 To N
For J = 1 To N
If Sh(J).number = 0 Then
If Sh(J).Y > Sh(Max).Y Then Max = J
End If
Next J
Sh(Max).number = i
If i <> 1 Then
Sh(Max).Y = myTop
Sh(Max).mySh.SetPosition Sh(Max).X, Sh(Max).Y
End If
myTop = Sh(Max).Y - Sh(Max).h
For J = 1 To N
If Sh(J).number = 0 Then
Max = J
Exit For
End If
Next J
Next i
myEnd:
End Sub
По горизонтали:
PHP:
Sub stykovka_horiz()
If Documents.Count = 0 Then
MsgBox "Нет открытых документов"
GoTo myEnd
End If
If ActiveSelection.Shapes.Count = 0 Then
MsgBox "Нет выделеных объектов"
GoTo myEnd
End If
ActiveDocument.Unit = cdrMillimeter
ActiveDocument.ReferencePoint = cdrTopLeft
Dim Sh() As mySh
N = ActiveSelection.Shapes.Count
ReDim Sh(1 To N)
For i = 1 To N
Set Sh(i).mySh = ActiveSelection.Shapes(i)
Sh(i).mySh.GetPosition Sh(i).X, Sh(i).Y
Sh(i).mySh.GetSize Sh(i).w, Sh(i).h
Sh(i).number = 0
Next i
Max = 1
For i = 1 To N
For J = 1 To N
If Sh(J).number = 0 Then
If Sh(J).X < Sh(Max).X Then Max = J
End If
Next J
Sh(Max).number = i
If i <> 1 Then
Sh(Max).X = myLeft
Sh(Max).mySh.SetPosition Sh(Max).X, Sh(Max).Y
End If
myLeft = Sh(Max).X + Sh(Max).w
For J = 1 To N
If Sh(J).number = 0 Then
Max = J
Exit For
End If
Next J
Next i
myEnd:
End Sub
Кстати, если беспорядочно раскиданым объектам применить стыковку по вертикали и горизонтали одновременно, то получится картина некого правильного хаоса... Мне как математику на такое смотреть было очень весело...