All Forums
 Категория Visio
 Форум Вопросы и ответы
 как сгруппировать содержимое коллекции Selection ?
Author Previous Topic Topic Next Topic  

Surrogate

Russia
122 Posts

Posted - 05/28/2010 :  09:26:19  Visit Surrogate's Homepage
Для копирования содержимого страницы из существующего файла в новый, я написал макрос. макрос записан в стенсиле.

Function GetRacks() ' получить фасады шкафов из существующего файла
On Error GoTo errHandle
Dim X As Integer
Debug.Print Path
Application.Documents.OpenEx "D:\RACKS\2.vsd", visOpenRO ' открыть документ содержащий фасады шкафов
Application.ActiveWindow.SelectAll ' выделить все в открытом документе
ActiveWindow.DeselectAll ' сбросить выделение
For X = Application.ActiveWindow.Page.Shapes.Count To 2 Step -1 ' перебор шейпов на активной странице
Debug.Print X
ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(X), 1024 ' отбрасывание шейпов находящихся внутри группы
Next X
Application.ActiveWindow.Selection.Copy ' копирование содержимого коллекции Selection в буфер обмена
Application.ActiveWindow.Close ' закрыть документ содержащий фасады шкафов
Exit Function
errHandle:
MsgBox Err.Description, vbCritical, "Ошибка №" & Err.Number
End Function

Sub MACRO1()
GetRacks ' вызов функции GetRacks
Application.ActiveWindow.Page.Paste ' вставить из буфера обмена
ActiveDocument.Pages(1).Shapes("Sheet.1").Delete ' удалить sheet.1
ActiveDocument.Pages(1).Shapes("Sheet.2").Delete ' удалить sheet.2
End Sub

содержимое файла он копирует и вставляет!

вопрос:
как сгруппировать содержимое коллекции Selection ?

bdfy

Belarus
267 Posts

Posted - 05/28/2010 :  10:05:31
selection.group ?
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 05/28/2010 :  12:19:05  Visit Surrogate's Homepage
я пробовал selection.group. Вылетает такая вот ошибка



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

Edited by - Surrogate on 05/28/2010 12:19:26
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/28/2010 :  15:51:08
Через Set
Set vsoGroupShape = vsoSelection.Group
vsoGroupShape - это как раз и будет новый шейп-группа.

Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 05/30/2010 :  16:47:32  Visit Surrogate's Homepage
Спасибо!

Edited by - Surrogate on 05/30/2010 17:08:44
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/30/2010 :  18:05:39
quote:
а как можно добраться до шейпов вложенных в группу

Может я вопрос не понял...
Если буквально, то у шейпа-группы есть коллекция Shapes (так же, как и у страницы). К членам этой коллекции можно обращаться. Выглядеть будет примерно так:
ActivePage.Shapes(1).Shapes(j)
(если первый шейп на странице - группа).
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 05/30/2010 :  19:37:21  Visit Surrogate's Homepage
Да, именно это я и имел в виду!

и снова вопросы:
фрагмент кода в котором я хотел удалить все шейпы содержащие текст - "xxx"
For y = 1 To ActivePage.Shapes.Count ' перебор шейпов на листе
    Debug.Print y, ActivePage.Shapes(y).Name
    For z = 1 To ActivePage.Shapes(y).shapes.count ' перебор шейпов внутри группы y
        If ActivePage.Shapes(y).Shapes(z).text = "xxx" Then 
        Application.ActiveWindow.Page.Shapes(y).Delete
        Exit For
        Else
        End If
    Next z
 Next y


в моем примере произошла ошибка в цикле еще на первом же шейпе, в котором не было вложенных шейпов.

можно ли как то воспользоваться коллекцией Shapes
например присвоить y-тому шейпу некое имя например aGrp, и просматривать его содержимое циклом вида ?
For each aShp in aGrp

хотя там тоже возможно будет ошибка в цикле, если шейп(y) не будет группой

Edited by - Surrogate on 05/30/2010 19:57:05
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/30/2010 :  21:03:45
Можно.
Только сначала хорошо бы проверить, является ли шейп группой.
Это делается опросом свойства Type.
Для группы оно вернет значение visTypeGroup. Кажется 2.
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 06/01/2010 :  11:29:31  Visit Surrogate's Homepage
Еще раз спасибо !

а можно программно исключать шейпы из коллекции Selection?
например, у меня в файлах из которых я копирую есть шейпы расположенные за пределами печатаемого листа.
Можно ли по условию не вхождения в печатаемую область листа PinX и PinY шейпа, исключить их из Selection?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/01/2010 :  15:16:08
Исключаются тем же методом Select, только параметр SelectAction должен быть установлен в visDeselect. Примерно так:
ActiveWindow.Select vsoShapes(3), visDeselect
А выход за пределы листа придется проверять перебором по одному шейпу.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)