Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 27 май 2019, 15:39

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)
Размещая ваши вложения на форуме не используйте имена файлов содержащих кириллицу, в противном случае файл будет иметь имя .<расширение файла> !



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 12 окт 2018, 13:00 
Не в сети

Зарегистрирован: 12 окт 2018, 08:06
Сообщений: 1
Использую Visio c: 2009
Уровнь квалификации: Shapesheet
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Здравствуйте!
Помогите решить следующую задачу:
Есть электрические схемы с различными элементами. У каждого элемента есть позиционное обозначение, например XT.
Можно ли сделать с помощью Вставка-> Поле-> Настраиваемая формула автоматическую нумерацию, чтобы при копировании элемента добавлялся +1 к номеру, например XT1, XT2 и т.д.
Или если обобщить: Как добавить в поле счётчик. Вроде тривиальная задача, но нигде не могу найти решения.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 12 окт 2018, 13:34 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1413
Очков репутации: 100594

Добавить очки репутацииУменьшить очки репутации
Ничего себе, тривиальная...
Дело в том, что формулы шейпа отлично ссылаются на себя. Могут ссылаться на страницу или документ. Могут на другой известный заранее шейп. А вот перебрать шейпы на странице - не могут. Поэтому счетчик не вставишь.
Тем более, что счетчик может понадобиться и не только в пределах страницы, но и в пределах документа.
В качестве приема... - можно организовать счетчик в данных страницы. И тогда каждый добавляемый шейп будет дергать оттуда данные для своего номера и модифицировать счетчик. Но это совсем не тривиально.
Более простой вариант - использовать штатный Add-on "Number shapes". С ним можно пронумеровать селектированные шейпы. И даже приставку задать.
А лучший вариант - написать свой макрос. С ним можно за одну операцию перенумеровать все. Шейпы с таким-то признаком получают такую-то приставку, с другим - другую и нумерация опять с 1 и т.д. Ну понятно - свой макрос - полнейшая свобода. Заодно можно и на дубли проверить, пропуски и т.д.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 12 окт 2018, 14:51 
ttllogika писал(а):
Как добавить в поле счётчик.
счетчик чего ?


Пожаловаться на это сообщение
Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 12:33 
Не в сети
Постоянный участник

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 84
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
ttllogika писал(а):
Здравствуйте!
Помогите решить следующую задачу:
Есть электрические схемы с различными элементами. У каждого элемента есть позиционное обозначение, например XT.
Можно ли сделать с помощью Вставка-> Поле-> Настраиваемая формула автоматическую нумерацию, чтобы при копировании элемента добавлялся +1 к номеру, например XT1, XT2 и т.д.
Или если обобщить: Как добавить в поле счётчик. Вроде тривиальная задача, но нигде не могу найти решения.

Я так понял Seq в поле нельзя вставить как в Word'е. Может у кого-то есть готовый макрос по автонумерации слева-направо и сверху-вниз? Нужно именно с форматированием и с уникальными именами текстовых блоков, чтобы можно было сослаться на них в документе Word.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 13:03 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 513
Использую Visio c: 2008
Очков репутации: 105

Добавить очки репутацииУменьшить очки репутации
Я делал когда-то макрос:
https://visio.getbb.ru/viewtopic.php?f=15&t=685


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 14:35 
Не в сети
Постоянный участник

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 84
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Shishok писал(а):
Я делал когда-то макрос:
https://visio.getbb.ru/viewtopic.php?f=15&t=685
В принципе я сделал автонумерацию по имени фигуры, но как реализовать по-проще номерацию слева-направо и сверху вниз? Неужели по координатам придется все фигуры сверять?

Код:
Public Sub AutonumElements()
    If MsgBox("????????? ????????????? ??????????", vbYesNo) = vbYes Then
        Dim Page As Visio.Page
        Dim Shapes As Visio.Shapes
        Dim Shape As Visio.Shape
        Dim FigureName As String
        Dim Counter As Integer
        Counter = 1
                   
        Set Page = ActivePage
        Set Shapes = Page.Shapes
        For Each Shape In Shapes
            FigureName = Shape.Name        '?????????? ???_?????? ??? ???_??????.ID (??? ?????)
            If InStr(1, FigureName, ".") > 0 Then
                FigureName = Left(FigureName, InStr(1, FigureName, ".") - 1)    '??????? .ID ?? ????? ?????? ???? ??? ????
            End If
                If FigureName = "Logic_ID" Then
                    Shape.Text = Counter
                    Counter = Counter + 1
                End If
        Next
    End If
End Sub


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 14:48 
В сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3594
Откуда: оттуда
Использую Visio c: 1998
Отрасль: -
Должность: Information worker
Уровнь квалификации: ShapeSheet, VBA
TheHeat писал(а):
Неужели по координатам придется все фигуры сверять?
а как еще можно ?
Фигуры могут добавляться на схему в любом порядке - и потом многократно перетасовываться !


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 14:59 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 513
Использую Visio c: 2008
Очков репутации: 105

Добавить очки репутацииУменьшить очки репутации
Если нумерация шейпов проводится 1 раз, то можно просто вручную выделить по 1 шейпу в нужном порядке(Ctlr+LeftClick) и запустить макрос. Шейпы будут пронумерованы в том же порядке, как и выделялись.
Только :
Не:
Код:
For Each Shape In Shapes

А:
Код:
For Each Shape In ActiveWindow.Selection


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 15:04 
Не в сети
Постоянный участник

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 84
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Shishok писал(а):
Если нумерация шейпов проводится 1 раз, то можно просто вручную выделить по 1 шейпу в нужном порядке(Ctlr+LeftClick) и запустить макрос. Шейпы будут пронумерованы в том же порядке, как и выделялись.
Только :
Не:
Код:
For Each Shape In Shapes

А:
Код:
For Each Shape In ActiveWindow.Selection

не, так геморно. Их тут несколько десятков может быть. Пока в голову пришло только в цикле искать самый крайний элемент и помечать его флагом - номером, а потом по новой цикл и так запускать цикл количество шейпов раз. :?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 15:09 
В сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3594
Откуда: оттуда
Использую Visio c: 1998
Отрасль: -
Должность: Information worker
Уровнь квалификации: ShapeSheet, VBA
Tumanov писал(а):
Более простой вариант - использовать штатный Add-on "Number shapes". С ним можно пронумеровать селектированные шейпы. И даже приставку задать.
но тут есть нюансы
Изображение
в конце получилась "неправильная нумерация", т.к. во втором ряду крайняя правая фигура, располагается чуть выше соседней. поэтому она получает минимальный порядковый номер !


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 15:15 
Не в сети
Постоянный участник

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 84
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
Tumanov писал(а):
Более простой вариант - использовать штатный Add-on "Number shapes". С ним можно пронумеровать селектированные шейпы. И даже приставку задать.
но тут есть нюансы
в конце получилась "неправильная нумерация", т.к. во втором ряду крайняя правая фигура, располагается чуть выше соседней. поэтому она получает минимальный порядковый номер !

не подойдет. Пронумеровать нужно только специфические шейпы. Выделять вручную каждый отдельно не дело.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 15:21 
В сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3594
Откуда: оттуда
Использую Visio c: 1998
Отрасль: -
Должность: Information worker
Уровнь квалификации: ShapeSheet, VBA
кто вам мешает, поместить эти специфические шейпы в отдельный слой. и выделять фигуры по слою ?
Изображение


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 15:38 
В сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3594
Откуда: оттуда
Использую Visio c: 1998
Отрасль: -
Должность: Information worker
Уровнь квалификации: ShapeSheet, VBA
Tumanov писал(а):
Приставку добавляет, слева направо / сверху вниз - тоже умеет.
но есть нюансы!
фигуре будет присвоен меньший номер если: фигура будет выше высота фигуры будет больше !
фигуры специально выровнены "по линеечке"
Изображение
при написании макроса это нужно не забыть учесть


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 18:53 
Не в сети
Постоянный участник

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 84
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Написал макрос для нумерации элементов с именем "Logic_ID". Вроде работает.

Код:
Sub AutonumElements()

If MsgBox("Выполнить автонумерацию элементов?", vbYesNo, "AutonumElements") = vbYes Then
        Dim Page As Visio.Page
        Dim Shapes As Visio.Shapes
        Dim Shape As Visio.Shape
        Dim FigureName As String
        Dim PositionX As Double
        Dim PositionY As Double
        Dim FirstFigureID As Integer
        Dim FigureCount As Integer
        Dim FigureCountChecked As Integer
        Dim NumCounter As Integer

        FigureCountChecked = 0
        NumCounter = 1
                   
        Set Page = ActivePage
        Set Shapes = Page.Shapes
       
        'Стирание предыдущих выполнений. Текст всех фигур = "999"
        For Each Shape In Shapes
            FigureName = Shape.Name        'возвращает имя_фигуры или имя_фигуры.ID (для копий)
            If InStr(1, FigureName, ".") > 0 Then
                FigureName = Left(FigureName, InStr(1, FigureName, ".") - 1)    'убирает .ID из имени фигуры если оно есть
            End If
            If FigureName = "Logic_ID" Then
                Shape.Text = "999"
            End If
        Next
               
Search:
        FigureCount = 0
        PositionX = 99999
        PositionY = 0
        For Each Shape In Shapes
            FigureName = Shape.Name        'возвращает имя_фигуры или имя_фигуры.ID (для копий)
            If InStr(1, FigureName, ".") > 0 Then
                FigureName = Left(FigureName, InStr(1, FigureName, ".") - 1)    'убирает .ID из имени фигуры если оно есть
            End If
            If FigureName = "Logic_ID" Then
                FigureCount = FigureCount + 1
           
                If Shape.Text = "999" Then
                    If Shape.Cells("PinY") > PositionY Then
                        PositionX = Shape.Cells("PinX")
                        PositionY = Shape.Cells("PinY")
                        FirstFigureID = Shape.ID
                    Else
                       
                        If Shape.Cells("PinY") = PositionY And Shape.Cells("PinX") < PositionX Then
                            PositionX = Shape.Cells("PinX")
                            FirstFigureID = Shape.ID
                        End If
                    End If
                End If
           
            End If
        Next
    FigureCountChecked = FigureCountChecked + 1
    If FirstFigureID > 0 Then
        Shapes.ItemFromID(FirstFigureID).Text = NumCounter
    End If
    NumCounter = NumCounter + 1
    If FigureCountChecked < FigureCount Then GoSub Search
End If

End Sub


Вложения:
Screenshot_6.png
Screenshot_6.png [ 6.57 Кб | Просмотров: 147 ]
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Позиционные обозначения элементов с автоматической нумерацие
СообщениеДобавлено: 09 апр 2019, 20:40 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 513
Использую Visio c: 2008
Очков репутации: 105

Добавить очки репутацииУменьшить очки репутации
Вот здесь многовато нагородил:
Код:
        'Стирание предыдущих выполнений. Текст всех фигур = "999"
        For Each Shape In Shapes
            FigureName = Shape.Name        'возвращает имя_фигуры или имя_фигуры.ID (для копий)
            If InStr(1, FigureName, ".") > 0 Then
                FigureName = Left(FigureName, InStr(1, FigureName, ".") - 1)    'убирает .ID из имени фигуры если оно есть
            End If
            If FigureName = "Logic_ID" Then
                Shape.Text = "999"
            End If
        Next

Можно проще:
Код:
        'Стирание предыдущих выполнений. Текст всех фигур = "999"
        For Each Shape In Shapes
            If Shape.Name Like  "Logic_ID*" Then Shape.Text = "999"
        Next


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB