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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Описание xdata

Описание xdata

Ответ
Поиск в этой теме
Непрочитано 27.09.2014, 23:09 #1
Описание xdata
АлексЮстасу
 
топограф, технолог
 
Москва
Регистрация: 24.05.2009
Сообщений: 3,075

Пардон за наивные вопросы - только пытаюсь знакомиться с xdata. Пишу в "Программирование", поскольку ответить смогут только программисты?
Пока имею возможность рассматривать xdata только с помощью команд xdata и xdlist из Express Tools.
1. Единое описание xdata у однотипных объектов не предусмотрено? Т.е. в принципе каждая отдельная xdata потенциально уникальна? Например, одна xdata "Труба", у одного графического элемента, может иметь один набор полей (допустим, для материала труб и диаметра), а другая "Труба" же, но у другого элемента может иметь совсем другой набор полей и числом, и типами полей (допустим, для назначения трубы, толщины стенок, предельного давления, сечения)? Тогда получается, что для анализа и манипулирования данными из xdata необходимо самостоятельно описывать структуры и состав xdata где-то вовне dwg? Но как быть с тем, что это почти бесполезно. Ведь ничто не ограничивает различие числа, типов и порядка следования полей у xdata для данных однотипных объектов?
2. Как описывать в xdata целочисленные поля для чисел больше 32767?
В xdata для целочисленных значений предусмотрены типы int и long.
Если задать для поля типа int или поля типа long число больше 32767, то появляется сообщение, что требуется целое значение до 32767.
Других типов целочисленных полей в xdata не предусмотрено.
3. Как идентифицировать поля данных в xdata - для каких данных какое поле? Ни при описании полей при команде xdata, ни при просмотре их с помощью xdlist не видно никаких идентификаторов полей. Единственное - порядок следования полей?
Допустим, присоединяю xdata к элементу с тремя полями типа str, символьными, описанными в последовательности: поле1, поле2, поле3. Но с помощью xdlist виден порядок полей обратный:
Цитата:
* Registered Application Name: XDATA_1
* Code 1002, Starting or ending brace: {
* Code 1000, ASCII string: содержание_поля_3
* Code 1000, ASCII string: содержание_поля_2
* Code 1000, ASCII string: содержание_поля_1
* Code 1002, Starting or ending brace: }
Как при этом найти нужное поле?

Или эти вопросы от особенности не самих xdata, а особенность работы команд xdata и xdlist из Express Tools?
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 28.09.2014 в 03:34.
Просмотров: 22756
 
Непрочитано 28.09.2014, 06:56
#2
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Пардон за наивные вопросы - только пытаюсь знакомиться с xdata
Ну, давай, знакомься. Может быть когда ознакомишься, то все-таки поймешь, насколько наивна твоя идея о хранении внутри DWG "описательных блоков", о которых мечтал в соседней ветке.

По пунктам отвечать специально не буду. Идея (найти "заначку" в DWG) порочна в принципе. А данные надо хранить вне чертежа, в базе данных. Вот там могут быть любые типы, любая структура, и "как найти" решается элементарно.

А в xdata (и других местах, которые есть) надо хранить только ссылки.
ShaggyDoc вне форума  
 
Непрочитано 28.09.2014, 12:41
#3
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Если задать для поля типа int или поля типа long число больше 32767, то появляется сообщение, что требуется целое значение до 32767.
Это косяк Express Tools, похоже - уже сам натыкался. Это ограничения для int (печальное наследие VBA? - для многих других языков Integer является 32-разрядным), для long при установке программно все нормально - сохраняется 32-битное число.

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Как при этом найти нужное поле?
Работает как FIFO стек - в каком порядке запихнешь данные, в таком и получишь. Т.е. при малейшем изменений формата представления данных придется переписывать все функции, работающие с xData данных объектов - почему уважаемый ShaggyDoc очень нервничает - когда речь заходит о хранении именно данных в xData
Сергей812 вне форума  
 
Непрочитано 28.09.2014, 13:18
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Похожая тема с 2005 года. http://forum.dwg.ru/showthread.php?t=3719
Полезные ссылки на Xdata и словари http://forum.dwg.ru/showpost.php?p=787874&postcount=7
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 30.09.2014, 02:59
#5
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Сможет кто-нибудь подправить эти xdata.lsp и xdlist.lsp из Express Tools, чтобы в long-поля можно было вводить целые числа больше 32767, а также видеть созданные поля xdata в их реальном порядке? Иначе тяжело понять действительные возможности xdata и моделировать работу с ними. Если, конечно, это именно подправить, а не переписывать полностью.
Как возможный бонус - эту исправленную версию лиспов предложить самому Autodesk на замену в Express Tools
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 30.09.2014, 08:22
#6
zamtmn

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


ShaggyDoc
>>А в xdata (и других местах, которые есть) надо хранить только ссылки.
Ненадо всё под одну гребенку стричь. Данные бывают разные как и подходы к их хранению. В случае
>>допустим, для назначения трубы, толщины стенок, предельного давления, сечения
Т.е. "стандартной" информации - да лучше ссылку. Но например если нужно хранить длину куска кабеля или температура теплоносителя в данной трубе (т.е. информацию специфичную только этому объекту) - вполне логично хранить напрямую, а не в виде ссылки
zamtmn вне форума  
 
Непрочитано 30.09.2014, 10:51
#7
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


АлексЮстасу, запиши большое число как строку. Предлагаю обратить Ваши взоры (zamtmn, АлексЮстасу, ) в сторону vlax-ldata-.... . попроще как-то.
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 30.09.2014, 11:18
#8
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Но например если нужно хранить длину куска кабеля или температура теплоносителя в данной трубе (т.е. информацию специфичную только этому объекту) - вполне логично хранить напрямую, а не в виде ссылки
Это только сначала кажется, что здесь "логичнее". А если надо собрать эти "куски кабеля" в один заказ из разных проектов? Лазить по всем чертежам и выбирать? А еще до этого рассуждать, что "специфично", а что нет. Часть положить в одно место, часть в другое и потом потерять всё.

А выборка из БД делается мгновенно с помощью SQL- запроса. Эти запросы могут быть и простые (типа select Sum(L) as SumL from Cables where CableID=24 чтобы получить сумму длин) и очень сложными, со всякими условиями, вычислением и применением функций. Но пользователю их и знать не надо, он их не увидит. Мы же не видим, какой SQL-запрос (вернее несколько десятков) посылается к БД, чтобы мы увидели эту страницу в браузере.

Вот пример, когда только с краешком проблем начинает человек сталкиваться:
Цитата:
Сможет кто-нибудь подправить эти xdata.lsp и xdlist.lsp из Express Tools, чтобы в long-поля можно было вводить целые числа больше 32767, а также видеть созданные поля xdata в их реальном порядке?
Чтобы это сделать, собирается и Express править, да еще "предложить самому Autodesk на замену в Express Tools". Чтоб там посмеялись. А ведь для внешних данных можно установить и любые типы данных (вплоть до картинок) и уж тем более легко управлавлять и порядком вывода полей (просто перечисляя какие поля вывести и в каком порядке), и прорядком вывода самих данных (сортировкой) по любым критериям.
ShaggyDoc вне форума  
 
Непрочитано 30.09.2014, 12:56
#9
zamtmn

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


>>Это только сначала кажется, что здесь "логичнее". А если надо собрать эти "куски кабеля" в один заказ из разных проектов? Лазить по всем чертежам и выбирать? А еще до этого рассуждать, что "специфично", а что нет. Часть положить в одно место, часть в другое и потом потерять всё.
В теории рассужать одно. 2 подхода: первый - чертеж дополнение к базе данных (в виде просто илюстрации), второй - база данных дополнение к чертежу (в виде отчета получаемого из чертежа). Зарание выбрать единственно верный нельзя, оба имеют право на жизнь, и любые из них комбинации тоже.

>>А выборка из БД делается мгновенно с помощью SQL- запроса.
Я конечно не гоняюсь за временем, но будет далеко не мгновенно. И "простые" задачи гораздо усложнятся, - например примитив просто уже не скопируешь, новое вхождение нужно привязать к созданой записи в БД

----- добавлено через ~4 мин. -----
>>Вот пример, когда только с краешком проблем начинает человек сталкиваться:
Незнаю, невижу никаких проблем)) по мне так в xdata можно что хочешь запихнуть, хорошо подумав естественно перед этим
zamtmn вне форума  
 
Автор темы   Непрочитано 30.09.2014, 16:37
#10
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от nolte Посмотреть сообщение
запиши большое число как строку
Да вроде бы Сергей812 писал в #3, что это в Express Tools криво сделано. Вот я и попросил по возможности подправить.
Цитата:
Сообщение от nolte Посмотреть сообщение
Предлагаю обратить Ваши взоры (zamtmn, АлексЮстасу, ) в сторону vlax-ldata-.... . попроще как-то.
Не для программиста - что это "vlax-ldata-...."? Поминание ldata в ссылках, данных выше, я уже видел. Это альтернатива xdata? Или альтернатива xrecord?
Цитата:
Сообщение от VVA Посмотреть сообщение
Полезные ссылки на ... и словари
Еще б узнать, что, применительно к черчению и Автокаду, понимается под "словарь"?!

Просто чтобы хоть что-то понять, хотелось здесь убедиться в возможностях-особенностях xdata для начала...
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 30.09.2014 в 17:40.
АлексЮстасу вне форума  
 
Непрочитано 30.09.2014, 18:03
1 | #11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
применительно к черчению и Автокаду, понимается под "словарь"?!
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Не для программиста - что это "vlax-ldata-...."?
vlax-ldata-* = словарь

----- добавлено через ~3 мин. -----
Почитай 1-й абзац стр. 145
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.09.2014, 19:59
#12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
что это в Express Tools криво сделано. Вот я и попросил по возможности подправить
Кстати, если расширенные данные присоединять к объекту программно, а извлекать командой "List xData" Express Tools - то порядок будет неизменный.

А то, что вы хотите сделать - как раз лежит больше в области внешних БД. Поскольку нет какой либо неизменной и краткой структуры данных.
Сергей812 вне форума  
 
Автор темы   Непрочитано 30.09.2014, 21:17
#13
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от VVA Посмотреть сообщение
Почитай 1-й абзац стр. 145
Начал почитывать и про xdata. В 1.14.1 Структура расширенных данных, с. 140 написано, что 1001 - имя приложения не может быть длиннее 31 знака, и может состоять только из цифр, латинских букв и символов $,-,_. Я этого не знал, но уже пытался проверить - и задавал в "Application Name" имена гораздо длиннее, на русском, с точками и пробелами, например: "надп. (набл._геод._пож._прож._спорт.) назначения вышки легкого типа". Правда, в кавычках. Ни xdata, ни xdlist из Express этому не воспротивились.
В чем тут дело? Может быть в том, что книга 2006 года? Или опять Express чудит?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 30.09.2014, 21:38
#14
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Как пишет Kean Walmsley
Цитата:
Because it's efficient for small amounts of data (and annotation scaling doesn't need much additional data - the same as for the Hyperlink feature in AutoCAD). XData is fine if you're storing up to around 1KB - anything more than that and I'd recommend ExtDicts + XRecords.

With hindsight, the word "legacy" has some negative connotations... the point I'm trying to make is that it is very risky to rely on it for substantial amounts of additional data (>1 KB per app).
И начните, наконец, пользоваться справочной документацией. А то еще 2 месяца будете эти xData только рассматривать, а не пробовать использовать)
Цитата:
Application name An ASCII string up to 255 bytes long (group code 1000).

Последний раз редактировалось Сергей812, 30.09.2014 в 21:57.
Сергей812 вне форума  
 
Автор темы   Непрочитано 03.10.2014, 19:46
#15
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
XData is fine if you're storing up to around 1KB - anything more than that and I'd recommend ExtDicts + XRecords.
Почему только 1 кб?
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Application name An ASCII string up to 255 bytes long (group code 1000).
В книге Полещука для Application name предусмотрен код не 1000, а 1001. Книга старая?
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
И начните, наконец, пользоваться справочной документацией.
Просветили бы какой именно лучше пользоваться. Еще лучше - на русском. Совсем хорошо бы, если бы одновременно с внятными разъяснениями.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 03.10.2014, 20:22
#16
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Почему только 1 кб?
Цитата:
The global XData limit is 16 KBytes per object, and this potentially needs to be shared between multiple applications.
Так что можете хоть все 16 занимать - если хотите получать неожиданные ошибки и возможные конфликты с другими надстройками AutoCAD, использующими xData.

В русской и англоязычной части интернета информации по подобным вопросам вполне достаточно для начала работы. Одну ссылку в другой ветке давал уже - как добавлять данные в xData на NetApi. Там же на этом ресурсе можно найти и примеры считывания и удаления xData (для заданного приложения), насколько помню. Разжевывать никто не будет, информацию перерабатывайте сами. И не забывайте заглядывать в ObjectARX SDK (см. сайт АutoDesk). Информация про:

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Application name An ASCII string up to 255 bytes long (group code 1000).
Была взята оттуда. DXF код у имени приложения конечно 1001, а ограничения по длине - как у строки с кодом 1000.
Сергей812 вне форума  
 
Непрочитано 04.10.2014, 00:02
#17
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
если бы одновременно с внятными разъяснениями
Я в #4 дал ссылку. Советую почитать Там кое-что было в #35 и дальше
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 05.10.2014, 05:54
#18
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от VVA Посмотреть сообщение
Я в #4 дал ссылку. Советую почитать Там кое-что было в #35 и дальше
Из #4 уже вовсю цитирую
Запускаю первый лисп из http://www.arcada.com.ua/forum/viewt...418f41ab9e777c, но мне сообщают:
Цитата:
Выберите объект: ; ошибка: no function definition: VLAX-ENAME->VLA-OBJECT
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 05.10.2014, 10:03
#19
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
но мне сообщают:
А ты не забыл провлоадкомиться???
gomer вне форума  
 
Автор темы   Непрочитано 05.10.2014, 14:43
#20
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от gomer Посмотреть сообщение
А ты не забыл провлоадкомиться???
Что-то подобное я слышал, хотя реально не в курсе.
Поэтому во первых строках пытался написать: (vl-load-com). Правильно?
На это мне ответили:
Цитата:
Выберите объект: ; ошибка: no function definition: _KPBLC-ENT-TO-VLA
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 05.10.2014, 16:07
#21
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Правильно?
Правильно, осталось еще окрыситься =)
gomer вне форума  
 
Автор темы   Непрочитано 05.10.2014, 16:24
#22
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от gomer Посмотреть сообщение
осталось еще окрыситься
А как это?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 05.10.2014, 16:31
#23
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


АлексЮстасу, а тебя ничего не смущает в названии функции _KPBLC-ENT-TO-VLA ?
KPBLC - читается как крЫс, знакомо? Ассоциации?
trir вне форума  
 
Автор темы   Непрочитано 05.10.2014, 16:52
#24
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от trir Посмотреть сообщение
а тебя ничего не смущает
Увы. Вне компетенции. Пытался по аналогии добавить строку: (kpblc-load-com) или (_kpblc-load-com). Пишет:
Цитата:
Команда: ; ошибка: no function definition: KPBLC-LOAD-COM
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 05.10.2014, 16:54
#25
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


ищи здесь
trir вне форума  
 
Непрочитано 05.10.2014, 17:00
#26
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


войди в аркаду и почитай внимательно что там написано
gomer вне форума  
 
Непрочитано 05.10.2014, 17:07
#27
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


АлексЮстасу, ее код приведен в самом первом посте
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 05.10.2014, 18:09
#28
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от VVA Посмотреть сообщение
ее код приведен в самом первом посте
Именно первый код и пытаюсь запустить.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 05.10.2014, 18:15
#29
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


Код:
[Выделить все]
 ;|=============================================================================
*    Функция преобразования полученного значения в vla-указатель.
*    Параметры вызова:
*   ent_value   значение, которое надо преобразовать в указатель. Может
*         быть именем примитива, vla-указателем или просто
*         списком.
*         Если не принадлежит ни одному из указанных типов,
*         возвращается nil
*    Примеры вызова:
(_kpblc-ent-to-vla (entlast))
(_kpblc-ent-to-vla (vlax-ename->vla-object (entlast)))
=============================================================================|;
(defun _kpblc-ent-to-vla (ent_value)
  (cond
    ((= (type ent_value) 'vla-object) ent_value)
    ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
    ((= (type ent_value) 'list)
     (if (not (vl-catch-all-error-p
      (vl-catch-all-apply
        (vlax-ename->vla-object (_kpblc-ent-to-ename ent_value))
        ) ;_ end of VL-CATCH-ALL-APPLY
      ) ;_ end of VL-CATCH-ALL-ERROR-P
         ) ;_ end of not
       nil
       ) ;_ end of if
     )
    (t nil)
    ) ;_ end of cond
  ) ;_ end of defun


;|=============================================================================
*    Функция преобразования полученного значения в ename
*    Параметры вызова:
*   ent_value   значение, которое надо преобразовать в примитив. Может
*         быть именем примитива, vla-указателем или просто
*         списком.
*         Если не принадлежит ни одному из указанных типов,
*         возвращается nil
*    Примеры вызова:
(_kpblc-ent-to-ename (entlast))
(_kpblc-ent-to-ename (vlax-ename->vla-object (entlast)))
=============================================================================|;
(defun _kpblc-ent-to-ename (ent_value)
  (cond
    ((= (type ent_value) 'vla-object) (vlax-vla-object->ename ent_value))
    ((= (type ent_value) 'ename) ent_value)
    ((= (type ent_value) 'list) (cdr (assoc -1 ent_value)))
    (t nil)
    ) ;_ end of cond
  ) ;_ end of defun
trir вне форума  
 
Автор темы   Непрочитано 05.10.2014, 18:38
#30
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Это вроде бы второй код? Предположил, что нужно их собрать в один. Собрал. Запустил первый с указанным примером запуска, пишут:
Цитата:
Команда: (_kpblc-ent-ldata-add (vlax-ename->vla-object (car (entsel)))
'(("block" . "data1")) t)
Выберите объект: ; ошибка: неверный тип аргумента: (or stringp symbolp): nil
Намеки не помогают - не программист.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 05.10.2014, 21:00
#31
Кулик Алексей aka kpblc
Moderator

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


http://autolisp.ru/2010/06/09/no-fun...t-acad-object/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.10.2014, 21:58
#32
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Для тех, кто в танке:
Код:
[Выделить все]
 
(setq *kpblc-appname* "DWGRU")

(vl-load-com)

;|============================================================================= 
*    Функция внесения дополнительных данных в примитив. 
*    Параметры вызова: 
*   ent      примитив, в который вносятся данные 
*   data-list   вносимые данные 
*   append-data   добавлять данные (t) или стирать старые (nil) 
*    Возвращаемое значение: 
*   полный список доп.данных или nil, если невозможно записать. 
*    Примеры вызова:

(_kpblc-ent-ldata-add (vlax-ename->vla-object (car (entsel))) '(("block" . "data1")) nil)
(_kpblc-ent-ldata-add (vlax-ename->vla-object (car (entsel))) '(("block" . "data2")) T)

=============================================================================|;
(defun _kpblc-ent-ldata-add (ent data-list append-data / exist_data)
  (setq ent (_kpblc-ent-to-vla ent))
  (if (and append-data
	   (setq exist_data (vlax-ldata-get ent *kpblc-appname*))
      ) ;_ end of and 
    (progn
      (setq data-list (append exist_data data-list))
      (vlax-ldata-delete ent *kpblc-appname*)
    ) ;_ end of progn 
  ) ;_ end of if 
  (vlax-ldata-put ent *kpblc-appname* data-list)
) ;_ end of defun 

;|============================================================================= 
*    Функция возвращает дополнительные данные, записанные в примитив (либо nil, 
* если их нет) 
*    Параметры вызова: 
*   ent   указатель на примитив 
*    Примеры вызова: 
(_kpblc-ent-ldata-get (vlax-ename->vla-object (car (entsel)))) 
=============================================================================|;
(defun _kpblc-ent-ldata-get (ent)
  (setq ent (_kpblc-ent-to-vla ent))
  (vlax-ldata-get ent *kpblc-appname*)
) ;_ end of defun

;|============================================================================= 
*    Функция преобразования полученного значения в vla-указатель. 
*    Параметры вызова: 
*   ent_value   значение, которое надо преобразовать в указатель. Может 
*         быть именем примитива, vla-указателем или просто 
*         списком. 
*         Если не принадлежит ни одному из указанных типов, 
*         возвращается nil 
*    Примеры вызова: 
(_kpblc-ent-to-vla (entlast)) 
(_kpblc-ent-to-vla (vlax-ename->vla-object (entlast))) 
=============================================================================|;
(defun _kpblc-ent-to-vla (ent_value)
  (cond
    ((= (type ent_value) 'vla-object) ent_value)
    ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
    ((= (type ent_value) 'list)
     (if
       (not (vl-catch-all-error-p
	      (vl-catch-all-apply
		(vlax-ename->vla-object (_kpblc-ent-to-ename ent_value))
	      ) ;_ end of VL-CATCH-ALL-APPLY 
	    ) ;_ end of VL-CATCH-ALL-ERROR-P 
       ) ;_ end of not 
	nil
     ) ;_ end of if 
    )
    (t nil)
  ) ;_ end of cond 
) ;_ end of defun 


;|============================================================================= 
*    Функция преобразования полученного значения в ename 
*    Параметры вызова: 
*   ent_value   значение, которое надо преобразовать в примитив. Может 
*         быть именем примитива, vla-указателем или просто 
*         списком. 
*         Если не принадлежит ни одному из указанных типов, 
*         возвращается nil 
*    Примеры вызова: 
(_kpblc-ent-to-ename (entlast)) 
(_kpblc-ent-to-ename (vlax-ename->vla-object (entlast))) 
=============================================================================|;
(defun _kpblc-ent-to-ename (ent_value)
  (cond
    ((= (type ent_value) 'vla-object)
     (vlax-vla-object->ename ent_value)
    )
    ((= (type ent_value) 'ename) ent_value)
    ((= (type ent_value) 'list) (cdr (assoc -1 ent_value)))
    (t nil)
  ) ;_ end of cond 
) ;_ end of defun
Вообще это все горе от ума, порочная практика понатыкивать "библиотечный" хлам, куда не надо. Происходит отчасти от лени, отчасти от параноидальности программиста... Приводит к тому, что программа на больших объемах данных начинает жутко тормозить вплоть до фаталэрррора...
gomer вне форума  
 
Автор темы   Непрочитано 05.10.2014, 22:06
#33
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
http://autolisp.ru/2010/06/09/no-fun...t-acad-object/
Там про функции vl:
Цитата:
сообщение может меняться, но начало всегда одно: не определена функция vl…
Но у меня после добавления (vl-load-com) ругается на тип аргумента
Цитата:
(or stringp symbolp): nil
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 05.10.2014, 22:33
#34
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от gomer Посмотреть сообщение
Приводит к тому, что программа на больших объемах данных начинает жутко тормозить вплоть до фаталэрррора...
Пример, пожалуйста. Потому как у меня пока такого не было.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Но у меня после добавления (vl-load-com) ругается на тип аргумента
Остается только одно: проходить пошагово выполнение.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.10.2014, 23:15
#35
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Но у меня после добавления (vl-load-com) ругается на тип аргумента
Цитата:
(or stringp symbolp): nil
Сколько можно объяснять? эта ошибка возникает потому что не определена *kpblc-appname*
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Пример, пожалуйста.
Ну, не знаю что даст вырванный из контекста фрагмент кода... Суть в том, что при сортировке списка с помощью vl-remove-if, vl-remove-if-not я заменил лямбду на функцию и получил нехилое проседание по быстродействию.
Может я чего-то не додумал, но неприятный осадок остался
gomer вне форума  
 
Непрочитано 05.10.2014, 23:18
#36
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
(or stringp symbolp): nil
Скорее всего не объявлен "dictionary key". У Алексея сделано через глобальную переменную. См. #32 1-ю строчку
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 05.10.2014, 23:23
#37
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от gomer Посмотреть сообщение
Суть в том, что при сортировке списка с помощью vl-remove-if, vl-remove-if-not я заменил лямбду на функцию и получил нехилое проседание по быстродействию.
Так... Ты ж говорил про Fatal Error - а теперь про низкое быстродействие. Встречные вопросы - функция определена глобально или локально? Что показывает benchmark? Что будет при компиляции кода в fas? А в vlx с отдельным именным пространством?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 06.10.2014, 00:19
#38
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от gomer Посмотреть сообщение
Сколько можно объяснять? эта ошибка возникает потому что не определена *kpblc-appname*
Цитата:
Сообщение от gomer Посмотреть сообщение
Для тех, кто в танке:
Код:
01 (setq *kpblc-appname* "DWGRU")
02
03 (vl-load-com)
Почему-то только сейчас отобразилось это сообщение #32. Заработало:
Цитата:
Команда: (_kpblc-ent-ldata-add (vlax-ename->vla-object (car (entsel)))
'(("block" . "data2")) T)
Выберите объект: (("block" . "data2"))
Offtop: Вместо сообщений #19-37 написать непрограммисту, что нужно добавить строку (setq *kpblc-appname* "DWGRU") - выше нечеловеческих сил?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 06.10.2014, 00:27
#39
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


[Offtop: quote=АлексЮстасу;1319801]Offtop: Вместо сообщений #19-37 написать непрограммисту, что нужно добавить строку (setq *kpblc-appname* "DWGRU") - выше нечеловеческих сил?[/quote]
терпите - вы уже начинающий программист)
Сергей812 вне форума  
 
Непрочитано 06.10.2014, 00:30
#40
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ты ж говорил про Fatal Error - а теперь про низкое быстродействие.
Fatal Error - это отдельная мистическая тема, но я замечал, после долгих циклов его вероятность увеличивается. Возможно это с нехваткой памяти связано.
Насчет быстродействия: да, быстродействие кода проверялось после компиляции в fas.
По теме: При написании кода нужно сразу определиться либо мы используем для выбора объектов ssget и entsel, либо activex. В первом случае получаем всегда примитив, во втором случае - vla-object. Иного не дано. Как следствие все эти фокусы с конвертацией нужны только тогда, когда понатыкано много чужого кода с разными методами получения объектов. В своей практике я не использую даже элементарную проверку на примитивность объекта, и как-то не замечал проблем.
ну ладно, это все лирика, мне вот интересно, куда автор дальше будет двигаться, не имея ни пользовательского интерфейса, ни обработчика данных...
gomer вне форума  
 
Непрочитано 06.10.2014, 00:45
#41
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от gomer Посмотреть сообщение
ну ладно, это все лирика, мне вот интересно, куда автор дальше будет двигаться, не имея ни пользовательского интерфейса, ни обработчика данных...
насколько помню, у ТС для этого есть молодой программист)
Сергей812 вне форума  
 
Непрочитано 06.10.2014, 00:48
#42
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
у ТС для этого есть молодой программист)
А Я забыл жешь
gomer вне форума  
 
Непрочитано 06.10.2014, 02:11
#43
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


По поводу использования LDATA (т.е. vlax-ldata-put/vlax-ldata-get). Не рекомендую ими пользоваться тем, кто собирается программировать не только на VisualLisp. Средства ObjectARX/AutoCAD .NET API не работают с такими данными. Точнее работа с такими данными совсем не документирована, используется пользовательский класс объекта vlo_VL, у которого нет публичного API. Если копнуть в глубину, то это выглядит так:

Александр Ривилис вне форума  
 
Автор темы   Непрочитано 06.10.2014, 02:51
#44
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
терпите - вы уже начинающий программист)
Цитата:
Сообщение от gomer Посмотреть сообщение
мне вот интересно, куда автор дальше будет двигаться, не имея ни пользовательского интерфейса, ни обработчика данных...
И не начинающий. Я технолог. Проблемы создания продукции, подходящие решения, как и какими силами реализовать для пользователей оптимальнее. И, соответственно, постановка задач программистам. А для этого из программистов же аж клещами приходится вытягивать, что именно в Автокаде вообще возможно, какие варианты, подводные камни и т.п.
Допустим, эта задача - определять в Автокаде графические элементы как объекты реальности и описывать их характеристики. Про XData недавно в целом представил, как с ними сделать соответствующие программы для пользователей. Про XRecord пока нет.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 06.10.2014, 03:04
#45
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
И, соответственно, постановка задач программистам. А для этого из программистов же аж клещами приходится вытягивать, что именно в Автокаде вообще возможно, какие варианты, подводные камни и т.п.
Допустим, эта задача - определять в Автокаде графические элементы как объекты реальности и описывать их характеристики. Про XData недавно в целом представил, как с ними сделать соответствующие программы для пользователей. Про XRecord пока нет.
А зачем из программистов что-то вытягивать? Ставите четко описанную задачу, на каких машинах (по конфигурации), каких версиях AutoCAD все это должно работать и т.д. А дальше головная боль программистов - как реализовывать и как потом поддерживать. А вы пытаетесь влезть в программирование, причем выхватывая какие то отдельные куски задачи. Или у вас не программисты, а обыкновенные кодеры-кнопкодавы.
Сергей812 вне форума  
 
Автор темы   Непрочитано 06.10.2014, 05:44
#46
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
По поводу использования LDATA (т.е. vlax-ldata-put/vlax-ldata-get). Не рекомендую ими пользоваться тем, кто собирается программировать не только на VisualLisp. Средства ObjectARX/AutoCAD .NET API не работают с такими данными. Точнее работа с такими данными совсем не документирована, используется пользовательский класс объекта vlo_VL, у которого нет публичного API.
Как же быть, если программер, кроме c++, писать ни на чем не собирается? Может быть в ранних версиях ObjectARX есть больше?
Необходимо не так много возможностей: создания определений нужных записей, редактирования определений, удаления определений, просмотра записей, ввода значений в записи. Или только кажется, что нужно немногое?
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А зачем из программистов что-то вытягивать? Ставите четко описанную задачу
Во-первых, если бы не вы - программисты, то я бы даже не подозревал о многих возможностях в Автокаде, например, о существовании расширенных данных. Во-вторых, только так можно определить степень реализуемости задачи. Нужно определить расширяемость решения, перспективность решения. Ну, и т.д. Да и далеко не все доступные программисты знают Автокад.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 06.10.2014, 10:09
#47
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Во-первых, если бы не вы - программисты, то я бы даже не подозревал о многих возможностях в Автокаде, например, о существовании расширенных данных. Во-вторых, только так можно определить степень реализуемости задачи. Нужно определить расширяемость решения, перспективность решения. Ну, и т.д. Да и далеко не все доступные программисты знают Автокад.
Расширяемость и реализуемость можно заложить на уровне ТЗ. Тем больше времени потратите на обдумывание ТЗ, тем меньше придется приделывать к программе "костылей" при новых возникающих функциональных потребностях.
Сергей812 вне форума  
 
Непрочитано 06.10.2014, 14:04
#48
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Как же быть, если программер, кроме c++, писать ни на чем не собирается? Может быть в ранних версиях ObjectARX есть больше?
Необходимо не так много возможностей: создания определений нужных записей, редактирования определений, удаления определений, просмотра записей, ввода значений в записи. Или только кажется, что нужно немногое?
Просто не пользоваться LDATA (которая есть некая хитрая разновидность Dictionary), а напрямую пользоваться Dictionary/XRecord если объема XDATA (16Кбайт на объект для всех приложений) по каким-то причинам недостаточно.
В любом случае создать LDATA (т.е. выполнить аналог vlax-ldata-put) средствами ObjectARX врядли удастся.
Александр Ривилис вне форума  
 
Непрочитано 06.10.2014, 17:31
#49
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Просто не пользоваться LDATA (которая есть некая хитрая разновидность Dictionary), а напрямую пользоваться Dictionary/XRecord
Это точно. Добавлю, что для того, чтобы надежно пользоваться всеми возможностями, понадобится еще куча дополнительных функций. Вот, для примера, только перечень моих функций на эту тему:

ru-dictvar-clear-all
ru-dictvar-clear-data
ru-dictvar-about-dlg
ru-dictvar-copyright-data
_ru-dictvar-add-new-dict
_ru-dictvar-add-new-var-name
_ru-dictvar-clear-value
_ru-dictvar-copyright
_ru-dictvar-gen-var-list
_ru-dictvar-get-copyright
_ru-dictvar-get-dict
_ru-dictvar-get-sym
_ru-dictvar-list-to-pickset
_ru-dictvar-name
_ru-dictvar-pickset-to-list
_ru-dictvar-regen-var-list
_ru-dictvar-remove-var
_ru-dictvar-set-var-data
ru-dictvar-get-data
ru-dictvar-list-all-var
ru-dictvar-set-data


ru-xrecord-add
ru-xrecord-delete
ru-xrecord-get
ru-xrecord-rebuild


ru-xdata-add-for-ent
ru-xdata-add-list-bracket
ru-xdata-write-for-ent
ru-xdata-get-for-pline-vertex
ru-xdata-get-reg-apps
ru-xdata-get-ruclass-by-layer-name
ru-xdata-get-ruclass-for-active-layer
ru-xdata-get-ruclass-for-all-layers
ru-xdata-get-ruclass-for-layer-obj
ru-xdata-read-for-ent
ru-xdata-rem-for-selection
ru-3d-xdata-rucad-regapp
ru-xdata-rucad-regapp

Тут "тщательнЕе надо, тщательнЕе" (С)
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 06.10.2014, 21:01
#50
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Просто не пользоваться LDATA (которая есть некая хитрая разновидность Dictionary), а напрямую пользоваться Dictionary/XRecord если объема XDATA (16Кбайт на объект для всех приложений) по каким-то причинам недостаточно.
В любом случае создать LDATA (т.е. выполнить аналог vlax-ldata-put) средствами ObjectARX врядли удастся.
В принципе, на один элемент по моим прикидкам (для картографических задач и не только) в среднем будет приходиться всего по 1.5-2 определения ("Application Name", XRecord), и только в небольшом проценте случаев до 5-7. Очень многие специалисты вообще противники определять один элемент больше, чем как один объект реальности, хотя, мне этот подход кажется некорректным. Т.е. число "приложений" прогнозируется небольшим в среднем и незначительным в предельном варианте.
16 кб - в принципе немало. 160 полей по 100 символов.
Тем не менее ограничение объема в 16 кб (а Сергей812 считает, что реально в 1 кб) все-таки для общего случая кажется рискованным.

По поводу XRecord мне еще не понятно, из чего состоит из собственное описание, какие у них есть возможности и ограничения, и что ими можно определить.

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
для того, чтобы надежно пользоваться всеми возможностями, понадобится еще куча дополнительных функций.
Согласен. В нашем сделанном под Map варианте получилось до 50 команд-программок - для полноценного решения без полноты, разнообразия возможностей не обойтись.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 06.10.2014, 21:58
#51
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Тем не менее ограничение объема в 16 кб (а Сергей812 считает, что реально в 1 кб) все-таки для общего случая кажется рискованным.
Это он ссылается на мнение Kean Walmsley, которому я доверяю, но проверяю. Вообще-то ограничение в 1Кб, это всё-таки перебор и реальных предпосылок именно для этого ограничения нет. С другой стороны если на каждый примитив добавить по 16Кбайт своей информации, то чертеж вырастет по объему в сотни раз.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
По поводу XRecord мне еще не понятно, из чего состоит из собственное описание, какие у них есть возможности и ограничения, и что ими можно определить.
Ограничений по объему практически никаких. Ограничение на длину строки для строковых и битовых данных - 255 байт. Можно в нём хранить строки, целые и плавающие числа, точки, имена других объектов, битовые поля. Структуру определяешь сам.
Александр Ривилис вне форума  
 
Непрочитано 06.10.2014, 22:58
#52
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


1Кб - Не ограничение, а рекомендация от Kean Walmsley. Если переводить #14:

xData хороши для объема данных около 1Кб, а если нужно больше - то рекомендую использовать ExtDicts + XRecords. Так как слишком велик риск использования расширенных данных для большего объема (более 1 кб/приложение).
Сергей812 вне форума  
 
Непрочитано 06.10.2014, 23:02
#53
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


еще пару ссылок
http://books.google.by/books?id=nByA...page&q&f=false
http://autolisp.ru/2012/04/06/dictionaries/
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 07.10.2014, 04:34
#54
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Вообще-то ограничение в 1Кб, это всё-таки перебор и реальных предпосылок именно для этого ограничения нет
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
xData хороши для объема данных около 1Кб
Почему не 2 кб, не 0.5? Должна быть какая-то аргументация. Допустим, до 1 кб пишется в надежное место, а больше - где данные могут путаться или теряться. Или еще что.

Еще интересно влияние расширенных данных на скорость работы Автокада. Ведь может же быть, что РД меньше влияют на скорость, чем аналогичные объемом графические данные?

Сейчас сделал эксперимент: создал полилинию, присоединил к ней с помощью XDATA.lsp из Express Tools расширенные данные в 30 символьных полей по 100 символов. Размножил этот элемент до 10000 штук. Сделал аналогичную полилинию в другом файле, и размножил ее до 10000 штук.
В файле с XData должно быть 10 000*30*100=30 000 000 байт занято РД. Это 30 мб? (Умею считать как топограф, но не как программист ) Размер же этого файла - 1 291 кб.
Размер файла с аналогичными элементами, но без XData - 700 кб.
Т.е. файлы различаются всего на 0.5 мб. Остальные 29.5 мб РД куда делись? Как-то оптимизировались за счет полной их одинаковости? Или свернулись за счет какого-нибудь "шестнадцатеричного представления"?
Кроме того, XDLIST.lsp время от времени выдавал, что у одного элемента с этими РД свободно примерно 13 кб, то пишет, что свободно 10 кб. Эти 3 кб разницы индикации свободного места в РД откуда берутся? Чаще 10 кб. Может быть Kean Walmsley что-то подобное имел в виду?

Кстати, на моей машине время выделения всех элементов что в файле с РД, что в файле без РД одинаковое - 20 секунд.

Файлы для интереса приложил.
Вложения
Тип файла: dwg
DWG 2004
10000_xd30-100.dwg (1.26 Мб, 1732 просмотров)
Тип файла: dwg
DWG 2004
10000_.dwg (699.7 Кб, 1724 просмотров)
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 07.10.2014, 09:53
#55
Кулик Алексей aka kpblc
Moderator

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


АлексЮстасу, dwg является не только закрытым (то бишь проприетарным) форматом, но еще и архивом в некоторой степени. Ты попробуй сохранять не в dwg, а в dxf версии "пораньше" - и только потом выполняй сравнение.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.10.2014, 10:45
1 | #56
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Мое представление о местах в чертеже, где можно сохранять неграфическую информацию (может быть, поможет Вам разобраться в этом):

1. XDATA, расширенные данные:

+ Есть инструменты в Express Tools для их просмотра и редактирования
+ При создании копии объекта, копируется вместе с ним.
+ Можно использовать эти данные в фильтре выбора объектов с помощью SSGET
+ Может содержать данные, которые модифицируются вместе с объектом встроенными средствами - насколько я помню, пересчитываются данные под определенными кодами в зависимости от поворота или масштаба объекта.

- Ограничение по размеру
- При добавлении нужно регистрировать приложение, с которым связываются данные, что вызывает ряд дополнительных сложностей.

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

2. Object Extension Dictionary, словарь расширения объекта. Принадлежит конкретному объекту чертежа. Может содержать как вложенные словари, так и записи в виде XRECORD.

+ Нет ощутимых ограничений по объему

- Не имеет возможностей XDATA.

Назначение: хранение данных об объекте, размер которых может изменяться. Например - коллекции точек, текстовые описания и т.п.

3. Named Object Dictionary, NOD, словарь именованных объектов чертежа. Один единственный на весь чертеж. Может содержать как вложенные словари, так и записи в виде XRECORD.

+ Нет ощутимых ограничений по объему

- В нем изначально уже есть много словарей, созданных программистами Autodesk, поэтому, нужно быть аккуратным и не нарушить в нем ничего.

Назначение: централизованное хранение информации об объектах чертежа, хранение не связанной с объектами чертежа информации.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)

Последний раз редактировалось Do$, 07.10.2014 в 12:12.
Do$ вне форума  
 
Непрочитано 07.10.2014, 10:51
#57
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Кроме того, XDLIST.lsp время от времени выдавал, что у одного элемента с этими РД свободно примерно 13 кб, то пишет, что свободно 10 кб. Эти 3 кб разницы индикации свободного места в РД откуда берутся? Чаще 10 кб. Может быть Kean Walmsley что-то подобное имел в виду?
Об этом знают достоверно только разработчики Autodesk) Я бы просто не стал работать на граничных условиях, чтобы потом не отлавливать в программе неожиданные ошибки. Вы хотите извлечь из xData по максимум - тогда не забудьте реализовать методы удаления расширенных из чертежа. Чтобы потом смежники не удивлялись размерам файла.

----- добавлено через ~9 ч. -----
И еще представьте вариант - вам нужно скопировать свойства с объекта с одного чертежа на объект на другом чертеже - будете жонглировать чертежами?
Сергей812 вне форума  
 
Автор темы   Непрочитано 07.10.2014, 21:22
#58
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


1. Можно без ограничений ввести в XData строковое поле с длиной больше 255. Пробовал и 257, и 270, и 300 символов. Пробовал с помощью XDATA.lsp из Express Tools. И XDLIST.lsp подтверждала, что такие строки без обрезания созданы. Сохранял-открывал - поля с длиной больше 255 символов сохранялись со всем содержимым.
И только Audit их обрезал до 255
2. Создал XData с 20-ю строками по 250 символов в каждой. Т.е. занял 5 кб. А XDLIST сообщает:
Цитата:
Object has 6316 bytes of Xdata space available.
Т.е., якобы, занято 10 кб. Опять определяется, что занято в два раза больше, чем реально введено.
Добавил еще 20 строк по 250 символов. Т.е. в сумме данные составили 10 кб. Сообщили:
Цитата:
Insufficient Xdata space available on object- no new Xdata appended.
Кто-нибудь с такой разницей между реальным и сообщаемым размером содержимого XData сталкивался? Или это XDATA.lsp неправильно создает, а XDLIST.lsp из Express Tools неправильно сообщает?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 07.10.2014, 21:30
#59
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


всегда существуют накладные расходы.. кроме объема сохраняемых данных.. а вы все продолжаете искать "заначку", как выразился в свое время ShaggyDoc. Успехов.
Сергей812 вне форума  
 
Автор темы   Непрочитано 08.10.2014, 02:36
#60
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
всегда существуют накладные расходы.. кроме объема сохраняемых данных..
Накладные расходы в 50% - это круто.
Сохранил те файлы по совету Кулик Алексей aka kpblc в dxf: без XData - 4 мб, с XData - 36 мб. Из них 30 мб - содержание XData, на "накладные" остается 2 мб.
Если реальные издержки XData составляют примерно 7%, то чем объяснить удвоение расходов допустимого объема, показываемого XDATA.lsp и XDLIST.lsp? Там не просто сообщается о большем, чем занято объеме, но и отказывается присоединять еще данные. Косяки XDATA.lsp и XDLIST.lsp? Или еще что-то?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 08.10.2014, 08:14
#61
zamtmn

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


>>Сохранил те файлы по совету Кулик Алексей aka kpblc в dxf
на объем dxf можно вообще не обращать внимания, текстовое представление бинарных данных - сплошной "накладной расход"
zamtmn вне форума  
 
Непрочитано 08.10.2014, 08:27
#62
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


Глянул тут в спецификацию dxf(2008)
Цитата:
1000-1009 String (same limits as indicated with 0-9 code range)
Цитата:
0-9 String (with the introduction of extended symbol names in AutoCAD 2000, the 255-character
limit has been increased to 2049 single-byte characters not including the newline at the end
of the line)
trir вне форума  
 
Непрочитано 08.10.2014, 10:10
#63
Кулик Алексей aka kpblc
Moderator

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


Дальше сугубо ИМХО. Кто в курсе, подправит.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Или еще что-то?
Или! Один символ кушает 1 байт только в кодировке ANSI. Насколько я понимаю, ACAD использует не ANSI, а в любой другой кодировке (что Win1251, что UTF-8) один символ кушает уже не 1, а 2 байта. Плюс символ окончания строки. Плюс место на регистрацию приложения в документе, плюс регистрация Xdata на примитив, плюс ключи точечных пар... Так что я особо не удивляюсь подобным "потерям".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.10.2014, 10:21
#64
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


2 байта это UTF-16, UTF-8 C = n*5+1 при n>1. Win1251 - 1 байт
dxf
Цитата:
9
$DWGCODEPAGE
3
ANSI_1251
хотя Notepad++ на этот файл говорит "UTF-8 w/o BOM"
trir вне форума  
 
Автор темы   Непрочитано 08.10.2014, 14:10
#65
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,075


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
один символ кушает уже не 1, а 2 байта.
Может быть кто-нибудь смог бы это проверить не средствами XDATA.lsp и XDLIST.lsp из Express Tools? Пока вроде бы получается, что применительно к символьным данным предельный размер XData не 16, а 8 килобайт. (В смысле не 16000, а 8000 символов ). Ведь XDATA.lsp уже показывал свою косячность.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 08.10.2014, 14:18
#66
zamtmn

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


>>хотя Notepad++ на этот файл говорит "UTF-8 w/o BOM"
Зависит от версии, в ранних текст лежит в ANSI_1251 в позних (непомню с какой) в utf-8. $DWGCODEPAGE это не про хранение файла на диске
кроме того текстовые символы могут храниться в виде \U+код, т.е. в виде уникод кодов символов
zamtmn вне форума  
 
Непрочитано 09.10.2014, 02:44
#67
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Зависит от версии, в ранних текст лежит в ANSI_1251 в позних (непомню с какой) в utf-8.
До 2006 включительно - ANSI, с 2007 - UTF-8. Хотя ты правильно сказал, что есть еще и \U+XXXX и \M+XXXXX

АлексЮстасу, не занимайся ерундой. Кроме самих данных из Xdata в dwg-файле хранятся еще и коды. В каком именно виде - мне не интересно, но подозреваю что занимают они не меньше 32 байт на одну группу XData, несмотря на то что сам код занимает не более двух байт.

Цитата:
Сообщение от trir Посмотреть сообщение
Глянул тут в спецификацию dxf(2008)
Цитата:
1000-1009 String (same limits as indicated with 0-9 code range)
Цитата:
0-9 String (with the introduction of extended symbol names in AutoCAD 2000, the 255-character
limit has been increased to 2049 single-byte characters not including the newline at the end
of the line)
Упаси тебя бог от таких экспериментов. В любой момент можешь потерять все данные...
Александр Ривилис вне форума  
 
Непрочитано 09.10.2014, 11:11
#68
zamtmn

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


Александр Ривилис
>>и \M+XXXXX
Мне ниразу не попадалось, это тоже что и \U или нет?
zamtmn вне форума  
 
Непрочитано 09.10.2014, 11:46
#69
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Мне ниразу не попадалось, это тоже что и \U или нет?
Принцип тотже. Подробностей сейчас не вспомню, но если в \U+XXXX (четыре шестнадцатиричных цифры), то в \M+YYYYY (пять шестнадцатиричных цифр). Вроде бы используется в Корейском и китайском, где не хватает обычного Unicode.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Описание xdata



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автокад 2010 виснит намертво при сохранении файла LenaE AutoCAD 18 04.05.2020 12:59
Автокад тормозит при копировании Борисыч123 AutoCAD 35 18.11.2019 09:29
При добавлении XData, блок перестает редактироваться командой _REFEDIT oktilon Программирование 1 05.11.2011 09:43
Размещение здания на участке под коммерческое использование, расстояние к границе участка ValenDz Архитектура 13 27.02.2011 13:42
Ищу способы упрощения работы с XData (расширенными данными) в VBA, Lisp RasRuf LISP 1 29.01.2009 10:55