ADN Open CIS
Сообщество программистов Autodesk в СНГ

24/05/2013

О редактировании при помощи ручек и производительности

Если исследовать файлы заголовков ObjectARX SDK, то можно заметить, что реализация редактирования с помощью ручек (Gripedit) использует механизм клонирования при перетаскивании. Это означает, что каждый раз, когда курсор перемещается, AutoCAD создаёт новые клоны «захваченных» примитивов и сразу отбрасывает эти клоны.

Этот механизм предотвращает потерю точности. Вот почему мы повторно инициализируем временную копию каждый раз, прежде чем вызвать его метод moveGripPointsAt, и выполняем "полный" переход от исходного объекта в текущую позицию, вместо серии последовательных трансформаций.

Для того, чтобы правильно инициализировать временный примитив, мы постоянно создаем временную копию и вызываем её конструктор. Затем мы вызываем метод dwgOutFields исходного примитива и передаем результат в метод dwgInFields временной копии. Затем вызываем методы moveGripPointsAt и worldDraw временной копии и удаляем её после этого.

Наш менеджер кучи достаточно умен, чтобы всегда повторно использовать одну и ту же память для этих временных объектов, так что этот механизм является в основном довольно эффективным. Оператор delete объекта AcDbObject сохраняет указатель, который оператор new использует при следующем вызове.

Кроме того вы сами можете сделать много других вещей, чтобы ускорить процесс клонирования:

1. Сделать конструктор по умолчанию вашего примитива настолько простым, насколько это возможно.

2. В реализации dwgInFields / dwgOutFields проверяйте типы файлер: kCopyFiler, kDeepCloneFiler и kWblockCloneFiler. Эти типы файлера указывают, что происходит операция копирования в оперативной памяти. В этих случаях, просто сохраните ваш указатель в методе dwgOutFields. В методе dwgInFields, прочитайте указатель и скопируйте состояние примитива путём разыменования указателя. Я использовал этот механизм в примере «Asdkbodyapp» в Amodeler, что значительно повысило производительность.

3. Используйте частичную отмену («partial undo»). Таким образом, вы сможете избавиться от  вызова файлера kUndoFiler в методах dwgInFields / dwgOutFields.

Источник: http://adndevblog.typepad.com/autocad/2013/01/about-gripedit-and-performance.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=45.0

Опубликовано 24.05.2013
Отредактировано 06.06.2013 в 01:10:29