Как принято, как лучше описывать Xdata у элементов?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как принято, как лучше описывать Xdata у элементов?

Как принято, как лучше описывать Xdata у элементов?

Ответ
Поиск в этой теме
Непрочитано 30.11.2019, 22:19 1 | #1
Как принято, как лучше описывать Xdata у элементов?
АлексЮстасу
 
топограф, технолог
 
Москва
Регистрация: 24.05.2009
Сообщений: 3,072

Допустим, чертим трубы. У труб нужно описать некий индекс, диаметр в мм, длину в м, материал и производителя. (Не важно, не трубы, так провода, не провода, так стены. Не эти х-ки, а любые. Не пять, а двадцать четыре х-ки. Все лишь условный пример).

Допустим, решили для х-к использовать Xdata.
Xdata определяются названием (application name) и входящими в них данными с типами Int, Long, Real, Str и пр.

Я вижу два варианта таких описаний:

Вариант 1. Все х-ки в одном Xdata. Допустим, придаем линии (3Dполилинии, телу - не важно) Xdata с названием "Трубы", в котором определяем одно поле Str для индекса, второе Real для диаметра, третье Real для длины, четвертое Str для материала и пятое Str для производителя. Вроде: "1-Т/22-94", "25.4", "72.6", "ППЭ", "Полипласт".

Вариант 2. Каждая х-ка в своем Xdata. Например: "Трубы_индекс", "Трубы_диаметр_мм", "Трубы_длина_м", "Трубы_материал", "Трубы_производитель".

Кто как чаще делает? Как-то принято? Есть какие-то конвенции? И подводные камни у этих вариантов?
__________________
количество моих сообщений не говорит о знании Автокада
Просмотров: 16228
 
Непрочитано 30.11.2019, 22:33
#2
trir


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


скоро ты познаешь боль во всей её полноте
ибо данные в dwg - это боль
trir вне форума  
 
Автор темы   Непрочитано 30.11.2019, 23:09
#3
АлексЮстасу

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


Я с удовольствием и даже не мазохистским собираю допданные в dwg в виде Object Data и Xrecord.
Но постоянно встречаю упоминания, что используют Xdata.
Хотел бы узнать, как люди их практикуют.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 24.12.2019, 05:21
#4
АлексЮстасу

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


Встретился Вариант 3. Причем, сделанный самим Autodesk в Map 3D.
Команда MAPTOACAD экспортирует данные FDO в dwg, и дает возможность выгружать описательные данные в Xdata.
Например:
* Registered Application Name: SAVE_MAP_TO_AUTOCAD
* Code 1000, ASCII string: _SCHEMA_NAME
* Code 1000, ASCII string: Default
* Code 1000, ASCII string: _TABLE_NAME
* Code 1000, ASCII string: OD_sample_1
* Code 1000, ASCII string: FeatId
* Code 1071, 32-bit signed long integer: 2
* Code 1000, ASCII string: id
* Code 1000, ASCII string: 55
* Code 1000, ASCII string: number
* Code 1071, 32-bit signed long integer: 125
* Code 1000, ASCII string: name
* Code 1000, ASCII string: bank
Название Xdata "SAVE_MAP_TO_AUTOCAD" дается автоматически от сути процесса.
Потом 2 текстовых поля на описание схемы соединения с данными в FDO.
Потом 2 текстовых поля на описание таблицы данных в источнике.
Потом самое интересное - все данные атрибутов выгружаются парами полей Xdata:
- название поля (атрибута) в источнике данных,
- значение поля (атрибута).
Таким образом можно понять, что за данные в каком поле Xdata.
С другой стороны, это может быть слишком затратно т.к. названия полей (атрибутов) могут быть достаточно длинными, и их может быть много.
Но ведь Autodesk на это пошел. Вероятно, предполагая, что вряд ли пользователи запишут при отдельном объекте больше, чем на 16К...
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 24.12.2019, 07:38
#5
trir


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


вот об этом я и говорил - дофига оверхеда и это ещё нифига не индексируется

Последний раз редактировалось trir, 24.12.2019 в 08:09.
trir вне форума  
 
Непрочитано 24.12.2019, 08:40
#6
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
С другой стороны, это может быть слишком затратно т.к. названия полей (атрибутов) могут быть достаточно длинными, и их может быть много.
Но ведь Autodesk на это пошел. Вероятно, предполагая, что вряд ли пользователи запишут при отдельном объекте больше, чем на 16К...
Если названия полей повторяются, то можно их вынести в отдельный словарь, например - а в XData писать лишь целочисленный ключ. XData - всего лишь бинарный поток значений, все остальное - это уже внешняя интерпретация.
Сергей812 вне форума  
 
Непрочитано 24.12.2019, 11:01
#7
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если названия полей повторяются, то можно их вынести в отдельный словарь, например - а в XData писать лишь целочисленный ключ. XData - всего лишь бинарный поток значений, все остальное - это уже внешняя интерпретация.
А еще проще - можно в имени слоя дать номер позиции в базе данных, а к базе данных отдельно обращаться.
Ибо, зачем из базы тащить кучу значений в объект, если эти значения уже есть в базе?

А если в базе была ошибка в значении параметров - нужно во всех файлах переприкрепить данные. Это не кипитсимплступид совсем.

Последний раз редактировалось nickname2019, 24.12.2019 в 11:14.
nickname2019 вне форума  
 
Непрочитано 24.12.2019, 11:27
#8
trir


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


а можно просто работать с базой напрямую
trir вне форума  
 
Непрочитано 24.12.2019, 11:51
#9
ShaggyDoc

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


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

А хранить так надо только то, что относится непосредственно к средствам рисования Автокада.
Всё остальное - "семантика", а иногда и пространственные данные должно храниться во внешне базе данных. Причем совсем не обязательно в "рекомендуемых лучшими автодесками".

Внутри Автокада должны быть только связанные с примитивами указатели на базу данных, таблицу и код записи. Любыми способами, как вариант - XDATA. При этом на одну запись в БД могут ссылаться самые разные примитивы, любых типов, в разных слоях.

Вся работа с БД - не средствами Автокада (их полно). БД может вестись совершенно независимо и может использоваться и другими системами.

Цитата:
Сообщение от nickname2019 Посмотреть сообщение
А еще проще - можно в имени слоя дать номер позиции в базе данных
"Иная простота хуже воровства". Сколько таких слоев понадобится?
ShaggyDoc вне форума  
 
Непрочитано 24.12.2019, 11:53
#10
Сергей812


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


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
А еще проще - можно в имени слоя дать номер позиции в базе данных, а к базе данных отдельно обращаться.
Ибо, зачем из базы тащить кучу значений в объект, если эти значения уже есть в базе?

А если в базе была ошибка в значении параметров - нужно во всех файлах переприкрепить данные. Это не кипитсимплступид совсем.
Ну Аутодеск решил так реализовать) А еще проще - в XData хранить идентификатор на строку БД и не надо страдать фигней с созданием идентификационной системы слоев и т.п.
Сергей812 вне форума  
 
Непрочитано 24.12.2019, 11:57
#11
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
"Иная простота хуже воровства". Сколько таких слоев понадобится?
Штук 20-40 на файл как максимум если мы говорим о линейных объектах (трубы, кабели и т.д.). Список используемых сортаментов обычно ограничен. Для сложных объектов - есть блоки.
nickname2019 вне форума  
 
Непрочитано 24.12.2019, 11:58
#12
Сергей812


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
"Иная простота хуже воровства". Сколько таких слоев понадобится?
а если вдруг (хотя это редкость большая) появиться заказчик со своим стандартом оформления - система автоматизации на слоях накрывается медным тазом)

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Штук 20-40 на файл как максимум если мы говорим о линейных объектах (трубы, кабели и т.д.). Список используемых сортаментов обычно ограничен. Для сложных объектов - есть блоки.
БД ведется общая как бы, иначе какой смысл в ней - если под каждый объект заново ее делать.
Сергей812 вне форума  
 
Непрочитано 24.12.2019, 12:00
#13
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
а если вдруг (хотя это редкость большая) появиться заказчик со своим стандартом оформления - система автоматизации на слоях накрывается медным тазом)
Если настолько крут, что разобрался как закодировать информацию по слоям и связать с базой - переименовать слои перед сдачей (печатью) - раз плюнуть.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
БД ведется общая как бы, иначе какой смысл в ней - если под каждый объект заново ее делать.
Да не надо ничего.
Создал слой "Уголок 125х8 ГОСТ... " - а программно можно связать с общей базой данных по некоторому правилу.

----- добавлено через ~6 мин. -----
Цитата:
Сообщение от trir Посмотреть сообщение
а можно просто работать с базой напрямую
Это намек на очередной БИМ?
nickname2019 вне форума  
 
Непрочитано 24.12.2019, 12:12
#14
Сергей812


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


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Создал слой "Уголок 125х8 ГОСТ... " - а программно можно связать с общей базой данных по некоторому правилу.
По некоторому?) В БД будет "Уголок" (общий тип), "Размер1", "Размер2", "ГОСТ такой то" - захотите то хороший фильтр и поиск иметь же...
Сергей812 вне форума  
 
Непрочитано 24.12.2019, 12:15
1 | #15
trir


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


Цитата:
Это намек на очередной БИМ?
это намёк на FDO

Цитата:
в XData хранить идентификатор на строку БД и не надо страдать фигней с созданием идентификационной системы слоев и т.п.
или просто хранить handle в бд
trir вне форума  
 
Непрочитано 24.12.2019, 12:16
#16
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
По некоторому?) В БД будет "Уголок" (общий тип), "Размер1", "Размер2", "ГОСТ такой то" - захотите то хороший фильтр и поиск иметь же...
В слое достаточно иметь только:
1. Идентификатор сортамента
2. Номер позиции в сортаменте

Длины и геометрия определяются объектами, которые нарисованы в соответствующем слое (для линейных объектов и плоскостных иногда - тоже).

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

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от trir Посмотреть сообщение
это намёк на FDO[/url]
Спасибо. Не знал. Было интересно.
nickname2019 вне форума  
 
Непрочитано 24.12.2019, 12:23
#17
Сергей812


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


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
В слое достаточно иметь только:
1. Идентификатор сортамента
2. Номер позиции в сортаменте
Слой является производным - в БД прописано, на каком слое должен размещаться данный элемент. Но не обязательно)

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от trir Посмотреть сообщение
или просто хранить handle в бд
хэндл гарантированно уникален только внутри одного чертежа.
Сергей812 вне форума  
 
Непрочитано 24.12.2019, 12:27
#18
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
хэндл гарантированно уникален только внутри одного чертежа.
Видимо, имелся ввиду хендл, который в ФДО (https://habr.com/ru/post/271109/).
nickname2019 вне форума  
 
Непрочитано 24.12.2019, 12:34
#19
trir


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


Цитата:
хэндл гарантированно уникален только внутри одного чертежа.
просто нужно убедится, что ты в нужном чертеже
trir вне форума  
 
Непрочитано 24.12.2019, 12:37
#20
Сергей812


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


Цитата:
Сообщение от trir Посмотреть сообщение
просто нужно убедится, что ты в нужном чертеже
просто нужно записать в расширенные данные примитива Primary Key, предоставленный БД - а не заниматься поиском дополнительных проблем)
Сергей812 вне форума  
 
Непрочитано 24.12.2019, 13:11
#21
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от trir Посмотреть сообщение
И радостно порушить все после выполнения, например, _.-wblock. Или внедрения ссылки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.12.2019, 14:49
#22
АлексЮстасу

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


Судя по разным форумам и личному внефорумному опыту, хранение описательных данных в Xdata достаточно распространено.
Можно относиться к этому, как к порочному - как почти все сейчас высказавшиеся.
Но не откликнулся пока никто собственно в тему.
Поделитесь подходами к передаче описательных данных в Xdata.
Я изложил три возможных варианта. Какими кто пользуется? Или есть свои варианты?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 24.12.2019, 15:16
#23
Сергей812


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


Вар4. В отдельном AppName XData хранится Primary Key БД. Т.е. унифицированный механизм, преобразующий хэндл примитива и имя файла в логический ключ. А дальше делайте что хотите - привязывайте данные, формируйте логические взаимосвязи - главное, что dwg файл (как некий черный ящик) в этом участвует по минимуму)
Сергей812 вне форума  
 
Автор темы   Непрочитано 24.12.2019, 17:43
#24
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Вар4. В отдельном AppName XData хранится Primary Key БД. Т.е. унифицированный механизм, преобразующий хэндл примитива и имя файла в логический ключ. А дальше делайте что хотите - привязывайте данные, формируйте логические взаимосвязи - главное, что dwg файл (как некий черный ящик) в этом участвует по минимуму)
Это не отдельный вариант. Это можно сделать любым из трех найденных сейчас вариантов. (Для Вашего случая первые два не отличаются).
Здесь вопрос не что, а как.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 24.12.2019, 18:20
#25
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Это не отдельный вариант. Это можно сделать любым из трех найденных сейчас вариантов. (Для Вашего случая первые два не отличаются).
ну если для вас это одно и тоже - пихать все в XData, или только ссылку в виде числа/строки...)

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Здесь вопрос не что, а как.
Вы ожидаете готовое решение или код?
Сергей812 вне форума  
 
Автор темы   Непрочитано 24.12.2019, 18:39
#26
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну если для вас это одно и тоже - пихать все в XData, или только ссылку в виде числа/строки...)
Это для кого угодно одно и то же - "пихать в Xdata" Primary Key БД первым или вторым вариантом.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Вы ожидаете готовое решение или код?
Я ожидаю рассказов, примеров, кто как хранит данные в XData.
Такая здесь тема.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 24.12.2019, 18:50
#27
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Это для кого угодно одно и то же - "пихать в Xdata" Primary Key БД первым или вторым вариантом.
Ну тогда смысл вам что-то рассказывать?) Ваши три варианта: все данные хранятся последовательно в одной "записи" (любая модификация состава данных превращается в увлекательнейший "геморрой"), опять же все данные классифицируются по имени приложения (первый пост в шапке), и все данные пишутся в формате пар {Имя параметра - Значение} (все та же ссылка - про строковые значения). Ну если ставите перед собой задачу максимально забить XData своими значениями, ну и заодно размер файл подраздуть - чтобы больше было соблазна воспользоваться советами по уменьшению размера файла и снести всю автоматизацию нафиг..).
Сергей812 вне форума  
 
Автор темы   Непрочитано 24.12.2019, 20:34
#28
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Ваши три варианта: все данные хранятся последовательно в одной "записи" (любая модификация состава данных превращается в увлекательнейший "геморрой")
Это и есть вопрос данной темы. Как разные люди решают задачу такой неудобной и уязвимой формы хранения данных, как Xdata?
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Ну если ставите перед собой задачу максимально забить XData своими значениями..).
Вот и хотелось узнать, что, а, главное, как люди в XData записывают.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 24.12.2019, 21:31
#29
trir


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


SPDS Extension записывает xml в dwg, а мы потом ловим fatal error через раз...
trir вне форума  
 
Автор темы   Непрочитано 24.12.2019, 21:53
#30
АлексЮстасу

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


Цитата:
Сообщение от trir Посмотреть сообщение
SPDS Extension записывает xml в dwg, а мы потом ловим fatal error через раз...
Ээээ... Ни разу еще не встречал суждений или свидетельств, что Xdata создают какие-либо проблемы для dwg, AutoCAD.
Но эта тема не о надежности и т.п. Xdata, а о том, как их используют.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 24.12.2019, 21:59
#31
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Но эта тема не о надежности и т.п. Xdata, а о том, как их используют.
Ну поскольку вы мужественно бегаете от любого упоминания внешней нормальной БД - то для вас любой из трех вариантов, все равно
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
XData - всего лишь бинарный поток значений, все остальное - это уже внешняя интерпретация.
Сергей812 вне форума  
 
Непрочитано 24.12.2019, 22:01
#32
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от trir Посмотреть сообщение
SPDS Extension записывает xml в dwg, а мы потом ловим fatal error через раз...
xml?? в dwg?!?! Да лааааадно!
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
а о том, как их используют.
Никак. Есть более устойчивые и менее доступные пользователю методы и средства.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.12.2019, 22:23
#33
АлексЮстасу

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Никак.
Регулярно вижу на совсем разных форумах поминание Xdata. Да хоть на ADN.
В Electrical по жизни используются Xdata.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Есть более устойчивые и менее доступные пользователю методы и средства.
В этой теме не об этом.
Как раз жду ответы от пользующихся.
Или от тех, у кого есть примеры применения.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 24.12.2019, 22:32
#34
Кулик Алексей aka kpblc
Moderator

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


Offtop:
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Регулярно вижу на совсем разных форумах поминание Xdata. Да хоть на ADN.
В Electrical по жизни используются Xdata.
В этой теме не об этом.
Частота упоминания не гарантирует, что это единственный вариант.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Как раз жду ответы от пользующихся.
Или от тех, у кого есть примеры применения.
Тогда больше не мешаюсь
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.12.2019, 22:45
#35
Сергей812


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


Offtop:
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Как раз жду ответы от пользующихся.
и уточните, в каком виде ждете ответов)
Сергей812 вне форума  
 
Непрочитано 24.12.2019, 23:50
1 | #36
__Valdemar


 
Регистрация: 24.12.2019
Сообщений: 3


Использую Xdata при проектировании линейных объектов (газопроводов), в том числе:
- для хранения в блоках пикетов трассы метки вхождения блока, содержащего информацию о типе тубы;
- для хранения в блоке конкретного пикета метки "его" мультивыноски (своего рода параметризация при автоматической аннотации пикетов);
- для быстрого доступа к локальным или удаленным ресурсам (к файлам txt/pdf/doc и т.п.) через встроенный в AutoCAD механизм гиперссылок. Подвел курсор мыши к полилинии ветки газопровода, нажал Ctl+ЛКМ и открылась таблица с полным описанием ее пикетов...
- для хранения параметров (например длины) продольного профиля при оформлении листов.
Низкоуровневые функции для работы с Xdata в свое время вполне прилично были обернуты уважаемыми создателями ruCAD-а. А упомянутый Electrical имеет свой набор команд включая диалоговый (!) редактор Xdata, функций и API для lisp-творчества.
По моему, для "кухни" рисунка линейного объекта, которая д.б. скрыта от "теток" - самое место в Xdata.
__Valdemar вне форума  
 
Непрочитано 25.12.2019, 06:46
1 | 2 #37
ShaggyDoc

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


Примеры? Да пожалуйста:

Код:
[Выделить все]
 (defun ru-xdata-add-for-ent (ename xd)
  (entmod (append (entget ename) (list xd)))
)

(defun ru-xdata-write-for-ent (ename xdata_list app_name / ent_list xdata)
			      ;|
Добавляет расширенные данные к примитиву
 ename - имя примитива
 xdata_list - список расширенных данных
 app_name - имя зарегистрированного приложения
Возвращает список данных примитива или NIL при ошибке


Допустимые типы данных  (STR, REAL,INT, LIST).
Метки примитивов должны быть с префиксом #
Точки  записываются в группу 1010 как список из трех REAL
Вложенный список помечается {} в первом элементе списка
с помощью ru-xdata-add-list-bracket
|;
  (setq
    xdata    (reverse (_xdata-write xdata_list))
    xdata    (list -3 (cons app_name xdata))
    ent_list (append (entget ename) (list xdata))
  ) 
  (entmod ent_list)
  ent_list
)

(defun _xdata-write (xdata_list / xdata xdata_tmp item)
  (setq xdata '())
  (foreach item	xdata_list
    (cond
      ((and (= (type item) 'list) (= (car item) "{}"))
       (setq
	 xdata_tmp (cons (cons 1002 "}") (_xdata-write (cdr item)))
	 xdata_tmp (append xdata_tmp (list (cons 1002 "{")))
	 xdata	   (append xdata_tmp xdata)
       ) 
      )
      ((and (= (type item) 'list) (= (length item) 3))
       (setq xdata (cons (cons 1010 item) xdata))
      )
      ((and (= (type item) 'STR) (= (substr item 1 1) "#"))
       (setq xdata (cons (cons 1005 (substr item 2)) xdata))
      )
      ((= (type item) 'STR)
       (setq xdata (cons (cons 1000 item) xdata))
      )
      ((= (type item) 'INT)
       (setq xdata (cons (cons 1070 item) xdata))
      )
      ((= (type item) 'REAL)
       (setq xdata (cons (cons 1040 item) xdata))
      )
    ) 
  ) 
  xdata
)
Это ответ на
Цитата:
Вот и хотелось узнать, что, а, главное, как люди в XData записывают
Правда я это не "люди", а так, прохожий мимо людей...

Ну и еще несколько подобных библиотечных функций (добавлять, читать). Хоть для слоя, хоть для любого примитива, хоть для каждой вершины полилинии. "Хоть тушкой, хоть чучелом".

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


Для каких целей применять - другое дело. Я, например, применяю для проверки соответствия имен слоев топографии специальному классификатору. Или для привязки "ёжика" временных осей координат при создании 3D-объектов. Но это всё внутри Автокада. И "упоминание XDATA" у меня также имеется.

Да, это программным путем (в данном случае - Лисп), а не щелканьем по кнопкам.

А в целом тема напоминает приставание ребенка - "Дяденьки, расскажите как лижут железные ручки на морозе". Дяденьки говорят - "Не надо вообще лизать железо на морозе", а оно опять - "А вот пацаны в Electrical лижут! Я тоже хочу быть крутым пацаном".
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 26.12.2019, 04:20
#38
АлексЮстасу

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


Цитата:
Сообщение от __Valdemar Посмотреть сообщение
Использую Xdata
Как Вы записываете данные? Вариантом 1, 2, 3 или как-то еще?
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Примеры? Да пожалуйста:
Я спрашивал примеры не чем, а как. Например, см. в #4.
Варианты 2 и 3 дают информацию, что в каком поле Xdata записано. Я не программист, и по Вашему коду не могу разобраться, какой вариант используете Вы.

1. Я сам вообще никогда, ни разу не использовал Xdata.
2. Не планирую в обозримом будущем использовать Xdata. Т.к. использую Object Data из Map 3D и Xrecord для AutoCAD.
3. Не пропагандирую применять Xdata.

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

В этой теме прошу поделиться сведениями, опытом. В первую очередь как определяют, что в каком поле, фрагменте Xdata записано.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 26.12.2019, 07:25
#39
ShaggyDoc

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Я не программист, и по Вашему коду не могу разобраться, какой вариант используете Вы
а без этого бессмысленен
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
ознакомительно-исследовательский интерес
потому что узнать
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
как определяют, что в каком поле, фрагменте Xdata записано
с помощью "кнопок" нельзя. Это та область, где необходимо действовать именно программно, причем можно использовать любые средства, доступные в AutoCAD.

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

Это как, например, в любой программе, работающей с базой данных - обычный пользователь видит названия каких-то граф или строк ввода данных (DisplayLabel), но не видит имена полей и их свойства. С этим можно разобраться только применяя спецсредства или анализируя код программы. Даже в исследовательских целях.

Для примера - картинка. На ней показана единица торгового оборудования, примененного в проекте. Оборудование внутри Автокада в виде 3D-моделей. Щелкнув специальную кнопку, пользователь видит все данные именно по этой позиции.

Разумеется их нельзя запихнуть внутрь Автокада ни в какие "хрен-данные". А вот ссылку на БД и код записи - можно. Сами данные хранятся во внешней БД, о местонахождении которой пользователь и не знает.

Возможно и обратное действие - открыв БД специальной кнопкой в Автокаде выбрать нужное изделие и внутри БД щелкнуть кнопку Выбрать. И именно это изделие будет "нарисовано" в Автокаде уже его средствами, и к его рисунку будет привязана ссылка. Причем БД сама "знает", как именно должна рисоваться эта позиция и "говорит" Автокаду. Причем самым простым образом - хранится метод рисования, а это всего лишь строчка ЛИСП-выражения. Причем метод может быть любым - хоть вставка блока, хоть специальная функция создания объектов.

А еще и без Автокада может быть и сформирована СО из примененных изделий, в виде полностью готового Отчета в формате PDF.

Разумется подобное можно делать и в ГИС, только привязывать, например к полилиниям, изображающим контур зданий информацию о зданиях. Наподобие того, как в Дубль-ГИС сделано.

Ну и попутно о высказывающейся идее "слой на позицию". Вот только в БД торгового оборудования 732 позиции, а еще есть несколько десятков других, в некоторых из них более 5000 позиций. Какие тут могут быть слои?
Миниатюры
Нажмите на изображение для увеличения
Название: db_rec_so.png
Просмотров: 51
Размер:	43.2 Кб
ID:	221587  
ShaggyDoc вне форума  
 
Непрочитано 26.12.2019, 14:33
#40
Сергей812


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


Это же блог ТС ?
Сергей812 вне форума  
 
Непрочитано 26.12.2019, 15:15
#41
ShaggyDoc

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Это же блог ТС ?
Видимо там описывается система, сложившаяся еще в AutoCAD R.10, когда еще никаких средств для хранения информации кроме атрибутов не было. И Autodesk демонстрировала примеры с извлечением данных из атрибутов, с самым простейшим примером - блоки оборудования.

Нам тоже тогда приходилось делать InCAD - "ГИС на базе Автокад". Там блоками создавались объекты (точечные, линейные, площадные), но в скрытых атрибутах были уже ссылки на БД.

Это были времена DOS, БД велись в Clipper. Геометрия объектов хранилась в БД, причем в специальном формате, в котором Clipper читал и записывал массивы чисел, наподобие {{x1,y1}{x2,y2}...{xn,yn}}.

В результате, имея БД можно было в пустом чертеже создать все "информационные" объекты. Они накладывались на топографию, сделанную средствами этой же системы, но в виде обычных примитивов. Три города так были оцифрованы.

Система несколько лет работала, потом перешли уже под Win95 и AutoCAD R14. Вот там уже были более серьезные возможности.

Потом от Автокадов совсем ушли, но все данные, вместе с геометрией, перекочевали в другие ГИС.

Но самое большое извращение я видел, когда информацию, требуемую для извлечения в СО хранили в именах блоков.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 26.12.2019, 15:20
#42
АлексЮстасу

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Это та область, где необходимо действовать именно программно...
Вопрос в том, что в Xdata поля определяются только типом и позицией относительно других полей. Из-за этого никакими средствами, ни "кнопками", ни программно понять, что в этом поле Int записан "номер", а в этом "количество" невозможно. Эта информация просто отсутствует. Вообще.
В т.ч. и потому, что названия "application" в Xdata не определяют ничего - любые два одноименных Xdata могут иметь совершенно разную структуру полей.
Поэтому и интересно, как разные люди решают эту проблему - проблему определения что где в Xdata.
Я нашел два варианта решения - 2-й, когда в каждом Xdata только одно поле, а его назначение дается в названии "application", и 3-й, когда поля всегда описываются парами: название, содержание.
Оба, конечно, фиговые. Но кто-то же мог уже найти способы получше.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Это же блог ТС ?
Там в статьях о том, что Xdata и Xrecord лучше, чем атрибуты. В принципе, как подход. И там же про отвратительную реализацию их самих для пользователей.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 26.12.2019, 17:42
#43
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Вопрос в том, что в Xdata поля определяются только типом и позицией относительно других полей. Из-за этого никакими средствами, ни "кнопками", ни программно понять, что в этом поле Int записан "номер", а в этом "количество" невозможно. Эта информация просто отсутствует. Вообще.
как отсутствует возможность для обычных пользователей залезать в эти XData, т.е. изначально они ориентированы под программные надстройки (ET тоже надстройка). Ограничение на объем данных - ссылку выше давал уже, хотите хранить все в XData - храните, никто не запрещает. Первый ваш вариант - храните в начале байт или два, определяющий версию данных и считывайте в зависимости от их значения последующие поля. Или первое число рассматривайте как битовое поле, определяющее - какие поля будут пропущены в дальнейшем в XData. Это все для экономии места, структура данных при этом будет "жесткая". И т.д. Но какой смысл это с вами обсуждать, если вы все равно
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Я не программист,
а доступа без программирования к XData нет.
Сергей812 вне форума  
 
Автор темы   Непрочитано 26.12.2019, 20:18
#44
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
как отсутствует возможность для обычных пользователей залезать в эти XData, т.е. изначально они ориентированы под программные надстройки
Во-первых, не факт, что "изначально они ориентированы под программные надстройки". Общее место, что в AutoCAD нечто есть, но слабо или очень слабо или почти никак не обеспечено пользовательскими инструментами.
Во-вторых, дополнительные/расширенные/описательные данные так же нужны пользователям, как и программистам. Пользователям больше. Иначе бы не изобретали, не пользовались издревле и до сих пор костылем в виде атрибутов.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
храните в начале байт или два, определяющий версию данных и считывайте в зависимости от их значения последующие поля. Или первое число рассматривайте как битовое поле, определяющее - какие поля будут пропущены в дальнейшем в XData.
Вы, похоже, так и не прочитали исходный вопрос, и его повторы в постах. Как это поможет определить, что вот это строковое поле для названий, а другое для адреса, а третье для ID и т.п.?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 26.12.2019, 20:31
#45
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Как это поможет определить, что вот это строковое поле для названий, а другое для адреса, а третье для ID и т.п.?
для кого определить? Вот для атрибутов блоков, о которых вы так пренебрежительно отзываетесь
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
не пользовались издревле и до сих пор костылем в виде атрибутов.
есть штатное средство создания заготовок отчетов в виде извлечения данных. А с вашими даже идентифицированными по типу хранимой информации "полями" в XData что делать дальше?
Сергей812 вне форума  
 
Автор темы   Непрочитано 26.12.2019, 20:59
#46
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Вот для атрибутов блоков, о которых вы так пренебрежительно отзываетесь
Не приписывайте мне своего. Я атрибуты всячески люблю. А вот их использование в качестве альтернативы описательным данным - типичный костыль. "Костыль" - это применение чего-либо не по назначению, несмотря на непригодность или относительную непригодность.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А с вашими даже идентифицированными по типу хранимой информации "полями" в XData что делать дальше?
Очевидно же что делать - дать пользователям достаточный набор инструментов работы с XData. (А лучше не с ними из-за их врожденных пороков).

Но, опять-таки, это очередное отклонение от темы - здесь не вопрос об использовании XData, а о том, как обеспечить определенность их содержания.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 26.12.2019, 21:13
#47
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
это очередное отклонение от темы - здесь не вопрос об использовании XData, а о том, как обеспечить определенность их содержания.
Это не очередное отклонение от темы - а вы зациклились на своих описательных характеристиках, хотя это лишь верхушка айсберга. Без дальнейшего использования этих характеристик для формирования взаимосвязей, расчетов, создания отчетов и т.п. - это мертвый груз. А дальнейшая обработка с хранением всех данных в контейнере последовательного доступа типа XData - все равно их придется куда-то извлекать для этой обработки с целью убыстрения и упрощения, и тогда и будет их нужная интерпретация...
Сергей812 вне форума  
 
Автор темы   Непрочитано 26.12.2019, 21:56
#48
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
вы зациклились на своих описательных характеристиках, хотя это лишь верхушка айсберга. Без дальнейшего использования этих характеристик для формирования взаимосвязей, расчетов, создания отчетов и т.п. - это мертвый груз. А дальнейшая обработка с хранением всех данных в контейнере последовательного доступа типа XData - все равно их придется куда-то извлекать для этой обработки с целью убыстрения и упрощения, и тогда и будет их нужная интерпретация...
Вопрос определенности XData абсолютно одинаков для любого их содержания. Как узнать, что именно "извлекаете" и что именно "обрабатываете" из XData?
"...тогда и будет их нужная интерпретация" - возникнет волшебным образом? Сама?
Раз Вы знаете секрет, как определить, что в таком-то поле XData описана взаимосвязь, а в таком-то "Primary Key БД", а не наоборот или не что-то еще другое и т.п., то поделитесь же, наконец.
Тема именно об этом.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 26.12.2019, 22:13
#49
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
что в таком-то поле XData описана взаимосвязь, а в таком-то "Primary Key БД", а не наоборот
уже писал
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Вар4. В отдельном AppName XData хранится Primary Key БД. Т.е. унифицированный механизм, преобразующий хэндл примитива и имя файла в логический ключ. А дальше делайте что хотите - привязывайте данные, формируйте логические взаимосвязи - главное, что dwg файл (как некий черный ящик) в этом участвует по минимуму)
имя приложения %AppName% именно под ключ БД зарезервировано и больше в нем ничего не храниться. Пару статических функций в коде, умеющих делать всего одну вещь - получить значение ключа или записать его в XData любого примитива. А все дополнительные свойства - это соответствующие столбцы таблиц внешней БД. Связи между элементами формируете тоже во внешней БД через дополнительные таблицы.
Сергей812 вне форума  
 
Непрочитано 26.12.2019, 22:47
#50
__Valdemar


 
Регистрация: 24.12.2019
Сообщений: 3


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Как узнать, что именно "извлекаете" и что именно "обрабатываете" из XData?
А как мы определяем что сохраняем и потом извлекаем и обрабатываем в локальных (или глобальных) переменных в программном коде (например, на лисп)? Структурой данных и логикой программы. Если принять что application в xdata это имя переменной для хранения значения, то хранимую в них информацию можно жестко структурировать. Записать в виде строки можно длинный и сложный список. Например, такой, какой мы получаем, когда обращаемся из lisp к БД SQL-запросом.
Те же (проверенные временем) атрибуты - в них любые значения (строки, метки, натуральные и вещественные числа) хранятся в виде строк, которые при извлечении сначала интерпретируются, а затем используются должным образом. В любом случае в документе все храниться в бинарном виде.
__Valdemar вне форума  
 
Автор темы   Непрочитано 27.12.2019, 01:31
#51
АлексЮстасу

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


Цитата:
Сообщение от __Valdemar Посмотреть сообщение
А как мы определяем что сохраняем и потом извлекаем и обрабатываем в локальных (или глобальных) переменных в программном коде (например, на лисп)? Структурой данных и логикой программы.
Во-первых, переменные имеют уникальные названия, и ничего, кроме единственных значений в них нет. Во-вторых, логика программы, структура данных записаны в ее коде, и можно все узнать и разобраться.
Цитата:
Сообщение от __Valdemar Посмотреть сообщение
Если принять что application в xdata это имя переменной для хранения значения, то хранимую в них информацию можно жестко структурировать.
Можно жестко структурировать. Но ничто не мешает появляться Xdata с теми же названиями, но с другой структурой. Защитного механизма для Xdata от этого нет.
И, получив от кого-то данные, не имея соответствующих программ, как определить, что где в Xdata записано?
Цитата:
Сообщение от __Valdemar Посмотреть сообщение
Те же (проверенные временем) атрибуты - в них любые значения (строки, метки, натуральные и вещественные числа) хранятся в виде строк, которые при извлечении сначала интерпретируются, а затем используются должным образом.
Именно что. У атрибутов есть названия "полей" - названия тегов, уникальные в пределах блока. И у блоков уникальные названия в пределах dwg. Даже при копировании одноименных блоков с другим набором атрибутов после ATTSYNC они будут приведены к одному виду.
Т.е. у атрибутов блоков есть такой защитный механизм, обеспечивающий однозначность определения какой атрибут что содержит.

Придумал еще три варианта:
Вариант 4. В неубиваемом месте dwg хранить Xdata, описывающих нужную структуру используемых application.
Вариант 5. Каждому элементу, к которому присоединяется Xdata с данными, добавлять специальные Xdata с описанием соответствующей структуры.
Вариант 6. Отвести первое строчное поле каждого Xdata под хранение его описания.
Вроде: "Полей: 5; 1 - Long, ID; 2 - Str, Название; 3 - Real, Диаметр; 4- Str, Материал; 5 - Str, Тип". Или т.п.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 27.12.2019, 02:28
#52
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Придумал еще три варианта:
Вариант 4. В неубиваемом месте dwg хранить Xdata, описывающих нужную структуру используемых application.
Вариант 5. Каждому элементу, к которому присоединяется Xdata с данными, добавлять специальные Xdata с описанием соответствующей структуры.
Вариант 6. Отвести первое строчное поле каждого Xdata под хранение его описания.
Вроде: "Полей: 5; 1 - Long, ID; 2 - Str, Название; 3 - Real, Диаметр; 4- Str, Материал; 5 - Str, Тип". Или т.п.
чудеса велосипедостроения... Вы всерьез думаете, что среди пользователей акада столько программистов-самоучек, прямо так горящих желанием внести деструктивные действия в ваши XData?) Уровень большинства пользователей максимум - это снести все эти скрытые данные в процессе очистки/уменьшения чертежа.
Сергей812 вне форума  
 
Непрочитано 27.12.2019, 06:35
#53
ShaggyDoc

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
чудеса велосипедостроения...
Вот именно. Потому что всё это

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Вроде: "Полей: 5; 1 - Long, ID; 2 - Str, Название; 3 - Real, Диаметр; 4- Str, Материал; 5 - Str, Тип". Или т.п.
описано в структуре таблицы базы данных. И это совершено незачем хранить в Автокаде. Тем более, что структура БД может и изменяться, а в ней могут быть разнообразные связи между таблицами.

АлексЮстасу никак не может смириться, что базовый AutoCAD - всего лишь "шасси" для разработки предметных приложений. "Вертикальных", "Горизонтальных", "Наискосячных". И все они создаются в результате программирования.

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Вопрос определенности XData абсолютно одинаков для любого их содержания. Как узнать, что именно "извлекаете" и что именно "обрабатываете" из XData?
А это знает программист и это совершенно не нужно (и вредно) знать пользователю. Он вообще не должен подозревать о существовании каких-то XDATA. Так же, как не знает, что вводя, например точку он изменяет базу данных самого Автокада.

Но программист, использующий координаты точек, знает об этом. Им обновляет БД чертежа, причем тремя способами.

Так же, как конечному пользователю СУБД просто вредно знать имена полей, типы данных и прочее. Он видит "русские" заголовки и может ввести только дозволенные данные. Например только числа, да еще в заданном диапазоне, или только строку из доступного списка. Причем он и не знает, что в таблице, которую он видит глазами, на самом деле будет не строка, а число. А сама строка хранится в другой таблице, а иногда и в другой БД.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 27.12.2019, 22:40
#54
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Вы всерьез думаете, что среди пользователей акада столько программистов-самоучек, прямо так горящих желанием внести деструктивные действия в ваши XData?)
Фактически так и поисходит.
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А это знает программист и это совершенно не нужно (и вредно) знать пользователю. Он вообще не должен подозревать о существовании каких-то XDATA.
Разве спорю? Лишь оговорю, что кроме условных "теток" и программистов еще есть организаторы, техподдержка, технологи и т.п., которым нужно понимать много больше пользователей.

Есть большой класс процессов - обмен данными. В т.ч. нужные данные могут быть в Xdata. (Льзя-нельзя, правильно-неправильно - не в этой теме).
(Так же, как во внешних БД, в Xrecord, в Object Data из Map, Property Sets из Civil, Architecture, MEP, в атрибутах...).

Здесь вопрос о том, как можно записывать в Xdata данные так, чтобы их могли полно и правильно интерпретировать другие. Не Вы сами, а другие. Без Вашего участия, вашего кода и пр. Как это можно сделать с атрибутами, Property Sets и т.п.

У Варианта 4 недостаток, что всегда можно создать Xdata с тем же названием, но другой структуры. Т.е. общее для dwg описание Xdata перестанет быть действительным.
У Варианта 6 недостаток, что в строчном поле Xdata можно записать только 255 (или 259?) символов. Точнее, записать можно хоть 8000, но первый же AUDIT их обрежет. 255 явно мало.
Варианты 2, 3, 5, вроде, неплохи. Самый надежный, однозначный, похоже, Вариант 2. См. первый пост.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 27.12.2019, 23:10
#55
trir


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


Цитата:
как можно записывать в Xdata данные так, чтобы их могли полно и правильно интерпретировать другие. Не Вы сами, а другие.
никак
trir вне форума  
 
Непрочитано 27.12.2019, 23:43
#56
Сергей812


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


Цитата:
Сообщение от trir Посмотреть сообщение
никак
Бессмысленно, АлексЮстасу на своей волне - ему даже в голову не приходит, что пытаться делать универсальный формат обмена данными с хранением внутри проприетарного dwg - это изначально тупиковая затея)
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.12.2019, 01:27
#57
АлексЮстасу

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


Цитата:
Сообщение от trir Посмотреть сообщение
никак
Вариант 2 позволяет же это сделать?
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 28.12.2019 в 02:00.
АлексЮстасу вне форума  
 
Непрочитано 28.12.2019, 05:07
#58
trir


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


Цитата:
Вариант 2 позволяет же это сделать?
зачем?
trir вне форума  
 
Автор темы   Непрочитано 28.12.2019, 05:37
#59
АлексЮстасу

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


Цитата:
Сообщение от trir Посмотреть сообщение
зачем?
"Зачем", "не нужно" и т.п. обсуждать в других темах.
Здесь тема для обсуждения "как".
Если нечего об этом сказать, то зачем засорять эфир?

Повторю, что есть задача обмена данными. Которые могут быть в Xdata.
Еще есть требования заказчиков. Которые могут заказать данные в Xdata. (Или это тоже вариант обмена?).
И т.д.

Кстати, вычитал, что в мире накоплен миллиард чертежей в dwg и т.п. Вероятно, достаточно актуальных, иначе зачем их считать.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 28.12.2019, 06:37
| 1 #60
trir


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


Xdata не предназначен для обмена, а только для хранения - подразумевается, что их читает только тот, кто знает что там записано, а остальным туда соваться не стоит
trir вне форума  
 
Непрочитано 28.12.2019, 09:05
#61
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Еще есть требования заказчиков. Которые могут заказать данные в Xdata.
и когда последний раз заказчик заказывал данные в XData?) Это внутренняя автоматизация фирмы, и тогда это уже скорее вариант №3 от Аутодеска в виде пар: название параметра - значение параметра. Причем
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если названия полей повторяются, то можно их вынести в отдельный словарь, например - а в XData писать лишь целочисленный ключ.
и даже не словарь - а тот же XML лежит в папке с корпоративными стандартами с доступом только для чтения и надстройка загружает его с сервера. Серверы-файлопомойки есть сейчас у большинства - и реализовать могут все, если от болтовни к делу перейдут, конечно) И простейший класс на основе словаря Dictionary<Int32, {DXFCode, NameVariable}>, посредством которого от обезличенных параметров XData переходите к индексируемым параметрам [NameVariable] с контролем типа переменной. Только прошло уже пять лет с тех времен, как вы начали с этой типизацией XData носиться...
Сергей812 вне форума  
 
Непрочитано 28.12.2019, 09:20
#62
Кулик Алексей aka kpblc
Moderator

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


Сергей812, чисто для справки - а разве в Dictionary допускаются повторяющиеся элементы? Я почему-то думал, что он в этом плане не сильно отличается от Collection.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.12.2019, 09:29
#63
trir


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


Цитата:
а разве в Dictionary допускаются повторяющиеся элементы?
только ключи должны быть уникальными
trir вне форума  
 
Непрочитано 28.12.2019, 09:35
#64
Сергей812


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
а разве в Dictionary допускаются повторяющиеся элементы? Я почему-то думал, что он в этом плане не сильно отличается от Collection.
я про этот словарь в .Net - а там ключи не могут повторяться, а значения - пожалуйста. Там приличные накладные расходы на элемент (если не ошибаюсь: +16/32 байт для 32/64-битной системы) - зато скорость доступа к элементу по ключу приближается к операции O (1). Чтобы этот дополнительный класс-прокладка индексированного доступа к xData не тормозил заметно)
Сергей812 вне форума  
 
Непрочитано 28.12.2019, 10:00
#65
Кулик Алексей aka kpblc
Moderator

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


Сергей812, ну так и я про него же. Ок, понял - ключи уникальные, без вариантов.

----- добавлено через 41 сек. -----
Читаю документацию от случая к случаю, так что многое просто не знаю )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.12.2019, 16:51
#66
АлексЮстасу

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


Цитата:
Сообщение от trir Посмотреть сообщение
Xdata не предназначен для обмена, а только для хранения - подразумевается, что их читает только тот, кто знает что там записано, а остальным туда соваться не стоит
Предназначены-не предназначены здесь тоже не к месту. Т.к. вопрос темы совершенно другой. Данные есть такие, какие есть. Не засоряйте тему.
Цитата:
Сообщение от trir Посмотреть сообщение
Это внутренняя автоматизация фирмы...XML лежит в папке...Dictionary<Int32, {DXFCode, NameVariable}>...
Внутренняя-внешняя, XML-Dictionary и пр. - тоже не заданные вопросы. Не засоряйте тему.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
...это уже скорее вариант №3 от Аутодеска в виде пар: название параметра - значение параметра.
Лучше Варианта 2?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 28.12.2019, 17:30
| 1 #67
Александр Ривилис

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Еще есть требования заказчиков. Которые могут заказать данные в Xdata.
У меня богатое воображение, но его недостаточно, чтобы представить того заказчика, который закажет данные в Xdata. 99.999% заказчиков вообще понятия не имеют о существовании Xdata.
Александр Ривилис вне форума  
 
Непрочитано 28.12.2019, 17:40
1 | #68
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Лучше Варианта 2?
Нет лучше варианта или хуже. Есть работающие варианты и пустозвонство на уже четвертую страницу...

Новогодний подарок для тех, кто что-то делает - а не только ноет)
Код:
[Выделить все]
// AutoCAD
using Autodesk.AutoCAD.DatabaseServices;


// Пространство индексированного доступа к XData
namespace Indexed_XData
{
    /// <summary>
    /// Элемент словаря в памяти с параметрами имен полей
    /// </summary>
    internal struct ItemInfoNamesDict
    {
        /// <summary>
        /// Код типа данных
        /// </summary>
        public short TypeCode;

        /// <summary>
        /// Индекс имени
        /// </summary>
        public int IndexKey;

        /// <summary>
        /// Конструктор структуры ItemNamesDict
        /// </summary>
        /// <param name="aDXFCode">DXF код типа данных</param>
        /// <param name="aIndexKey">Индекс ключа</param>
        public ItemInfoNamesDict(DxfCode aDXFCode, int aIndexKey)
        {
            TypeCode = (short)aDXFCode;
            IndexKey = aIndexKey;
        }
    }


    /// <summary>
    /// Состояние статуса инициализации
    /// </summary>
    internal enum StatusInit
    {
        /// <summary>
        /// Данные успешно считаны из XData
        /// </summary>
        OK,

        /// <summary>
        /// Не найдено зарегистрированное приложение
        /// </summary>
        NotFoundApp,
        
        /// <summary>
        /// Непредвиденная ошибка
        /// </summary>
        Error,

        /// <summary>
        /// XData не найдены в примитиве
        /// </summary>
        NotFoundXData,

        /// <summary>
        /// Структуре данных писец
        /// </summary>
        CorruptedStructure
    };
}

Код:
[Выделить все]
// Windows
using System;
using System.Collections.Generic;
using System.Linq;

// AutoCAD
using Autodesk.AutoCAD.DatabaseServices;


// Пространство индексированного доступа к XData
namespace Indexed_XData
{
    /// <summary>
    /// Поддержка имен полей в XData
    /// </summary>
    internal static class XDataFieldNames
    {
        /// <summary>
        /// Словарь параметров полей по их именам
        /// </summary>
        private static Dictionary<string, ItemInfoNamesDict> _Info = 
            new Dictionary<string, ItemInfoNamesDict>();

        /// <summary>
        /// Словарь имен полей по их индексам
        /// </summary>
        private static Dictionary<int, string> _Indexes = new Dictionary<int, string>();
        

        /// <summary>
        /// Инициализация словарей
        /// </summary>
        public static void InitNames()
        {
            // ЗАГЛУШКА! Тут нужно реализовать метод инициализации - из XML, БД и т.п. 
            _Info.Add("Длина", new ItemInfoNamesDict(DxfCode.ExtendedDataInteger32, 1));
            _Info.Add("Ширина", new ItemInfoNamesDict(DxfCode.ExtendedDataInteger32, 2));
            _Info.Add("Классификатор", new ItemInfoNamesDict(DxfCode.ExtendedDataAsciiString, 3));

            // Инициализируем словарь имен полей по их индексам
            foreach (string lName in _Info.Keys.ToArray<string>())
            {
                _Indexes.Add(_Info[lName].IndexKey, lName);
            }
        }


        /// <summary>
        /// Получение параметров поля по его имени
        /// </summary>
        /// <param name="aName">Имя поля</param>
        /// <returns>Параметры поля (если указанное поле отсутствует
        /// в словаре, то возвращается DxfCode.Invalid)</returns>
        public static ItemInfoNamesDict GetInfoName(string aName)
        {
            return _Info.ContainsKey(aName) ? _Info[aName] : 
                new ItemInfoNamesDict(DxfCode.Invalid, -1);
        }


        /// <summary>
        /// Получение имени поля по его индексу
        /// </summary>
        /// <param name="aIndex">Индекс поля (не путать с порядковым номером в списке!)</param>
        /// <returns>Имя поля либо пустая строка, если такого индекса нет</returns>
        public static string GetNameByIndex(int aIndex)
        {
            return _Indexes.ContainsKey(aIndex) ? _Indexes[aIndex] : String.Empty;
        }
        

        /// <summary>
        /// Количество имен полей
        /// </summary>
        public static int Count
        {
            get { return _Info.Count; }
        }


        /// <summary>
        /// Получение отсортированного списка имен полей
        /// </summary>
        public static string[] GetSortNames
        {
            get
            {
                // Если пустая коллекция
                if (_Info.Count == 0)
                {
                    // Возвращаем пустой массив
                    return new string[0];
                }
                else
                {
                    // Получаем список имен ключей
                    string[] lNames = _Info.Keys.ToArray<string>();
                    // Сортируем и возвращаем его
                    Array.Sort(lNames);
                    return lNames;
                }
            }
        }

    }
}

Код:
[Выделить все]
// Windows
using System;
using System.Collections.Generic;
using System.Linq;

// AutoCAD
using Autodesk.AutoCAD.DatabaseServices;

// Пространство индексированного доступа к XData
namespace Indexed_XData
{
    /// <summary>
    /// Индексированные значения XData
    /// </summary>
    internal class NamedXData
    {
        /// <summary>
        /// Словарь индексированных значений XData
        /// </summary>
        private Dictionary<string, TypedValue> _Values = new Dictionary<string, TypedValue>();

        /// <summary>
        /// Имя приложения в XData
        /// </summary>
        private readonly string _NameApp;

        /// <summary>
        /// Состояние инициализации
        /// </summary>
        private readonly StatusInit _StatusInit = StatusInit.OK;


        /// <summary>
        /// Конструктор класса NamedXData
        /// </summary>
        /// <remarks>Для упрощения проверка аргументов исключена из кода</remarks>
        /// <param name="aNameApp">Имя приложения в XData</param>
        public NamedXData(string aNameApp)
        {
            // Запоминаем имя приложения XData
            _NameApp = aNameApp;
        }


        /// <summary>
        /// Конструктор класса NamedXData
        /// </summary>
        /// <remarks>Для упрощения проверка аргументов исключена из кода</remarks>
        /// <param name="aNameApp">Имя приложения в XData</param>
        /// <param name="aEntityId">Идентификатор примитива</param>
        /// <param name="aAcadDb">БД чертежа</param>
        public NamedXData(string aNameApp, ObjectId aEntityId, Database aAcadDb)
        {
            // Запоминаем имя приложения XData
            _NameApp = aNameApp;
            // Открываем транзакцию
            using (Transaction lAcadTran = aAcadDb.TransactionManager.StartTransaction())
            {
                try
                {
                    // Получаем таблицу зарегистрированных приложений
                    RegAppTable lRegAppTable = (RegAppTable)lAcadTran.GetObject(
                        aAcadDb.RegAppTableId, OpenMode.ForRead);
                    // Если приложение зарегистрировано
                    if (lRegAppTable.Has(_NameApp))
                    {
                        // Открываем примитив
                        Entity lEntity = (Entity)lAcadTran.GetObject(aEntityId, OpenMode.ForRead);
                        // Пробуем получить расширенные данные
                        ResultBuffer lResultBuffer = lEntity.GetXDataForApplication(_NameApp);
                        // Если примитив содержит XData
                        if (lResultBuffer != null)
                        {
                            // Флаг идентификатора поля
                            bool lIsNameField = true;
                            // Имя поля
                            string lNameField = null;
                            // В цикле по значениям XData
                            foreach (TypedValue lTypedValue in lResultBuffer)
                            {
                                // Если имя приложения - пропускаем
                                if (lTypedValue.TypeCode == (short)DxfCode.ExtendedDataRegAppName) continue;
                                // Если имя поля
                                if (lIsNameField)
                                {
                                    // Если целочисленный тип
                                    if (lTypedValue.TypeCode == (short)DxfCode.ExtendedDataInteger32)
                                    {
                                        // Получаем имя поля
                                        lNameField = XDataFieldNames.GetNameByIndex((int)lTypedValue.Value);
                                        // Если такое поле не существует
                                        if (lNameField == String.Empty)
                                        {
                                            // Нарушена структура данных
                                            _StatusInit = StatusInit.CorruptedStructure;
                                            // Выходим из цикла
                                            break;
                                        }

                                    }
                                    else
                                    {
                                        // Нарушена структура данных
                                        _StatusInit = StatusInit.CorruptedStructure;
                                        // Выходим из цикла
                                        break;
                                    }
                                }
                                else
                                {
                                    // Получаем информацию о  поле
                                    ItemInfoNamesDict lInfoItem = XDataFieldNames.GetInfoName(lNameField);
                                    // Если тип текущего поля в XData соответствует информации о поле
                                    if (lTypedValue.TypeCode == lInfoItem.TypeCode)
                                    {
                                        // Заносим значение в словарь
                                        _Values.Add(lNameField, lTypedValue);
                                    }
                                    else
                                    {
                                        // Нарушена структура данных
                                        _StatusInit = StatusInit.CorruptedStructure;
                                        // Выходим из цикла
                                        break;
                                    }
                                }
                                // Инвертируем флаг идентификатора поля
                                lIsNameField = !lIsNameField;
                            }
                            // Освобождаем буфер
                            lResultBuffer.Dispose();
                        } // Если примитив содержит XData
                        else
                        {
                            // XData не найдено
                            _StatusInit = StatusInit.NotFoundXData;
                        }
                    }
                    else
                    {
                        // Приложение не зарегистрированно
                        _StatusInit = StatusInit.NotFoundApp;
                    }
                    // Подтверждаем транзакцию
                    lAcadTran.Commit();
                }
                catch
                {
                    // Непредвиденная ошибка
                    _StatusInit = StatusInit.Error;
                    // Отменяем транзакцию
                    lAcadTran.Abort();
                }
            } // Открытие транзакции
            // Если была нарушена структура - очищаем словарь данных
            if (_StatusInit == StatusInit.CorruptedStructure) _Values.Clear();
        }


        /// <summary>
        /// Обновление XData в примитиве
        /// </summary>
        /// <remarks>Для упрощения проверка аргументов исключена из кода</remarks>
        /// <param name="aEntityId">Идентификатор примитива</param>
        /// <param name="aAcadDb">БД чертежа</param>
        /// <param name="aIsRemoveEmptyXData">Удалять расширенные данные, 
        /// если нет значений в словаре</param>
        /// <returns>true - обновление прошло успешно, false - нет</returns>
        public bool UpdateXData(ObjectId aEntityId, Database aAcadDb, 
            bool aIsRemoveEmptyXData = true)
        {
            // Открываем транзакцию
            using (Transaction lAcadTran = aAcadDb.TransactionManager.StartTransaction())
            {
                try
                {
                    // Если словарь значений не пустой
                    if (_Values.Count > 0)
                    {
                        // Получаем таблицу зарегистрированных приложений
                        RegAppTable lRegAppTable = (RegAppTable)lAcadTran.GetObject(
                            aAcadDb.RegAppTableId, OpenMode.ForRead);
                        // Если приложение не зарегистрировано
                        if (!lRegAppTable.Has(_NameApp))
                        {
                            // Переоткрываем таблицу зарегистрированных приложений на запись
                            lRegAppTable.UpgradeOpen();
                            // Создаем запись регистрируемого приложения
                            RegAppTableRecord lRegAppTableRecord = new RegAppTableRecord
                            {
                                Name = _NameApp
                            };
                            // Добавляем в таблицу и в саму БД
                            lRegAppTable.Add(lRegAppTableRecord);
                            lAcadTran.AddNewlyCreatedDBObject(lRegAppTableRecord, true);
                            // Переоткрываем таблицу зарегистрированных приложений на чтение
                            lRegAppTable.DowngradeOpen();
                        }
                        // Создаем буфер значений
                        ResultBuffer lResultBuffer = new ResultBuffer();
                        // Заносим туда имя приложения
                        lResultBuffer.Add(new TypedValue((short)DxfCode.ExtendedDataRegAppName, _NameApp));
                        // И значения из словаря
                        foreach (string lName in _Values.Keys.ToArray<string>())
                        {
                            lResultBuffer.Add(new TypedValue((short)DxfCode.ExtendedDataInteger32,
                                XDataFieldNames.GetInfoName(lName).IndexKey));
                            lResultBuffer.Add(_Values[lName]);
                        }
                        // Открываем примитив на запись
                        Entity lEntity = (Entity)lAcadTran.GetObject(aEntityId, OpenMode.ForWrite);
                        // Добавляем ему XData
                        lEntity.XData = lResultBuffer;
                    } // Если словарь значений не пустой
                    else
                    {
                        // Если включено удаление XData
                        if (aIsRemoveEmptyXData)
                        {
                            // Открываем примитив
                            Entity lEntity = (Entity)lAcadTran.GetObject(aEntityId, OpenMode.ForRead);
                            // Пробуем получить расширенные данные
                            ResultBuffer lResultBuffer = lEntity.GetXDataForApplication(_NameApp);
                            // Если примитив содержит XData
                            if (lResultBuffer != null)
                            {
                                // Переоткрываем примитив на запись
                                lEntity.UpgradeOpen();
                                // Удаляем XData
                                lEntity.XData = new ResultBuffer(new TypedValue(
                                    (short)DxfCode.ExtendedDataRegAppName, _NameApp));
                                // Переоткрываем примитив на чтение
                                lEntity.DowngradeOpen();
                            }
                        }
                    }
                    // Подтверждаем транзакцию
                    lAcadTran.Commit();
                }
                catch
                {
                    // Отменяем транзакцию
                    lAcadTran.Abort();
                    // Возвращаем - ошибка обновления данных
                    return false;
                }
            } // Открываем транзакцию
            // Возращаем - успешное обновление XData
            return true;
        }


        /// <summary>
        /// Статус инициализации
        /// </summary>
        public StatusInit StatusInitialization
        {
            get { return _StatusInit; }
        }


        /// <summary>
        /// Количество значений
        /// </summary>
        public int CountValues
        {
            get { return _Values.Count; }
        }


        /// <summary>
        /// Получение/установка значения по индексу
        /// </summary>
        /// <param name="aName">Имя индекса</param>
        /// <returns>Значение типа TypedValue</returns>
        /// <exception cref="KeyNotFoundException">Не найдено получаемое
        /// значение с именем!</exception>
        /// <exception cref="InvalidCastException">Тип задаваемого значение 
        /// не совпадает с параметрами поля!</exception>
        public TypedValue this[string aName]
        {
            // Получение значения по имени
            get
            {
                // Если нет такого имени в индексах - исключение 
                if (!_Values.ContainsKey(aName)) throw new KeyNotFoundException(
                    String.Format("Не найдено получаемое значение с именем [{0}]!", aName));
                // Возвращаем значение
                return _Values[aName];
            }
            // Установка значения
            set
            {
                // Если есть такое имя в индексах - исключение 
                if (_Values.ContainsKey(aName))
                { 
                    // Если пытаемся задать иной тип значения - исключение
                    if (value.TypeCode != XDataFieldNames.GetInfoName(aName).TypeCode) throw new
                        InvalidCastException("Тип задаваемого значение не совпадает с параметрами поля!");
                }
                // Добавляем/заменяем значение
                _Values[aName] = value;
            }
        }


        /// <summary>
        /// Отсортированный список имен переменных
        /// </summary>
        public string[] NameValues
        {
            get
            {
                // Если пустая коллекция
                if (_Values.Count == 0)
                {
                    // Возвращаем пустой массив
                    return new string[0];
                }
                else
                {
                    // Получаем список имен переменных
                    string[] lNames = _Values.Keys.ToArray<string>();
                    // Сортируем и возвращаем его
                    Array.Sort(lNames);
                    return lNames;
                }
            }
        }

    }
}

Код:
[Выделить все]
// AutoCAD
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;

// User
using Indexed_XData;


namespace KEY_XData
{
    public class CommandsClass : IExtensionApplication
    {
        /// <summary>
        /// Имя приложения XData
        /// </summary>
        private const string cNameApp = "INDEXESXDATA";


        /// <summary>
        /// Установка расширенных данных для примитива
        /// </summary>
        [CommandMethod("SetXData")]
        public void SetXData()
        {
            // Получаем документ, его БД и редактор
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            Database lAcadDb = lAcadDoc.Database;
            Editor lAcadEd = lAcadDoc.Editor;
            // Запрашиваем у пользователя примитив
            PromptEntityResult lPromptEntityResult = lAcadEd.GetEntity("\nУкажите примитив: ");
            // Если пользователь выбрал примитив
            if (lPromptEntityResult.Status == PromptStatus.OK)
            {
                NamedXData lNamedXData = new NamedXData(cNameApp);
                lNamedXData["Классификатор"] = new TypedValue(
                    (short)DxfCode.ExtendedDataAsciiString, "DF45-GH-JK3");
                lNamedXData["Ширина"] = new TypedValue((short)DxfCode.ExtendedDataInteger32, 250);
                lNamedXData.UpdateXData(lPromptEntityResult.ObjectId, lAcadDb);
                lAcadEd.WriteMessage("\nДанные занесены в XData");
                lAcadEd.WriteMessage("\n");
            }
        }


        /// <summary>
        /// Считывание расширенных данных для примитива
        /// </summary>
        [CommandMethod("GetXData")]
        public void GetXData()
        {
            // Получаем документ, его БД и редактор
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            Database lAcadDb = lAcadDoc.Database;
            Editor lAcadEd = lAcadDoc.Editor;
            // Запрашиваем у пользователя примитив
            PromptEntityResult lPromptEntityResult = lAcadEd.GetEntity("\nУкажите примитив: ");
            // Если пользователь выбрал примитив
            if (lPromptEntityResult.Status == PromptStatus.OK)
            {
                // Получаем расширенные данные из примитива
                NamedXData lNamedXData = new NamedXData(cNameApp, 
                    lPromptEntityResult.ObjectId, lAcadDb);
                // Если успешно
                if (lNamedXData.StatusInitialization == StatusInit.OK)
                {
                    // В цикле по именам переменных
                    foreach (string lName in lNamedXData.NameValues)
                    {
                        lAcadEd.WriteMessage("\nName =[{0}] Value = [{1}]",
                            lName, lNamedXData[lName].Value);
                    }
                }
                else
                {
                    switch (lNamedXData.StatusInitialization)
                    {
                        case StatusInit.NotFoundApp:
                            lAcadEd.WriteMessage("\nПриложение не зарегистрировано!");
                            break;
                        case StatusInit.Error:
                            lAcadEd.WriteMessage("\nОбщая ошибка!");
                            break;
                        case StatusInit.NotFoundXData:
                            lAcadEd.WriteMessage("\nВ указанном примитиве нет XData!");
                            break;
                        case StatusInit.CorruptedStructure:
                            lAcadEd.WriteMessage("\nВ XData покапался горе-программист!");
                            break;
                    }
                }
                lAcadEd.WriteMessage("\n");
            }
        }
        

        /// <summary>
        /// Установка расширенных данных для примитива
        /// </summary>
        [CommandMethod("ModifyXData")]
        public void ModifyXData()
        {
            // Получаем документ, его БД и редактор
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            Database lAcadDb = lAcadDoc.Database;
            Editor lAcadEd = lAcadDoc.Editor;
            // Запрашиваем у пользователя примитив
            PromptEntityResult lPromptEntityResult = lAcadEd.GetEntity("\nУкажите примитив: ");
            // Если пользователь выбрал примитив
            if (lPromptEntityResult.Status == PromptStatus.OK)
            {
                // Получаем расширенные данные из примитива
                NamedXData lNamedXData = new NamedXData(cNameApp,
                    lPromptEntityResult.ObjectId, lAcadDb);
                // Если успешно
                if (lNamedXData.StatusInitialization == StatusInit.OK)
                {
                    // Добавляем величину
                    lNamedXData["Длина"] = new TypedValue((short)DxfCode.ExtendedDataInteger32, 1024);
                    // Меняем значение величины
                    lNamedXData["Ширина"] = new TypedValue((short)DxfCode.ExtendedDataInteger32, 512);
                    lNamedXData.UpdateXData(lPromptEntityResult.ObjectId, lAcadDb);
                    lAcadEd.WriteMessage("\nДанные изменены в XData");
                    lAcadEd.WriteMessage("\n");
                }
            }
        }


        /// <summary>
        /// Инициализация сборки
        /// </summary>
        public void Initialize()
        {
            // Инициализация имен переменных из корпоративных стандартов))
            XDataFieldNames.InitNames();
        }


        /// <summary>
        /// Деинициализация сборки
        /// </summary>
        public void Terminate()
        {
        }
    }
}


Команда: SETXDATA
Укажите примитив:
Данные занесены в XData

Команда: GETXDATA
Укажите примитив:
Name =[Классификатор] Value = [DF45-GH-JK3]
Name =[Ширина] Value = [250]

Команда: MODIFYXDATA
Укажите примитив:
Данные изменены в XData

Команда: GETXDATA
Укажите примитив:
Name =[Длина] Value = [1024]
Name =[Классификатор] Value = [DF45-GH-JK3]
Name =[Ширина] Value = [512]


Тщательно не тестировал, но в целом работает) Может кому то пригодится)
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.12.2019, 17:49
#69
АлексЮстасу

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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
У меня богатое воображение, но его недостаточно, чтобы представить того заказчика, который закажет данные в Xdata. 99.999% заказчиков вообще понятия не имеют о существовании Xdata.
Заказчики-начальники - да. А их сотрудники - вполне. Этот год у меня начался ровно с того, что программеры со стороны заказчика предложили вариант с Xdata.
Но как это отвечает на вопрос темы?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 28.12.2019, 17:58
#70
Александр Ривилис

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Но как это отвечает на вопрос темы?
На этот вопрос давно дал ответ trir. И я полностью с ним согласен:

Цитата:
Сообщение от trir Посмотреть сообщение
Xdata не предназначен для обмена, а только для хранения - подразумевается, что их читает только тот, кто знает что там записано, а остальным туда соваться не стоит
И как программист будет хранить там информацию - это его дело. Хоть в виде бинарного кода. Общепринятого способа использовать XData нет.

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Заказчики-начальники - да. А их сотрудники - вполне. Этот год у меня начался ровно с того, что программеры со стороны заказчика предложили вариант с Xdata.
Стесняюсь спросить что именно они заказывали?
Александр Ривилис вне форума  
 
Непрочитано 28.12.2019, 18:00
| 1 #71
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Этот год у меня начался ровно с того, что программеры со стороны заказчика предложили вариант с Xdata.
т.е. прошел год - а вы даже не сдвинулись с мертвой точки, всё идеальный вариант хранения в XData ищите созерцательно?)
Сергей812 вне форума  
 
Автор темы   Непрочитано 29.12.2019, 17:14
#72
АлексЮстасу

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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
И как программист будет хранить там информацию - это его дело. Хоть в виде бинарного кода. Общепринятого способа использовать XData нет.
В посте темы речь об использовании Xdata, как средства хранения описательных данных объектов. И задан вопрос, как лучше их описывать в Xdata, чтобы было понятно, где что? Из поста, по-моему, тоже понятно, что я знаю, что общепринятого способа нет. Но разве не может быть каких-то удачных решений?
Вопросов о том, целесообразно ли хранить описательные данные в Xdata, как еще в программах используют Xdata и т.д., и т.п., не задавалось.
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Стесняюсь спросить что именно они заказывали?
Объекты благоустройства с характеристиками. Или системы сигнализации. Или трубопроводы. Какая разница?
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
т.е. прошел год - а вы даже не сдвинулись с мертвой точки, всё идеальный вариант хранения в XData ищите созерцательно?)
Ваш стиль поведения в этой теме (и не только) - это троллинг.

Сейчас вспомнил, что сам AutoCAD пишет Xdata в штриховки:
Цитата:
* Registered Application Name: GradientColor1ACI
* Code 1070, 16-bit integer: 5

* Registered Application Name: GradientColor2ACI
* Code 1070, 16-bit integer: 2

* Registered Application Name: ACAD
* Code 1010, 3 real numbers: (0.00 0.00 0.00)

* Registered Application Name: HATCHBACKGROUNDCOLOR
* Code 1071, 32-bit signed long integer: -1023410175
* Code 1000, ASCII string:
* Code 1000, ASCII string:
Т.е. для штриховок AutoCAD использует почти Вариант 2 - одно appname на одно свойство с одним полем. За исключением HATCHBACKGROUNDCOLOR с тремя полями - появляется, если у штриховки есть цвет фона.
Можно было записать, допустим, цвета градиентов в одном общем appname. Или сделать одно общее для всех данных штриховок.
Во-вторых, в них AutoCAD не использует бинарный код.
Т.е. похоже на стремление обеспечить наибольшую прозрачность этих данных.

Конечно, в самом AutoCAD есть и противоположные примеры.

Посмотрел, как в Electrical:
Цитата:
* Registered Application Name: CIM_WD_WDESC
* Code 1002, Starting or ending brace: {
* Code 1005, Database handle: 0
* Code 1002, Starting or ending brace: }

* Registered Application Name: CIM_WD_WDESCLEAD
* Code 1002, Starting or ending brace: {
* Code 1005, Database handle: 0
* Code 1002, Starting or ending brace: }

* Registered Application Name: VIA_WD_WNPTR
* Code 1002, Starting or ending brace: {
* Code 1005, Database handle: 110C6
* Code 1002, Starting or ending brace: }
И т.д. Таких у объекта может быть несколько десятков, попалось и больше 100.
В т.ч. есть, оказывается, специальный "* Code 1005, Database handle".
Т.е. у всех объектов Electrical, которые смог просмотреть, используется Вариант 2 - одно appname на одно свойство с одним полем.

Прислали еще пример, Вариант 7:
Все значения формируются как текстовые из трех частей: <название_поля>|<тип_поля>|<значение>
Например:
Цитата:
* Code 1000, ASCII string: BUILDINGID|INT|4711
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 29.12.2019, 17:36
#73
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Ваш стиль поведения в этой теме (и не только) - это троллинг.
см. п.68 - там рабочий код, как перейти в XData к индексированным (по имени) данным вне зависимости от их реального порядка следования в расширенных данных. И при этом контролируется тип расширенных данных при задании значений элементов XData. Но вы же нефига там не поняли в коде же, признайтесь?) И так и будете пытаться еще многие годы носиться со своими абстрактными идеями универсального описания данных в XData, несмотря на то - что ответы от разных людей на подобный бред годами не меняются)
Сергей812 вне форума  
 
Автор темы   Непрочитано 29.12.2019, 18:59
#74
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Но вы же нефига там не поняли в коде же, признайтесь?)
Продолжаете, значит...
Выкладывая код, Вы хорошо знали, что я не смогу его понять и даже запустить. Чтобы подразнить и позлорадствовать. И злорадствуете.
Разные люди часто поступают и мыслят, увы, стереотипно. Например, не читают вопросы тем. Заодно, не читают и объяснений. И пребывают в своих шорах. И часто поддаются на участие в троллинге. Вот, и Ривилис поучаствовал.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 29.12.2019, 19:28
#75
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Выкладывая код, Вы хорошо знали, что я не смогу его понять и даже запустить. Чтобы подразнить и позлорадствовать. И злорадствуете.
а зачем вы полезли в тему, где подразумевается знание программирования? Так как обычным пользователям доступ к XData закрыт, две стандартные функции в надстройке ET - это просто пощупать XData, а не для реальной работы.
Уже не знаю сколько раз выкладывал ссылки на .Net - сайт Бушмана Андрея, официальный сайт Аутодеска, поиском можно найти и другие источники (в том числе русскоязычные) - с картинками, подробно разжеванной информацией. Про само программирование на .Net тоже русскоязычной информации достаточно помимо сухой справки от Майкрософта. Ну и мой код снабжен очень подробными комментариями.

За те годы, что вы носитесь с этими XData - базовые основы программирования можно было освоить - но это вам не нужно. Вместо этого вы уже очередную статейку накалякали - какие все плохие, один вы несете бескорыстно светлую идею общего формата обмена данными)
Сергей812 вне форума  
 
Автор темы   Непрочитано 29.12.2019, 20:01
#76
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
За те годы, что вы носитесь с этими XData - базовые основы программирования можно было освоить - но это вам не нужно. Вместо этого вы уже очередную статейку накалякали - какие все плохие, один вы несете бескорыстно светлую идею общего формата обмена данными)
...И продолжаете.
Если тема возмущает, то достаточно 1-2 постов, выразить свое мнение. Или вообще не писать. Но Вы из 4-х страниц темы написали на две. Лишь полтора сообщения на вопрос темы, а все остальное для увода ее в стороны, стремясь меня задеть, унизить и осмеять.
И какие бы Вы "аргументы" ни изобретали, это не оправдывает троллинг.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 29.12.2019, 20:05
#77
Кулик Алексей aka kpblc
Moderator

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


Я все больше начинаю подозревать, что тему надо переносить в "Программирование"...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.12.2019, 20:21
#78
Сергей812


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я все больше начинаю подозревать, что тему надо переносить в "Программирование"...
А зачем? ТС не собирается решать задачу практически, насколько понимаю). Да и нет задачи - потому что для тех же разделов проектирования для каждого из них есть какой-то свой набор сведений, необходимый для работы - и перекликаются с другими лишь частично. И начинать надо с этого - да здравствует стандарт проектирования (предприятия) очередной раз)
Сергей812 вне форума  
 
Непрочитано 29.12.2019, 20:27
#79
Кулик Алексей aka kpblc
Moderator

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


Offtop: Брррр, не начинай снова!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.12.2019, 21:09
#80
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А зачем? ТС не собирается решать задачу практически, насколько понимаю). Да и нет задачи - потому что для тех же разделов проектирования для каждого из них есть какой-то свой набор сведений, необходимый для работы - и перекликаются с другими лишь частично. И начинать надо с этого - да здравствует стандарт проектирования (предприятия) очередной раз)
...И продолжаете.
Вопрос темы очень-очень узкий и очень простой, не требующий ничего, кроме здравого смысла. Но Вы так и пишете, и пишете о чем угодно, но не о нем.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я все больше начинаю подозревать, что тему надо переносить в "Программирование"...
Тему можно закрыть, поскольку от ответов толку здесь ноль.
Когда я ее начинал, то Вариант 2 был умозрительным. В процессе обнаружил, что AutoCAD его использует вовсю. Как и некоторые разработчики.
Какие-то варианты возникли у меня по ходу темы. Что-то мне прислали извне. Если будут еще решения и примеры, то могут прислать лично.

Кулик Алексей aka kpblc, Троллинг на форуме безнаказан? Здесь образцовый случай.
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 29.12.2019 в 21:15.
АлексЮстасу вне форума  
 
Непрочитано 29.12.2019, 21:25
#81
Кулик Алексей aka kpblc
Moderator

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


АлексЮстасу, с определением троллинга - к Админу. С моей точки зрения на вопрос ответы и варианты решения были даны, и просто постоянно к ним возвращаемся в том или ином варианте. Считаешь, что тут троллинг - вперед, "Обратить внимание модератора". Лично я вряд ли буду реагировать, поскольку не уверен в собственной беспристрастности.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.12.2019, 22:22
#82
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Когда я ее начинал, то Вариант 2 был умозрительным.
а почему умозрительный? На каждую характеристику RegNameApp не стоит городить, имхо - но симбиоз, например, с моим кодом: RegNameApp - определенная группа параметров, а внутри этой группы уже индексируемые значения XData. И каждый примитив имеет определенный набор XData со своими RegNameApp - в зависимости от своего функционального назначения. Пример: для токопотребляющего оборудования - номинальное напряжение питания, допустимый диапазон питающего напряжения, ток потребления. А для лотка эти параметры вообще лишены смысла - значит, группы XData с соответствующим RegNameApp не будет в примитиве лотка. Хотя во внешней БД это все проще будет обрабатывать на порядок, чем получать фильтром наборы идентификаторов объектов с соответствующими RegNameApp - и потом обрабатывать ещё все это)
Сергей812 вне форума  
 
Автор темы   Непрочитано 30.12.2019, 21:44
#83
АлексЮстасу

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


Прямо сейчас попался такой вариант от индийских кабельщиков, оба Xdata у одного кабеля:
Цитата:
* Registered Application Name: CYIENT_ID
* Code 1000, ASCII string: 14070027450225690C789F

* Registered Application Name: SplitInfo
* Code 1000, ASCII string: SplitID=Merged
* Code 1000, ASCII string: Status=Open
* Code 1000, ASCII string: OBJECTID=(140700274502256)
Можно предположить, что CYIENT_ID для идентификатора кабеля.
А SplitInfo, возможно, для описания состояния кабеля, разрывов в нем. SplitInfo есть только у одного кабеля.
Названия полей пишутся до знака "=", значения - после.
Первое Xdata - как Вариант 2. Второе - похоже на Вариант 7 из #72. Отличается тем, что тип данных не записан.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 30.12.2019, 22:15
#84
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Названия полей пишутся до знака "=", значения - после.
и получаем дополнительный парсинг: поиск позиции начала значения, преобразование значения к соответствующему виду.
Сергей812 вне форума  
 
Непрочитано 31.12.2019, 01:30
#85
Александр Ривилис

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Прямо сейчас попался такой вариант от индийских кабельщиков, оба Xdata у одного кабеля:
Боюсь, что "индийские кабельщики" не в курсе, что ObjectId сохранет значение только в пределах одной сессии AutoCAD. Поэтому строка вида: OBJECTID=(140700274502256) бессмысленна и даже опасна.
Когда-то (лет 25 назад) я хранил данные в виде строки, которая раскрывалась в ассоциативный список. Если длины в 255 символов было недостаточно, то список содержался в нескольких последовательных полях с кодом 1000. С этим списком достаточно удобно было работать из lisp'а и возможно было работать из ObjectARX.
Так что это еще один возможный вариант.
АлексЮстасу,
Я не занимался троллингом, а лишь высказал своё мнение.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 05.01.2020, 17:58
#86
АлексЮстасу

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


На днях попался забавный вопрос: человек сделал в AutoCAD модель автомобиля из 3D отдельных деталей, и теперь для каждой из них хочет определить характеристики. У двигателя - свои, у рессор другие и т.д.
А вопрос обращен к специалистам Map 3D! Т.е., вероятно, его уже кто-то обломал с возможностями базового AutoCAD (включая, похоже, и с Xdata), но этот кто-то слышал, что задача определения описательных данных давно решена в Map 3D.

Понятно, что у Autodesk может быть другое ПО, лучше подходящее для моделирования автомобилей.
Но, по-моему, это хороший пример законности, естественности желания пользователей создавать не только графические модели, но и иметь возможность добавлять описательные данные. Создавать модели объектные.
И очередная иллюстрация аномальности ситуации в AutoCAD с инструментарием описательных данных.

В этой теме возникали некоторые общие вопросы, на которые отвлекаться было не к месту. Я написал свои соображения о них здесь - https://dwg.ru/blog/300.

Offtop: Александр Ривилис, я написал не "занимался", а "поучаствовал". Ехидство без оснований посреди троллинга и одобрение троллящего очень похоже на участие.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 05.01.2020, 18:13
#87
Сергей812


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


Offtop: Троллинг - это когда человек носится с одной идей фикс много лет подряд, пишет кучу статей и создает прочую шумиху вместо решения самой проблемы) Я предложил рабочий вариант в посте 68, что вы даже не смогли за неделю найти любую статью для начинающих по NetApi и хотя бы попытаться собрать приведенный готовый код. Прямо так чувствуется практическое желание работать над проблемой описательных данных в акаде)
Сергей812 вне форума  
 
Автор темы   Непрочитано 05.01.2020, 22:44
#88
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
и получаем дополнительный парсинг: поиск позиции начала значения, преобразование значения к соответствующему виду.
Наверное, получаем. Но без этого мы можем вообще ничего не получить - набор непонятно для чего предназначенных полей.
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Когда-то (лет 25 назад) я хранил данные в виде строки, которая раскрывалась в ассоциативный список. Если длины в 255 символов было недостаточно, то список содержался в нескольких последовательных полях с кодом 1000. С этим списком достаточно удобно было работать из lisp'а и возможно было работать из ObjectARX.
Так что это еще один возможный вариант.
Это способ хранения длинных строковых значений. Но не помогает понимать какое поле для чего предназначено.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 05.01.2020, 23:09
#89
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Наверное, получаем. Но без этого мы можем вообще ничего не получить - набор непонятно для чего предназначенных полей.
так любое решение - что в XData, что во внешней БД или иным способом - это всего лишь условно принятый способ хранения нужных характеристик. Например, применительно к тому же оборудованию - ток вместе с напряжением определяет мощность потребления (на постоянном токе). А с параметрами кабеля - погонным сопротивлением и длиной - падение напряжение (будет ли вообще подключенное оборудование работать) и правильно ли выбрано сечение кабеля (не будет ли перегрева). И т.д. Но это уже не проблемы dwg - это программная интерпретация входных данных, полученных с чертежа. Само хранение данных в чертеже или в связанном хранилище - лишь верхушка айсберга.
Сергей812 вне форума  
 
Непрочитано 05.01.2020, 23:42
#90
Александр Ривилис

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Это способ хранения длинных строковых значений. Но не помогает понимать какое поле для чего предназначено.
Речь вообще-то шла об ассоциативных списках, представленных в виде строки. Например,
Код:
[Выделить все]
 ("ROOM_NUMBER" 666) ("ROOM_AREA" 12.15) ("ROOM_NAME" "Кухня")
И вот этот список завернут в строку.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 06.01.2020, 04:27
#91
АлексЮстасу

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
так любое решение - что в XData, что во внешней БД или иным способом - это всего лишь условно принятый способ хранения нужных характеристик.
Собственно, я и задал исходный вопрос о том, можно ли и как сделать способ хранения в Xdata однозначно или достаточно понятным. При том, что сами Xdata не слишком к этому располагают.
Например, для моих Object Data Map 3D такого вопроса вообще нет - в них все понятно и однозначно.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А с параметрами кабеля - погонным сопротивлением и длиной - падение напряжение (будет ли вообще подключенное оборудование работать) и правильно ли выбрано сечение кабеля (не будет ли перегрева). И т.д. Но это уже не проблемы dwg - это программная интерпретация входных данных, полученных с чертежа.
Естественно, что эти вопросы здесь не рассматриваются. Здесь рассматривается вопрос возможности правильно интерпретировать первичные данные из Xdata.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Само хранение данных в чертеже или в связанном хранилище - лишь верхушка айсберга.
Для проверки тлетворного влияния описательных данных в чертеже я выложил такие тестовые dwg в посте - https://dwg.ru/blog/301.
Правда там не предлагаются Xdata, т.к. я использую либо Object Data Map 3D, либо Xrecord. Но я о принципе - хранение описательных данных в dwg не добавляет проблем и вполне оправдано для относительно небольших моделей и объемов данных.

----- добавлено через ~9 мин. -----
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Речь вообще-то шла об ассоциативных списках, представленных в виде строки. Например,
Код:
1 ("ROOM_NUMBER" 666) ("ROOM_AREA" 12.15) ("ROOM_NAME" "Кухня")
И вот этот список завернут в строку.
Просто я не телепат и не программист, чтобы без пояснений и примера сообразить.
Так - действительно, это новый вариант. Вариант 8.
Он сразу сочетает в себе и черты варианта 2 (единственное поле в appname), и варианта 7 (в поле/-я записано название "таблицы", "поля таблицы" и само значение). Но вся запись одной "таблицы" одной строкой.
Ок.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 06.01.2020, 09:12
#92
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Здесь рассматривается вопрос возможности правильно интерпретировать первичные данные из Xdata.
да легко. Напишите стандарт, описывающий однозначную интерпретацию всех возможных данных, пролоббируйте - чтобы его приняли в качестве ФЗ - и все, проблема решена. Точнее, это уже станет общей проблемой) А на практике нужно знать - что это число означает, например, ток, а это - погонное сопротивление. И тогда будет понятно, что перемножив эти числа - получишь падение напряжения на кабеле. Естественно, надо учитывать в каких единицах эти значения - чтобы не перемножив мА на Ом, приятно удивиться минусовым значениям напряжения на нагрузке. А вы все абстрактным чем то грезите.
Сергей812 вне форума  
 
Непрочитано 06.01.2020, 09:59
#93
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
xml?? в dwg?!?! Да лааааадно!
Увы, но очень похоже на это =(

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
На днях попался забавный вопрос: человек сделал в AutoCAD модель автомобиля из 3D отдельных деталей, и теперь для каждой из них хочет определить характеристики. У двигателя - свои, у рессор другие и т.д.
А вопрос обращен к специалистам Map 3D! Т.е., вероятно, его уже кто-то обломал с возможностями базового AutoCAD (включая, похоже, и с Xdata), но этот кто-то слышал, что задача определения описательных данных давно решена в Map 3D.

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

Offtop: Общение слепых с глухими, всегда интересно.
Boxa на форуме  
 
Автор темы   Непрочитано 06.01.2020, 19:40
#94
АлексЮстасу

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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Для этого существуют гиперссылки.
Да, о гиперссылках я все время забываю. Их кто-то практикует?
Чем они лучше тех же Xdata? Записать в Xdata тип, марку, мощность и пр. двигателя, свое про колеса и т.д. Вполне в Xdata все подобное уместится. Будет однозначно связано с графикой. Автоматически передаваться вместе с графикой при передаче dwg. При написании или заимствовании соответствующих несложных программок будет доступно для выбора, изменений и пр. - любых нужных задач.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 06.01.2020, 21:56
1 | 1 #95
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Автоматически передаваться вместе с графикой при передаче dwg. При написании или заимствовании соответствующих несложных программок будет доступно для выбора, изменений и пр. - любых нужных задач.
представил себе глаза посредников/смежников/заказчиков при словах - остальные данные у нас в XData, напишете там несложную программку, чтобы посмотреть)
Сергей812 вне форума  
 
Автор темы   Непрочитано 08.01.2020, 05:58
#96
АлексЮстасу

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


Кулик Алексей aka kpblc, с чем сейчас ты согласен, что одобрил?
Сейчас была речь об альтернативе - использовании гиперссылок для описательных данных. Т.е. они лучше Xdata? (В тему: обнаружил, что гиперссылки описываются как раз Xdata ).
И я ошибался, что для Xdata можно найти больше программных наработок, чем для гиперссылок или пр.?
Подскажи тогда, что и где для гиперссылок можно посмотреть, попробовать готового пользовательского для "посредников/смежников/заказчиков"?

Добавил в https://dwg.ru/blog/301 пример dwg с Xdata, аналогичный примерам с Xrecord, Object Data.
Результат вроде бы такой же - достаточно большой объем описательных данных не так уж и раздувает dwg (добавляет примерно 1/30 от их объема), и не заметно снижения скорости работы в AutoCAD.
Возможный вывод: целесообразность хранения описательных данных в dwg ограничена главным образом не свойствами и объемами Xdata, Xrecord или т.п. и пр., а общими возможностями AutoCAD. В первую очередь - объемами графических данных в dwg, с которыми AutoCAD еще может удовлетворительно работать.
Но все это нужно еще получше проверить.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 08.01.2020, 09:25
#97
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Сейчас была речь об альтернативе - использовании гиперссылок для описательных данных. Т.е. они лучше Xdata?
у гиперссылок есть один плюс - автоматически работает появление подсказок при наведении на объект с гиперссылкой) А так и то, и другое - лишь средство связи некой информации с примитивами акада, техническая поддержка (код) для этого пишется за несколько часов - все остальное: это разработка внутреннего регламента по связи внешней информации с чертежом. Сугубо индивидуальное дело разработчиков надстроек, в которое вы пытаетесь влезть - размахивая своими мифическими описательными данными уже который год и мужественно игнорируя все попытки окружающих сказать об бесперспективности этого занятия)
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как принято, как лучше описывать Xdata у элементов?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посчитать коэффициенты унификации конструктивных элементов, точности обработки, шероховатости поверхностей Igorek21 Машиностроение 2 09.11.2016 12:32
Как найти уточненные значения жесткостей элементов по СП 52-103-2007? Midimi Железобетонные конструкции 9 30.04.2016 13:43
Описание xdata АлексЮстасу Программирование 68 09.10.2014 11:46
описывать свойства элементов по слою (bylayer) или прямо АлексЮстасу AutoCAD 110 13.03.2010 03:51
Lisp: Список элементов в слоях ALFMario LISP 4 29.04.2008 17:26