|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
ImprintEntity - утечка памяти (ObjectArx / C++)
прохраммист ObjectArx
Регистрация: 01.11.2010
Сообщений: 40
|
||
Просмотров: 7119
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Glam Troll, ты в заголовке темы укажи - язык, под какую версию пишешь и проч.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Можешь: Как переименовать тему?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Если на C++, да к тому же член ADN, то прямая дорога сюда: http://adn-cis.org/forum/index.php?board=3.0
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic) |
||||
![]() |
|
||||
Цитата:
P.S.: А с acdbEntNext ты меня пробил на ностальгию. Я эту функцию не использовал лет пятнадцать.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
прохраммист ObjectArx Регистрация: 01.11.2010
Сообщений: 40
|
Разумеется габаритные контейнеры проверяю. Тут без проверки, чтобы ошибку явно показать. На каждый импринт "утекает" буквально килобайт памяти, но из-за сложности конструкции накапливаются десятки гигабайт за считанные минуты...
С габаритными контейнерами у автокада тоже баг есть (или фича ![]() Цитата:
![]() |
|||
![]() |
|
||||
Тебя интересуют 3DSolid'ы только в Пространстве Модели или все, которые есть в чертеже, в том числе и лежащие в блоках?
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
прохраммист ObjectArx Регистрация: 01.11.2010
Сообщений: 40
|
Интересуют вообще все entity, которые есть в БД документа. Причём, типы некоторых из них мне даже неизвестны (сторонняя библиотека по AcDbObjectId возвращает его солидное представление). В простейшем случае, нужны все солиды и сюрфэйсы с видимых слоёв, включая те, которые в блоках или вставлены по xref.
Кстати! Нынешний код вполне рабочий и его быстродействие меня вполне устраивает. А вот с блоками есть непонятки. К телам в блоках ведь могут применяться различные трансформации и, вытаскивая тело из блока, у меня не всегда эти трансформации удаётся применить. Проблема настолько редкая, что я даже про неё не стал спрашивать в виде отдельной темы. Может сталкивались с подобным? |
|||
![]() |
|
||||
Цитата:
Цитата:
Код:
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
прохраммист ObjectArx Регистрация: 01.11.2010
Сообщений: 40
|
|
|||
![]() |
|
||||
Перечитай,только внимательно мой код и обрати внимание на pDb->getAcDbObjectId(id,false,h)) - без него ты можешь получить несуществующий в даном чертеже AcDbHandle
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
прохраммист ObjectArx Регистрация: 01.11.2010
Сообщений: 40
|
Действительно, не обратил внимания. С учётом огромного количества объектов в документе (там ещё и текст и 2Д построения и куча прочего мусора) и их создания/удаления код выглядит как-то опасно. В принципе, инвалидный объект всё-равно не откроется. А вот что может потребоваться тысячи идентификаторов уже "удалённых" объектов отсеивать... Думаю, автокад делает примерно то же самое в методе acdbEntNext, пропуская идентификаторы удалённых объектов.
|
|||
![]() |
|
||||
Можешь из спортивного интереса засечь скорость работы обоих методов. Достоинство моего метода в том, что можно работать и с чертежами, которые не загружены в редактор AutoCAD (т.е. открыты через AcDbDatabase::readDwgFile) или не являются активными в редакторе AutoCAD. Функция acedEntNext работает только с активным dwg-файлом.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
прохраммист ObjectArx Регистрация: 01.11.2010
Сообщений: 40
|
|
|||
![]() |
|
||||
В дальнейшем, пожалуйста, посмотри в мою подпись и можешь задавать вопросы там. Во всяком случае специалистов по ObjectARX там больше и легче программистским коллективом "давить на Autodesk".
![]()
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
А в чем причина такого частого вызова (видимо идет сравнение "каждый к каждому") - какова конечная цель? Быть может возможно будет придумать оптимизацию.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
прохраммист ObjectArx Регистрация: 01.11.2010
Сообщений: 40
|
В реальной программе imprint делается только для тех тел, чьи габаритные контейнеры пересекаются (но это всё-равно тысячи вызовов). По этим телам строится КЭ сетка и сеточному генератору необходимо, чтобы в зоне контакта сетки совпадали. Обеспечить это можно только проецированием тел друг на друга. Если с плоскими гранями ещё можно что-то придумать, дробить самостоятельно сетку, после получения её из BREP'a, то вот с не плоскими поверхностями выбора никакого нет. BREP аппроксимирует кривые так, как ему приспичит и состыковать тела просто невозможно без imprint'a.
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Вот эту часть можно поподробней -оперируя только автокадными понятиями.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
прохраммист ObjectArx Регистрация: 01.11.2010
Сообщений: 40
|
|
|||
![]() |
|
||||
Ну можно еще сократить количество вызовов imprintEntity если смотреть пересечение не габаритных контейнеров, а наличие взаимного пересечения AcBrFace пары тел.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
прохраммист ObjectArx Регистрация: 01.11.2010
Сообщений: 40
|
Как я понимаю, придётся проверять пересечение каждой грани одного тела с каждой гранью второго. Утечку с импринтом я вычислил на чертеже из нескольких сотен деталей, по 2-3 тысячи граней в каждой. BREP там вообще страдает очень сильно, от таких моделей.
----- добавлено через ~2 мин. ----- Offtop: Зарегистрировался на вашем сайте (по ссылке в подписи). Антибот у вас там впечатляющий... Нигде столь усиленной проверки не встречал. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Важны детали - что есть - должны совпадать?? Найти грани которые точно равны, пересекаются, одна грань полностью лежит внутри другой, частично и пр. Нарисуйте пример и укажите что нужно - если конечно видите в этом смысл. По моей практике, в большинстве случаев, все подобные "геометрические" задачи имеют "резервы" к упрощению (к усложнению алгоритма - но росту производительности).
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
коротко - т.к. с телефона, вариант оптимизации каждого к каждому - копию каждого тела немного отмасштабировать относительно центра, чтоб касающиесия тела начали пересекаться, а затем последовательно объединять их все в одно тело, анализируя объем до и после - если ‘прирост‘ оказался меньше объема тела, значит оно заползает на какое либо из уже добавленных - то есть с ними надо будет проверить импринт, если прибавка к объему = объему тела -то его можно не проверять.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
прохраммист ObjectArx Регистрация: 01.11.2010
Сообщений: 40
|
Вот это кстати неплохая идея. Только не объединять в одно тело, а найти объём на пересечении тел (выполняется мгновенно даже на сложных телах). Вычисление объёма слишком трудозатратная операция. На сложных телах (особенно построенных лофтингом по сплайнам) может занимать часы или вообще вешать Автокад.
В принципе идея понятна. Можно будет отфильтровать тела, чьи габаритные контейнеры пересекаются, но контакта тел нет. Только от утечки памяти на импринтах, которые всё же есть, это не избавит.( |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Я с таким моделями еще не сталкивался, но в общем верю. По моей практике анализ через однократное сложение тел идет быстрее чем сверка каждого к каждому.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
прохраммист ObjectArx Регистрация: 01.11.2010
Сообщений: 40
|
Только вот эта проверка лишь сообщит о факте контакта, а вот с каким из уже сбуленных тел этот контакт происходит - неизвестно. Т.е. опять придётся проверять каждый с каждым. Но, хотя бы, можно отсечь заведомо не контактирующие тела, у которых габаритные контейнеры пересекаются.
В ADN утечки признали вроде, может хоть в 2016 каде поправят и будет мне счастье. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Не совсем каждый к каждому - проверять только те которые "просигнализировали", к тем, которые уже проверены до него. До кучи - если есть ограничения по возможным вариантам взаиморасположения (они как правило есть - надо только посмотреть внимательно), вполне возможно что достаточно будет проделать ту-же процедуру сложения тел, но в обратном порядке.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как бороться с ошибкой выделения памяти | ratkill | SCAD | 14 | 07.09.2015 16:20 |
VBA: утечка памяти при вставке блоков | Mikha | Программирование | 13 | 03.04.2009 09:18 |
При запуске Lisp идет утечка памяти | Name | LISP | 6 | 24.07.2007 14:36 |
Утечка памяти | mental | Программирование | 2 | 22.02.2007 07:40 |
Лира 9.2 + 1 Гб оперативной памяти | nikе | Лира / Лира-САПР | 3 | 28.01.2006 19:02 |