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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > X-записи. Где и как хранить? Как добавлять, как читать, как изменять? и все таки, для чего они?

X-записи. Где и как хранить? Как добавлять, как читать, как изменять? и все таки, для чего они?

Ответ
Поиск в этой теме
Непрочитано 25.06.2017, 23:20
X-записи. Где и как хранить? Как добавлять, как читать, как изменять? и все таки, для чего они?
AlexZh
 
Регистрация: 23.09.2015
Сообщений: 146

Категорически всех приветствую!

Никак у меня не получается разобраться с этими записями.
Как я понимаю, это что-то типа атрибутов, но они не видны и "записаны" в виде списка в каком-то примитиве.

Но, не понимаю, для чего тогда словари? и как там хранится вся информация об этих примитивах. или не хранится?

Что-то брал здесь - http://autolisp.ru/2012/04/06/dictionaries/.
Перед глазами Книга Полещука и Лоскутова.

И все равно мне не понять принцип работы.

Не писал в теме "Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) ". Думаю, что не только мне будет интересно.

Ну или ткните носом, пожалуйста. Честно, пытался разобраться, но никак.
__________________
Проекты СС

Последний раз редактировалось AlexZh, 25.06.2017 в 23:58.
Просмотров: 5982
 
Непрочитано 05.07.2017, 16:01
#21
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Цитата:
Сообщение от Do$ Посмотреть сообщение
А зачем оборачивать лямбду в eval и function?
function - привычка к замыканию: #'(lambda () (terpri)), а eval, так надо же вычислить возвращаемое значение

Цитата:
Сообщение от Do$ Посмотреть сообщение
Допустим, но на какой объект будет ссылаться метка и как это поможет, если объект будет скопирован?
Если предварительно не не извратиться с реакторами и внедокументным пространством имен и/или каким-либо внешним по отношению к акаду текстовым буфером, то ни на какой.
__________________
На работе было скучно:shout:
ciril вне форума  
 
Непрочитано 05.07.2017, 16:34
1 | #22
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Тут, правда, возможны сложности при создании копии объекта. И исходный и скопированный объект будут ссылаться на один и тот же словарь, и уже независимо друг от друга им не задать значения в словаре.
Цитата:
Сообщение от Do$ Посмотреть сообщение
Какая метка, какого объекта? Допустим, я выбрал объект, Ctrl+C - Ctrl+V. РД скопируются в копию объекта вместе с этой непонятной меткой. А дальше что?
в #3 я ссылался на тему Автоматический подбор высоты текста, начиная с поста #27.
Приведу цитату оттуда (из #35)
Цитата:
Xdata - extended object data или расширенные данные (РД), хранятся в описании примитива в группе -3 в соответствии со своим кодом подгруппы (строка -1000, целое - 1070 и т.д.)
Код:
[Выделить все]
(entget (car (entsel)) '("*"))
Цитата:
((-1 . <Имя объекта: 7ef70e08>) (0 . "MTEXT") (330 . <Имя
объекта: 7ef70d08>) (5 . "41") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8
. "0") (100 . "AcDbMText") (10 124.49 92.716 0.0) (40 . 30.1982) (41 . 117.705)
(71 . 1) (72 . 5) (1 . "erfgergfergfeer") (7 . "МИП_ГОСТ") (210 0.0 0.0 1.0)
(11 1.0 0.0 0.0) (42 . 295.616) (43 . 40.6945) (50 . 0.0) (73 . 1) (44 . 1.0)
(-3 ("MTEXT+RECTANGLE" (1000 . "3E") (1000 . "41"))))
Но у них есть один плюс: Имя РД можно использовать как фильтр ssget
(в моем примере в команде TEST1)
Цитата:
(setq ss (ssget "_X" '((0 . "MTEXT,*POLYLINE")(-3 ("MTEXT+RECTANGLE")))))
Это позволяет быстро отфильтровать нужные тебе примивы. Я уже говорил и еще раз повторю, что, на мой взгляд, самое рациональное использовать связку РД и vlax-ldata-*.
В РД используются только строковые поля (1000), чтобы не "захломлять", так как 16 кб делятся на всех. Но у нас появляется возможность фильтровать примитивы с помощью ssget.
В моем примере записываются 2 строковых поля:
первое - метка (хэндл) примитива, на который ссылаемся
второе - метка (хэндл) самого примитива. Это нужно для того, чтобы отсечь скопированный (если нужно) примитив. Т.к. в этом случае запомненная метка примитива и метка самого примитива не будут совпадать.

Остальные данные можно хранить в X-records (X-записях) самого примитива.
Красным выделил сохраненную метку примитива. У скопированного они не будут совпадать
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 05.07.2017, 19:16
#23
Do$

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


Идея понятна. В отдельных случаях это даже будет работать
Реализация связи между объектами чертежа как в примере - это вообще отдельная история. Там много тонкостей. Вот если, к примеру, нужно рамку с текстом парой скопировать, и чтобы, при этом, между новыми объектами образовалась связь? Тут без обработки событий не обойтись. Не уверен, что на LISP такое можно реализовать. Но это уже тема отдельного разговора.
Вернемся к нашим баранам. Предположим, что мы просто сохраняем какие-то простые данные: числа, строки или булевые значения. Рассмотрим изначально обсуждаемый вариант: в XDATA объекта хранится имя записи или словаря с данными, а сама запись или словарь хранятся в NOD. Предположим, что при копировании объекта, у его копии должна создаваться независимая копия его данных. На мой взгляд - это самое ожидаемое поведение. Итак, объект скопирован, читаем XDATA и видим, что метка не совпадает с объектом. Значит, это - копия. Ищем в NOD данные исходного объекта, делаем их копию, привязываем к новому объекту, переписываем метку в XDATA. Вроде бы, вполне работоспособно. Но тут 2 момента:
1. Между операцией копирования и первым обращением к объекту-копии может пройти значительное время. Пользователь будет уверен, что в копии сохранены все данные исходного объекта на момент копирования и может успеть что-то изменить. И при обращении к данным объекта-копии окажется, что данные не сохранились.
2. Если копировать объект в другой чертеж, то данные исходного объекта не будут вообще никогда прочитаны, т.к. они в NOD исходного чертежа.
В этих ситуациях сохранение метки исходного объекта не поможет.
Поэтому-то я и пришел к мысли, что:
Цитата:
Сообщение от Do$ Посмотреть сообщение
Тогда, можно попробовать другой вариант - использовать словарь объекта, в котором сохранять нужные данные, а имя этой записи хранить в РД.
При копировании, в копию автоматически добавляются и XDATA и словарь объекта. То есть, данные у копии уже не потеряются.
Собственно, как я понял, в указанном примере данные сохраняются именно в словарь объекта.
Надеюсь, понятно объяснил
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)

Последний раз редактировалось Do$, 06.07.2017 в 17:43.
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > X-записи. Где и как хранить? Как добавлять, как читать, как изменять? и все таки, для чего они?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для чего нужен диспечер конфигурации слоёв Theodora AutoCAD 7 16.03.2020 13:20
С чего начать изучение AutoCad и с чего начинать карьеру в строительстве? kenmamon Разное 115 11.02.2013 16:30
Из чего лучше построить одинокостоящую стену 6х4м? McCobra Прочее. Архитектура и строительство 1 27.07.2012 19:45
Автомобильные диски с «полкой» — для чего? tematema Машиностроение 3 22.11.2011 11:30
Из чего делают пол и крышу в проекте обычного контейнера? dextron3 Конструкции зданий и сооружений 3 02.09.2011 11:00