Для того, чтобы AutoCAD мог определить есть или нет у примитива XData с соответствующим именем приложения, примитив нужно открыть, ну а потом закрыть, т.е. вызвать его метод CloseБлин, и точно)) Очевидно же
Что при этом постоянно открывается?Запусти под отладчиком и посмотри. Возможно какой-то другой Overrule или PointMonitor/PointFilter шалит.
Понятия не имею как это сделать) Я знаю, что срабатывает мой конкретный метод Close(), знаю, что прилетает в него всегда BlockReference, а вот как узнать кто является причиной - я так не умею )Что при этом постоянно открывается?Запусти под отладчиком и посмотри. Возможно какой-то другой Overrule или PointMonitor/PointFilter шалит.
Я бы в этой ситуации использовал бы не фильтр SetXDataFilter, а SetIdFilter, предварительно отобрав бы ObjectId своих примитивов и создав из них коллекцию для каждого документа.Идея очень даже хорошая, но вот реализация объёмная как мне кажется. Я ведь за этой коллекцией должен следить и многое могу не усмотреть сразу. Это я так рассуждаю, потому-что еще ни разу не использовал словари автокадовские (даже не помню как их там зовут). Надо будет поизучать и посмотреть примеры.
Это я так рассуждаю, потому-что еще ни разу не использовал словари автокадовские (даже не помню как их там зовут).Причем здесь "AutoCAD'овские словари"? Я не про AutoCAD'овские, а про .NET-овские.
Ну мне же эти данные нужно будет сохранять в документе, чтобы при следующем открытии документа все заработало. А значит либо XData, либо DBDictionary. При этом первый вариант, по идее, подвержен переполнениюЭто я так рассуждаю, потому-что еще ни разу не использовал словари автокадовские (даже не помню как их там зовут).Причем здесь "AutoCAD'овские словари"? Я не про AutoCAD'овские, а про .NET-овские.
Ну мне же эти данные нужно будет сохранять в документе, чтобы при следующем открытии документа все заработало.Можно и так. Тогда XRecord в Named Object Dictionary (NOD) или в ExtensionDictionary для BlockTable. А можно и налету при открытии файла. Но в любом случае Close будет срабатывать и для них. Вот что самое печальное.
Скоро, кстати, будет новый комментарий, если это конечно кому-то интересно.Лично мне эта тема интересна и последние несколько месяцев ей и занимаюсь по мере сил, результаты экспериментов есть на youtube (если интересно), код пока не выкладываю, так как там именно эксперименты и показать пока нечего. Про оптимизацию пока не думал, но с интересом читаю твои посты.
Но в любом случае Close будет срабатывать и для нихТогда, пожалуй, пока отложу такую фичу. На данный момент не вижу в ней острой необходимости. Возможно, когда моих "кастомных" примитивов перевалит штук за 10, тогда можно будет задуматься об этом еще раз
Кстати, если у тебя это только BlockReference, то почему ты сразу не проверяешь в IsApplicable на BlockReference? Кроме того я проверил бы еще и ObjectId на null и в этом случае возвращал сразу falseХорошие замечания. Добавлю в проверку. Все-таки свежий взгляд полезен. Особенно, когда проект уже перевалил за 5К строк исполняемого кода (согласно метрикам VS)
результаты экспериментов есть на youtube (если интересно)Только вот нет ссылки на ютуб =))
Про оптимизацию пока не думал, но с интересом читаю твои постыКстати, рассматриваю вариант делать проект OpenSource. Правда не совсем в этом уверен, так как он будет не "отвязанным" - т.е. все-равно завязан на ModPlus и работать только в нём. Вот и думаю - нужно ли?
Отвлекся, думал что добавилКакая-то специфическая штуковина во всех видосах =)) Что это за объект такой? От какой специальности?
Какая-то специфическая штуковина во всех видосах =)) Что это за объект такой? От какой специальности?Сейчас придет Александр Ривилис и даст нам по голове, за такой оффтоп...
Сейчас придет Александр Ривилис и даст нам по голове, за такой оффтопТогда уйдем в ту тему ;)
Кроме того я проверил бы еще и ObjectId на null и в этом случае возвращал сразу falseВот это, кстати, не стоит делать. Конечно, идея правильная в том ключе, что мы обсуждаем только лишь ObjectOverrule. Но у меня метод IsApplicable работает со всеми overrule и в GripOverrule это вызывает отрицательный эффект. Дело в том, что при работе метода MoveGripPointsAt автокад создает копию блока, которую мы и видим на экране в момент изменения. И вот у этой копии ObjectId.Null как-раз.
Но у меня метод IsApplicable работает со всеми overrule и в GripOverrule это вызывает отрицательный эффект.И кто тебе виноват? ;)