|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
30.09.2020, 13:27 | #1 | |
Лисп для записи свойств одно динамического блока в атрибуты другого блока
Регистрация: 05.04.2011
Сообщений: 43
|
||
Просмотров: 3058
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787
|
Поиск по форуму: установка динамических свойств, программное создание поля и т.п. Кирпичики есть.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 20.03.2008
Сообщений: 2,653
|
Задумка на лиспе вполне и довольно несложно реализуема. У LeeMac'a есть функции по чтению/редактированию атрибутов и свойств динамических блоков.
Dynamic Block Functions Attribute Functions Для новичка в лиспе задачка будет, конечно, трудновата. Если нужен именно код (а не поучиться), я готов нацарапать на досуге, думаю, делов там минут на 15. Только попрошу скинуть файл с этими блоками. |
|||
|
||||
Регистрация: 05.04.2011
Сообщений: 43
|
Со вставкой номера и габарита полем не разобрался.
Смотрел вот эту тему https://forum.dwg.ru/showthread.php?t=120398. Просьба оказать помощь. Файл с блоками прилагаю.Опора.dwg ----- добавлено через ~19 ч. ----- Попробовал запустить лисп из темы https://autolisp.ru/2010/05/30/field-proceed-2/ Выдает ошибку: "Укажите точку для простановки поля <Отмена> : ; ошибка: неверный тип аргумента: stringp nil". В комментарии к теме https://autolisp.ru/2011/07/07/x32x64objectid/ говорится, что на новых версиях AutoCAD не сработают предложенные методы. Смотрел еще тему https://forum.dwg.ru/showthread.php?t=14528 про вставку поля в таблицу, но там тоже лиспы 2007 года. Где ж рабочий алгоритм взять? |
|||
|
||||
Регистрация: 20.03.2008
Сообщений: 2,653
|
Что-то не сработал у меня этот код на приложенном файле.
Дерзну для начала дать несколько рекомендаций. 1. Не забываем локализовывать переменные. Для этого нужно перечислить имена переменных (определяемых с помощью setq в коде) после слэша внутри первых скобок, следующих за defun. Если этого не сделать, то они станут глобальными (будут находиться в памяти автокада вплоть до его закрытия, хотя логично их существование ограничить только временем выполнения функции). Если переменные локализованы, то при завершении функции они стираются из памяти. Не то, чтобы в данном случае это было критично, но для порядку стоит это делать по разным причинам, сейчас углубляться не будем. Бывают случаи, когда нужно переменную сделать глобальной сознательно (то есть не вписывать ее после слэша), например, для запоминания последних введенных значений функций, начинающихся на get... (getstring, getint, getreal и т.д.). Но это - следующий этап познания основ. Пока пропустим. 2. От многих опытных программистов многократно слышал рекомендации делить код на условные блоки (разделы). И я считаю это очень правильным. Наводит порядок в коде и в голове. Делить нужно именно пространственно, то есть, в начале кода - первое, затем - второе, и в конце - третье. Это не всегда может быть в точности реализуемо с учетом логики программы, но стремиться к этому надо. В общем случае это примерно такой перечень:
3. Указывая ссылки, я имел в виду, что следует использовать готовые функции, подставляя в них полученные от пользователя (или вычисленные в коде значения) в качестве аргументов. Например, функция Lee Mac'a LM:vl-setattributevalue имеет следующие аргументы: Код:
Из этих готовых к применению функций впоследствии (и в идеале) стоит собрать свою собственную библиотеку, а не выдергивать из них куски и повторять их по несколько раз в одном коде. Тут встает важный вопрос об организации своей библиотеки функций. Если эта нужная (своя или чужая) функция используется только в этом конкретном коде, то ее надо поместить в этом же файле в конце, а если она используется в нескольких своих кодах, то ее стоит добавить в библиотеку (отдельный lsp-файл или несколько файлов, которым нужно обеспечить автозагрузку). В данном случае мы приведем коды нужных вспомогательных функций внутри нашего кода. Вот первый вариант кода с пояснениями в комментариях. Он просто считывает нужные атрибут и дин.параметр первого блока и добавляет их в соответствующие атрибуты второго блока: Код:
Код:
Последний раз редактировалось skkkk, 02.10.2020 в 15:20. |
|||
|
||||
Регистрация: 05.04.2011
Сообщений: 43
|
skkkk, спасибо огромное за столь развернутый и толковый ответ.
Советы безусловно дельные. Прокомментирую, пожалуй, только второй. Блочное выполнение лиспа - признак мастерства. Ну а так как у меня с этим не очень, то блочная структура для восприятия мне тяжеловата. Когда операции прописаны одна за другой шаг за шагом, воспринимается, пишется и отслеживается надежнее. Отсюда, кстати, вышли и раздельный запрос на блоки, и ввод дополнительных промежуточных переменных. У меня появилась еще пара вопросов. Бывают ситуации, когда исходный блок КС_Опора размещается в пространстве модели, а принимающий блок КС_Данные опоры размещается на листе. При ручном задании полей в атрибутах номера и габарита нет проблем дать ссылку на блок в модели - достаточно при выборе объекта для поля щелкнуть по блоку в видовом экране, блок без проблем воспринимается и распознается. То есть получается организовать связь блока в модели с атрибутом блока на листе. Возможно ли такую функцию реализовать в данном лиспе? Например, использовать не функцию entsel? В ходе работы над данным лиспом я столкнулся с проблемой поиска информации по функциям LISP. Существует ли какая-то книга, сайт, справочник и т.п., где приведен максимально полный перечень функций LISP с синтаксисом и описанием аргументов? Странно почему мой лисп не сработал у вас - я выкладывал рабочий обкатанный вариант. Может быть дело в "битости" файла Опора.dwg - после скачивания на другом компьютере он запросил восстановление. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,002
|
Цитата:
|
|||
|
||||
Регистрация: 20.03.2008
Сообщений: 2,653
|
Цитата:
Код:
Код:
Цитата:
|
|||
|
Опции темы | Поиск в этой теме |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Тестирование динамического блока дает другой результат нежели вхождение | Artem.jkl | Динамические блоки | 1 | 13.12.2019 00:58 |
Как блокировать атрибуты динамического блока? | Leopard_ | Динамические блоки | 13 | 20.06.2019 10:42 |
Назначение свойств атрибутов блока без attsync | Кулик Алексей aka kpblc | Программирование | 9 | 15.08.2017 06:32 |
Странное поведение динамического блока высотной отметки | hwd | Динамические блоки | 12 | 08.09.2011 11:15 |
Изменение свойств атрибута в составе блока | rzinnurov | AutoCAD | 9 | 24.04.2009 15:17 |