Макрос подгоняет выделеные объекты стык в стык

  • Автор темы Автор темы dizzy
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

dizzy

Участник
Топикстартер
Сообщения
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

Кстати, если беспорядочно раскиданым объектам применить стыковку по вертикали и горизонтали одновременно, то получится картина некого правильного хаоса... Мне как математику на такое смотреть было очень весело...
 
Ответ: Макрос подгоняет выделеные объекты стык в стык

lev сказал(а):
вариации на тему:
Ну и что... Все равно я молодец...
 
Ответ: Макрос подгоняет выделеные объекты стык в стык

а-то :)
 
Ответ: Макрос подгоняет выделеные объекты стык в стык

Доработал свой наборчик шэйпинг... Терь при вызове открывается симпатичная менюшка (наподобие как у адобов, маленькая такая, компактная), где есть кнопка вертикальной и горизонтальной стыковки... Также появилась возможность стыковки с отступом..

Юзайте!
 

Вложения

Статус
Закрыто для дальнейших ответов.