Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Привалов Дмитрий от 29-06-2015, 10:21:57
-
как-то давно увидел данную тему
http://adn-cis.org/ispolzovanie-tranzitnoj-grafiki.html (http://adn-cis.org/ispolzovanie-tranzitnoj-grafiki.html)
давно попробовал, работало.
Сейчас на 2014 автокаде захотелось применить в работе данный механизм, но стали вываливаются ошибки, при transientManager.AddTransient(....)
Наткнулся на обсуждение.
http://forums.autodesk.com/t5/net/transientmanager-trouble/td-p/4786911 (http://forums.autodesk.com/t5/net/transientmanager-trouble/td-p/4786911)
Если я правильно понял обсуждение, то:
1. TransientManager не применим для долгосрочного отображения на экране.
2. Нельзя внутри метода использовать объекты, созданные не в базе данных.
Для этих целей рекомендуют использовать
If you have to achieve the similar visisual effect and clear it at later time, using DrawableOverrule might be much better solution. In your can simply override the WorldDraw() method to fill the polyline with desired color. You set the Overrule's custom filter to user picked polyline.
Я планировал использовать TransientManager именно для долгосрочной отрисовки на экране.
Типа включить/выключить отображение ошибок. Пользователь сам должен выбирать момент когда включить/отключить отображение.
Можно создать слой в чертеже и выводить дополнительную графику там. Данное решение менее удобно, потребуется очистка данного слоя.
Подскажите пожалуйста, как для этих целей пользоваться override the WorldDraw() method, или как правильно использовать TransientManager.
-
А чем DrawJig не угодил?
-
А чем DrawJig не угодил?
А подойдет?
Обычно им динамически изменяемые объекты отрисовывают на короткий период.
В данном случае статические объекты, не зависящие от действий пользователя. Объектов может быть много.
-
Так Вы сами написали:
If you have to achieve the similar visisual effect and clear it at later time, using DrawableOverrule might be much better solution. In your can simply override the WorldDraw() method to fill the polyline with desired color. You set the Overrule's custom filter to user picked polyline
Там и советуют использовать DrawJig. Благо примеров полно: http://through-the-interface.typepad.com/through_the_interface/jigs/
-
и советуют использовать DrawJig
Ок, спасибо, не сообразил что DrawableOverrule и есть DrawJig.
Не приходилось использовать, для теста один раз запустил пример и то давно.
Попробую, отпишусь что получилось.
-
Ок, спасибо, не сообразил что DrawableOverrule и есть DrawJig.
Насколько я знаю, это разные вещи. Первое - для изменения постоянного отображения объекта, второе - для получения временного отображения объекта или объектов при операциях копирования, перемещения и т.п.
-
Ок, спасибо, не сообразил что DrawableOverrule и есть DrawJig.
Насколько я знаю, это разные вещи. Первое - для изменения постоянного отображения объекта, второе - для получения временного отображения объекта или объектов при операциях копирования, перемещения и т.п.
Скорее всего да - это разные вещи (лично я просто не пробовал DrawableOverrule), но с помощью DrawJig тоже можно менять постоянное отображение объекта
-
но с помощью DrawJig тоже можно менять постоянное отображение объекта
Но ведь только на момент выполнения какого-то пользовательского запроса? Давно не трогал Jigs, подзабыл. Но вот глянул быстро примеры кода, и вроде как да, только когда выполняется запрос с помощью Editor.Drag, можно на это время что-то поменять. А DrawableOverrule меняет отображение "на постоянной основе", т.е. до тех пор, пока его не отключить.
-
Если я правильно понял обсуждение, то:
1. TransientManager не применим для долгосрочного отображения на экране.
2. Нельзя внутри метода использовать объекты, созданные не в базе данных.
Ну это обсуждение - не истина в последней инстанции. Впрочем, любой чужой код может стереть твою транзитную графику.
И если объект не в базе, а просто создан при помощи оператора new, то он может быть в любой момент удалён сборщиком мусора. Так что такие объекты желательно сделать глобальными/статическими.
-
Ну это обсуждение - не истина в последней инстанции. Впрочем, любой чужой код может стереть твою транзитную графику.
И если объект не в базе, а просто создан при помощи оператора new, то он может быть в любой момент удалён сборщиком мусора. Так что такие объекты желательно сделать глобальными/статическими.
Как всегда в точку.
Только одно уточнение обязательно сделать глобальными/статическими, если хотим использовать объекты после завершения работы функции.
Иначе в 2014 версии происходит крах "unhandled access violation reading" через различные промежутки времени.
Вероятнее как раз во время работы сборщика мусора.
Либо, как следовало в обсуждении
http://forums.autodesk.com/t5/net/transientmanager-trouble/td-p/4786911 (http://forums.autodesk.com/t5/net/transientmanager-trouble/td-p/4786911)
сделать освобождение объектов внутри функции, до работы сборщика мусора.
Если есть возможность, подправьте пожалуйста статью, добавьте комментарий в коде.
http://adn-cis.org/ispolzovanie-tranzitnoj-grafiki.html (http://adn-cis.org/ispolzovanie-tranzitnoj-grafiki.html)
Это поможет избежать проблем другим программистам, при использовании кода.
Еще ссылка, где обсуждается использование в пространстве листа.
http://www.theswamp.org/index.php?topic=36557.0 (http://www.theswamp.org/index.php?topic=36557.0)
-
Ну вообще-то в коде статьи элементы транзитной графики явно сделаны глобальными.
-
Ну вообще-то в коде статьи элементы транзитной графики явно сделаны глобальными.
Да это так. Моя ошибка состояла в том, что вынес код в отдельную функцию и запустил.
И для меня было не очевидно, из-за чего произошел крах, пока вы не подсказали)