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

scaramush

2 Posts

Posted - 06/10/2003 :  21:29:17
Насколько я понимаю, Любой OLE документ является контейнером, в который можно вставить свой OLE объект, этот OLE объект будет сохранятся в файле, который содержит документ. Необходимо только коректно эти данные "подсунуть". Пример: Excel таблица, вставленная в Word.

Вопрос: можно ли похожим образом вставить свои собственные данные (объект) в документ Word/Excel/Visio/и т.д. таким образом, что
1. Объект был "невидимым" на экране, т.е. он не показывался, и до него нельзя было "достучаться" с помощью интерфейса пользователя (мышкой, менюшками, кливиатурой, etc), а только программно.
2. Объект был "мой", в смысле написанный мною, следовательно хранил определенные мной данные.


Конкретная задача такова:
Есть желание использовать схемы Visio в качестве подготовки данных. По нарисованной схеме генерится код, который потом "дописывается" руками.
Что-то вроде UML Addin для Visio. Насколько я заметил, упомянутый Addin каким-то образом хранит структуру данных в памяти, при этом shape's являются ссылками на объекты этой структуры данных. Таким образом, данные хранятся каким-то образом отдельно от графических примитивов. Хочется сделать аналогичный addin (в смысле хранения данных).

Можно, конечно использовать "теневой файл", но ИМХО это дешевка.

Tumanov

Russia
1198 Posts

Posted - 06/12/2003 :  16:00:44
Писать свой объект - это пожалуй только в том случае, если не пройдет более распространенное решение.
В Visio ведь Addin обычно является только программой, а данные хранятся непосредственно в шейпах (хотя их и не видно на рисунке). К любому шейпу прилагается таблица с сотней ячеек данных, описывающих его. Там же еще пара секций для хранения пользовательских данных, доступных через Custom Properties и Data. И можно еще вводить свои, чтобы общаться с ними программно или хранить промежуточные данные.
Весь вопрос только в секретности. Дело в том, что с теми или иными ухищрениями (по крайней мере через шейп-лист) к этим данным все-таки можно добраться. Хотя дополнительно можно и усилить защиту, например, защитив шейп от селектирования, что прикроет доступ к шейп-листу. Другой вариант - кодировать данные. Тогда уже достать вручную можно, а разобраться - только программно.
И это - именно "аналогичное" решение, наиболее распространенное в Visio.
Go to Top of Page

scaramush

2 Posts

Posted - 06/12/2003 :  20:21:20
Структура данных не позволяет хранить в user-defined ячейках данные в рамках данной задачи. Дело в том, что для данной задачи шейпы является только ссылкой. Таким образом, на одной и той же диаграмме вполне вероятно могут быть два шейпа представляющие, по сути одну и ту же сущность. Опять таки обращаю внимание на UML addin: есть дополнительно окно, в котором можно увидеть список классов. Теоретически можно удалить ВСЕ шейпы из документа, тем не менее структура классов, хранящаяся в документе не пострадает. то есть из этого дополнительного окна можно повытаскивать классы обратно в окно редактирования VISIO. Вся структура классов восстановится.

Дело в том, что user defined cells не ориентированы на такого рода фокусы вообще. Если два шейпа являются отображениями одной и той же сущности, и если хранить атрибуты сущностей в обоих шейпах — нарываться на потерю непротиворечивости данных. Теоретически можно хранить сериализованные данные в data1 data2 data3. В документации написано, что для них нет ограничений по объему: то есть создавать при сохранении специфичный шейп, в data_ запихивать сериализованную структуру данных, при открытии по этому блоку десериализовывать структуру данных в памяти, затем удалять шейп. Если по-другому сделать не удастся, то так и сделаю. Но это решение a la теневой файл. Любой сбой при сохранении испортит какую-либо диаграмму (например, при отключенных макросах). Причем по глупости пользователь шейп, в котором сохранена структура, удалит, и при этом не заметит, что удалил всю свою работу.

В документации по visio описано, каким образом visio подключать к базе данных, и заполнять базу данных, рисуя диаграмму. Каждый выложенный шейп является представлением записи в какой-либо таблице. Но база данных – понятие стационарное. При открытии документа можно запросить логин, пароль, сервер, — и работай на здоровье. Имя сервера от открытия к открытию не будет меняться – запихать можно в реестр.

Если же мы рисуем что-то вроде диаграммы классов — то каждый документ это отдельный проект. По сути дела каждому документу соответствует внутренняя база данных, которую НЕЛЬЗЯ сохранять отдельно. Опять таки в связи с потенциальной потерей непротиворечивости данных.

Уточню задачу: Каким образом можно сохранить в Visio документе дополнительную информацию, которая при этом НИКАК не будет видна в диаграммах. То есть контейнер для оной информации никак не может быть связан с шейпами и страницами (в смысле pages). Так как в UML Visio addin это как-то реализовано, я хочу знать: как?


Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/13/2003 :  10:24:00
Нашел.
См. коллекцию Masters. Там есть Master под названием UML. У него такое хитрое примечание Prompt='UML master stores embedded UML model information.'. И он их там действительно stores в <ForeignData ForeignType='Object'...
Внутри этого объекта без знания формата ничего не просматривается, но Вам все равно свою структуру делать...
Так что все данные о модели все-таки хранятся в файле рисунка, в шейпе, хотя и не на странице.
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)