Author |
Topic |
|
Robinkzn
84 Posts |
Posted - 12/14/2011 : 12:15:58
|
Возможно ли обработать событие BeforeConnectionsDeleted? Ситуация следующая, есть коннектор подключенный боими концами к фигурам, при перемещении, которого оба конца от фигур отрываются, это вызовет два события connectionsdeleted. При первом надо узнать отсоединен ли второй конец линии в тот же момент что и первый, и от чего он был отсоединен. Или же после событий получить коннекты которые были разорваны. |
|
Robinkzn
84 Posts |
Posted - 12/23/2011 : 07:21:14
|
Проблема так и не решена, но теперь я точно определил её причину. Есче раз объясню ситуацию, коннектор перемещается, тем самым возникаю два события ConnectionsDeleted. Хотя в обработчике дисконекты упомянуты во множественном числе, при перемещении коннектора событие происходит два раза, тоесть каждый дисконект обрабатывается отдельно. При первом дисконекте программа определяет от чего оторвался коннектор - кабель и убирает из его свойств потерянный сигнал, при этом второй конец оторван и что к нему было подключено определить невозможно. Второй дисконект вызывает проверку фигуры к которой был коннект, определяется, что она потеряла сигнал, но так как свойство у коннектора было удалено при первом событии "пробежать" по свойствам до источника тока невозможно. |
|
|
Robinkzn
84 Posts |
|
Robinkzn
84 Posts |
Posted - 12/23/2011 : 16:44:58
|
После долгих размышлений пришел вот к чему: создам в "prop" две строчки с флагами, которые будут сигнализировать подключено ли начало/конец коннектора к фигурам. При событии соединение добавлено буду поднимать соответствующий концу флаг, при событии соединение удалено опускать. В вышеописанном случае если второй конец никуда не подключен буду проверять поднят ли флаг для этого конца кабеля, если поднят начну поиск в документе фигуру определенного типа имеющую ссылку на данный коннектор. Таким образом получу ту фигуру от которой был оторван переехавший коннектор. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 12/23/2011 : 17:56:42
|
Ну-ка еще поподробнее... По первому событию ConnectionsDeleted Вы получаете два шейпа - коннектор и тот шейп, от которого он оторвался. По второму событию получаете тот же коннектор и другой шейп, от которого он оторвался. Остается просуммировать полученные знания и увидим оба шейпа и коннектор. Разве не это надо?
|
|
|
Robinkzn
84 Posts |
Posted - 12/23/2011 : 18:40:06
|
Фишка в том, что действие разбито на две части. Если можно было бы узнать, что за первым дисконектом последует второй и отложить обрабоку программой. |
|
|
Robinkzn
84 Posts |
Posted - 12/23/2011 : 19:36:40
|
Есче одна мысль пришла, если коннектор был перемещен, значит, взаимное положение его конца и начала не изменилось. Отсюда можно найти координату второго конца до предполагаемого перемещения, если в этой координате есть точка и она принадлежит фигуре в свойствах которой есть ссылка на коннектор то предположение подтвердилось и можно брать эту фигуру в оборот. |
|
|
Robinkzn
84 Posts |
Posted - 12/23/2011 : 20:26:57
|
Наверное отдельную тему надо создать по механизму работы программы, так сходу его объяснить я не могу. Тут проблема вызвана тем, что при первом дисконекте программа сносит свойство у коннектора, которое использует фигура подключенная ко второму концу, получается определить, при втором дисконекте, что фигура его потеряла, но есче необходимо проследить цепочку до начала, а свойство, в коннекторе уже снесено программой при первом дисконекте и цепочка распадается. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 12/24/2011 : 05:40:31
|
Все равно не очень понятен механизм прослеживания связей. А не может быть так, что Вы выбрали не совсем удачный метод решения, и теперь бьетесь над его воплощением? Вот, например, когда с использованим Visio строятся какие-то модели, то часто делают так. Модель существует в виде записей в БД или в виде коллекций (коллекция узлов, коллекция связей между узлами). А рисунок служит в основном инструментом для изменения этой коллекции. Основным источником данных для анализа служит не рисунок, а модель. Если принять такой подход, то в модели будут отражены все связи до отсоединения коннектора. В момент ConnectorDeleted Вы легко найдете отключаемый коннектор в модели и разрывать там нужные связи по очереди. То есть появится второй источник данных, который поможет установить очередность событий. Модель можно строить либо в момент открытия документа, либо даже хранить ее в документе, записывая в момент закрытия или при изменениях. Работать с двуми источниками, конечно, несколько сложнее, зато не будет тех проблем, которые есть сейчас. Да и прикладной анализ вести проще. |
|
|
Robinkzn
84 Posts |
Posted - 12/24/2011 : 08:12:12
|
Каждая фигура имеет группы свойств в которых прописано, откуда она получила сигнал, не используя коннекты можно по этим ссылкам пробежать от конца к началу, но не наоборот. Распростроняются сигналы от источника через коннекты фигур. Способ то в целом рабочий, во всяком случае удаление всей схемы переживает без багов :). Беда нашлась вот только, эта. Спасибо за наводку на бд и на коллекции. Я изначально и не рассматривал эти варианты. |
|
|
|
Topic |
|
|
|