Перенос информации в форматки

Автор Тема: Перенос информации в форматки  (Прочитано 14451 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Vladislav_ValerievichАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
  • Skype: skvortsov_vv
Доброго времени суток, господа!
Позвольте представиться – полный чайник в AutoLISP. Никогда не программировал. Лишь пользовался готовыми LISP и устраивал разборы, что за команды там используют. В общем, имею поверхностные представления.
Работаю проектировщиком в AutoCAD 2012. Ленивым проектировщиком. Оттого хочется постоянно оптимизировать процессы, которые десятки раз на дню повторяются в моём обиходе. Поэтому взываю о помощи со скидкой на мои знания.
Итак, есть файл «Схема.dwg» (прилагаю).
В нём есть блоки форматок «А4В1_ОКП», «А4В2_ОКП». Вся информация, хранящаяся в блоках – лежит в соответствующих атрибутах. Желание сделать механизм, благодаря которому в одном месте ввести данные (разработал, проверил, …) и эта информация перенеслась бы на все форматки в данном файле. В данном случае – в 2 форматки.
Спасибо за внимание.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Перенос информации в форматки
« Ответ #1 : 12-05-2017, 17:15:35 »
Vladislav_Valerievich
Встречный вопрос: вы хотите,  сами научиться программировать или ищете того, что напишет для вас программу? Если второе, то выбран неправильный раздел форума. Если первое, то где хотя-бы зачатки кода?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Перенос информации в форматки
« Ответ #2 : 12-05-2017, 23:55:48 »
ИМХО для этого программирование особо и не нужно. Нужно знание, что такое поле, и использование этого знания - хоть применительно к файлу, хоть к подшивке.
P.S. Файл не смотрел.
---
Добавлю: Плюс атрибуты блоков, поля и т.д., и т.п.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Vladislav_ValerievichАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
  • Skype: skvortsov_vv
Re: Перенос информации в форматки
« Ответ #3 : 15-05-2017, 09:39:18 »
Александр Ривилис
Я очень хочу научиться программировать и ни в коем случае не ищу кому можно сесть на шею.
Касательно зачатков кода – мои знания позволяют мне лишь назвать функцию (не бейте сильно)
Код - Auto/Visual Lisp [Выбрать]
  1. (defun format ()
  2. )
Зачатки кода простыми словами, упрощая цель – есть блоки форматок, например, «А4В1_ОКП» (в файле «Схема.dwg»). У всех есть атрибут «ФИО1». Хочу сделать диалоговое окно, в котором пользователю будет предложено ввести ФИО1 и после заполнения - данная информация перенесётся во все атрибуты «ФИО1» блоков форматок.
Возможно, я ошибаюсь и диалоговые окна – это не к AutoLISP.

Алексей Кулик
Посмотрел, что за зверь такой диковинный «Поле». Как понимаю, он позволяет работать узконаправленно, т.е. связывать конкретные блоки с их конкретными параметрами, что интересно, но не то, что меня интересует.

Скажу конечную цель, которую я преследую.
Хочу создать информационную базу/модель/оболочку (со своим интерфейсом), в которую пользователь будет вводить/вносить данные. Как например данные о своей фамилии. Далее данная информация будет выводиться в чертёж Автокада в соответствующие атрибуты блоков форматок.
Форматки – это то элементарное, с чего хочется начать.
Далее хочу считывать информацию со схем Автокада (определять блоки, связи между блоками), работать с ней и преобразовывать её в различные виды.
БД блоков у меня имеются.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Перенос информации в форматки
« Ответ #4 : 15-05-2017, 10:41:53 »
Диалоговые окна на AutoLISP разрабатывать можно (см. язык DCL и работа с ним). Но я сильно подозреваю, что именно в случае заполнения форматок подобный подход будет только мешать. Намного проще в пользовательские свойства документа "загнать" соответствующие данные и брать значения в атрибутах именно полями. Сугубо ИМХО - не стоит привлекать тяжелую артиллерию, если можно обойтись штатными возможностями.
Вот геометрический анализ - это значительно тяжелее. Найти вхождение блока не проблема. А вот определить "связь" (кстати, что под этим словом понимается?) - как правило, задача уже не настолько тривиальная и решаться будет в зависимости от очень многих факторов.
P.S. Если сегодня смогу, попробую нарисовать пример применения полей.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Перенос информации в форматки
« Ответ #5 : 15-05-2017, 10:59:16 »
Вот что получилось в первом приближении. Свойства документа доступны по команде _.dwgprops, там и менять все, что надо.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Vladislav_ValerievichАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
  • Skype: skvortsov_vv
Re: Перенос информации в форматки
« Ответ #6 : 23-05-2017, 11:59:22 »
Спасибо! Это было поучительно. Возникли вопросы:
1. Касательно синтаксиса команд. Попытался загуглить - бесполезно. Чем отличается _команда от _.команда? А ещё бывает_.-команда. Визуально - итог получается один.
2. Не все поля а штампе всегда заполняются - остаются и пустые. В этом случае выходят прочерки, за что можно получить бан от нормоконтроля :)

3. В моём штампе используются многострочные атрибуты, например, "ТЕКСТ1" - как быть с ним? Ибо в такой тип данных невозможно вставить поле.
4. Можно ли копировать свойства файла, чтобы не приходилось забивать их каждый раз?
5. Есть ли возможность регулировать порядок полей в свойствах файла?

6. В свойствах атрибутов - не обязательно ведь делать  его "установленным", если уже реализовано "постоянный"?
Спасибо за внимание!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Перенос информации в форматки
« Ответ #7 : 23-05-2017, 15:40:46 »
Чем отличается _команда от _.команда: http://autolisp.ru/2010/03/04/localization/
_.команда от _.-команда отличается тем, что некоторые команды позволяют работать в 2 режимах: либо диалогового окна, либо ком.строки. Попробуй вызвать _.-purge и _.-purge. Во втором варианте доступны некоторые интересные опции :)
Если надо использовать не "-", а "", кто мешает в соответствующие поля поставить по пробелу?
Можно ли копировать свойства файла, чтобы не приходилось забивать их каждый раз?
Не уверен, но, кажется, можно. Даж на лиспе. На dwg.ru, кажется, было что-то по этому вопросу.
Есть ли возможность регулировать порядок полей в свойствах файла?
По-моему, порядок создания и определяет порядок следования.
В свойствах атрибутов - не обязательно ведь делать  его "установленным", если уже реализовано "постоянный"?
А поле при этом работать будет? Если будет - то почему бы и нет.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Vladislav_ValerievichАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
  • Skype: skvortsov_vv
Re: Перенос информации в форматки
« Ответ #8 : 24-05-2017, 16:41:17 »
Цитировать
Поэтому лично я при неизбежности использования команд (бывает такое, бывает)
А чем ты рекомендуешь пользоваться?
Также у каждого блока форматок есть атрибут "№". Хочу сделать функцию, которая бы позволила пронумеровать форматки путём заполнения этого атрибута числами по приоритету слева направо, сверху вниз. Подскажите, пожалуйста, как это реализовать

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Перенос информации в форматки
« Ответ #9 : 24-05-2017, 16:51:48 »
Не понял, кому был адресован вопрос
А чем ты рекомендуешь пользоваться?
Если ко мне - то собственными наработками и разработками. Как правило, получается более интересно и более функционально.
Также у каждого блока форматок есть атрибут "№". Хочу сделать функцию, которая бы позволила пронумеровать форматки путём заполнения этого атрибута числами по приоритету слева направо, сверху вниз. Подскажите, пожалуйста, как это реализовать
Ну дык... Берем набор блоков, сортируем их по точкам вхождения или порядку следования листов в файле, у каждого блока получаем атрибут по тэгу и назначаем значение. В каком конкретно месте проблема?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Vladislav_ValerievichАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
  • Skype: skvortsov_vv
Re: Перенос информации в форматки
« Ответ #10 : 31-05-2017, 15:14:16 »
Если ко мне - то собственными наработками и разработками. Как правило, получается более интересно и более функционально.
А эти наработки делаешь исключительно с помощью AutoLISP?

Ну дык... Берем набор блоков, сортируем их по точкам вхождения или порядку следования листов в файле, у каждого блока получаем атрибут по тэгу и назначаем значение. В каком конкретно месте проблема?
Проблема в следующем:
Касательно зачатков кода – мои знания позволяют мне лишь назвать функцию (не бейте сильно)
Так или иначе почти неделю упорно пробую разобраться. Нашёл интересный источник "СПРАВОЧНИК AUTOLISP ФУНКЦИЙ. ПО АЛФАВИТУ": https://acad-prog.ru/spravochnik-autolisp-funktsij-po-alfavitu/#ssadd. При разборе опираюсь на него.
Итак, разбиваю задачу на пункты:
1. Выбрать набор блоков.
Хочу, чтобы набор осуществлялся без взаимодействия пользователя, т.е. в файле идёт автоматический поиск блоков форматок. Предполагаю, что это можно сделать, исходя из имён блоков форматок, которые мне известны.
Полагаю - это можно сделать с помощью функции "ssadd".
Код - Auto/Visual Lisp [Выбрать]
  1. (defun abc
  2.    (ssadd (А4В1_ОКП) nabor)
  3. )
"А4В1_ОКП" - это наименование блоков, которые используются в чертеже (прикрепил файл).
При подгрузке лиспа - функция не воспринимается. Понимаю, что явно очень накосячил, возможно, даже выбрал не ту функцию. Прошу хотя бы подскажу в реализации пункта 1.
2. Сортировка по точкам вхождения.
3. Получение атрибута по тэгу.
4. Назначить значение.
Какие функции понадобятся для реализации пунктов 2,3,4?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Перенос информации в форматки
« Ответ #11 : 31-05-2017, 15:32:16 »
Извини, но я сейчас буду долго и муторно вещать :) Готов? Нумерация моя и с твоей никак не связана :)
1. посмотри в документации параметры функции ssadd
2. посмотри ключи ssget. Там есть такая штука, как "_X" - проверь, что она означает
3. Заодно посмотри фильтры ssget.
4. После получения набора можно его преобразовывать в список примитивов и отфильтровывать нужные, т.к. (открою страшную тайну!) ssget не сможет влегкую выбрать дин.блоки
5. На сайте lee-mac.com, кажется, был код по выбору всех динамических блоков с определенным эффективным именем.
6. Как ты будешь сортировать блоки по точкам вхождения, если 3 штуки из них, например, находятся в модели с точками вставки '(1000. 2000. 0.), '(2000. 100. 0.), '(300. 300. 0.), а еще пара штук - на листах с точками вставки '(0. 0. 0.) в обоих случаях?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Vladislav_ValerievichАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
  • Skype: skvortsov_vv
Re: Перенос информации в форматки
« Ответ #12 : 08-06-2017, 16:37:48 »
Иду по простому пути. Узнал, как можно выбрать все блоки.
Применительно к ранее приложенному файлу "Схема_2017.05.31".
Код - Auto/Visual Lisp [Выбрать]
  1. (setq sdel (ssget "X" '((0 . "INSERT")))) ;<Selection set: 901>
  2. (sslength sdel) ;проверка количества взятых блоков
  3. (setq i 0)
  4. (while (< i (sslength sdel))
  5.     (setq sdel0 (entget(ssname sdel i))) ;данные о примитиве
  6.     (print (ssname 1 sdel))
  7.     (setq i(+ i 1))
  8. ) ;ошибка: неверный тип аргумента: lselsetp 1

Help please! Почему выходит ошибка и как её исправить?
ssget создаёт набор. А есть понятие список. Поясни, пожалуйста, чем они отличаются и почему следует преобразовывать наборы в списки?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Перенос информации в форматки
« Ответ #13 : 08-06-2017, 16:47:03 »
Во-первых, не
Код - Auto/Visual Lisp [Выбрать]
  1. (ssget "X" ...
, а
Код - Auto/Visual Lisp [Выбрать]
  1. (ssget "_X" ...
Во-вторых, на каком конкретном месте ошибка? Наверное, на print? Которому надо подставлять строку и только строку, а ты выдаешь что-то непонятное? :) vl-princ-to-string используй для подобного "контроля".
В-третьих, есть значительно более простой вариант преобразования набора в список:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
Список - это перечень чего бы то ни было. Набор - просто набор примитивов. Чтобы его обработать и, к примеру, исключить те блоки, у которых эффективное имя не соответствует каким-либо правилам, значительно проще использовать vl-remove-if-not, чем ковырять весь полученный набор.
---
Исправил код, с устатку неправильно написал...
« Последнее редактирование: 09-06-2017, 07:30:40 от Алексей Кулик »
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Перенос информации в форматки
« Ответ #14 : 08-06-2017, 16:53:14 »
Help please! Почему выходит ошибка и как её исправить?
Потому что не:
Код - Auto/Visual Lisp [Выбрать]
  1. (print (ssname 1 sdel))
а:
Код - Auto/Visual Lisp [Выбрать]
  1. (print (ssname sdel i))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение