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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Выгрузить XData в csv (txt)

Выгрузить XData в csv (txt)

Ответ
Поиск в этой теме
Непрочитано 10.07.2021, 22:20 #1
Выгрузить XData в csv (txt)
АлексЮстасу
 
топограф, технолог
 
Москва
Регистрация: 24.05.2009
Сообщений: 3,030

Пытался найти экспорт содержания XData в csv, txt.
Нашел лисп Renseignements-XDATA.lsp с командой XdataXL, выгружающей XData в csv для указанных объектов.
И нашел лисп WXD_XData-Excel.lsp, команда WXD, выгружающий указанный Application в открывающийся Excel для указанных объектов.
Но оба выгружают не все из XData. Пропускают какие-то данные, выгружают, допустим, из "Code 1010, 3 real numbers" в нечитаемом виде.

Можно ли какой-то из этих лиспов модифицировать, чтобы выгружал в csv все данные из Application?
Лучше всего для выделенных до/после объектов в духе ATTOUT из Express: с HANDLE объектов, с названиями колонок из типов данных ("ASCII_string", "3_real_numbers", "Real_number", "16-bit_integer" и т.п.).
Можно, допустим, без выбора Application - выгружать все XData у выбранных объектов, каждый в свой csv с названием из названия dwg&appname.

Вложения
Тип файла: lsp Renseignements-XDATA.lsp (4.9 Кб, 62 просмотров)
Тип файла: lsp WXD_XData-Excel.lsp (2.7 Кб, 57 просмотров)

__________________
количество моих сообщений не говорит о знании Автокада
Просмотров: 21529
 
Непрочитано 10.07.2021, 22:52
#2
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Можно ли какой-то из этих лиспов модифицировать, чтобы выгружал в csv все данные из Application?
Можно. Модифицируй. Если что - вали на меня, типа я разрешил.
Offtop: Код (по первому просмотру) не то чтобы очень сложный (и не сильно дураказащищенный), так что меняй.
P.S. Я у себя на сайтике делал альтернативный варинат attin / attout, можешь забирать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.07.2021, 00:22
#3
АлексЮстасу

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Можно. Модифицируй. Если что - вали на меня, типа я разрешил.
Грешно смеяться над больными людьми.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я у себя на сайтике делал альтернативный варинат attin / attout, можешь забирать.
Для атрибутов или для XData?
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 11.07.2021 в 00:30.
АлексЮстасу вне форума  
 
Непрочитано 11.07.2021, 00:29
#4
румата


 
Регистрация: 06.04.2015
Сообщений: 2,673


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Можно ли какой-то из этих лиспов модифицировать, чтобы выгружал в csv все данные из Application?
Лучше написать .net плагин по мотивам этого лиспа специально для этого. А можно для выгрузки в проприетарный .xlsx
румата вне форума  
 
Автор темы   Непрочитано 11.07.2021, 00:33
#5
АлексЮстасу

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


Цитата:
Сообщение от румата Посмотреть сообщение
Лучше написать .net плагин
К лисп я сейчас склоняюсь, т.к. это и по его возможностям, и чтобы не зависеть от версий AutoCAD.
Но почему нет...
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 11.07.2021, 01:29
#6
Сергей812


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


Цитата:
Сообщение от румата Посмотреть сообщение
Лучше написать .net плагин по мотивам этого лиспа специально для этого.
специально для чего? У ТС уже не первый год навязчивая идея фикс - что кто-то будет использовать XData для массового обмена информацией...
Сергей812 вне форума  
 
Непрочитано 11.07.2021, 08:54
#7
румата


 
Регистрация: 06.04.2015
Сообщений: 2,673


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
специально для чего?
Как раз для массового обмена информацией XData.
румата вне форума  
 
Непрочитано 11.07.2021, 09:33
#8
Сергей812


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


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

Вот лежит БД на диске - она может быть размерами в гигабайты и даже терабайты, но путем запроса из нее получаешь лишь небольшой объем конкретно необходимых в данный момент данных. A XData: чтобы получить хоть одно значение - надо загрузить полностью файл *.dwg в память, найти по определенным критериям примитив(ы) с необходимыми присоединенными данными и при этом еще правильно интерпретировать последовательность данных в контейнере XData.
Сергей812 вне форума  
 
Непрочитано 11.07.2021, 09:42
#9
румата


 
Регистрация: 06.04.2015
Сообщений: 2,673


Сергей812, все верно. Тем не менее XData вполне можно использовать для обмена дополнительной информацией без создания дополнительных структур и баз данных.
румата вне форума  
 
Непрочитано 11.07.2021, 09:55
| 1 #10
Сергей812


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


Цитата:
Сообщение от румата Посмотреть сообщение
Тем не менее XData вполне можно использовать для обмена дополнительной информацией без создания дополнительных структур и баз данных.
можно все - но для большинства пользователей формата *.dwg (как самого акада, что его альтернатив) XData - абсолютно бесполезный ввиду недоступности в явном виде) Если, конечно, сделать нормальный ГУИ с набором функций обработки данных - то и такой костыль найдут куда приспособить. Только делать костыль ради костыля
Сергей812 вне форума  
 
Непрочитано 12.07.2021, 08:27
| 1 #11
ShaggyDoc

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
У ТС уже не первый год навязчивая идея фикс - что кто-то будет использовать XData для массового обмена информацией...
Лет через ХХ он откроет для себя базы данных. Может быть...
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 13.07.2021, 01:11
#12
АлексЮстасу

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


Обычная просьба к программистам помочь с конкретной задачей. Примерно такой же, как выгрузка содержания атрибутов в csv, как ATTOUT.
Прошу помочь с программой экспорта содержания XData в csv.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 13.07.2021, 07:04
#13
nickname2019


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Обычная просьба к программистам помочь с конкретной задачей. Примерно такой же, как выгрузка содержания атрибутов в csv, как ATTOUT.
Прошу помочь с программой экспорта содержания XData в csv.
Вы можете сформулировать, какого функционала Вы собираетесь добиться, выводя XData в csv?
Вы собираетесь сделать в экселе спецификации по модели в DWG?
Вы собираетесь связать эксель с моделью dwg, чтобы при изменении екселя менялась автоматически модель dwg?
Сам факт вывода XData в csv не имеет практического смысла, так как эти данные с успехом можно обрабатывать внутри базы данных dwg, не подключая промежуточный файл csv.
nickname2019 вне форума  
 
Непрочитано 13.07.2021, 08:04
#14
zamtmn

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


>>Сам факт вывода XData в csv не имеет практического смысла
Почему не имеет та? иногда надо. если в импорт+экспорт = вообще красота
zamtmn вне форума  
 
Непрочитано 13.07.2021, 08:40
#15
nickname2019


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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Почему не имеет та? иногда надо. если в импорт+экспорт = вообще красота
Offtop: Напомнило .Приходит мужик в овощной магазин:
- У вас морква есть?
Продавщица:
- Есть.
- Тогда 2 штуки, пожалуйста.
Она продает ему две морковки он вставляет их в уши и убегает.
На следующий день:
- У вас морква есть?
Продавщица:
- Есть.
- Тогда 2 штуки, пожалуйста.
Она продает ему две морковки он вставляет их в уши и убегает.
Так продолжается и на следующий день. Продавщица офигивает и в очередной
раз на вопрос есть ли морква, отвечает нет.
Мужик:
- А свекла есть?
Она:
- Есть.
- Тогда 2 штуки, пожалуйста.
Продавщица дает ему 2 свеклы, мужик ее тоже в уши вставляет. Продавщица
не выдерживает:
- А можно поинтересоваться, чтой то вы всякую х.. ню в уши вставляете?
На что мужик:
- А что, морква есть?

Ответа на вопрос "зачем" я пока так и не понял. Подозреваю, что есть пути решения без XData.
nickname2019 вне форума  
 
Непрочитано 13.07.2021, 09:25
#16
Сергей812


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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Почему не имеет та? иногда надо. если в импорт+экспорт = вообще красота
Ну была бы написана уже такая программа, если реально нужда была) Встроенные attin / attout и аналог от Алексея, работа со свойствами динблоков от Boxa, работа с пользовательскими свойства документов от azetown и т.д. - есть конкретная задача и есть какой то вариант ее решения.

----- добавлено через ~14 мин. -----
Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Ответа на вопрос "зачем" я пока так и не понял
да сам ТС не знает - зачем, похоже. Он зациклился на одной промежуточной чисто технической задаче по хранению данных в XData и выпал из реальности)
Сергей812 вне форума  
 
Автор темы   Непрочитано 13.07.2021, 15:08
#17
АлексЮстасу

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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
если в импорт+экспорт = вообще красота

Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Вы можете сформулировать, какого функционала Вы собираетесь добиться, выводя XData в csv?
1. Посмотреть в целом, какие данные в XData есть, каких нет.
2. Для отчетов, экспликаций и т.п.
3. Заполнить-заменить значения другими средствами - в Excel или т.п. (Для обратной загрузки).
4. Для загрузки в атрибуты блоков ATTIN.
5. Для передачи данных в другие средства их хранения. В вертикальных приложениях, в словарях или т.п.
6. Для сохранения данных.

Есть лисп-программы экспорта/импорта (приложил) сразу всех указанных дополнительных данных Object Data (лучший аналог XData) для Map/Civil 3D. Они еще хороши тем, что после изменения последовательности и числа полей данных в csv при импорте соответственно изменяются и описания таких данных в dwg.
Если не сложно в этих лиспах заменить относящееся к Object Data на соответствующее для XData, то было бы то, что нужно.
Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Сам факт вывода XData в csv не имеет практического смысла, так как эти данные с успехом можно обрабатывать внутри базы данных dwg, не подключая промежуточный файл csv.
Программист "с успехом" - может, а пользователь же - нет.
Опыт работы с аналогом XData в Map/Civil 3D показывает, что постоянно возникают вопросы как бы что-то сделать с дополнительными данными, что не сложно сделать средствами того же Excel. Создать, изменить идентификаторы, подсчитать, взять данные из других полей и пр.
И рекомендации выгрузить в csv, изменить в нем, загрузить, на практике даются постоянно.
Вложения
Тип файла: lsp All_OD2CSV.lsp (5.7 Кб, 20 просмотров)
Тип файла: lsp CSV2OD.lsp (5.2 Кб, 21 просмотров)
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 13.07.2021, 15:33
#18
Сергей812


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


программист даже с минимальным опытом вздрогнет, представив себе процесс связи между приложениями на csv-файлах)

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Заполнить-заменить значения другими средствами - в Excel или т.п. (Для обратной загрузки).
ну так выгрузите в эксель через COM и обратно)
Сергей812 вне форума  
 
Непрочитано 13.07.2021, 23:23
#19
zamtmn

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


>>программист даже с минимальным опытом вздрогнет, представив себе процесс связи между приложениями на csv-файлах)
ничем не лучше не хуже других форматов
zamtmn вне форума  
 
Непрочитано 14.07.2021, 00:15
#20
Сергей812


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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
ничем не лучше не хуже других форматов
но тот же XML был бы лучше, имхо. Это печально - если в XData примитивов напиханы табличные данные: когда csv явно имеет преимущество. Но пустой разговор - все в конечном итоге свелось к выклянчиванию готового кода ради счастья мифического большинства...
Сергей812 вне форума  
 
Автор темы   Непрочитано 14.07.2021, 04:35
#21
АлексЮстасу

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


Сергей812, покиньте, пожалуйста, эту тему.
Ваши негативные мысли об идее этой программы, об XData и обо мне понятны были сразу.
Все остальные Ваши многочисленные сообщения уже на половину темы не о создании такой программы - это флуд. И троллинг, поскольку Вы еще и переходите к уничижительным характеристикам.
Высказывать свое мнение и отношение - нормально. Ненормально флудить и троллить.
Ненормально мешать.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 14.07.2021, 07:44
#22
nickname2019


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
1. Посмотреть в целом, какие данные в XData есть, каких нет.
Проблема решается если XData не использовать. Если нет XData - смотреть их не нужно.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
2. Для отчетов, экспликаций и т.п.
Эта проблема решается гуглем: как автоматически получить спецификацию в Autocad... Решений будет несколько десятков. Если ничего не устраивает - я думаю, что услуги программиста встанут не более 15 тыс. руб для настройки чего-то массового на индивидуальные потребности (спецификация с "бантиком") - но это без использования XDATA. На XDATA время тратить никто не будет, так как будет нужно "с нуля" поднимать функционал, который уже разработан без использования XDATA.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
3. Заполнить-заменить значения другими средствами - в Excel или т.п. (Для обратной загрузки).
Вероятнее всего гуглом можно нарыть большое количество бесплатных или недорогих функций по сортировке любых автокадовских объектов. Можно также попробовать освоить sql запросы, если с базами данных работать.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
4. Для загрузки в атрибуты блоков ATTIN.
Проблема решается если XData не использовать. Если нет XData - смотреть их не нужно.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
5. Для передачи данных в другие средства их хранения. В вертикальных приложениях, в словарях или т.п.
Нет XData - нет проблемы.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
6. Для сохранения данных.
Каких конкретно данных? Проблема хранения данных в Autocad по оборудованию легко решается блоками с атрибутами (в т.ч. динамическими блоками). Проблема хранения данных по кабельной трассе и инженерным сетям на генплане - тоже решаема более-менее стандартными и не сильно дорогими существующими способами. Если нужно модифицировать "под себя" - нетрудно найти программиста, чтобы допилил существующий функционал.

Я понимаю желание иметь возможность задавать доп. параметры любому объекту, чтобы потом с ними оперировать, но это утопия, так как порождает логистический кошмар. Если каждый будет задавать свой список и имена параметров - разобраться будет невозможно (у одного высота колонны будет "H", у другого "L" и т.д., совместимость проектов будет невозможна).
Параметрическое проектирование сейчас решается через создание кастомных объектов (стена, колонна и т.д.) с ЧЕТКИМ НАБОРОМ ПАРАМЕТРОВ, что обеспечивает ясность работы с объектом.
Т.е. сейчас используется объектно-ориентированный подход, когда создается стандартное описание объекта (с набором параметров), который затем используется везде. Вы предлагаете информацию хранить распределенно, что затрудняет анализ.

Последний раз редактировалось nickname2019, 14.07.2021 в 07:51.
nickname2019 вне форума  
 
Непрочитано 14.07.2021, 08:01
#23
trir


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


Цитата:
но это утопия, так как порождает логистический кошмар. Если каждый будет задавать свой список и имена параметров - разобраться будет невозможно
там ещё ограничение в 16K на всё, именно это стало причиной почему XData так мало пользуются - если несколько приложений начнут писать свои данные, то будут сплошные fatal error'ы
trir вне форума  
 
Непрочитано 14.07.2021, 08:13
#24
Кулик Алексей aka kpblc
Moderator

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


Fatal вряд ли, скорее - обрезка не влезающих данных. Offtop: С nickname2019 и trir согласен абсолютно и полностью.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.07.2021, 08:36
#25
Boxa

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


Может я чего то не понимаю, но прочитать/записать XData не сложно, вывести все это в csv или любой другой формат так же не сложно и по прочтению этой темы я так и не понял в чем проблема то, если нужен такой инструмент, бери да пиши.

АлексЮстасу, если Вы готовы профинансировать создание этого инструмента для сообщества, т.е. с открытым кодом, то я мог бы написать подобное, обращайтесь. =о)

ЗЫ.
Некоторое время назад, ТС опубликовал статью, по поводу тегов в КАД Бентли, если я правильно помню, мне тогда понравилась эта идея и я реализовал подобное для автокада (даже окошки и менюшки постарался сделать похожими), прежде чем отдать сотрудникам я попытался по пользоваться сам... не зашло, хотя часть тех наработок использую до сих пор.
Boxa вне форума  
 
Непрочитано 14.07.2021, 09:22
#26
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Boxa, тс предпочитает код на лиспе.
koMon вне форума  
 
Непрочитано 14.07.2021, 09:39
#27
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Ненормально флудить и троллить.
чем вы успешно занимаетесь уже который год со своими присоединенными данными)

Цитата:
Сообщение от Boxa Посмотреть сообщение
если Вы готовы профинансировать создание этого инструмента для сообщества, т.е. с открытым кодом, то я мог бы написать подобное, обращайтесь. =о)
ТС не новичок на форуме, и знает - где раздел исполнителей

И ему прямо так нужно получить программу - что даже не удосужился выложить полный тестовый набор данных для тестирования. Это тоже показывает - насколько он заинтересован в конечном результате и насколько ценит время других)
Сергей812 вне форума  
 
Непрочитано 14.07.2021, 10:27
#28
Boxa

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


koMon, т.к. ТС не владеет ни одним языком, ИМХО ему должно быть совершенно параллельно на каком языке все это реализуется. Однако, если лисп принципиален, то бог в помощь, программистов много. =0)

Сергей812, я все понимаю, но реально задолбало читать про волшебные XData и как они всех спасут. Я в свое время попробовал, не пошло, может новый виток приведет к чему то хорошему... хотя у меня сомнения в этой затее, но если ТС все это профинансирует, то почему нет. Про раздел исполнителей ТС писали много раз, но он намеков не понимает видимо, потому пишу прямо.

Причем мне в этой теме не сколько интересно писать программу, сколько интересно понаблюдать взлетит ли у автора эта гравицапа, после стольких лет =0)
Boxa вне форума  
 
Непрочитано 14.07.2021, 11:28
#29
Сергей812


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
взлетит ли у автора эта гравицапа, после стольких лет
не давайте ТС ложных надежд))

Понимаю, если разговор шел бы о вспомогательной библиотеке работы с XData - например, как с индексированными свойствами. Т.е. данная библиотека как основа для разработки других надстроек. А пропихивать с маниакальным упорством XData как самодостаточное изделие...
Сергей812 вне форума  
 
Непрочитано 16.07.2021, 15:53
1 | #30
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


АлексЮстасу,
это не коррекция, это другой новый лисп, который выгружает все расширенные данные для всех приложений по умолчанию в файл/ы csv/txt в папку с рабочим чертежом, с именем рабочего чертежа и суффиксом "_xdatum" и если выбрана множественная запись файлов, то ещё и с суффиксом "_Название_Приложения". проверок на работу с файлом нет. для каждого приложения своя строка в выводимом файле, первая строка также включает название примитива и его handle. значения полей расширенных данных следуют за их dxf кодом. множественные значения выводятся скобочным списком. легенда по dxf кодам в конце файла csv.

Код:
[Выделить все]
 
;**********************************************************************************************************************

;	Пользовательская команда EXDATUM для выгрузки расширенных данных у выбранных примитивов. koMon, 02/22.

;**********************************************************************************************************************

(vl-load-com)

;**********************************************************************************************************************

(defun select_string ( 	preselected_string_list
						_list
						dialog_name
					  /
						main_dcl_strings_list
						dcl_filename_full
						sl_dcl_id
						_list
						dialog_result
						selected_strings_list
					 )

	;******************************************************************************************************************

	(defun write_dialog_file (dialog_strings_list / temp_file_path dcl_filename_full dcl_file_id)
		(setq temp_file_path (vla-get-tempfilepath (vla-get-files (vla-get-preferences (vlax-get-acad-object))))
			  dcl_filename_full (vl-filename-mktemp "Dialog" temp_file_path ".dcl"])
			  dcl_file_id (open dcl_filename_full "w")
		)
		(mapcar '(lambda (dcl_str) (write-line
										dcl_str
										dcl_file_id
									)
				 )
				 dialog_strings_list
		)
		(close dcl_file_id)
		dcl_filename_full
	)

	;******************************************************************************************************************

	(defun populate_list ( list_key list_to_process )
		(start_list list_key 3)
			(mapcar 'add_list
				  	(mapcar '(lambda (list_element)
				  			 	(strcat "\n" list_element)
				  			 )
				  			 list_to_process
				  	)
			)
		(end_list)
	)

	;******************************************************************************************************************

	(defun list_to_number_string (preselected_string_list _list)
		(apply 'strcat (mapcar '(lambda (preselected_string) (if (setq position (vl-position preselected_string _list))
																(strcat (itoa position) " ")
																""
															 )
								)
								preselected_string_list
					   )
		)
	)

	;******************************************************************************************************************

	(setq main_dcl_strings_list
								(list
									"Strings_List : dialog {"
															(strcat "label = \"" dialog_name "\";")
															": list_box {"
																			"key = \"All_Strings_List\";"
																			"width = 50;"
																			"height = 20;"
																			"allow_accept = true;"
																			"multiple_select = true;"
																       "}"
															"ok_cancel;"
											     		 "}"
								)
		  dcl_filename_full (write_dialog_file main_dcl_strings_list)
		  sl_dcl_id (load_dialog dcl_filename_full)
	)
	(if sl_dcl_id
		(if (new_dialog "Strings_List" sl_dcl_id)
			(progn
				(populate_list "All_Strings_List" _list)
				(set_tile "All_Strings_List" (list_to_number_string preselected_string_list _list))
				(action_tile "All_Strings_List" "(cond
													(
														(= 4 $reason)
															(setq selected_strings_list $value)
													)
													(
														t
															(setq selected_strings_list $value)
													)
												 )
											   "
				)
				(setq dialog_result (start_dialog))
				(unload_dialog sl_dcl_id)
				(vl-file-delete dcl_filename_full)
				(cond
						(
							(= dialog_result 1)
								(if selected_strings_list
									(setq selected_strings_list (mapcar '(lambda (index)
																			(nth index _list)
																		)
																		(read (strcat "(" selected_strings_list ")"))
															   )
									)
									(setq selected_strings_list (mapcar '(lambda (index) (nth index _list))
																		 (vl-sort (read (strcat "(" (list_to_number_string preselected_string_list _list) ")")) '<)
																)
									)
								)
						)
						(
							t
								(setq selected_strings_list nil)
						)
				)
			)
		)
	)
	selected_strings_list
)

;**********************************************************************************************************************

(defun divide_list_at_nth_index (in_list nth_index / in_list_before in_list_after)
	(repeat nth_index
		(setq in_list_before (append in_list_before (list (car in_list)))
			  in_list_after (cdr in_list)
			  in_list in_list_after
		)
	)
	(append (list in_list_before) (list in_list_after))
)

;**********************************************************************************************************************

(defun get_app_name_list (selection_set / index app_list xd_type xd_variant 1001_index app_list)
	(setq index 0)
	(repeat (sslength selection_set)
		(vla-getxdata (vlax-ename->vla-object (ssname selection_set index)) "" 'xd_type 'xd_variant)
		(if xd_type
			(progn
				(setq 1001_index 0)
				(foreach _type (vlax-safearray->list xd_type)
					(if (= 1001 _type)
							(if (and
									(not (member (setq app_name (vlax-variant-value (nth 1001_index (vlax-safearray->list xd_variant)))) app_list))
									(not (vl-some '(lambda (drop_app_name) (wcmatch (strcase app_name) (strcase drop_app_name)))
											  	   apps_to_exclude
										 )
									)
								)
									(setq app_list (append app_list (list app_name)))
							)
					)
					(setq 1001_index (1+ 1001_index))
				)
			)
		)
		(setq index (1+ index))
	)
;	(if app_list
;			(acad_strlsort app_list)
			app_list
;	)
)

;**********************************************************************************************************************

(defun get_csv_filename (extension / output_name csv_filename)
	(setq output_name (strcat (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'Path)
					   		  "\\"
							  (vl-filename-base (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'Name))
							  "_xdatum"
					  )
	)
	(if (type (vl-symbol-value 'acet-ui-getfile))
			(setq csv_filename (acet-ui-getfile "Enter CSV filename"
												output_name
												extension
												""
												1
							   )
			)
			(setq csv_filename (getfiled "Enter CSV filename"
										  output_name
										 extension
										 1
							   )
			)
	)
	(if (= "" csv_filename)
		nil
		csv_filename
	)
)

;**********************************************************************************************************************

(defun get_prompted_value (initget_value get_function prompt_string var command_terminated / default_string var_saved)
	(if (/= 3 (getvar 'dynmode)) (setvar 'dynmode 3))
	(if (null command_terminated)
		(progn
			(setq var_saved (read (strcat (vl-symbol-name var) "_saved")))
			(cond
				(
					(null (vl-symbol-value var_saved))
						(setq default_string "")
				)
				(
					(= 'str (type (vl-symbol-value var_saved)))
						(setq default_string (vl-symbol-value var_saved))
				)
				(
					t
						(setq default_string (rtos (vl-symbol-value var_saved)))
				)
			)
			(initget initget_value)
 			(set var (vl-catch-all-apply get_function (list (strcat "\n" prompt_string " <" default_string ">: "))))
 			(cond
 				(
 					(null (vl-symbol-value var))
 						(set var (vl-symbol-value var_saved))
 				)
 				(
 					(vl-catch-all-error-p (vl-symbol-value var))
 						(setq command_terminated t)
 				)
 				(
 					t
 						(set var_saved (vl-symbol-value var))
 				)
 			)
		)
	)
 	command_terminated
)

;**********************************************************************************************************************

(defun c:eXDatum (/ entities_ss application_list ss_index csv_filename_full csv_file_id object_identified
					xd_object xd_type xd_variant xd_list xd_list_applicated 1001_nth xd_list_divided xd_list_applicated
					application_identified command_terminated each_app_to_file overriden value_separator
					selecting_xd_active apps_to_exclude app_list items_number dynmode_set selecting_all
				 )
	(if (null action) (setq action "Да"))
	(setq dynmode_set (getvar 'dynmode))

	;##################################################################################################################
	;										список исключаемых приложений
	;##################################################################################################################

;	(setq apps_to_exclude
;		  (mapcar 'vl-symbol-name
;		  		  '(
;					;************************************************************************************************

;				  	 acad* gradient*

;					;************************************************************************************************
;				   )
;		  )
;	)

	;##################################################################################################################
	;										список исключаемых приложений
	;##################################################################################################################

	(setq selecting_xd_active t)
	(while selecting_xd_active
		(cond
			(
				(setq entities_ss (vl-catch-all-apply 'ssget (list '((-3 ("*"))))))
					(setq selecting_xd_active nil)
					(if (vl-catch-all-error-p entities_ss)
						(setq command_terminated t
							  selecting_xd_active nil
						)
					)
			)
			(
				(null entities_ss)
					(setq selecting_all t)
					(while selecting_all
						(initget "Да Нет")
						(if (vl-catch-all-error-p (vl-catch-all-apply 'getkword (list (strcat "Ничего не выбрано. Выбрать все объекты базы с XD? (ESC изменить, Space подтвердить):[" action "] <" action ">"))))
							(setq action (cadr (member action '("Да" "Нет" "Да"))))
							(if (= "Да" action)
									(setq entities_ss (ssget "_x" '((-3 ("*"))))
										  selecting_xd_active nil
										  selecting_all nil
									)
									(setq selecting_all nil)
							)
						)
					)
			)
		)
	)
	(if (and
			(null command_terminated)
			entities_ss
			(setq app_list (get_app_name_list entities_ss))
			(setq application_list (select_string preselected_apps app_list "Приложения для выгрузки XD"))
	      	(null (setq command_terminated (get_prompted_value "Да Нет" 'getkword "Писать отдельный файл для каждого приложения [Да/Нет]" 'each_app_to_file command_terminated)))
			(null (setq command_terminated (get_prompted_value "Запятая ТОчкаЗапятая ТАбуляция" 'getkword "Разделитель данных [Запятая/ТОчкаЗапятая/ТАбуляция]" 'value_separator command_terminated)))
			(setq value_separator (cdr (assoc value_separator '(("Запятая" . ",") ("ТОчкаЗапятая" . ";") ("ТАбуляция" . "\t")))))
		)
			(cond
				(
					(= "Нет" each_app_to_file)
						(if (setq csv_filename_full (get_csv_filename "csv;txt"))
							(progn
								(setq ss_index 0)
								(if (findfile csv_filename_full) (setq overriden " (перезаписан)") (setq overriden ""))
								(while (null (setq csv_file_id (open csv_filename_full "w")))
									(alert (strcat "Файл \"" csv_filename_full "\" используется."
												   "\nЗакройте его для продолжения"
										   )
									)
								)
								(princ (strcat "\n" csv_filename_full))
								(princ overriden)
								(repeat (sslength entities_ss)
									(setq object_identified nil)
									(foreach application application_list
										(vla-getxdata (setq xd_object (vlax-ename->vla-object (ssname entities_ss ss_index))) application 'xd_type 'xd_variant)
										(if xd_type
											(progn
												(setq xd_list (mapcar '(lambda (type data) (cons type data)) (vlax-safearray->list xd_type) (vlax-safearray->list xd_variant))
													  xd_list_applicated nil
												)
												(while (setq 1001_nth (vl-position (assoc 1001 (cdr xd_list)) (cdr xd_list)))
													(setq xd_list_divided (divide_list_at_nth_index xd_list (1+ 1001_nth)))
													(setq xd_list_applicated (append xd_list_applicated (list (car xd_list_divided))))
													(setq xd_list (cadr xd_list_divided))
												)
												(foreach xd_sublist (append xd_list_applicated (list xd_list))
													(foreach xd_ (append (list (car xd_sublist)) (vl-sort (cdr xd_sublist) '(lambda (member_1 member_2) (< (car member_1) (car member_2)))))
														(cond
															(
																(= 1001 (car xd_))
																	(if (null object_identified)
																		(progn
																			(princ (strcat (substr (vla-get-objectname xd_object) 5) value_separator "Handle" value_separator "'" (vla-get-handle xd_object)  value_separator "Application" value_separator (vlax-variant-value (cdr xd_))) csv_file_id)
																			(setq object_identified t)
																		)
																		(princ (strcat value_separator value_separator value_separator "Application" value_separator (vl-princ-to-string (vlax-variant-value (cdr xd_)))) csv_file_id)
																	)
															)
															(
																(/= 1002 (car xd_))
																	(princ (strcat value_separator (vl-princ-to-string (car xd_)) value_separator) csv_file_id)
																	(cond
																		(
																			(= 'safearray (type (vlax-variant-value (cdr xd_))))
																				(princ (vlax-safearray->list (vlax-variant-value (cdr xd_))) csv_file_id)
																		)
																		(
																			t
																				(princ (vlax-variant-value (cdr xd_)) csv_file_id)
																		)
																	)
															)
															(
																t
															)
														)
													)
													(princ "\n" csv_file_id)
												)
											)
										)
									)
									(setq ss_index (1+ ss_index))
								)
								(princ
								"****************
								1000; String
								1003; Layer name
								1004; Binary data
								1005; Database handle
								1010, 1020, 1030; 3 Reals
								1011, 1021, 1031; World space position
								1012, 1022, 1032; World space displacement
								1013, 1023, 1033; World direction
								1040; Real
								1041; Distance
								1042; Scale factor
								1070; Integer
								1071; Long"
								csv_file_id)
								(close csv_file_id)
								(setq preselected_apps application_list)
						)
						(princ "\nКоманда отменена или не выбраны примитивы/приложения для выгрузки")
					)
				)
				(
					t
						(if (setq csv_filename_full (get_csv_filename ";csv;txt"))
							(progn
								(foreach application application_list
									(setq ss_index 0)
									(setq application_identified nil)
									(if (findfile (strcat (vl-filename-directory csv_filename_full) "\\" (vl-filename-base csv_filename_full) "_" application (vl-filename-extension csv_filename_full))) (setq overriden " (перезаписан)") (setq overriden ""))
									(setq csv_file_id (open (princ (strcat (vl-filename-directory csv_filename_full) "\\" (vl-filename-base csv_filename_full) "_" application (vl-filename-extension csv_filename_full))) "w"))
									(princ overriden)
									(setq items_number 0)
									(repeat (sslength entities_ss)
										(vla-getxdata (setq xd_object (vlax-ename->vla-object (ssname entities_ss ss_index))) application 'xd_type 'xd_variant)
										(if xd_type
											(progn
												(setq xd_list (mapcar '(lambda (type data) (cons type data)) (vlax-safearray->list xd_type) (vlax-safearray->list xd_variant))
													  xd_list_applicated nil
													  items_number (1+ items_number)
												)
												(while (setq 1001_nth (vl-position (assoc 1001 (cdr xd_list)) (cdr xd_list)))
													(setq xd_list_divided (divide_list_at_nth_index xd_list (1+ 1001_nth)))
													(setq xd_list_applicated (append xd_list_applicated (list (car xd_list_divided))))
													(setq xd_list (cadr xd_list_divided))
												)
												(setq xd_sublist (assoc (cons 1001 (vlax-make-variant application)) (append xd_list_applicated (list xd_list))))
												(foreach xd_ (append (list (car xd_sublist)) (vl-sort (cdr xd_sublist) '(lambda (member_1 member_2) (< (car member_1) (car member_2)))))
													(cond
														(
															(= 1001 (car xd_))
																(if (null application_identified)
																	(progn
																		(princ (strcat (substr (vla-get-objectname xd_object) 5) value_separator "Handle" value_separator (vla-get-handle xd_object) value_separator "Application" value_separator (vlax-variant-value (cdr xd_))) csv_file_id)
																		(setq application_identified t)
																	)
																	(princ (strcat (substr (vla-get-objectname xd_object) 5) value_separator "Handle" value_separator "'" (vla-get-handle xd_object) value_separator value_separator)  csv_file_id)
																)
														)
														(
															(/= 1002 (car xd_))
																(princ (strcat value_separator (vl-princ-to-string (car xd_)) value_separator) csv_file_id)
																(cond
																	(
																		(= 'safearray (type (vlax-variant-value (cdr xd_))))
																			(princ (vlax-safearray->list (vlax-variant-value (cdr xd_))) csv_file_id)
																	)
																	(
																		t
																			(princ (vlax-variant-value (cdr xd_)) csv_file_id)
																	)
																)
														)
														(
															t
														)
													)
												)
												(princ "\n" csv_file_id)
											)
										)
										(setq ss_index (1+ ss_index))
									)
									(princ (strcat ". Количество записей: " (itoa items_number) "\n"))
									(princ
									"****************
									1000; String
									1003; Layer name
									1004; Binary data
									1005; Database handle
									1010, 1020, 1030; 3 Reals
									1011, 1021, 1031; World space position
									1012, 1022, 1032; World space displacement
									1013, 1023, 1033; World direction
									1040; Real
									1041; Distance
									1042; Scale factor
									1070; Integer
									1071; Long"
									csv_file_id)
									(close csv_file_id)
								)
								(setq preselected_apps application_list)
							)
							(princ "\nКоманда отменена/не выбраны примитивы/приложения для выгрузки")
						)
				)
			)
			(princ "\nКоманда отменена/не выбраны примитивы (приложения) для выгрузки")
	)
	(setvar 'dynmode dynmode_set)
	(princ)
)

;**********************************************************************************************************************

Последний раз редактировалось koMon, 08.02.2022 в 11:43.
koMon вне форума  
 
Автор темы   Непрочитано 16.07.2021, 21:31
#31
АлексЮстасу

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


Спасибо!
В целом, кажется, разобрался.
Оч. удобно, что действует и для заранее выбранных объектов, и можно выбрать после.
Цитата:
Сообщение от koMon Посмотреть сообщение
выгружает все расширенные данные для всех приложений по умолчанию в файл csv
По-моему, лучше выгружать в условно стандартный вид - близкий к выгружаемому ATTOUT и All_OD2CSV.lsp из #17, чтобы пользователям было проще и разбираться в данных, и готовить для перевода в другой вид.
В т.ч., что лучше выгружать каждый Appname в свой файл. Тогда проще сформировать строку заголовка, и пользователям легче просматривать-анализировать данные.
Да, ATTOUT выгружает все выбранные блоки в один файл, но и работать с ним пользователям сложнее.
В заголовке я бы выводил не коды, а человекопонятные обозначения типов данных. И, наверное, давал их порядковый номер (1_INTEGER, 5_STRING) - чтобы легче было ориентироваться в случае многих однотипных полей, видеть, что поля (колонки) были переставлены.
Вроде:
Цитата:
Для одного Appname

Из ATTOUT:

HANDLE BLOCKNAME NUMBER IDNETWRK
'DBE asrn_node 72 ST25
'DB8 asrn_node 59 ST26


Из csv-экспорта XData:

HANDLE PRIMITIVE 1_INTEGER 2_STRING
'DBE BlockReference 72 ST25
'DB8 BlockReference 59 ST26


Из All_OD2CSV.lsp:

HANDLE NUMBER IDNETWRK
'DB8 59 ST26
'DBE 72 ST25
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 16.07.2021, 22:08
#32
Кулик Алексей aka kpblc
Moderator

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


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

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
...
Все приведенные мной сейчас соображения повторяют описанное мной в вопросе.
Придавать порядковые номера к названиям полей-колонок я придумал, да, позже. С ними для XData было бы удобнее, но и не настаиваю.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 17.07.2021, 10:03
#34
Сергей812


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
И, наверное, давал их порядковый номер (1_INTEGER, 5_STRING) - чтобы легче было ориентироваться в случае многих однотипных полей, видеть, что поля (колонки) были переставлены.
В NOD занести список соответствий {Целое число - ключ ID и Строковое название поля}, в XData писать парами -> число ID названия поля и само значение. Тогда был бы осознанный вывод информации, а не шифровки Юстас-центру) С тем же извлечением данных из атрибутов люди до сих пор работают - но там же однозначная привязка данных к имени атрибута.
Сергей812 вне форума  
 
Непрочитано 17.07.2021, 10:22
| 1 #35
Boxa

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


koMon, на полном серьезе, спасибо за помощь ТС.
Теперь самое интересное, наблюдать взлетит или нет и если взлетит, то в каком направлении =)

ЗЫ.
Накину, одна из причин, почему XData не зашли у конечного пользователя - эти данные не видно, не видно есть они или нет, не видно что там хранится, в отличи от атрибутов блока.
Но очень любопытно....
Boxa вне форума  
 
Непрочитано 17.07.2021, 10:23
#36
nickname2019


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


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

1. Делаем динамический блок, который имеет параметр растяжения и выглядит как условное обозначение забора в плане.
2. В блок добавляем атрибуты, которые нужны для составления спецификации (производитель, марка, высота и т.д.)
3. На генплане "разбрасываем" динамические блоки в соотвествующем слое и изменяем их длины в соответствии с требуемым планом забора
4. Изолируем слои с забором и делаем что-то типа attout для изолированных объектов
5. Обрабатываем результаты в экселе и создаем спецификацию

Атрибуты для указанных динамических блоков очень удобно задаются в свойствах выделенного объекта (хоть для всех сразу, хоть для некоторых, хоть для одного).

Зачем XDATA? Для XDATA нет удобного инструмента вроде палитры свойств объекта.
Для XDATA будем писать аналогичный менеджер свойств?

P.S. Любой объект (трубу, кабель и т.д.) можно сделать динамическим блоком, навешать на него нужные атрибуты и относительно быстро заспецифицировать.

Последний раз редактировалось nickname2019, 17.07.2021 в 10:30.
nickname2019 вне форума  
 
Непрочитано 17.07.2021, 10:54
#37
Сергей812


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
эти данные не видно, не видно есть они или нет, не видно что там хранится, в отличи от атрибутов блока.
ну на том же .Net сделать палитру и в обработчике события ImpliedSelectionChanged собирать и выводить информацию из XData - не сверхсложная задача) Но опять же, для организации нормального вывода нужно делать индексируемые свойства в XData - чтобы при выводе для одновременном выделении разных примитивов можно было выводить одинаковое значение либо писать "разное". Если бы ТС хотел реально заниматься решением этой задачи, а не безудержным хайпом на присоединенных данных на XData...

Цитата:
Сообщение от nickname2019 Посмотреть сообщение
P.S. Любой объект (трубу, кабель и т.д.) можно сделать динамическим блоком, навешать на него нужные атрибуты и относительно быстро заспецифицировать.
так охота "плодить" бесконечные анонимные промежуточные определения блоков?
Сергей812 вне форума  
 
Непрочитано 17.07.2021, 11:17
#38
nickname2019


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
так охота "плодить" бесконечные анонимные промежуточные определения блоков?
Ели цель сдать быстро работу и получить деньги - для генплана и ТХ самое оно. Там объектов мало, тормозить серьезно не будет.
Проблемы могут быть если объектов много, например, при армировании ж.б.к. Там хомутов могут быть тысячи в одном файле.
nickname2019 вне форума  
 
Непрочитано 17.07.2021, 13:10
#39
Boxa

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну на том же .Net сделать палитру и в обработчике события ImpliedSelectionChanged собирать и выводить информацию из XData - не сверхсложная задача)
ну на том же .NEt можно и переопределить внешний вид примитива, выведя туда данные из XData, а ля атрибуты блока, используя OPMNetExt можно попробовать добавить XData в стандартную панель свойств и т.д. и т.п. Было бы желание и время этим заниматься.
Но вот зачем, мне пока не понятно. Достаточно других инструментов, не понятна финансовая выгода с всего этого. Используя другие инструменты я выполню ту же работу с той же скоростью и зачем при этом тратить время/деньги на разработку этого ПО не вполне понятно. Поэтому с интересом наблюдаю за движухой...


АлексЮстасу, Вы проверяли, не теряются ли / портятся ли XData при вылете автокада с фатальной ошибкой и при последующем восстановлении файла?
Boxa вне форума  
 
Непрочитано 17.07.2021, 14:23
#40
Сергей812


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
ну на том же .NEt можно и переопределить внешний вид примитива, выведя туда данные из XData, а ля атрибуты блока
или определить примитивы под апертурой курсора (вроде в обработчике PointMonitor, насколько помню) и всплывающее окно полупрозрачное около курсора с информацией..

Цитата:
Сообщение от Boxa Посмотреть сообщение
не понятна финансовая выгода с всего этого
какая может быть финансовая выгода - когда по истечении стольких лет процесс у ТС дошел лишь до собирания винегрета из чужих программ для работы с XData?
Сергей812 вне форума  
 
Непрочитано 17.07.2021, 14:40
#41
zamtmn

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


Чтоб взлетело - нужно отображение в окне свойств и какоето отдельное отображение данных в какойто древовидной структуре, чтоб быстро находить нужные примитивы
zamtmn вне форума  
 
Автор темы   Непрочитано 17.07.2021, 15:31
#42
АлексЮстасу

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


Насколько могу понять (могу ошибаться!), этот фрагмент кода отвечает за выведение списка Apps XData в свое окно и выбор пользователем нужных Apps в этом окне. В т.ч. с помощью Ctrl и Shift.
Код:
[Выделить все]
 ;; ListBox (gile)
;; Boite de dialogue permettant un ou plusieurs choix dans une liste
;;
;; Arguments
;; title : le titre de la boite de dialogue (chaîne)
;; msg ; message (chaîne), "" ou nil pour aucun
;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...)
;; flag : 0 = liste déroulante
;; 1 = liste choix unique
;; 2 = liste choix multipes
;;
;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2)
;;
;; Exemple d'utilisation
;; (listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoutlist) (layoutlist)) 1)
(vl-load-com)
(defun str2lst (str sep / pos)
  (if (setq pos (vl-string-search sep str))
    (cons
      (substr str 1 pos)
      (str2lst (substr str (+ (strlen sep) pos 1)) sep)
    )
    (list str)
  )
)
(defun ListBox (title msg keylab flag / tmp file dcl_id choice)
  (setq
    tmp (vl-filename-mktemp "tmp.dcl")
    file (open tmp "w")
  )
  (write-line
    (strcat "ListBox:dialog{label=\"" title "\";")
    file
  )
  (if (and msg (/= msg ""))
    (write-line (strcat ":text{label=\"" msg "\";}") file)
  )
  (write-line
    (cond
      ((= 0 flag) "spacer;:popup_list{key=\"lst\";")
      ((= 1 flag) "spacer;:list_box{key=\"lst\";width=32;")
      (T "spacer;:list_box{key=\"lst\";width=32;multiple_select=true;")
    )
    file
  )
  (write-line "}ok_cancel_err;}" file)
  (close file)
  (setq dcl_id (load_dialog tmp))
  (if (not (new_dialog "ListBox" dcl_id))
    (exit)
  )
  (start_list "lst")
  (mapcar 'add_list (mapcar 'cdr keylab))
  (end_list)
  (action_tile
    "accept"
    "(or (= (get_tile \"lst\") \"\")
      (if (= 2 flag)
        (progn
          (foreach n (str2lst (get_tile \"lst\") \" \")
            (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice))
          )
          (setq choice (reverse choice))
        )
        (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab)))
      )
    )
    (done_dialog)"
  )
  (start_dialog)
  (unload_dialog dcl_id)
  (vl-file-delete tmp)
  choice
)
А как-то так он вызывается в программе (это мое предположение профана):
Код:
[Выделить все]
         (setq sel_app (listbox "Applications" "Choisir l'application" (mapcar 'cons lst_apps lst_apps) 2))
Точнее можно посмотреть в sel_by_apps.lsp в моей подборке 30+ программ для XData или в https://forum.dwg.ru/showpost.php?p=...0&postcount=44

Если есть выбранные объекты, то в окно Apps можно вывести только те, которые есть у выбранного.

Хорошо бы в eXDatum.lsp добавить таким образом выбор экспортируемых Apps.
Тогда, совмещенное с выбором объектов, управление экспортом было бы для пользователей и точнее, и эффективнее.
Миниатюры
Нажмите на изображение для увеличения
Название: выбор_Apps_El.png
Просмотров: 48
Размер:	9.4 Кб
ID:	238977  
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 17.07.2021 в 16:02. Причина: Замена картинки; добавил пример лиспа
АлексЮстасу вне форума  
 
Непрочитано 19.07.2021, 11:51
1 | #43
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


да это простейший диалог с одним элементом построения списка и стандартными кнопками.

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Хорошо бы в eXDatum.lsp добавить таким образом выбор экспортируемых Apps.
обновил #30 с диалогом.

Boxa, звучит как-то амбивалентно
koMon вне форума  
 
Автор темы   Непрочитано 19.07.2021, 15:36
#44
АлексЮстасу

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


Спасибо!
Управление выгрузкой так и проще, и точнее!

Сейчас при Esc все равно создается файл - с "послесловием" о кодах. Т.е. так можно случайно затереть содержательные данные.

Хорошо бы дать пользователю возможность выбирать место для сохранения, да и изменять "префикс" заодно. Вроде бы в лиспе есть стандартная возможность - как окно из картинки?
Тогда и полученные данные можно сравнивать при разных выгрузках, и не утратить незаметно предыдущие.

Если нет предупреждений, что файлы уже существуют, то, может, выдавать общее предупреждение, что Существующие файлы будут заменены?

Добавлено: для тестирования XData можно использовать файлы Electrical.
Миниатюры
Нажмите на изображение для увеличения
Название: окно_file.png
Просмотров: 34
Размер:	32.6 Кб
ID:	239034  
Вложения
Тип файла: dwg
DWG 2004
Electrical.dwg (2.48 Мб, 13 просмотров)
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 19.07.2021, 15:47
#45
Кулик Алексей aka kpblc
Moderator

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


Повторюсь:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Offtop: Аппетит приходит во время еды. АлексЮстасу, изучай программирование и пиши сам чего хочешь - только в таком случае ты получишь именно то, что тебе нужно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.07.2021, 17:13
#46
АлексЮстасу

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
...
Соображений, выходящих за пределы стандартных самых общих принципов работы с файлами, я не высказываю.
Offtop: А если б ты в теме "Сделать при выборе объектов Enter соответствующим <Все>" подсказал решение, то это помогло бы моему пониманию лиспа.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 20.07.2021, 12:24
1 | #47
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Сейчас при Esc все равно создается файл - с "послесловием" о кодах. Т.е. так можно случайно затереть содержательные данные.
обновил #30. при нажатии Esc или не выбранных App команда завершается без записи пустого файла. файл запрашивается в лисп диалоге или et диалоге.
koMon вне форума  
 
Автор темы   Непрочитано 20.07.2021, 16:02
#48
АлексЮстасу

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


Здорово, что теперь можно не только менять место выгрузки, но и управлять префиксом! Легче сравнивать результаты разных выгрузок.
И с предупреждениями точно безопаснее.

А за "Select objects <All>:" отдельное особое спасибо!

Можно для профанов? Что есть "et диалог"?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 20.07.2021, 16:21
1 | #49
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


диалог функции по работе с именем файла из Express Tools (ET).
koMon вне форума  
 
Автор темы   Непрочитано 21.07.2021, 15:33
#50
АлексЮстасу

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


Цитата:
Сообщение от koMon Посмотреть сообщение
koMon
У меня был открыт в блокноте соответствующий csv, и после предупреждения, что файл существует, появилось окно
Цитата:
Файл "" используется.
Закройте его для продолжения
Я все csv закрыл, но это окно не реагирует ни на что, и блокирует весь AutoCAD.
Кстати, названия файла csv в окне нет - "".
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 21.07.2021, 16:05
#51
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


дескриптор файла не закрылся. точно блокнот втроенный. ятд, что встроенный не оставляет открытыми дескрипторы и читает всё в память, если только их не открыто немерянно. надо переписать на этот случай фрагмент с открытием файла.
koMon вне форума  
 
Автор темы   Непрочитано 21.07.2021, 16:20
#52
АлексЮстасу

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


Цитата:
Сообщение от koMon Посмотреть сообщение
koMon
Я проверяю в разных вариантах, и пока с Вашей программой это единственная проблемка.

----- добавлено через ~4 ч. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
дескриптор файла не закрылся. точно блокнот втроенный. ятд, что встроенный не оставляет открытыми дескрипторы и читает всё в память, если только их не открыто немерянно. надо переписать на этот случай фрагмент с открытием файла.
В заглохшем AutoCAD MTEXTED был "Internal".
Я попробовал в другом AutoCAD, и запроса "Файл "" используется. Закройте его для продолжения" не было. В нем MTEXTED "Встроенный".
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 22.07.2021, 14:08
1 | #53
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


я имел в виду notepad встроенный в винду. а так-то с дескрипторами нужно аккуратнее.
koMon вне форума  
 
Автор темы   Непрочитано 25.07.2021, 04:30
#54
АлексЮстасу

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


Пока предположительно.
Наверное, пользователям выгружать XData, создаваемые самим AutoCAD, ни к чему?
Может быть их лучше исключить из показываемых пользователю Apps, из выгружаемых Apps?
Перечень таких пока оч. скуден, собран методом тыка, официального нет:
ACAD - у видовых экранов, у размеров, у штриховок,
GradientColor1ACI - у штриховок,
GradientColor2ACI - у штриховок,
PE_URL - для гиперлинков,
IRD - для топологических данных в Map 3D.
XData в Electrical используются вовсю, помногу, списка их тоже нет. Сотни.
У большинства из них особенность - есть общие начала названий:
VIA_WD_...
ACE_TABLE_...
CIM_WD_...
AVE_...
KABLING.
Может быть для этих и подобных предусмотреть маски звездочками? Вроде: VIA_WD_*, ACE_TABLE_*.
В целом похоже на список неудаляемых словарей, который здесь на форуме тоже собирали всем миром - https://forum.dwg.ru/showpost.php?p=...4&postcount=94.
Здесь же список для не показываемых пользователю, не выгружаемых XData.
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 26.07.2021 в 00:24.
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 09.03.2022, 16:39
#55
АлексЮстасу

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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
если в импорт+экспорт = вообще красота
Вот и импорт (загрузка) - XDTOOLS_CSV2.
Загружаются данные в XData из csv, txt с одинаковым количеством данных через разделители табуляцией, точкой с запятой, запятой.
После выбора файла загружаются данные из всех файлов с одинаковым префиксом, если в названии есть символ "&". Часть названия файла после "&" принимается как название XData. Или все название, если нет "&".
В т.ч. можно загружать данные txt из ATTOUT.

Написано слабо, переделано из программы француза для аналогичных данных, но задачу выполняет.
Требует тестирования.
Вложения
Тип файла: lsp XDTOOLS_CSV2-v-0-6.lsp (10.9 Кб, 14 просмотров)
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 14.03.2022, 20:31
#56
АлексЮстасу

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


На основе опубликованной здесь eXDatum.lsp от komon сделана команда выгрузки данных из XData в csv, txt в двух вариантах: в общий файл, в раздельные файлы для каждого XData.

Выгружаются указанные XData для выбранных объектов.
Изменения-дополнения сделаны для удобства пользователей.

Одновременно француз CADaSchtroumpf создал свои такие же программы выгрузки-загрузки XData: All_XD2CSV.lsp и CSV2XD.lsp.

Выгружаются сразу все указанные XData и загружаются все csv, txt с указанным префиксом названий файлов.
Миниатюры
Нажмите на изображение для увеличения
Название: XDTOOLS_2CSV.png
Просмотров: 24
Размер:	33.1 Кб
ID:	246013  
Вложения
Тип файла: lsp XDTOOLS_2CSV-v-0-62.lsp (36.8 Кб, 15 просмотров)
Тип файла: lsp XDTOOLS_CSV2-v-0-62.lsp (11.5 Кб, 15 просмотров)
Тип файла: lsp All_XD2CSV.lsp (5.9 Кб, 18 просмотров)
Тип файла: lsp CSV2XD.lsp (3.7 Кб, 17 просмотров)
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Выгрузить XData в csv (txt)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автокад 2010 виснит намертво при сохранении файла LenaE AutoCAD 18 04.05.2020 12:59
Как принято, как лучше описывать Xdata у элементов? АлексЮстасу AutoCAD 96 08.01.2020 09:25
Описание xdata АлексЮстасу Программирование 68 09.10.2014 11:46
Ищу способы упрощения работы с XData (расширенными данными) в VBA, Lisp RasRuf LISP 1 29.01.2009 10:55