All Forums
 Категория Visio
 Форум Вопросы и ответы
 Свойства мастер-шейпа
Next Page
Author Previous Topic Topic Next Topic

dkapotov

Russia
29 Posts

Posted - 10/23/2004 :  13:25:37  Visit dkapotov's Homepage
Вопрос такой.
Создаю мастер-шейп, сохраняю его в Stencils, далее необходимо, чтобы у него заполнялись некие свойство. Например оптоволокно. На схеме над условным обозначением должны присутствовать его характеристики: диаметр сердцевины, диаметр оболочки, диаметр защиты и т.д. Допустим каждая из этих характеристик сопоставляется некой букве (a, b, c, d).
Как сделать, чтобы при перетаскивании шейпа на рабочий лист появлялось окошко, прелагающее заполнить свойства этого шейпа и в дальнейшем они сохранялись бы в какой-нибудь базе?

Капотов Дмитрий Владимирович

Tumanov

Russia
1198 Posts

Posted - 10/23/2004 :  16:37:01
Вариант 1 - написать макрос или Add-on
Вариант 2 - пользоваться Custom Properties Window и визардом Database Wizard.

Вариант 1
У документа есть событие добавления шейпа. По нему вызывается обработчик
Document_ShapeAdded(ByVal Shape As IVShape)
Текст этого обработчика пишете сами. Сначала делаете формочку, в которой есть поля для заполнения свойств. В обработчике эту форму вызываете. По кнопке OK на форме надо занести в пользовательские свойства введенные значения.
Для сохранения в базе может быть отдельный макрос. Запускается, например, из меню, коннектится к базе, потом опрашивает все шейпы на рисунке. Если имя шейпа включает заданное имя (мастер-шейпа), то выбирает пользовательские свойства и добавляет их в виде строки к базе.

Вариант 2
Если открыть окно Custom Properties Window (меню View), то при переносе мастер-шейпа на страницу рисунка его свойства будут отображаться в этом окне. В принципе, это аналогично приглашению заполнить их.
Для передачи данных в базу в Visio существует несколько Add-on'ов Database Wizard, Database Export и т.д. (в меню Tools / Macros / Visio Extras). С их помощью можно передать нужные данные.
Например, берем Database Export.
(Сначала нужно иметь какую-нибудь базу, например Access, и создать для нее псевдоним ODBC)
Запускаем Database Export. Он запрашивает, что мы хотим экспортировать. Говорим, что хотим экспортировать данные селектированных шейпов.
Селектируем нужные шейпы и жмем OK.
Выбираем нужные пользовательские поля.
Выбираем псевдоним нашей базы в качестве источника ODBC.
Выбираем существующую табличку или вводим имя новой таблицы.
Указываем имена и типы полей в базе.
И еще через несколько нажатий клавиш, когда экспорт завершится, можно открывать базу Access и проверять наличие нужных данных в указанной таблице.
Этот путь далеко не единственный, каждый визард может что-то свое...

Короче, если Вам нужно быстро и сейчас, то изучаете эти визарды и уже можно работать. А если нужно иметь красивое приложение и не долбить каждый раз по лишним кнопкам, то лучше один раз написать пару своих макросов или Add-on'ов.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 10/23/2004 :  17:28:34
Вот, например, этот макрос открывает таблицу Access и пишет туда два пользовательских свойства из единственного селектированного шейпа:
Sub ttt()
s1 = Replace(ActiveWindow.Selection(1).Cells("Prop.Row_1").Formula, Chr(34), "")
s2 = Replace(ActiveWindow.Selection(1).Cells("Prop.Row_2").Formula, Chr(34), "")
Dim cnt As New ADODB.Connection
strDB = "D:\My Documents\db1.mdb"
cnt.Open ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\My Documents\db1.mdb")
SQLstr = "INSERT INTO Таблица2 (Prop_Row_1, Prop_Row_2 ) VALUES ('" & s1 & "', '" & s2 & "');"
cnt.Execute (SQLstr)
cnt.Close
Set cnt = Nothing
End Sub

Комментарии:
База называется db1.mdb и находится в D:\My Documents\
Custom Properties шейпа не переименованы, поэтому называются Prop.Row_1 и Prop.Row_2.
Replace нужно чтобы вычистить лишние кавычки.
SQLstr - это строка SQL, добавляющая запись в таблицу с именем "Таблица2".
Поля в базе называются Prop_Row_1 и Prop_Row_2 (почти как свойства шейпа).
К проекту, естественно, нужно добавить Microsoft ActiveX Data Objects 2.5 Library
Go to Top of Page

dkapotov

Russia
29 Posts

Posted - 10/23/2004 :  20:21:53  Visit dkapotov's Homepage
quote:
Originally posted by Tumanov

Вот, например, этот макрос открывает таблицу Access и пишет туда два пользовательских свойства из единственного селектированного шейпа:
Sub ttt()
s1 = Replace(ActiveWindow.Selection(1).Cells("Prop.Row_1").Formula, Chr(34), "")
s2 = Replace(ActiveWindow.Selection(1).Cells("Prop.Row_2").Formula, Chr(34), "")
Dim cnt As New ADODB.Connection
strDB = "D:\My Documents\db1.mdb"
cnt.Open ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\My Documents\db1.mdb")
SQLstr = "INSERT INTO Таблица2 (Prop_Row_1, Prop_Row_2 ) VALUES ('" & s1 & "', '" & s2 & "');"
cnt.Execute (SQLstr)
cnt.Close
Set cnt = Nothing
End Sub

Комментарии:
База называется db1.mdb и находится в D:\My Documents\
Custom Properties шейпа не переименованы, поэтому называются Prop.Row_1 и Prop.Row_2.
Replace нужно чтобы вычистить лишние кавычки.
SQLstr - это строка SQL, добавляющая запись в таблицу с именем "Таблица2".
Поля в базе называются Prop_Row_1 и Prop_Row_2 (почти как свойства шейпа).
К проекту, естественно, нужно добавить Microsoft ActiveX Data Objects 2.5 Library




Чтож, спасибо за помощь. Попробую поковырять. Может получится...:))

Капотов Дмитрий Владимирович
Go to Top of Page

dkapotov

Russia
29 Posts

Posted - 10/23/2004 :  22:34:56  Visit dkapotov's Homepage
quote:
Originally posted by Tumanov

Вариант 1 - написать макрос или Add-on
Вариант 2 - пользоваться Custom Properties Window и визардом Database Wizard.

Короче, если Вам нужно быстро и сейчас, то изучаете эти визарды и уже можно работать. А если нужно иметь красивое приложение и не долбить каждый раз по лишним кнопкам, то лучше один раз написать пару своих макросов или Add-on'ов.



В общем с горем пополам подсоединил базу Access.
Есть ляпы:
1. Если к листу привязать add-on Database export, то сколько раз будешь жать на педаль обновить данные, столько раз они в таблицу и пишутся. Т.е. если есть 5 шейпов на листе, а я выбрал два раза действие обновить базу, то в таблице появляется 10 строк. Данные дублируются дважды. Че-то не запонминаются уникальные номера шейпов.
2. Хотелось бы, чтобы значения пользовательских полей выводились на лист. Например есть обозначение розетки. Я ей нарезаю пользовательские поля: 1-префикс, 2-номер комнаты, 3-номер порта, 4- тип порта. Обозначение розетки на схеме 1XD1.23.К (где 1-номер комнаты, XD-префикс, 23-номер порта, к-тип порта). Как забацать, чтобы вот такая строчка писалась над обозначением розетки на схеме? Например по двойному щелчку на шейпе или по контекстному меню. Пробовал макрос записать - фигня выходит. Только одно какое-то значение записывается и все. И то только для одного шейпа.


Капотов Дмитрий Владимирович
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 10/24/2004 :  08:06:57
1. Там надо сочетать функции. Если один раз провели экспорт, то появились связи между шейпами и строками базы. Дальше, чтобы использовать эти связи, надо пользоваться уже не экспортом, а Update. Тогда при изменении полей в шейпе будут меняться связанные с ними строки в базе...
Короче, прежде чем работать, их действительно изучать надо :(

2. Нужно в шейп Insert / Field / Custom formula и в нее вписать формулу, выбирающую данные из Custom Properties. Например,
=Prop.Row_1 & " - " & Prop.Row_2
Комментарии:
Формула выберет значение из первой строки Custom Properties, после этого значения поставит дефис с двумя пробелами, потом припишет значение из второй строки Custom Properties.
Разделители можно делать разные или вообще не делать.
Объединение строковых переменных производится знаком &.
Переменных можно набирать сколько угодно.
Изменения на рисунке появляются сразу же, как только Вы закончите редактировать пользовательское свойство (например, переведете курсор на другое свойство).

Однако, в нашем приложении "Задача 1" (которое я все никак не доделаю) в похожей ситуации используется другой принцип. В ОПС позиционные обозначения извещателей формируются по схеме: НомерПрибора - Префикс - НомерШлейфа - ПорядковыйНомерВШлейфе.
Так вот, в таком случае для нумерации у меня сделан Add-on с формочкой. На рисунке выделяется несколько шейпов, которые надо пронумеровать (входящие в один шлейф). Запускается Add-on. Пользователю выдается формочка, на которой четыре поля: пустое, префикс из одного из шейпов, пустое, пустое.
Пользователь либо оставляет поля пустыми, либо вводит туда начальные значения. Нажимает ОК.
А дальше Add-on нумерует (присваивает позиционные обозначения) всем селектированным шейпам. Номер прибора и номер шлейфа добавляются, если на форме введены значения, иначе исключаются.
Префикс берется из шейпа.
Порядковый номер нарастает, начиная от введенного начального значения.
Результат записывается в Custom Properties шейпа, а оттуда уже не составной, а простой формулой выводится в текстовое поле на рисунок.
Удобно тем, что одна операция выполняется сразу для множества шейпов (и для одного тоже сгодится). Посмотрите, может и в данном случае такой принцип будет удобнее.
Go to Top of Page

dkapotov

Russia
29 Posts

Posted - 10/24/2004 :  08:35:17  Visit dkapotov's Homepage
quote:
Originally posted by Tumanov

Однако, в нашем приложении "Задача 1" (которое я все никак не доделаю) в похожей ситуации используется другой принцип. В ОПС позиционные обозначения извещателей формируются по схеме: НомерПрибора - Префикс - НомерШлейфа - ПорядковыйНомерВШлейфе.
Так вот, в таком случае для нумерации у меня сделан Add-on с формочкой. На рисунке выделяется несколько шейпов, которые надо пронумеровать (входящие в один шлейф). Запускается Add-on. Пользователю выдается формочка, на которой четыре поля: пустое, префикс из одного из шейпов, пустое, пустое.
Пользователь либо оставляет поля пустыми, либо вводит туда начальные значения. Нажимает ОК.
А дальше Add-on нумерует (присваивает позиционные обозначения) всем селектированным шейпам. Номер прибора и номер шлейфа добавляются, если на форме введены значения, иначе исключаются.
Префикс берется из шейпа.
Порядковый номер нарастает, начиная от введенного начального значения.
Результат записывается в Custom Properties шейпа, а оттуда уже не составной, а простой формулой выводится в текстовое поле на рисунок.
Удобно тем, что одна операция выполняется сразу для множества шейпов (и для одного тоже сгодится). Посмотрите, может и в данном случае такой принцип будет удобнее.



Конечно так удобнее будет. Только есть еще небольшие нюансы. Как я понял нумерация шейпов проставляется один раз и навсегда. То есть нельзя будет в случае необходимости корректировки просто щелкнуть на текстовой надписи над шейпом и переправить вручную. И надо будет как то систематизировать весь спектр приборов и оборудования и делать какую то сводную или универсальную таблицу пользовательских свойств. Затруднительно будет, т.к. например у пожарного извещателя это один набор свойств, у применых приборов другой и т.п. Либо проще все решать - для каждого вида шейпов на каждый новый чертеж будет создаваться новая таблица в базе данных.

Капотов Дмитрий Владимирович
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 10/24/2004 :  09:27:26
Тут уж надо выбирать - либо работаем в системе, либо вручную. То есть если щелкнуть на текстовой надписи и ввести текст вручную, потеряется возможность потом работать с ним визардом нумерации (хотя, в визард можно заложить и возможность восстановления формулы; сейчас этого нет).
Но ведь можно запустить тот же Add-on по одному шейпу и изменить позиционное обозначение только в нем. Повторная нумерация тоже работает - выделил ту же или немного отличающуюся группу шейпов и перенумеровал...

А по поводу систематизации - это действительно намного серьезнее, чем какой-то макрос написать. Но и эффект должен быть гораздо больше (может быть) :)
Go to Top of Page

immortal

Russia
391 Posts

Posted - 10/25/2004 :  09:04:04  Visit immortal's Homepage
quote:
Хотелось бы, чтобы значения пользовательских полей выводились на лист. Например есть обозначение розетки. Я ей нарезаю пользовательские поля: 1-префикс, 2-номер комнаты, 3-номер порта, 4- тип порта. Обозначение розетки на схеме 1XD1.23.К (где 1-номер комнаты, XD-префикс, 23-номер порта, к-тип порта). Как забацать, чтобы вот такая строчка писалась над обозначением розетки на схеме
не понятно зачем это все на схеме или плане, пусть будут в свойствах элемента, а все связи типа номера порта(присоединения, если я правильно понимаю) должны быть гдето в журнале (таблице) соединений, или кабельном журнале, на плане только позиционное обозначение, все остальные характеристики должны быть в ведомости изделий или спецификации, не надо хранить данные о шейпах чертежа в базе данных, база данных должна быть одна, и называться "база данных комплектующих", к комутирующим устройствам должно быть адресное присоединение, т.к. если при добавлении или изменении может оказаться что у одного адреса будут несколько присоединений, и в дальнейшем сложно работать с таким проектом, так-же усложняет работу большое количество элементов схемы, все это относиться к различным проводным системам, будь то скс, электрика и т.д.

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 10/25/2004 :  15:47:24
quote:
не понятно зачем это все на схеме или плане,

См. требования нормативных документов, например, РД 25.953-90
"Буквенно-цифровое обозначение пожарного извещателя допускается записывать в последовательности: номер приемно-контрольного прибора, буквенный код извещателя, номер шлейфа, порядковый номер извещателя. Номер шлейфа и порядковый номер извещателя в обозначении должны разделяться точкой. Для построения обозначения применяют прописные буквы латинского алфавита.
Например: 2ВТК1.12"
Go to Top of Page

immortal

Russia
391 Posts

Posted - 10/26/2004 :  08:07:44  Visit immortal's Homepage
Понятно, тогда все эти свойства должны наследоваться (браться) из присоединенных элементов, я как раз над этим работаю, пока сделано только для электрики по высоте прокладки, планирую и адресные "ссылки" делать, в случае с
quote:
Буквенно-цифровое обозначение пожарного извещателя допускается записывать в последовательности
ставим ПКП и нумеруем его, далее присоединяем к нему шлейф, шлейф содержит (получает автоматически)номер ПКП, присоединяем к шлейфу пожарный извещатель и указываем присоединение, извещатель берет данные шлейфа, т.е. его номер, из шлейфа, номер ПКП, при изменении номера прибора или шлейфа, или извещателя, автоматически адреса изменяются. пока у меня немного работа в этом направлении приостановлена. т.к. проблема с запуском своих ехе, о чем я тут писал.

quote:
Создаю мастер-шейп, сохраняю его в Stencils, далее необходимо, чтобы у него заполнялись некие свойство. Например оптоволокно. На схеме над условным обозначением должны присутствовать его характеристики: диаметр сердцевины, диаметр оболочки, диаметр защиты и т.д. Допустим каждая из этих характеристик сопоставляется некой букве (a, b, c, d).
Как сделать, чтобы при перетаскивании шейпа на рабочий лист появлялось окошко, прелагающее заполнить свойства этого шейпа и в дальнейшем они сохранялись бы в какой-нибудь базе?



в этом случае лучше сделать обратную задачу, создать базу данных комплектующих с уникальным полем "тип, марка, обозначение" а остальные характеристики будут браться из других полей, я делаю БДК, но предполагается в свойствах шейпа держать только уникальный номер изделия, в данном случае из поля "тип, марка, обозначение", в принципе можно и другие характеристики держать там, но если
quote:
допускается
то можно и не записывать, а можно и записывать, в любом лучше использовать вариант описанный мной, хотя тут не написано что для каждого документа своя база, как и не написано что одна база для всех. уточнять однако надо.

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

dkapotov

Russia
29 Posts

Posted - 10/26/2004 :  08:48:39  Visit dkapotov's Homepage
Обратная задача вовсе не лучше, потому как при проектировании системы я как пректировщик беру план помещения, определяю состав и тип помещений и начинаю набрасывать на него элементы (извещатели, приборы и т.п.). Так я определяю состав оборудования. Заранее в голове я его определить не могу просто физически. Если объект большой в особенности (несколько корпусов, распределенная территоия и т.п.) это касается интегрированных вместе систем - видео+СКУД+ОПС, то вообще нереально в голове все держать. Далее я как на ладони сразу увижу как организовать разбиение системы на разделы - какой извещатель в какой шлейф включить, какой шлейф к какому прибору подключить, как организовать связь между приборами и т.п.
И уже на конечнеом этапе рождается окончательная структура системы, которую и надо описывать в базе.
Хотя должен признать, что идея последовательной связи элементов очень хорошая, но наверное сильно усложняет задачу разработчикам. Поэтому и приходится довольстоваться малым пока.
Сейчас хотя бы просто систематизировать и составить базу условных графических обозначений со свойствами...

Капотов Дмитрий Владимирович
Go to Top of Page

immortal

Russia
391 Posts

Posted - 10/26/2004 :  09:32:55  Visit immortal's Homepage
quote:
Хотя должен признать, что идея последовательной связи элементов очень хорошая, но наверное сильно усложняет задачу разработчикам. Поэтому и приходится довольстоваться малым пока.

Вы совершенно правы, но вы же не разработчик, что вам заботиться об усложнении задач, от вас требуется техническое задание на разработку, тут между прочим есть раздел для заказчиков и разработчиков, пока конечно можно сделать и так, но только как на первом этапе, хотелось бы нормально работать, и в голове не надо все держать, если вы размешаете приборы и провода на рисунке в визио , то почему нельзя вычислить их расположение, привязки и т.п. , а база данных должна быть комплектующих, естественно с возможностью добавления, по аналогии например с САПР Компас-6, там ведь связи не надо в голове держать. через месяц планирую закончить работу над базой данных со связью с шейпами, и тогда посмотрим.

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 10/26/2004 :  16:40:23
quote:
...тут между прочим есть раздел для заказчиков и разработчиков, ... через месяц планирую закончить работу над базой данных со связью с шейпами, и тогда посмотрим...


Ну да, пожалуй это моя вина. Надо было совместно разрабатывать. А так получается, что два человека делают работу в параллель.
Просто я слишком долго с задачей разбирался, а когда все понял, то привлекать кого-то еще вроде уже поздно стало. Неудачно получилось...
Ну ничего, посмотрим у кого лучше получится :)
Go to Top of Page

dkapotov

Russia
29 Posts

Posted - 10/26/2004 :  17:00:52  Visit dkapotov's Homepage
quote:
Originally posted by Tumanov

quote:
...тут между прочим есть раздел для заказчиков и разработчиков, ... через месяц планирую закончить работу над базой данных со связью с шейпами, и тогда посмотрим...


Ну да, пожалуй это моя вина. Надо было совместно разрабатывать. А так получается, что два человека делают работу в параллель.
Просто я слишком долго с задачей разбирался, а когда все понял, то привлекать кого-то еще вроде уже поздно стало. Неудачно получилось...
Ну ничего, посмотрим у кого лучше получится :)



Придется напроситься в бета-тестеры...

Капотов Дмитрий Владимирович
Go to Top of Page

immortal

Russia
391 Posts

Posted - 10/27/2004 :  06:33:36  Visit immortal's Homepage
quote:
Придется напроситься в бета-тестеры...

толко приветствуется, я тут уже писал о тестировании моих разработок, пока откликнулся только Digitall, могу общаться мылом, аськой и через этот форум

бэтатестерам скидка 100%

визио 2003 форэвер

...а вобще-то я белый и пушистый.

Edited by - immortal on 10/27/2004 06:39:03
Go to Top of Page
Previous Topic Topic Next Topic  
Next Page
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)