| 
        
          | 
              
                | 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
 
                Russia1198 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
 
                Russia1198 Posts
 | 
                    
                      |  Posted - 12/24/2011 :  05:40:31 
 |  
                      | Все равно не очень понятен механизм прослеживания связей. А не может быть так, что Вы выбрали не совсем удачный метод решения, и теперь бьетесь над его воплощением?
 Вот, например, когда с использованим Visio строятся какие-то модели, то часто делают так. Модель существует в виде записей в БД или в виде коллекций (коллекция узлов, коллекция связей между узлами). А рисунок служит в основном инструментом для изменения этой коллекции. Основным источником данных для анализа служит не рисунок, а модель.
 Если принять такой подход, то в модели будут отражены все связи до отсоединения коннектора. В момент ConnectorDeleted Вы легко найдете отключаемый коннектор в модели и разрывать там нужные связи по очереди. То есть появится второй источник данных, который поможет установить очередность событий.
 Модель можно строить либо в момент открытия документа, либо даже хранить ее в документе, записывая в момент закрытия или при изменениях.
 Работать с двуми источниками, конечно, несколько сложнее, зато не будет тех проблем, которые есть сейчас. Да и прикладной анализ вести проще.
 |  
                      |  |  |  
                | Robinkzn
 
                84 Posts | 
                    
                      |  Posted - 12/24/2011 :  08:12:12 
 |  
                      | Каждая фигура имеет группы свойств в которых прописано, откуда она получила сигнал, не используя коннекты можно по этим ссылкам пробежать от конца к началу, но не наоборот. Распростроняются сигналы от источника через коннекты фигур. Способ то в целом рабочий, во всяком случае удаление всей схемы переживает без багов :). Беда нашлась вот только, эта. Спасибо за наводку на бд и на коллекции. Я изначально и не рассматривал эти варианты.
 |  
                      |  |  |  
                |  |  Topic  |  |  |  |