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

Robinkzn

84 Posts

Posted - 12/14/2011 :  12:15:58
Возможно ли обработать событие BeforeConnectionsDeleted? Ситуация следующая, есть коннектор подключенный боими концами к фигурам, при перемещении, которого оба конца от фигур отрываются, это вызовет два события connectionsdeleted. При первом надо узнать отсоединен ли второй конец линии в тот же момент что и первый, и от чего он был отсоединен. Или же после событий получить коннекты которые были разорваны.

Robinkzn

84 Posts

Posted - 12/23/2011 :  07:21:14
Проблема так и не решена, но теперь я точно определил её причину. Есче раз объясню ситуацию, коннектор перемещается, тем самым возникаю два события ConnectionsDeleted. Хотя в обработчике дисконекты упомянуты во множественном числе, при перемещении коннектора событие происходит два раза, тоесть каждый дисконект обрабатывается отдельно. При первом дисконекте программа определяет от чего оторвался коннектор - кабель и убирает из его свойств потерянный сигнал, при этом второй конец оторван и что к нему было подключено определить невозможно. Второй дисконект вызывает проверку фигуры к которой был коннект, определяется, что она потеряла сигнал, но так как свойство у коннектора было удалено при первом событии "пробежать" по свойствам до источника тока невозможно.
Go to Top of Page

Robinkzn

84 Posts

Posted - 12/23/2011 :  10:35:11
Вот тут файл с примером http://narod.ru/disk/35287855001/%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%8212.vsd.html
Go to Top of Page

Robinkzn

84 Posts

Posted - 12/23/2011 :  16:44:58
После долгих размышлений пришел вот к чему: создам в "prop" две строчки с флагами, которые будут сигнализировать подключено ли начало/конец коннектора к фигурам. При событии соединение добавлено буду поднимать соответствующий концу флаг, при событии соединение удалено опускать. В вышеописанном случае если второй конец никуда не подключен буду проверять поднят ли флаг для этого конца кабеля, если поднят начну поиск в документе фигуру определенного типа имеющую ссылку на данный коннектор. Таким образом получу ту фигуру от которой был оторван переехавший коннектор.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 12/23/2011 :  17:56:42
Ну-ка еще поподробнее...
По первому событию ConnectionsDeleted Вы получаете два шейпа - коннектор и тот шейп, от которого он оторвался.
По второму событию получаете тот же коннектор и другой шейп, от которого он оторвался.
Остается просуммировать полученные знания и увидим оба шейпа и коннектор. Разве не это надо?
Go to Top of Page

Robinkzn

84 Posts

Posted - 12/23/2011 :  18:40:06
Фишка в том, что действие разбито на две части. Если можно было бы узнать, что за первым дисконектом последует второй и отложить обрабоку программой.
Go to Top of Page

Robinkzn

84 Posts

Posted - 12/23/2011 :  19:36:40
Есче одна мысль пришла, если коннектор был перемещен, значит, взаимное положение его конца и начала не изменилось. Отсюда можно найти координату второго конца до предполагаемого перемещения, если в этой координате есть точка и она принадлежит фигуре в свойствах которой есть ссылка на коннектор то предположение подтвердилось и можно брать эту фигуру в оборот.
Go to Top of Page

Robinkzn

84 Posts

Posted - 12/23/2011 :  20:26:57
Наверное отдельную тему надо создать по механизму работы программы, так сходу его объяснить я не могу. Тут проблема вызвана тем, что при первом дисконекте программа сносит свойство у коннектора, которое использует фигура подключенная ко второму концу, получается определить, при втором дисконекте, что фигура его потеряла, но есче необходимо проследить цепочку до начала, а свойство, в коннекторе уже снесено программой при первом дисконекте и цепочка распадается.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 12/24/2011 :  05:40:31
Все равно не очень понятен механизм прослеживания связей.
А не может быть так, что Вы выбрали не совсем удачный метод решения, и теперь бьетесь над его воплощением?
Вот, например, когда с использованим Visio строятся какие-то модели, то часто делают так. Модель существует в виде записей в БД или в виде коллекций (коллекция узлов, коллекция связей между узлами). А рисунок служит в основном инструментом для изменения этой коллекции. Основным источником данных для анализа служит не рисунок, а модель.
Если принять такой подход, то в модели будут отражены все связи до отсоединения коннектора. В момент ConnectorDeleted Вы легко найдете отключаемый коннектор в модели и разрывать там нужные связи по очереди. То есть появится второй источник данных, который поможет установить очередность событий.
Модель можно строить либо в момент открытия документа, либо даже хранить ее в документе, записывая в момент закрытия или при изменениях.
Работать с двуми источниками, конечно, несколько сложнее, зато не будет тех проблем, которые есть сейчас. Да и прикладной анализ вести проще.
Go to Top of Page

Robinkzn

84 Posts

Posted - 12/24/2011 :  08:12:12
Каждая фигура имеет группы свойств в которых прописано, откуда она получила сигнал, не используя коннекты можно по этим ссылкам пробежать от конца к началу, но не наоборот. Распростроняются сигналы от источника через коннекты фигур.
Способ то в целом рабочий, во всяком случае удаление всей схемы переживает без багов :). Беда нашлась вот только, эта. Спасибо за наводку на бд и на коллекции. Я изначально и не рассматривал эти варианты.
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)