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

ADN Club => AutoCAD .NET API => Тема начата: Грасмик Алексей от 27-01-2016, 09:14:43

Название: размер объекта
Отправлено: Грасмик Алексей от 27-01-2016, 09:14:43
добрый день, помогите идеями, как узнать объем объекта автокада? в байтах или процентах, без разницы в чем. но мне нужно узнать какой объем занимает объект при хранении в файле DWG.
Название: Re: размер объекта
Отправлено: Привалов Дмитрий от 27-01-2016, 10:54:21
добрый день, помогите идеями, как узнать объем объекта автокада? в байтах или процентах, без разницы в чем. но мне нужно узнать какой объем занимает объект при хранении в файле DWG.
бррр.......объем линии автокада 0,001% может объем в литрах лучше? ;-)

Ты наверное хочешь:
1. получить сам объект.
2. получить размер объекта в байтах.
3. сравнить с размером чего-то? (Файла или другого объекта.)

уточни задачу, для чего это нужно. А то может тебе вовсе и не размер нужен!
Название: Re: размер объекта
Отправлено: Грасмик Алексей от 27-01-2016, 11:20:47
уточняю.
у меня есть DWG файлы, они велики, их объем может быть 10мб, а может и 30мб. был случай, когда объем файла достиг 640мб. при это в этих файлах не так то много информации, их реальный объем 1-2мб. эти файлы можно почистить _purge, но как правило это не так-то помогает. можно отключить прохи-графику _proxygrphics=0, это помогает, но не сильно.
как выяснилось, даже если из этих файлов удалить все, что видно, файлы остаются в своем преждем объеме минус 1-2мб. объекты полнящие файл не визуальны, это огромное количество библиотек, таблиц, х-данных и всякой фигни, как позже выяснилось, не нужной для работы файла.
я уже вычистил, все, что могу идентифицировать, как лишнее, это позволяет легко уменьшать файлы до их почти реальных размеров, но все же, что-то остается.
можно ловить блох и вычищать дальше, но мне хочется видеть, что реально занимает место. очевидно, что это что-то большое, одного типа и происхождения.
поэтому я хочу видеть какие объекты сколько занимают.
получить размер объекта в байтах, меня вполне устроит.
Название: Re: размер объекта
Отправлено: Привалов Дмитрий от 27-01-2016, 11:43:45
поэтому я хочу видеть какие объекты сколько занимают.
по идее получаешь объект
DbObject  dbObject = tr.GetObject( .....
int byteCount = sizeof(dbObject);
И возможно удастся что-то вычислить и проанализировать

...но размер точно не будет соответствовать размеру в файле, это размер DbObject. Но возможно хватит для нахождения "лишней информации"
Название: Re: размер объекта
Отправлено: Грасмик Алексей от 27-01-2016, 11:49:10
не получится - sizeof даст размер для типа, а не для объекта.
Название: Re: размер объекта
Отправлено: Привалов Дмитрий от 27-01-2016, 11:53:27
не получится - sizeof даст размер для типа, а не для объекта.
тогда попробуй
Marshal.SizeOf
Возвращает неуправляемый размер объекта в байтах.

https://msdn.microsoft.com/ru-ru/library/y3ybkfb3.aspx (https://msdn.microsoft.com/ru-ru/library/y3ybkfb3.aspx)
Название: Re: размер объекта
Отправлено: Грасмик Алексей от 27-01-2016, 12:01:16
ну идея была не плохая, я даже водумал "вот оно!!!", но нет ексцепшн:
System.ArgumentException: Невозможно упаковать тип "Autodesk.AutoCAD.DatabaseServices.BlockTable" как неуправляемую структуру; невозможно вычислить размер или смещение, имеющие смысл.
Название: Re: размер объекта
Отправлено: Александр Ривилис от 27-01-2016, 13:13:08
Охохо...
В .NET вы оперируете с обертками, поэтому размер объекта/примитива даже в оперативной памяти вы определить не можете. Это можно сделать средствами ObjectARX/C++ но и это явно не то, что тебя интересует. Ведь ты же спрашиваешь про:
какой объем занимает объект при хранении в файле DWG.
Ну так поступи таким образом:
1) Сохрани базу в dwg-файл
2) Получи его размер
3) Добавь к базе нужный тебе примитив
4) Сохрани базу в dwg-файл
5) Получи его размер
6) Найди разницу в размерах
Вот и будет тебе размер объекта.
При этом:
1) Системная переменная ISAVEPERCENT должна быть равнв 0
2) Лучше добавлять не один объект, а скажем сотню. И потом разницу в размерах файлов делить на количество добавленных объектов - для точности вычисления.

P.S.: Считаю задачу совершенно бессмысленной пока меня не убедят в обратном.
Название: Re: размер объекта
Отправлено: Грасмик Алексей от 27-01-2016, 13:17:58
меня устроит и объем занимаемый в памяти при загрузке DWG. как узнать объем в objectARX?
добавить интересующий меня примитив не могу - так как не знаю какой объект жрет объем.
Название: Re: размер объекта
Отправлено: Андрей Бушман от 27-01-2016, 13:25:07
добрый день, помогите идеями, как узнать объем объекта автокада? в байтах или процентах, без разницы в чем. но мне нужно узнать какой объем занимает объект при хранении в файле DWG.
Какова практическая польза сего действа?
Название: Re: размер объекта
Отправлено: Андрей Бушман от 27-01-2016, 13:28:33
Это можно сделать средствами ObjectARX/C++ но и это явно не то, что тебя интересует.
Кроме того, совершенно не факт, что структура и размер объекта в памяти соответствует структуре и размеру того, в каком виде эта информация сохраняется в DWG, т.к. вовсе не исключено (хотя и не обязательно), что в этом случае может присутствовать некоторая оптимизация.

Цитата: Александр Ривилис
Считаю задачу совершенно бессмысленной пока меня не убедят в обратном.
Аналогично.
Название: Re: размер объекта
Отправлено: Александр Ривилис от 27-01-2016, 13:33:03
как узнать объем в objectARX?
В ObjectARX: sizeof(<имя класса объекта>). Хотя это тоже всё неправильно. Допустим это растровый объект. Размер класса один и тотже, а в памяти будет занимать разный объем в зависимости от размера растра. Единственный более-менее корректный способ - это:
1) Определяем объем оперативной памяти, занятый AutoCAD
2) Добавить/создать измеряемый объект
3) Определяем объем оперативной памяти, занятый AutoCAD
4) Получаем разницу между 3) и 1) 
Название: Re: размер объекта
Отправлено: Привалов Дмитрий от 27-01-2016, 13:40:30
Какова практическая польза сего действа?
Андрей не дочитал! в 3 сообщении Алексей написал для какой цели. Хотя скорее всего сам размер в том виде и не нужен.

...кстати Александр напомнил ISAVEPERCENT был 0? ...это нужно было перед очисткой выставить, а то можно долго искать не то и не там :-)
Название: Re: размер объекта
Отправлено: Андрей Бушман от 27-01-2016, 13:45:32
можно отключить прохи-графику _proxygrphics=0, это помогает, но не сильно.
как выяснилось, даже если из этих файлов удалить все, что видно, файлы остаются в своем преждем объеме минус 1-2мб. объекты полнящие файл не визуальны, это огромное количество библиотек, таблиц, х-данных и всякой фигни, как позже выяснилось, не нужной для работы файла.
я уже вычистил, все, что могу идентифицировать, как лишнее, это позволяет легко уменьшать файлы до их почти реальных размеров, но все же, что-то остается.
По части уменьшения размера файла...
А если расчленить все прокси (в т.ч. и не графические) с последующим их удалением - в этом случае объём файла насколько сокращается в твоём примере? А.Н. Ривилис предоставлял утилиту для этого на своём сайте. В качестве альтернативы можно попробовать воспользоваться .net-аналогом (https://bitbucket.org/Andrey-Bushman/cadproxy/wiki/Home). Так же интересует, насколько отличается объём DWG файла, полученного путём экспорта всего контента через команду _.WBLOCK.
Название: Re: размер объекта
Отправлено: Привалов Дмитрий от 27-01-2016, 14:05:22
_.WBLOCK
насколько помню
_.WBLOCK практически копирует старую базу, оставляя стили, словари и т.д. и удаляет из нее не выбранные объекты.
(Ну или реализует близкую логику.)

поэтому результат _.WBLOCK стоит сравнить с созданием нового чертежа и копированием примитивов в него.
Название: Re: размер объекта
Отправлено: Андрей Бушман от 27-01-2016, 14:06:40
насколько помню
Я всё же предлагаю попробовать.
Название: Re: размер объекта
Отправлено: Привалов Дмитрий от 27-01-2016, 14:13:15
Или скинь пример файла посмотрим что в нем.
Название: Re: размер объекта
Отправлено: Грасмик Алексей от 27-01-2016, 15:01:56
практическая ценность очевидна:
1. файл в 2мб в 5 разь меньше места занимает на диске, чем файл в 10мб, а место на диске это деньги - куда уж практичнее?!
2. файл в 10мб долго загружается по сети и будучи загруженным больше жрет памяти, когда открыто 10 файлов - это критично - винда начинает свопить - то есть потеря скорости.
насчет расчленения: я делал уже разные варианты чистилки, одна из них расчленяла все блоки (то есть блокрефы) в пространство их владельца, в результате я получал файл без блоков вовсе, который хорошо худел при выполнении purge.
потом я обнаружил, что в базе много элементов, которые в поле onwerid имеют id не существующего объекта, то есть это объекты сиротки, я их удаляю, это тоже помогает.
потом я обнаружил, что в база много dictionary, которые имеют хозяевами блоки или слои. что может слой хранить в таком виде? я их удаляю.
много просто х-данных без привязки, видимо владелец был удален ранее, тоже удаляю.
в таблице таблиц оказалось много таблиц не нужных автокаду, по крайней мере после их удаления файл худел и грузился нормально. часть таблиц, оказались жизненно необходимы.
талица рагистрированных приложений постоянно заполняется всякими приложениями - то же вытираю их.
короче, применение чистого автокада не вредить файлам, в вот всякие ПО под автокад забивают файл шлаком и этот шлак я не могу идентифицировать.
Название: Re: размер объекта
Отправлено: Андрей Бушман от 27-01-2016, 15:06:41
практическая ценность очевидна:
1. файл в 2мб в 5 разь меньше места занимает на диске, чем файл в 10мб, а место на диске это деньги - куда уж практичнее?!
Я спрашивал не о практичности более компактного представления документа, а о практичности того пути, который ты выбрал для решения этой задачи.
Название: Re: размер объекта
Отправлено: Андрей Бушман от 27-01-2016, 15:08:48
я делал уже разные варианты чистилки, одна из них расчленяла все блоки
Я не спрашивал о "твоих вариантах чистилок". Я спрашивал о том, пробовал ли ты взрывать и уничтожать прокси любым из обозначенных мною выше инструментов. Эти инструменты выполняют работу не штатными средствами [т.е. командами] акада.

P.S.
Блоки и прокси - это не одно и то же. Прокси бывают графическими и не графическими. Обычными ["родными"] командами акада удалить их не удастся.
Название: Re: размер объекта
Отправлено: Привалов Дмитрий от 27-01-2016, 15:10:35
потом я обнаружил, что в база много dictionary, которые имеют хозяевами блоки или слои. что может слой хранить в таком виде? я их удаляю.
Полегче с этим! Это часть стандартных механизмов автокада. К примеру аннотативность и динамические блоки создают такие словари.
Название: Re: размер объекта
Отправлено: Привалов Дмитрий от 27-01-2016, 15:12:05
в вот всякие ПО под автокад забивают
А что за ПО то? это тоже может помочь. Файл-пример то выложишь?
Название: Re: размер объекта
Отправлено: Владимир Шу от 27-01-2016, 16:41:47
Этот патч ставили: https://knowledge.autodesk.com/support/autocad/downloads/caas/downloads/content/autocad-C2-AE-dgn-hotfix.html ?
Или вот этот код для чистки использовали
Код - Auto/Visual Lisp [Выбрать]
  1. ^C^C(DICTREMOVE (namedobjdict) "ACAD_DGNLINESTYLECOMP")
?

В конторе, где работаю, это вечная проблема у архитекторов и из-за этого файлы весят больше 10 Мб.
Название: Re: размер объекта
Отправлено: Александр Ривилис от 27-01-2016, 17:24:44
Полегче с этим! Это часть стандартных механизмов автокада. К примеру аннотативность и динамические блоки создают такие словари.
За это плюсанул три раза. И еще. Разбивать до примитивов блоки можно только если с ними никто больше работать не будет. Кстати, 1000 одинаковых блоков, содержащих десяток-другой примитивов будут работать значительно быстрее и занимать меньше места, чем те же самые расчленённые блоки. Так что бездумное расчленение ни к чему хорошему не приведёт.
Название: Re: размер объекта
Отправлено: Привалов Дмитрий от 27-01-2016, 18:55:58
Разбивать до примитивов блоки можно только если с ними никто больше работать не будет. Кстати, 1000 одинаковых блоков, содержащих десяток-другой примитивов будут работать значительно быстрее и занимать меньше места, чем те же самые расчленённые блоки. Так что бездумное расчленение ни к чему хорошему не приведёт.
Да блоки штука хитрая.
У нас наоборот догадались внедрить ссылку как блок с 40 чертежами внутри. В итоге получилось много вставок мега блока и на каждом подрезка отображения. Типа "продвинутая компоновка."
Результат получился печальный, примерно 40*40 обсчетов вместо 40. Типа примитивы попали/не попали в контур подрезки.
Идея на самом деле хорошая, поменял в одном месте, в других поменялось автоматом. Но "злоупотребили" количеством. Пришлось потом  самим разбивать и вручную подрезать.

...это я к чему. блоки нужно продумывать. Использовать как простой блок почти везде для ускорения, а вот блоки с  динамикой, аннотативностью, атрибутами, подрезкой вида использовать минимально, с осмотрительностью, чтобы не просадить скорость работы.
Название: Re: размер объекта
Отправлено: Грасмик Алексей от 28-01-2016, 05:40:18
всем спасибо за участие.
файлы примеры выложить не могу - они коммерческие.
от DGN остатков конечно чищу.
инструменты, предложенные Бушманом, еще не попробовал.
расчленяю блоки, так как знаю, что с ними работать не будут.
размер в 1000 одинаковых блоках, конечно будет меньше, чем в раслененке, и есть еще блоки с аттрибутами, и динамические, там отдельная история, их не трогаю, они как правило оптимальные и не раздувают файл.
ПО всякое используют мои коллеги: автоплант, просталь, геоникс, цивил и прочие.
Название: Re: размер объекта
Отправлено: Привалов Дмитрий от 28-01-2016, 10:03:01
файлы примеры выложить не могу - они коммерческие.
не обязательно выкладывать целый файл. Можно удалить всю графическую информацию с модели/листов. И вызвать Purge. И если он действительно большой, тогда можно поковыряться в остатках что в них не так   ;-)