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

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

Описание xdata

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

Пардон за наивные вопросы - только пытаюсь знакомиться с 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.
Просмотров: 22626
 
Непрочитано 05.10.2014, 16:07
#21
gomer

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


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

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


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


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


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

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


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


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


ищи здесь
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,072


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


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


Код:
[Выделить все]
 ;|=============================================================================
*    Функция преобразования полученного значения в 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,072


Это вроде бы второй код? Предположил, что нужно их собрать в один. Собрал. Запустил первый с указанным примером запуска, пишут:
Цитата:
Команда: (_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,411


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,072


Цитата:
Сообщение от Кулик Алексей 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,411


Цитата:
Сообщение от 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,411


Цитата:
Сообщение от 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,072


Цитата:
Сообщение от 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 вне форума  
Ответ
Вернуться   Форум 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