Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Алексей Терно от 29-04-2019, 20:26:34
-
Решил одну проблему и получил новую )
Мой модуль создает слои и помещает на эти слои всю пользовательскую графику. Для этого я создал функцию, которая ищет слои, созданные модулем, и запоминает их ID, которые потом присваиваются создаваемым примитивам. Эту функцию я поместил, в том числе, и в событие Application.DocumentManager.DocumentActivated, но оно, по всей видимости, наступает после обработки всех Overrule. И получается, что когда я переключаюсь на другой чертеж, вначале подхватываются все Overrule и назначаются слои, а эти слои были определены в предыдущем чертеже. Есть, конечно, вариант засунут эту функцию поиска слоев в сам метод получения пользовательской графики, но я боюсь, что это может увеличить работу модуля, если в чертеже будет создано несколько сотен или тысяч объектов.
Я пробовал события Application.DocumentManager.DocumentToBeActivated и Application.DocumentManager.DocumentBecameCurrent, но они так же наступают после Overrule. Есть ли какое-нибудь событие, наступающее до переопределений, чтобы я мог получить базу данных активного чертежа?
-
Я пробовал события Application.DocumentManager.DocumentToBeActivated и Application.DocumentManager.DocumentBecameCurrent, но они так же наступают после Overrule. Есть ли какое-нибудь событие, наступающее до переопределений, чтобы я мог получить базу данных активного чертежа?
Странно это очень. О каком именно Overrule идёт речь?
-
О каком именно Overrule идёт речь?
DrawableOverrule
В событиях DocumentActivated, DocumentToBeActivated и DocumentBecameCurrent я первой строчкой я написал вывод простого сообщения (точку останва тоже ставил), но до этой строчки дело не доходит - сразу фатальная ошибка. В режиме отладки, нажав на пузу, я попадаю на строчку в своем методе получения графики, который срабатывает как раз в DrawableOverrule.ViewportDraw().
-
я боюсь, что это может увеличить работу модуля, если в чертеже будет создано несколько сотен или тысяч объектов
Я сделал проверку времени работы цикла из 1000 итераций этой функции. Вот результаты нескольких тестов, которые проводились подряд, один за другим:
63, 78, 96, 106, 62, 63, 61, 67, 61 - это время в миллисекундах.
В принципе, время работ приемлемое, но очень странный разброс от 106 до 61 мс, почти в два раза.
-
В принципе, время работ приемлемое, но очень странный разброс от 106 до 61 мс, почти в два раза.
Это работа в мультизадачной среде, так что ничего удивительного.
-
И получается, что когда я переключаюсь на другой чертеж, вначале подхватываются все Overrule и назначаются слои, а эти слои были определены в предыдущем чертеже. Есть, конечно, вариант засунут эту функцию поиска слоев в сам метод получения пользовательской графики, но я боюсь, что это может увеличить работу модуля, если в чертеже будет создано несколько сотен или тысяч объектов.
Можно же просто проверять - принадлежит ли ObjectId текущему чертежу. Если нет - то создать/найти слои в текущем чертеже и перезаписать переменные.
Вообще, мне не сильно нравится подход, когда такое возможно - обращение к ObjectId объектов из другого чертежа. Я бы сделал какой-то словарь, типа: Dictionary<Database, ObjectId[]> искал бы текущую БД в нём и соответствующие Id слоёв. Если нет такой БД в словаре - добавляем при первом обращении. Надеюсь, понятно описал?
-
искал бы текущую БД в нём и соответствующие Id слоёв
Изначально так и задумывалось. Вопрос, в какой момент искать текущую БД?
-
В тот момент, когда нужны слои. По принципу отложенной инициализации.
-
В тот момент, когда нужны слои. По принципу отложенной инициализации.
Именно так я и сделал, но изначально хотел один раз при активации чертежа.