Определение размера описания элементов AutoCAD-a
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Определение размера описания элементов AutoCAD-a

Определение размера описания элементов AutoCAD-a

Ответ
Поиск в этой теме
Непрочитано 15.06.2009, 18:44 #1
Определение размера описания элементов AutoCAD-a
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Не знаю как подступиться к этой задаче.
Есть описание вхождения блока. Как определить его размер?
Есть группа элементов, описание которых тоже имеет размер. Как определить кто больше описание блока или если его взорвать - описание элементов?
Если брать чистый файл, делать ему purge и смотреть его размер в байтах, а потом вставлять в него графику и смотреть размер, то за вычетом оболочки получим размер графики. То же с блоком, но делать так для каждой работы - ужас.
Если просто нарисовать линию, а потом ее заключить в блок, то вхождение блока больше описания самой линии, когда она еще в блоке не была. Но начиная с какого-то объема графики, описание вхождений становится меньше, правда динамические свойства описание вхождений увеличивают, но это только смещает отметку.

Как определить размер описания элемента программно?

Может написать прожку для постоянной индикации размера файла после каждого сохранения? Висит в уголочке окошечко с цифрами и показывает сколько мусора ты уже напихал в файл.
Просмотров: 4964
 
Непрочитано 15.06.2009, 19:25
#2
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Как определить размер описания элемента программно?
Размер описания в файле и в памяти - разные вещи, в файл не сохраняется "избыточная" информация для уменьшения размера, в памяти она хранится чтоб не тратить время каждый раз на ее вычисление. + в последних версиях вроде как встроенный архиватор.
zamtmn вне форума  
 
Автор темы   Непрочитано 15.06.2009, 19:47
#3
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Задача не стоит мерять в битах или байтах, оценка нужна размера одного, относительно другого. Архивирует - и ладно. он же и то и то архивирует, а вот с памятью и разворачиванием сложнее.
В теории, каждый объект это СОМ объект и он размещаясь в памяти сжирает ее часть, а вот какую? Может ObjectARX поможет?
Ломаю,ломаю голову - никак.
Supermax вне форума  
 
Непрочитано 15.06.2009, 19:57
#4
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Даже с определением линии ИМХО не все так просто: размер в памяти должен зависить от кучи параметров, например от типа линии, каждый штрих считается и гдето хранится. Наверно в ObjectARX можно посмотреть размер класса линии, но сколько еще памяти выделяет экземпляр объекта, узнать сложнее.

Последний раз редактировалось zamtmn, 15.06.2009 в 20:15.
zamtmn вне форума  
 
Автор темы   Непрочитано 15.06.2009, 20:11
#5
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


От этой задачи зависит очень многое. Тут народ, "слегка" заболел взрыванием блоков. Даже просят прогу написать, чтобы все блоки повзрывала, а вот к какому это объему файла приведет и как такое можно пошевелить - не понимают и я не понимаю. Если через размер файла смотреть, то надо сохранять и сравнивать относительно предидущего размера, но откатить будет уже не легко. Надо будет страховую копию делать, а заменять существующее страховой копией - летят все загруженные проги. Жуть, короче.
Узнать бы хотя бы сколько в памяти занимает открытый файл. Тогда можно прогой создавать два чистых файла и в один кидать одну группу элементов, а в другую - другую, сохранять эти файлы как временные и сравнивать их размеры. Все это делать без их активации прямо из рабочего файла. Индикацию делать сразу с учетом дельты на оболочку.
Ах если бы, ах если бы, не жизнь была б, а песня бы!
Supermax вне форума  
 
Непрочитано 15.06.2009, 20:21
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Делай (entget) для примитива. Полученный список умножай на {размер целого (ключ) + размер второй части точечной пары + размер указателя на следующий размер списка}.
Последний элемент для меня самый "темный" в смысле размера. Он может быть равен как размеру целого, так и размеру следующей точечной пары (для последней принимать равным тогда надо 0). По идее искать надо в ObjectARX SDK.
Вопрос: не проще ли будет показать на живом примере, к чему приводит разбитие блоков?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.06.2009, 21:18
#7
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


kpblc, ничего не понял. Как можно список умножать на какой-то ключ?
Размер второй части точечной пары это что? По счету или 2 DXF код?

Размер указателя на следующий размер списка это где?
И как быть со всякими там словарями и пр. нечистью? Тут не раз и не два entget надо делать.
Да и не оперирует машина DXF кодами, она ими только представляет содержание, чтобы нам понятней было.
Длинна списка совсем не означает, что в памяти будет занято определенное, соотносящееся с этой длинной пространство.
Тут либо надо искать в процессе указатели на объект и смотреть его ресурс, либо косвенно как-то вычислять.
Надо для автокада создавать свои законы квантовой механики, точнее автокадовой.

Цитата:
Вопрос: не проще ли будет показать на живом примере, к чему приводит разбитие блоков?
Что, не знаешь? Автокад наплодит кучу новых примитивов.

Лично мне надо не взрывать, а оценивать что лучше блок или куча примитивов? У меня много раз повторяется один и тот же набор элементов. Это не "виртуальные изделия" или "виртуальные материалы" просто одинаковые группы примитивов и я их копирую, предварительно объединив в блок (временный), так потом мне их лучше взорвать, или так оставить? Постоянно на эти грабли наступаю.

Если я смогу узнать размер выделенной памяти для отдельного, открытого файла - все станет ОК.
Supermax вне форума  
 
Непрочитано 15.06.2009, 21:24
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Как я понимаю (если сейчас придет сюда А.Ривилис, я получу по ушам) вариант получается таким:
'((1 . 2) (2 . 3) (4 . "asd")) даст объем:
Последний элемент : (int + string(4) + null) = 6 байт
Предпоследний элемент: (int + int + int) = 3 байт
Первый элемент: (int + int + int) = 3 байт
Итого: 12 байт + указатель на начало списка (int) = 13 байт.
---
Добавлено: наверняка напутал с размерностью.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.06.2009, 21:46
#9
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Или ты в Китай переметнулся, или я деревенского воздуха надышался. Ничего не понимаю.
По человечески объяснить нельзя?
Supermax вне форума  
 
Непрочитано 15.06.2009, 22:09
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Насколько я понял, данные в ObjARX представляются как массив структур типа resbuf:
Цитата:
The following result-buffer structure, resbuf, is defined in conjunction with a union, ads_u_val, that accommodates the various AutoCAD and ObjectARX data types, as follows:

union ads_u_val {
ads_real rreal;
ads_real rpoint[3];
short rint; // Must be declared short, not int.
char *rstring;
long rlname[2];
long rlong;
struct ads_binary rbinary;
};
struct resbuf {
struct resbuf *rbnext; // Linked list pointer
short restype;
union ads_u_val resval;
};
NoteThe long integer field resval.rlong is like the binary data field resval.rbinary; both hold extended entity data.
The following figure shows the schematic form of a result-buffer list:
Извини, картинку забыл...
Миниатюры
Нажмите на изображение для увеличения
Название: 001.jpg
Просмотров: 85
Размер:	27.9 Кб
ID:	22255  
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.06.2009, 22:10
#11
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


размер списка вовсе не равен размеру объекта.
Supermax
Странные у тебя мысли)), зачем это знать в лиспе непонимаю. пример с блоками не показателен, ясно что если вставок блока >1 и блок сложный, ане просто POINT - разбивать не может быть невыгодно
zamtmn вне форума  
 
Непрочитано 24.08.2014, 22:42
#12
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Цитата:
Сообщение от Supermax Посмотреть сообщение
Есть описание вхождения блока. Как определить его размер?
Для каждого Блок как АкадБлок в Акад.Документ.Блоки
Создать МассивЛист новый
Для каждого Примитив как АкадПримитив в Блок
МассивЛист.Добавить(Примитив )
конец Для каждого Примитив
Определить Массив(МассивЛист.Размер)
Записать НовыйБлок(Массив, Блок.Имя, ПутьКудаПисать)
конец Для каждого Блок

В результате получим все блоки чертежа, аккуратно сложенные в папку. Будет и размер и все, что хошь.
Дмитрий Асташев вне форума  
 
Непрочитано 23.06.2015, 14:25
#13
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Вот руки дошли посмотреть.

Код:
[Выделить все]
  Private Sub ButtonБлокиЧертежа_Click(sender As Object, e As EventArgs) Handles ButtonБлокиЧертежа.Click
        initacad()
        Dim ArrListBlockSNullElem As New ArrayList
        Dim di As DirectoryInfo
        Dim path As String = doc.Path & "\xxxblocks"

        If Directory.Exists(path) Then
        Else
            di = Directory.CreateDirectory(path)
        End If
        Dim Dir As Directory
        For Each block As AcadBlock In doc.Blocks
            If InStr(block.Name, "*") = 0 Then
                Dim bname As String = block.Name
                Dim objArrList As New ArrayList
                If block.Count = 0 Then
                    ArrListBlockSNullElem.Add(bname)
                Else
                    For i = 0 To block.Count - 1

                        Dim enty As AcadEntity = block.Item(i)
                        objArrList.Add(enty)
                    Next
                    Dim Point0 As Double() = ToPoint3D(0, 0, 0)
                    For Each enty As AcadEntity In objArrList
                        enty.Move(block.Origin, Point0)
                    Next
                    Dim sset As AcadSelectionSet = NewSelectionSets("bsset")
                    Dim Arrobj(objArrList.Count - 1) As AcadEntity
                    For i = 0 To objArrList.Count - 1
                        Dim objEnt(0) As AcadEntity
                        objEnt(0) = objArrList(i)
                        Dim varRet() As Object = doc.CopyObjects(objEnt, doc.ModelSpace)
                        Dim newenty As AcadEntity = varRet(0)
                        Arrobj(i) = newenty
                    Next
                    sset.AddItems(Arrobj)
                    doc.Wblock(path & "\" & bname & ".dwg", sset)
                    For Each enty As AcadEntity In Arrobj
                        enty.Delete()
                    Next
                                 End If
            End If
        Next
    End Sub
Дмитрий Асташев вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Определение размера описания элементов AutoCAD-a



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видеоуроки AutoCAD kosmax AutoCAD 173 17.02.2017 15:08
Определение площади поверхности и объема тел в AutoCAD на VBA. shumilovvv Программирование 23 21.07.2014 14:44
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
Случайный эксцентриситет p_sh Прочее. Архитектура и строительство 14 22.07.2009 11:32
Численное определение свободных длин элементов eilukha Конструкции зданий и сооружений 4 28.11.2008 08:38