|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
|
||||
Цитата:
1.строка кромсается кодом Евгения на куски 2.каждый кусок проверяется через numberp. если число - запомнили и преобразовали обратно в строку. В этом конкретном примере запомнится только последнее число в списке 3. пересчитали число на новые единицы 4. склеиваем список обратно в строку и пришиваем новый кусок с хвоста, результат загоняем в примитив.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
![]() |
|
||||
1. работает ОДНОкратно на только текстах, нуно (0 . "*text"). при повторном использовании считает футы метрами и дописывает в конец новые футы
2. если метры в середине строки, то дописывает футы в конец строки 3. если в строке нет цифр - обрушение. если такая строка выбрана среди тех, что с цифрами, то результат над безцифровыми строками непредсказуем. Последний раз редактировалось koMon, 16.02.2021 в 12:05. |
||||
![]() |
|
||||
Цитата:
А по второму пункту это уже выходит за рамки конкретного образца строки, представленного в #3979 и мы вернемся к "эпичности задачи по обработке всех вариантов в одном коде". Никто не запрещает добавить к анализу полученного числа проверку измерителя который можно найти в следующем по счету элементе списка... только надо вводить счетчик элементов или менять принцип обработки полностью. Вместо foreach прогонять repeat с отгрызанием просмотренных элементов cdr'ом, например. з.ы. защиту от повторной обработки то и организовать не сложно: достаточно весь код повесить на (if (wcmatch str "*'*") nil (progn...)) з.з.ы. Добавил в #3999 защиту от повторной обработки и игнорирование строк без чисел
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... Последний раз редактировалось Vladimir_Sergeevich, 16.02.2021 в 13:53. |
||||
![]() |
|
||||
Цитата:
![]() ----- добавлено через ~5 мин. ----- 4. если поменять число метров в строке уже с футами, то футы при выборе этой строки не меняются. ----- добавлено через ~12 мин. ----- Vladimir_Sergeevich, сдаётся мне что на твоём месте должен был бы быть тс!? ![]() |
||||
![]() |
|
||||
Цитата:
у меня там в 4 строке висит "(wcmatch (vla-get-TextString txt) "*'*") nil..." и если уже были ранее футы в строке, то nil и погнали на следующий. давно не кодил, работа утомила, надо было отвлечься...
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
![]() |
|
||||
Цитата:
and i have a strong feeling that topic caster would've definitely been amused amighty |
||||
![]() |
|
||||
на этот случай надо не забывать. такое уже не лечится программистами
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
![]() |
|
||||
![]() |
||||
![]() |
|
||||
Регистрация: 08.02.2021
Сообщений: 5
|
Цитата:
Всем спасибо!! ![]() |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
![]() |
|||
![]() |
|
||||
хм... что то лыжи не едут.
Вроде как с акад 2015 было новшество на тему командных методов command и vl-cmdf Сейчас заметил, что в акад 2021 благополучно работают коды, которые работать и не должны бы... они что ли вернули поддержку command для обратной совместимости?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ты не забывай еще и про наличие command-s.
----- добавлено через ~1 ч. ----- Сейчас проверил: независимо от результатов vl-cmdf всегда возвращает t, а command и command-s - nil. Логика не поменялась с 2015 версии. Возможно, в кодах есть логические ошибки
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
В том то и дело, что помню. Только раньше сидел на акад 2013 и не грузился этим. Вроде речь шла о том, что с 2015 command не должна работать от слова совсем? А она все равно работает без переписывания...
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Кто это говорил и где? Она работает, только в другом режиме.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Цитата:
----- добавлено через ~1 ч. ----- хм... вот жеж засада... Почему значение (vla-get-TextRotation obj) для объекта мультивыноски ("AcDbMLeader") зависит от текущей пск? Озадачился тут обработкой систем координат и споткнулся там где не ждал.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Уважаемые форумчане, помогите прояснить следующий момент. Пытаюсь добраться через реестр к параметрам текущего профиля юзера, чтобы изменить их конфигурацию. Например, меняю состояние статус-бара и добавляю туда циклический выбор:
(vl-registry-write (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\Profiles\\" (getvar "cprofile") "\\StatusBar\\Application" "SelectionCycling" "1")) командная строка, при этом, возвращает T, но запись в реестре не изменяется, оставаясь со значением "0". В чем может быть причина? Последний раз редактировалось Browning Zed, 06.08.2021 в 09:24. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А не проще ли системную переменную менять?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ключи в реестре как правило все же меняются. Другой вопрос, что не стоит менять ключи, касающиеся самого ACAD'a. Так, например, можно поменять пути поддержки в реестре, и изменения даж сохранятся в реестре - но а) они не подхватятся и б) при закрытии ACAD'a все пути вернутся в начальное состояние. Поэтому и приходится работать через переменную окружения "ACAD".
По крайней мере такое было раньше, и я подозреваю, что вряд ли система изменилась.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А с какого перепугу ты работаешь с переменной окружения, когда надо работать с системной переменной?
Не setenv / getenv, а setvar / getvar
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Если бы все было так просто. Системная переменная отвечает за другое - она активирует либо деактивирует функцию. Ключ в реестре же, ответственен за то будет или не будет присутствовать иконка данной функции в статус-баре. Мне нужно получить второе.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Провокационные вопросы
![]() 1. Если поменять в самом каде - в реестре данные меняются? 2. Если "снаружи" руками поменять в реестре данные - статусная строка меняется? Если да, то сразу или нет? 3. Если реестр правился снаружи, что будет после выхода из када? Что-то у меня подозрения, что на лиспе подобное нереализуемо, да и не особо надо конечному пользователю.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ответ на второй вопрос - ключевой.
По поводу третьего: допустим, настройка включена. Меняется реестр, и тут же выход из ACAD. Что окажется в реестре?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Ну, меня и в таком виде бы устроило, с перезапуском программы.
Немного не понял как смоделировать подобную ситуацию. Изменить реестр с одновременным выходом из акада? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Изменить реестр. Закрыть кад. Проверить, что получилось в реестре.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Можно, почему нет?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Примерно так же, как вызываются стандартные функции. Я искренне не понимаю, в чем собственно "затык"?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Вызывай как
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Товарищи, помогите с командой: как сделать слой с именем из буфера обмена?
есть простой лисп (defun c:sloy () (command "-слой" ) (command "с" pause ^C^C) (command "ПЛИНИЯ") ) нужно, чтобы имя слоя не вводилось руками, а бралось из буфера и дальше выполнялась команда "ПЛИНИЯ" |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
ищите получение на лиспе содержимого буфера (встроенных методов вроде нет - так что через костыли), проверка: - что строка и не содержит запрещенных символов, и является ключем в таблице слоев - ну задавайте через тот же CLAYER.
----- добавлено через ~34 мин. ----- и при этом нет никаких гарантий, что в процессе работы другие программы не захотят использовать буфер обмена для своих нужд - он (буфер обмена) никак не защищен от изменений |
|||
![]() |
|
||||
ну можно и без костылей. проверки на правильность имени слоя нет.
Код:
|
||||
![]() |
|
||||
Регистрация: 24.03.2011
Сообщений: 14
|
Добрый день всем гуру Автокада!
Я пересел на новый компьютер и столкнулся с проблемой. Перестали работать некоторые мои программы. В частности перестали програмно заполнятся динамические блоки в мультивыноске. Вот такой кусочек кода: Код:
Новый комп AutoCad 2020, Win10, х64 Может быть кто-нибудь подскажет что делать, и куда копать? А то не хочется переделывать кучу утилит..... |
|||
![]() |
|
||||
Регистрация: 24.03.2011
Сообщений: 14
|
Простите не понял вопроса...
----- добавлено через ~37 мин. ----- Ура! Заработало! Все дело оказалось в системной переменной ATTREQ. Сегодня перевел ее в "1" и все получилось. Только не понятно почему у меня вчера не получалось, я ведь ее менял. Вчера при ATTREQ="1" выскакивало окошко заполнения динамического блока вручную.... Видимо вчера я в процессе экспериментов изменил еще какую-то системную переменную... Вот бы узнать какую))).... |
|||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Доброго дня!
Хочу создать набор примитивов (текстов), в который входили бы только тексты-числа (REAL и INT). Что то голову сломал, с какой стороны подойти. Подскажите. Через (vl-string->list (cdr (assoc 1 (entget (car (entsel)))))) получаю список кодов символов текста Знаю, что точка и цифры 0-9 имеют коды (46 48 49 50 51 52 53 54 55 56 57) Теперь вроде надо сравнить список кодов выбранного текста на наличие в нем кодов, не являющихся кодами точки и цифр, и вот тут что то у меня затык с исполнением. Какую функцию применить и что сделать со списком, чтобы отсеять все примитивы (тексты), в которых присутствуют любые символы, кроме точки и цифр. Может есть какой то более элегантный способ выбрать тексты-числа? |
|||
![]() |
|
||||
не элегантно
Код:
Последний раз редактировалось koMon, 03.09.2021 в 08:59. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Если однострочные тексты не содержат букв и начинаются с чисел (возможно, пробелов) - то как вариант:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.03.2011
Сообщений: 14
|
|
|||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Добрый день!
Хочу построить перпендикулярный отрезок относительно точки на кривой. Используя vlax-curve-getFirstDeriv получаю координаты вектора направленности в системе координат объекта (полилинии в моем случае). В случае для полилинии-прямоугольника размерами 1000*1000 с параметром 0.5 (начальная точка полилинии отстоит от начала координат МСК) выдает (1000.0 0.0 0.0) Пытаюсь преобразовать эти координаты в МСК, и не получается, функция на запрос (trans (vlax-curve-getFirstDeriv (car (entsel)) 0.5) (car (entsel)) 0) выдает тоже, что и (vlax-curve-getFirstDeriv (car (entsel)) 0.5) Что я делаю не так? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Возможно, ОСК и МСК совпадают.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Все функции vlax-curve-... в случае выдачи результата в виде точки выдают их в МСК.
Исключением является vlax-curve-getFirstDeriv. Координаты вектора направленности выдаются в СКО. Как эти координаты преобразовать в МСК? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
vlax-curve-getFirstDeriv
Returns the first derivative (in WCS) of a curve at the specified location Возвращает первую производную (в WCS) кривой в указанном местоположении, т.е. в МСК Чудеса. Рисую прямоугольник 1000*1000 в произвольном месте - далеко от начала координат МСК На всякий случай запрашиваю координаты начальной точки "кривой" в МСК (vlax-curve-getStartPoint (car (entsel))) Получаю нечто подобное (9685.63 6276.53 0.0) Теперь запрашиваю (vlax-curve-getFirstDeriv (car (entsel)) 0.5) И получаю результат (1000.0 0.0 0.0), т.е. координаты явно не в МСК. Это глюк автокада? Кому не лень, попробуйте у себя пожалуйста проделать эти пару действий. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
first deriv = первая производная от кривой в указанной точке. Вектор.
(vlax-curve-getPointAtParam (car (entsel)) 0.5) что вернет?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Где эта точка будет лежать? Скорее всего, на нижней горзонтальной грани прямоугольника. Вот вектор касательной и показывает направление Х
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Какая система координат для значений векторов??
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Параметр 0.5 говорит о том, что лежать она будет ровно посередине между нулевой и первой точкой полилинии. Функция vlax-curve-getPointAtParam вернет координаты этой точки в МСК, вот и все. Вектор направленности можно я так понимаю получить лишь функцией vlax-curve-getFirstDeriv
----- добавлено через ~2 мин. ----- А как это определить? Есть какая то системная переменная? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Еще раз. Первая производная - это первая производная. Вектор, а не точка. Трехмерный, поэтому там и три координаты. Получишь вторую производную - что будет?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
получу координаты вектора второй производной
От первой производной получу координаты вектора первой производной. Есть точка на кривой (в МСК), есть координаты вектора первой производной (в ОСК вопреки мануалу). Имею 2 точки - могу построить нормаль, но надо перевести координаты вектора первой производной (вектора направленности) из ОСК в МСК. КАК??? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я не могу объяснить, что вектор не имеет координат. У него есть только направление, и все.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Ладно, как нормаль то построить тогда?
----- добавлено через ~6 мин. ----- Призадумался я что то... Физический смысл vlax-curve-getFirstDeriv я понимаю следующим образом. Есть точка на кривой, она является НАЧАЛОМ ВЕКТОРА, результирующая точка функции vlax-curve-getFirstDeriv (первой производной) - КОНЕЦ ВЕКТОРА. Конец вектора указывает его направление. Прошу поправить, если неправ. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
ятд, что поскольку первая производная это 3d вектор в мск, то его направление будет от нуля в мск до полученной 3d точки при выполнении функции получения первой производной.
|
||||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Функция vlax-curve-getFirstDeriv
Вычисляет первую производную (в МСК) к кривой в точке, заданной параметром. (vlax-curve-getFirstDeriv <кривая> <параметр>) Аргументы: <кривая> - примитив или VLA-объект, соответствующий кривой; <параметр> - значение параметра, определяющее положение точки на кривой. Возвращаемое значение - список из трех вещественных чисел (координаты вектора первой производной). Т.е первая точка вектора определяется аргументом <параметр> Вторая точка вектора - результат функции vlax-curve-getFirstDeriv Направление будет от первой точки (заданной аргументом параметр) ко второй (полученной из результата функции vlax-curve-getFirstDeriv) Вся беда в том, что координаты второй точки выдаются вопреки мануалу не в МСК, а в системе координат объекта. А функция trans их не преобразовывает, потому что, видимо, не воспринимает результат функции vlax-curve-getFirstDeriv как точку, а как "вектор" (чтобы дьявол его побери это не значило), хотя и принимает координаты конца вектора в качестве аргумента. КТО НИБУДЬ, ПОПРОБУЙТЕ ПОЖАЛУЙСТА, ИСПОЛНИТЬ КОД У СЕБЯ В АВТОКАДЕ Код:
|
|||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Т.е мануалы автокада врут.
vlax-curve-getFirstDeriv возвращает координаты вектора первой производной в СКО, а не МСК. И как тогда преобразовать координаты вектора первой производной из СКО в МСК Код ниже их не преобразовывает (trans (vlax-curve-getFirstDeriv (car (entsel)) 0.5) (car (entsel)) 0) С другой стороны координаты вектора первой производной не всегда лежат на кривой. Может в этом дело... Как тогда строить нормаль к кривой? Последний раз редактировалось megabeton, 11.10.2021 в 23:09. |
|||
![]() |
|
||||
Да нет никакой координаты ско, первая производная это направление касательной в искомой точке. Вектору направления касательной не нужна связь с искомой точкой. Как я написал ранее, направление касательно определяется от нуля мск до результата первой производной. Перпендикуляр считать тупым прибавление к углу касательно половины пи. Skkk нарисовал произвольную полилиния, касательная в искомой точке ноль градусов, перпендикуляр плюс минус половина пи.
Вряд ли мануалы автокада могут так долго и продолжительно врать))) |
||||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
(300.0 0.0 0.0) тогда что это, если не внутренняя координата второй (первой после нулевой) точки полилинии?
Вот это ничего себе Цитата:
угол относительно каких точек берем? ----- добавлено через ~8 ч. ----- Все, понял. Неправ. Вечером уже тупил, с утра дошло. Слишком буквально воспринимал значение вектора, как направленного отрезка. Начальная точка вектора жестко ассоциировалась с точкой на кривой. Думаю слово АЗИМУТ быстрее вернуло бы меня в нужное русло)) Спасибо koMon skkkk kpblc Последний раз редактировалось megabeton, 11.10.2021 в 23:48. |
|||
![]() |
|
||||
кстати очень похоже, что вектор второй производной будет не что иное как вектор нормали в искомой точке. и не надо делать лишних телодвижений)))
|
||||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Вторая производная по идее несет смысл степени изогнутости кривой в точке.
Для точки, лежащей посередине между двух точек прямой полилинии дает (0.0 0.0 0.0), т.е. изогнутость нулевая. Для аналогичных условий с полилинией-дугой выдает нечто (4.51197e-014 736.86 0.0), только не понятно, как правильно это интерпретировать в данном случае. Это координаты (и координаты ли) чего интересно? |
|||
![]() |
|
||||
по идее да, но видимо не здесь. я попробовал для дуги и получил ровно вектор перпендикуляра)
|
||||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Вопрос по функции if
Есть код примерно такого содержания (if (выполни команду подобие со смещением 100) (что то сделай) (сделай что другое) ) Функция if реагирует на nil и T. А что, если в ответ на какое то действие программа не возвращает ни nil ни T. В конкретном примере при слишком большом смещении внутрь создается ситуация невозможности создания объекта, программа возвращает "; ошибка: Ошибка Automation. Отсутствует описание." То есть для IF это ни nil ни T. Как правильно надо обходить это препятствие, чтобы выполнились дальнейшие действия, чтобы "Ошибка Automation" воспринималась как nil. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
vl-catch-функции в руки
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Сначала добейся, чтобы vla-offset (или что там на самом деле, не помню) нормально срабатывала. А потом уже можно хоть entlast сравнивать с предыдущим примитивом.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Хочу отбить площадь полилинии в "идеальном" месте внутри полилинии. Методом лучевого траассирования точка внутри не всегда получается в "идеальном" месте, может оказаться близко к краю. Если реализовать идею с подобием, неважно, какой изначальной формы полилиния, после подобия внутрь она будет стремится к упрощению формы и одновременно будет стремиться к "идеальному" центру. Иногда, после подобия это будут несколько полилиний, соответственно нам надо только выбрать наибольшую по площади и дальше офсетить.
Вот в конце получается ситуация, при которой офсет невозможен, и при этом программа не возвратила ни nil, ни T. Хотел понять, как это обойти, чтобы продолжить выполнения кода. Я так понимаю vl-catch поможет, пока правда не пробовал, руки не дошли. Сама конструкция кода неверная, привел для простого примера, такую вещь через while, а не через if надо реализовывать, но конечный затык в виде сообщения об ошибке идентичен. Если не лень, буду благодарен за любую посильную помощь в достройке кода ![]() ----- добавлено через ~22 мин. ----- Стоп, или это был философский вопрос, примерно как про смысл жизни?) |
|||
![]() |
|
||||
нет, это был не философский вопрос))))
а если по-простецки, через штриховку? |
||||
![]() |
|
||||
может. это я видимо не догнал. автоматом "отбить" площадь?
|
||||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Да, автоматом. В смысле извлечения площади полилинии и отбивки ее автоматом проблемы нет. Тут именно реализация определения точки вставки через офсет интересна.
----- добавлено через ~11 мин. ----- Нечто такое (while (vla-offset (vlax-ename->vla-object (entlast)) -50) (добавить в набор (entlast)) (после сообщения об ошибке в центре последней полилинии отбей точку) ) (удалить элементы набора) Последний раз редактировалось megabeton, 14.10.2021 в 15:31. |
|||
![]() |
|
||||
офсет внутрь (отрицательное смещение) определяется ещё и направлением следования вершин плинии. против часовой - внутрь, по часовой - наружу.
|
||||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Да да, я в курсе, направление изменяемо, это не проблема. Плтуллс от VVA тут очень помогает, спасибо ему
![]() ----- добавлено через ~12 мин. ----- Собственно вопрос, while реагирует на nil, однако (vla-offset (vlax-ename->vla-object (entlast)) -50) на последней стадии выдаст ошибку и остановит дальнейшее выполнение всего кода. Как правильно и во что обернуть (vla-offset (vlax-ename->vla-object (entlast)) -50), чтобы выдало в конце nil, а не ошибку? Последний раз редактировалось megabeton, 14.10.2021 в 16:09. |
|||
![]() |
|
||||
Код:
Последний раз редактировалось koMon, 14.10.2021 в 16:57. |
||||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Вопрос про отличие блоков, созданных разными способами.
Ситуация №1: Создал блок с помощью Код:
Код:
Код:
Создал блок через vla-copyobjects (взято отсюда https://forum.dwg.ru/showthread.php?t=76304) Код:
Код:
Результат – точка вставилась на чертеже в начало координат, а не в место вставки блока. Почему в одном случае (vlax-3d-point 0. 0. 0.) вставляет точку в точку вставки блока, а в другом в начало координат? Что нужно добавить в код к vla-copyobjects, чтобы он вел себя как при "_pasteblock" Заметил, что у первого блока в свойствах указано "Единицы блока - миллиметры", у второго "Единицы блока - безразмерный". |
|||
![]() |
|
||||
немного к предыдущей теме.
Цитата:
В результате я определял положение точки относительно оси (криволинейной) таким куском кода: Код:
По текущему вопросу: Цитата:
Может, каким то невероятным образом, во втором случае базовая точка блока отличается от начала координат блока?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
![]() |
|
||||
Регистрация: 20.04.2011
Сообщений: 485
|
Подскажите, есть ли изящный способ понять направление обхода по трём точкам? Пользователь указывает три точки на плоскости. Мне нужно понимать направление, - по часовой или против?.
Стоит задача вычислить точки Ферма-Торричелли в произвольном треугольнике. Алгоритм довольно простой и тестовый алгоритм у меня работает, но только в тех случаях когда точки указываются по часовой стрелке. Код пока такой: Код:
-------------- update сделал через скалярное произведение Код:
Последний раз редактировалось gumel, 22.10.2021 в 07:27. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
Что-то под конец рабочей недели запутался с формированием списков
Допустим есть список (setq A '("1A" "2A")) и на на выходе получаем ("1A" "2A") есть другой список (setq B '("1B" "2B")) и на на выходе получаем ("1B" "2B") Есть промежуточная итерация объединения списков (setq nabor (list A B)), на выходе получаем (("1A" "2A") ("1B" "2B")) Далее нужно в уже сформированный список nabor добавить дополнительное значение из новой переменной (setq С '("3A" "3B")) (setq nabor (list nabor C)) но на выходе получаем вложенный список ((("1А" "1B") ("2A" "2B")) ("3A" "3B")) Как сделать чтобы получился список для переменной nabor без учета вложенности (("1A" "1B") ("2A" "2B") ("3A" "3B")) Последний раз редактировалось Sege, 11.11.2021 в 15:35. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
(append (list a b) (list c))
(cons c (list a b))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
----- добавлено через ~10 мин. ----- в том же ObjectArx/.Net есть метод RemoveVertexAt, но в ActiveX его решили не "вытаскивать" в публичные методы, видимо |
|||
![]() |
|
||||
Регистрация: 23.01.2005
spb
Сообщений: 124
|
всех с новым годом однако!
![]() теперь вопрос. хочу ткнуть мышкой в экран и получить простенький текст с координатами ткнутой точки. соорудил следующее: (command "text" (setq TT (getpoint)) 1 0 TT) получаю: 205.385389406629,27.86316521445838 по-моему первый раз, когда акад по доброй воле показал ТОЧНЫЕ координаты ))), но мне столько не надо! ![]() Есть ли какая (не)общая переменная, определяющая точность вещ.чисел? (я верну!) -- мне 1-2 цифры после запятой хватило бы. -- просто не хочется rtos-ить, разбивать список на части и клеить обратно... ![]() ![]() (искал-ненашол )) Последний раз редактировалось shishoq, 05.01.2022 в 22:17. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
luprec ?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я бы думал в сторону "не сильно простого" кода. Что-нибудь такого типа (варианты разных систем координат не учитываются):
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
???
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
shishoq, чего такого? можно еще и закодить значение по умолчанию с возможность поменять на требуемое в процессе выполнения.
Код:
![]() с прошедшими ![]()
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Здравствуйте. Я из начинающих липсогрызов, о которых в первом посте)
Подскажите, что у меня не так в программе. При открытии нового файла чертежа, она строит второй примитив, но некорректно, не строит в отрицательную сторону от точки 0.0.0. Потом "слетает" и выдает сообщение о том, что ящик нулевой длины не допускается. В консоли, списки координат выдает правильные. ----- добавлено через ~22 ч. ----- Разобрался. Привязки надо отключать. Последний раз редактировалось Alxndr1697, 06.02.2022 в 21:32. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
И при чем тут инетовская ошибка?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А, сорри. Ну да, аркада померла уже очень давно
![]() Как эрзац-альтернативу можно попытаться использовать https://autolisp.ru/2009/09/13/error-catch/ - но там совсем уж мало ((
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
atoi заменить на atof ?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Именно так. Спасибо.
Теперь у меня не получается извлечь данные из выпадающего списка. (key = "S_ko", для переменной S_k) (setq S_k atoi (get_tile "S_ko")) - не работает. Понимаю, что надо как-то порядковый номер в выпадающем списке воткнуть функцией nht, но вот как это оформить, не знаю. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
1. Со скобками совсем бяда
2. Функции nht не знаю. nth - да, слышал 3. Без хоть какого-то куска кода дальше разговаривать особого смысла не вижу.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
1. В сообщении, орфографические и программные. Но, я понял.
2. А вот это да, моя беда. Бывает, путаю местами буквы и потом теряю кучу времени на поиск ошибок. 3. Не хотел выкладывать, дабы не шокировать, но, видимо, придется. И да, я знаю, как с новичками бывает трудно ![]() Последний раз редактировалось Alxndr1697, 18.02.2022 в 07:11. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Код:
Offtop: Грабли №2 тоже могут подпортить жизнь. Код:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
По поводу граблей, там говорится про какие-то красные отрезки... В общем, проверить не получилось.
Вторые, для меня, - темный лес пока. По поводу оформления, понял. Скобки напротив и ключ на первое место. Код (setq s_k (atoi (get_tile "S_ko"))) возвращает номер строки выпадающего списка, а надо бы содержание. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну так примени nth, делов-то
![]() Оформление lsp/dcl кода - чистой воды вкусовщина, на мое кривое-косое-лысое-седое-далее по тексту мнение можно не ориентироваться.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Применяю, - ничего не получается.
(setq s_k (nth (atoi (get_tile "S_ko")) <список> )) Что надо поставить на место списка? ----- добавлено через ~26 мин. ----- Если сам список создан в лисп-программе, примерно понятно, а если, как у меня, в dcl? Последний раз редактировалось Alxndr1697, 18.02.2022 в 22:28. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну так передавай в dcl не ключи, а списки через те же start_list, add_list, end_list
Если будет интересно что и как еще можно в dcl сделать: https://autolisp.ru/2015/02/05/dcl-develop/
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Алексей, koMon, спасибо, но, еще раз, - я совсем начинающий и "чего проще..." и "перелопатить в список", для меня не так просто и не совсем понятно.
В итоге, на сегодняшний день, у меня так ничего и не получается. Руки опускаются... Перепробовал уже все (на свой взгляд, конечно). Прошу помощи в виде работающей функции. Только, пожалуйста, - попроще, чтобы можно было понять и разобраться новичку. Проблемы с функцией -функция raz_panel- ----- добавлено через ~2 мин. ----- Код:
----- добавлено через 29 сек. ----- Код:
Буду рад любой критике и поправкам! Последний раз редактировалось Alxndr1697, 22.02.2022 в 06:35. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
1. Принцип 20/80 никуда не девается. 20% времени код пишется, 80% - читается. К вопросу о форматировании, именовании переменных и функций ![]() 2. Любая функция / модуль должна работать только с теми данными, которые ей "прилетают" и не затрагивать глобальные переменные. Не надо делать т.н. "GodObject" (божественные объекты) с массой ответственности. Если такое появляется - это отличный шанс выстрелить себе в ногу в самый непредсказуемый момент. 3. Следствие: любую локальную функцию можно "вытащить" наружу и проверить ее работу. И она должна работать! 4. Крайне желательно разобраться с видимостью переменных и функций. Если код оставить как есть - в какой-то момент он может запросто перестать работать. Или не он, а соседний, но который использует таким же манером именованные переменные / функции. 5. Для решения предыдущего вопроса - скопировать любую функцию, вставить в новый файл, и нажать Ctrl+Shift+C (если не ошибаюсь) - в отчете будут видны все незалокаленные переменные и функции. На переработку кода времени нет ((
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
без изяществ)
Код:
Последний раз редактировалось koMon, 22.02.2022 в 22:14. |
||||
![]() |
|
||||
Это не функция, это булевая константа истины) true
|
||||
![]() |
|
||||
Эммм, здесь 6 принков, которые выводят в консоль последовательно значения l, b, s. По-другому их в консоль не вывести. Но это так, посмотреть. Можно все эти принки убрать.
|
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
koMon, благодарствую! Благодаря вашей функции, нашел ошибки в своей и она работает, даже в моем варианте)))
----- добавлено через ~10 ч. ----- Вопрос: Как сделать, чтобы после неверного ввода осуществлялся не выход, а возврат в диалоговое окно, для последующего верного ввода? Код:
Подозреваю, что программу надо сначала вывести из состояния ошибки, или сброс, а потом запускать заново, но не знаю как. Код:
![]() Последний раз редактировалось Alxndr1697, 24.02.2022 в 06:35. |
|||
![]() |
|
||||
если речь идёт о компоненте диалога :edit_box, то проверять правильность введённых данных нужно на выходе из компонента/подтверждении введённых данных в компоненте, то есть должна быть функция проверки введённых данных по результату которой осуществится выход или не выход из компонента, причём это не должно влиять на выход их диалога.
|
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Прошу прощения, эту програмку я написал для примера, чтобы разобраться с диалоговым окном...А так-то, я "строю" шкаф
![]() Цитата:
Код:
Код:
Код:
И, пользуясь случаем, просьба, если есть время и желание, посмотреть на наличие грубых ошибок, т.е. то, что надо исправить однозначно. Последний раз редактировалось Alxndr1697, 24.02.2022 в 21:43. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Насколько я помню, это выход не из диалога, а вообще из программы. Стараюсь подобного у себя не допускать.
Из исправлений, которые я бы сделал:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
1. Это удобство, или ошибка? И это делается при помощи вла? До него я еще не дошел.
2. Других вариантов пока не знаю. 3. Читаю все, что вы предлагаете, правда, не все понятно пока. 4. Какая это функция, дайте направление. 5. Спасибо, буду изучать. Представляете, - мне уже тоже))) но, как могу, так могу. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
может разбивать на подфункции?
и в более современных языках программирования с удобной средой разработки функция с ~15 аргументами вызовет определенное офигевание удивление) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Offtop: https://autolisp.ru/2009/09/20/howto_undo/
Системная переменная nomutt (как минимум), если без команд ну вообще никуда и никак. Это не функция (по крайней мере штатная). А так-то можно нарисовать нечто типа: Код:
![]() Сголашусь с Сергеем: Та же самая функция построения бокса - легко может быть сделана как локальная функция, которая возвращает либо указатель на созданный элемент, либо nil. А "снаружи" уже проверять результаты и предпринимать какие-то действия. Но это все так, размышления на тему. Мои слова не стоит воспринимать уж сильно всерьез ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Может. Дайте, пожалуйста, пример.
Почитав начало темы, я, видимо, сделал неправильный вывод. ----- добавлено через ~1 мин. ----- Посоветуйте учебник, видеокурс, или что-нибудь, где можно этому научиться. Последний раз редактировалось Alxndr1697, 25.02.2022 в 07:36. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Alxndr1697, сугубо ИМХО.
Если какой-то код длиннее 3..5 строк с оооочень незначительными изменениями (ну, например, имена используемых переменных) копипастится хотя бы раз - его надо в отдельную функцию выносить. Т.н. принцип DRY: Don't Repeat Yourself (никогда не повторяй за собой). Числа в именах переменных есть зло, если только у тебя не стоит задача максимально запутать код. Если в переменной, к примеру, хранятся координаты точки, то и называть ее надо максимально информативно. К примеру, base_point / top_left_point и т.д. ВО VLIDE Ctrl+Shift+Пробел помогут в наборе таких длинных имен. Ну и так далее. Цитата:
Ну и так далее.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
и если на английском хотя бы читаете более менее - справка. Там тоже примеры кода есть. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
Также внутри класса есть возможность создавать внутренние поля-переменные (куда заносятся те же параметры создания). А так же есть возможность создавать внутренние методы, имеющие доступы к этим полям (т.е. не надо загонять в аргументы внутренних методов) и эти методы выполняют каждый свой кусочек работы по созданию шкафа (т.е. можно отлаживать по отдельности). И при этом нет никаких конфликтов с другими частями программы даже при совпадении имен внутренних переменных и методов, так как инкапсуляция является одной из основ ООП. А в лиспе ничего этого нет - либо локальная переменная функции, либо глобальная переменная, значение которой может в любой момент изменить любая другая функция кода - о чем и писал Алексей выше Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну, при желании и в лиспе можно "перегрузку" организовать
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
|
|||
![]() |
|
||||
Alxndr1697, это какой-то мебельный шкаф что ли?
|
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Да, он самый. Мне надоело перерисовывать чертежи, которые приходят мне в работу и дабы облегчить себе труд и сократить время перерисовки, решил "освоить" лисп, чисто в личных нуждах, а дальше посмотрим.
----- добавлено через ~15 мин. ----- Цитата:
![]() Отчего-то я решил, что ЛИСП, - это азбука, не изучив которую, дальше нет смысла идти. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Сейчас пробую что-то ковырять в C#, весьма увлекательно. Правда, вопросы в 99% случаев не касаются ACAD'a
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
лисп - это лишь средство взаимодействия с базой данных чертежа и акадом в целом. Причем со своим синтаксисом и очень нишевой применимостью.
Если есть эксель, то можно попробовать перерисовывать через COM - интерфейс. Заодно в самом экселе делать расчеты и хранить вспомогательные данные на листах. Но через COM не все доступно. Последний раз редактировалось Сергей812, 26.02.2022 в 00:08. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Offtop: Сергей812, мне кажется, советовать VBA, да еще и с ранним связыванием... Я бы не стал двигаться по этому пути, честно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Offtop: ну это лишь один из вариантов, учитывая что VBA для мс офиса встроенный родной язык) А после отладки убирается ссылка на библиотеку акада и раннее связывание быстро переделывается на позднее. Но согласен - лучше, конечно, работать "изнутри" акада, а не через COM-прокладку со своими глюками.
|
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
Извините, пожалуйста, но у меня осталось желание "допилить" свой шкаф в лиспе))) |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
А также сделать надежные функции ввода данных, потому что штатные "get=xxx" не защищены от действий пользователя. Нажмет ESC и вся программа рухнет. Т.е. надо сформировать библиотеку функций - каждая из которых короткая, с минимумом аргументов. А уже с использованием библиотеки делать конечные команды-функции для конкретных шкафов-диванов, и вообще всяких "из досок". Каждая из них будет очень короткой, надежной и легко читаемой. Стоит подумать - а нужен ли вообще здесь диалог на DCL. Это ведь реликт давних времен, когда ничего лучшего не было. Разрабатывать такие диалоги не так уж и сложно, но очень муторно. В этих "шкафах" немного данных для ввода, причем многие из них условно-постоянные. Вполне может быть сделана "команда" с командной строкой, с опциями и значениями по умолчанию. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
Цитата:
Ооо, вот тут не соглашусь. В свое окно впихнул, как понимаю, с избытком, планировал еще пару параметров и, все равно, останется что подправить в модели. (Как говаривала Тося Кислицина, - "Из картошки, знаешь сколько блюд приготовить можно?" ))) |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
|
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
Спасибо. |
|||
![]() |
|
||||
Я бы сказал, что сей труд весьма полезен когда уже научился кодить хоть что то. "САПР на базе..." неплохо вправляет мозги на тему систематизации в разработке кода.
А если говорить о повседневной шпаргалке, то скорее подойдет "AutoLisp и VisualLisp в среде Autocad" за авторством Полещука. Хотя при некоторой сноровке эту книгу заменит справка автокада, тем более что творение Полещука слегка устарело морально, акад все таки развивается помаленьку.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
----- добавлено через ~4 мин. ----- Цитата:
|
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А если это условие не соблюдается? Что тогда делать?
P.S. Ползать по всей теме и разыскивать, в каком коде и в каком месте у тебя нестыковка - мне лениво и некогда. ----- добавлено через ~2 мин. ----- Тьфу, блин, не так! Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Код:
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
М-да, C#-подход уже накладывает свои ходы
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Это будет дальше следующим вопросом
![]() Оно самое! Вот, догадывался, что с дублированием setq, что-то не так. koMon Вообще, - супер! Не знал, что < работает "на две стороны". ![]() А как будет, если по условию, >=273 и <303? Так? Код:
Последний раз редактировалось Alxndr1697, 15.03.2022 в 07:32. |
|||
![]() |
|
||||
Alxndr1697,
не работает на две стороны, сравниваемых величин может быть больше трёх. последовательно проверяются пары от символа сравнения до первого nil. я бы сделал так: Код:
Последний раз редактировалось koMon, 15.03.2022 в 10:03. |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
|
|||
![]() |
|
||||
чем именно лучше?)
эмм и потом... тут x должен сравниваться с a и b, а не а и b между собой... еяпп |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Это просто пример. cond возвращает значение, а в ее ветвях можно записать любое выражение, также возвращающее значение. |
|||
![]() |
|
||||
для понятия нахождения числа в диапазоне из двух других чисел cond ваще не вариант имхо) потому что заменяется простым if с проверкой and на граничность, что соответствует поставленному практическому вопросу, а не теории многочисленности вариантов.
|
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Извините, что не появлялся, уведомления почему-то не приходят, вот и думал , что тут тишина.
Вопрос, как и полагал, решил через cond: Код:
Что-то у меня с if не складывается) Что тут неправильно? Код:
пс. Решено. Замена eq на /= Последний раз редактировалось Alxndr1697, 19.03.2022 в 08:09. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
1. Зачем каждый раз вычислять (distance P_0 P_B) ? Не вижу, чтобы в данном коде переменные P_0 P_B менялись - чтобы была необходимость актуализации дистанции.
2. Здесь как раз напрашивается сделать функцию, куда передаются аргументы P_0 P_B, а возвращается длина направляющей. Либо -1, если менее 273 - а уже в вызывающей основной функции либо продолжение работы, либо alert. И так везде - где есть строго определенный законченный функционал, выносите в отдельную функцию, а в основном коде будет лишь одна строчка вызова этой функции. Читаемость кода будет гораздо лучше, и отладка проще. Есть, конечно, определенные затраты на вызов функции и обратный возврат к выполнению основной программы. Ну потом при необходимости где-то в одиночных критичных местах развернуть вызов функции в ее код с целью повышения быстродействия - но сама то программа уже будет готова, и ею уже можно будет практически пользоваться даже с этими временными лагами первое время. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
Буду признателен, если кто-нибудь напишет эту функцию ( без вла) и как ее потом вызывать, чтоб разобраться. ----- добавлено через ~5 мин. ----- Еще вопрос. Эту дистанцию можно было записать в переменную и уже, легче бы читалось. Сознательно пошел на этот шаг, чтобы уменьшить количество переменных. Это правильно, или нет? |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
Цитата:
Код:
Ну а вызов - вызов же той же distance не вызывает затруднения, а ваша функция ничем не отличается для кода. Последний раз редактировалось Сергей812, 19.03.2022 в 12:00. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Сергей812 Благодарю!
Но, немного не пойму, зачем нужна функция? Если просто назначить переменную (setq Dist (distance P_0 P_B)) и заменить все (distance P_0 P_B) на Dist, будет неправильно? Пока нет возможности проверить... Последний раз редактировалось Alxndr1697, 20.03.2022 в 14:10. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Просто есть синтаксические ошибки (выявляется на этапе компиляции), есть явные ошибки типа передачи неинициализированных переменных и т.п. (обычно выявляются во время первых прогонов runtime), и есть логические ошибки. И если программа достаточно большая, но при этом не структурирована в логические законченные функциональные узлы (функции) - то можно очень долго заниматься поиском этих логических ошибок путем пошаговой отладки. И поддержка структурированных программ проще - вносятся изменения только куда нужно, не затрагивая уже работающее.
|
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Так это я знаю)
Делая в окне программы, я ввожу "интервал межу строками", а тут надо по другому. Как? Есть где-нибудь справочник (не справка автокада) со всеми командами, опциями команд и их последовательностью? Не всегда все так очевидно, как делаешь через окно автокада (командную строку). |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
По-моему, такого не существует. Только если постоянно эксперименты ставить. И то не факт, что удастся все варианты предусмотреть.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
|
|||
![]() |
|
||||
Количество столбцов, расстояние между столбцами. Можно заменить на "" яд.
|
||||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Приветствую. Споткнулся о простой, казалось бы, вопрос. Как можно зациклить вставку блока с последующим безболезненным выходом из цикла? Пробовал:
Код:
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
|
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Требуется помощь. Функции по отдельности работают, а вот в "кучу" собрать не могу. Причиной остановки указывает последнюю строчку (выделил красным) . Полагаю, что-то не так с переменными. Честно признаюсь, эта тема (аргументы, переменные, что где прописывать) мне непонятна, если кто может, - объясните, пожалуйста.
Код:
Код:
Последний раз редактировалось Alxndr1697, 31.03.2022 в 08:02. |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Цитата:
Выглядит он так: (defun foo ( a b / c d ) < тело функции > ) Разберем по порядку каждый элемент: defun – начало определения функции. Любая функция или команда, определяемая пользователем, обязательно начинается со слова defun. foo – имя функции. Обрати внимание, что если имя функции начинается на c:, тогда AutoCAD определяет эту функцию как команду. Таким образом, если имя функции будет foo она будет определена непосредственно как функция, но, если имя будет c:foo, она будет определена как команда, это важно! Теперь разберемся со скобками, идущими после имени функции. Элементы внутри скобок могут содержать параметры функции и локальные переменные. Все зависит от варианта написания того, что содержится в скобках. Рассмотрим каждый из них: Вариант 1. (defun foo ( a b / c d ) < тело функции > ) В данном случае, функция содержит как параметры функции, так и локальные переменные. Элементы, которые идут до слеша – a b, это параметры функции. Элементы, расположенные после слеша – c d, это локальные переменные. Вариант 2. (defun foo ( a b ) < тело функции > ) или то же самое (defun foo ( a b / ) < тело функции > ) Функция содержит только параметры функции. Вариант 3. (defun foo ( / c d ) < тело функции > ) Функция содержит только локальные переменные. Вариант 4. (defun foo () < тело функции > ) или то же самое (defun foo nil < тело функции > ) Функция не имеет ни параметров функции, ни локальных переменных. И теперь важный момент – если ты определяешь функцию как команду, то бишь вместо foo пишешь c:foo, то такая функция не должна содержать параметров функции, это будет являться ошибкой. Параметры функции нужны, чтобы функция могла принимать входящие значения. Например, определим простейшую функцию создания круга: Код:
Вызов функции с параметром, осуществляется следующим образом: (имя_функции параметр_функции) Подобным образом, попробуем вызвать нашу функцию с применением разных значений в качестве параметра функции color: (MakeCircle 1) - создан круг красного цвета (MakeCircle 3) - создан круг зеленого цвета (MakeCircle 5) - создан круг синего цвета и т.д. Входящие параметры функции могут быть совершенно любого характера: начиная со свойств объекта (цвет, толщина линий, слой и т.д.) заканчивая списками координат и значениями системных переменных. Функции с параметрами нужны, если часто используются повторяющиеся элементы кода, в которых меняется лишь одно или несколько значений. Составив такую функцию, можно впоследствии запускать ее определив только нужное значение, а не дублировать одни и те же строки кода. Теперь разберем, что из себя представляют локальные переменные. Начать нужно с того, что сами переменные могут быть двух типов: локальные и глобальные. Локальные переменные могут быть активны только в функции, в которой они были определены, и после завершения этой функции вычищаются из памяти компьютера. Глобальные же переменные всегда находятся в памяти. В AutoLISP переменные могут быть установлены с помощью двух функций setq и set. Таким образом, все значения, заданные с помощью этих функций, будут являться переменными. Проведем небольшой эксперимент и создадим команду, где определим переменную. Команда будет в двух вариантах. В первом варианте команды мы зададим переменную var как локальную. Введем в командную строку: Код:
Теперь определим ту же команду, но переменную var оставим глобальной: Код:
При определении в функции переменных должно выполняться обязательное правило: переменные должны всегда задаваться как локальные, за исключением тех редких случаев, когда переменные могут потребоваться как глобальные. Но ты должен четко понимать, когда, где и зачем переменная может потребоваться как глобальная, и если этого понимания нет – тогда локализуй переменные. Возвращаясь к вышесказанному – если в функции присутствуют слова setq или set, значит в функции есть переменные, и они, за исключением редких случаев должны быть локализованы. Добавлю также, что локализовываться могут не только переменные, но и функции которые вложены в другие функции, – они так и называются – локальные функции. Думаю, синтаксис функций в общих словах я объяснил. И теперь исходя из изложенного проверь свой код: То, что ты выделил красным, это вызов некой функции Fasad_sup с кучей аргументов (параметров функции), и эта функция ранее не была определена! В начале ты определяешь команду c:Fasad_sup, а не функцию. И, забегая вперед, скажу: функция запускаемая внутри функции, которая носит с ней одно и то же имя, называется рекурсивной, и применяется в специфических случаях. Это явно не тот случай. Последний раз редактировалось Browning Zed, 31.03.2022 в 20:37. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
терминологическое уточнение
не активные - а у переменных есть области видимости. И для лиспа всего два варианта - локальная видимость в пределах функции или глобальная для всего кода лиспа. Причем чтобы создать переменную с глобальной видимостью - в лиспе достаточно просто забыть указать переменную в теле функции или ошибиться с написанием идентификатора переменной в коде. |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Цитата:
От себя также добавлю, что по теме "область видимости в AutoLISP" есть замечательная статья на сайте Алексея Кулика. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Browning Zed, спасибо, очень доходчиво.
----- добавлено через ~6 мин. ----- Цитата:
Насчет имен, у меня, вроде, разные везде. Или, это просто предупреждение Последний раз редактировалось Alxndr1697, 01.04.2022 в 07:48. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Переделал программу. Теперь причиной остановки указывает выражение (выделил красным), которое в программах, по отдельности работало нормально.
Да что в нем не так??? ![]() ![]() ![]() Код:
Последний раз редактировалось Alxndr1697, 03.04.2022 в 19:09. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Какое сообщение об ошибке?
Offtop: Сугубо ИМХО: код следует переработать полностью. Начиная с переименования функций и их локализации и документирования, заканчивая общим принципом. Могу, если хочется, снять видосик, почему этот код не подлежит отладке.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Текстового сообщения нет, просто выделение.
Цитата:
Вот, его-то, я никак не поймаю, видимо. Последний раз редактировалось Alxndr1697, 03.04.2022 в 20:23. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Alxndr1697, видосик записать не удалось - что-то не то у меня с виртуалкой. Так что текстом
![]() Прежде чем читать - все это личное мнение, никого ни к чему не обязывающее. Дисклеймер: будет много ссылок на мой сайтик. Представленный код невозможно протестировать. В принципе невозможно. Причина номер раз - это использование диалога (которого, естественно, у меня нет). Я понимаю, что можно покопаться по форуму и найти тот самый dcl. Но как-то подобное не комильфо - не проще ли создавать диалог "на лету"? Причина номер два - именования функций и переменных. Функция re_name (к примеру), судя по названию, должна там что-то переименовывать. А делает она совсем другое. Причина номер три - это видимость функций и переменных. Все внутренние функции объявлены как глобальные. Отличный шанс выстрелить себе в ногу ![]() Далее. Мое искреннее убеждение состоит в том, что любая (подчеркиваю - любая!), даже локальная, функция должна работать только с теми данными, которые в нее прилетели и не лезть во внешние переменные. Та же raz_fasad (кстати, по имени можно решить заранее - что оно делает?) у меня была бы переписана примерно так: Код:
Код:
Код:
Дальше - я бы постарался максимально отказаться от использования командных методов. Так, например Код:
Код:
Код:
Код:
На предмет переопределения глобального обработчика *error* я уже когда-то высказывался. Кстати, у тебя там не возвращаются обратно системные переменные. И метка окончания отмены не ставится, что может привести к неприятным последствиям. Ну и по поводу запроса точек и прочего ![]() Сорян, накидали работы. Пока заканчиваю.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
По поводу наименования функций - чтобы не запутаться, можно придерживаться псевдоиерархии:
Fasad_%Тип фасада%_Create - создание фасада Fasad_%Тип фасада%_Create_%Fun01% Fasad_%Тип фасада%_Create_%Fun02% - это подфункции создания отдельных частей фасада данного типа Fasad_%Тип фасада%_Create_%Fun03% и не надо их куда-то прятать, уже по идентификатору функции видно - где она должна вызываться. И что функция Fasad_%Тип фасада%_Create не может (не должна, точнее) вызываться внутри Fasad_%Тип фасада%_Create_%Fun01%. И данные передаются в эти подфункции через аргументы. И если под рукой тот же эксель - не ленитесь делать простейшие таблички копипастом: название функции, назначение аргументов, возвращаемое значение, примечание. В табличном виде гораздо проще воспринимать информацию, чем в простынях кода. |
|||
![]() |
|
|||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
"На лету", - отличный вариант! Но,- VLA... Цитата:
Цитата:
Цитата:
Raz_fasad считывает содержимое из диалогового окна, вроде как размеры фасада. Такие уж у меня ассоциации. Хотя, в окне, назвал это параметрами)) А вот дальше, то самое Но, о котором писал выше. Мне жутко неудобно, что вы потратили на меня столько времени, но, в VLA я не понимаю, от слова совсем((( По поводу запроса точек, идею понял, попробую применить. ----- добавлено через ~11 мин. ----- Для этого у меня вся программа в комментариях. Это для форума я их "чищу", думаю, что они будут мешать. Последний раз редактировалось Alxndr1697, 04.04.2022 в 22:21. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ага, только одно "но" - это callback. Которого особо не видать
![]() Какое vla-? Тупо получение каталога временных файлов, создание файла, запись в него и далее по тексту. Вроде бы в ссылках было. Цитата:
Советую поискать на youtube видосики от Сергея Немчинского. Он, хотя и джавист, но вещи озвучивает очень серьезные и важные. В том числе и про правило 20/80, про чтение кода, про аналитику кода и все вот это вот.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
defun Имя_функции ( аргументы или параметры / локальные переменные)
1. Аргументы могут дублироваться (по имени) произвольное количество раз в разных функциях, но при этом конфликта не будет - так как область видимости аргумента: только внутри функции. 2. Локальные переменные - аналогично. это просто расширение лиспа, позволяющее делать многие вещи не через комстроку, а вызовом напрямую функций с передачей им необходимых аргументов. Ведь каждый раз, когда обращаетесь к командному процессору акада внутри функции - по сути прерываете выполнение функции с передачей управления самому акаду. И вернет ли акад управление в вашу функции сразу, или захочет чем-то своим заняться.. Никак не управляемо и не предсказуемо |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
Или, опять, что-то путаю? Код:
Цитата:
Внешние переменные, - это которые в DCL? Последний раз редактировалось Alxndr1697, 05.04.2022 в 07:33. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
"Внешние переменные" - это то, что по отношению к какой-то функции не прилетевшее в нее. Пример callback-функции я привел.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
Я не собираюсь становиться Программистом. Мне хотелось бы написать (самому) несколько программ, которые облегчат мне работу сегодня и, возможно, обеспечат мне ее в будущем. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
![]() Касаемо ошибки: проверяй, какие значения тебе прилетают. Точки останова в помощь ))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Offtop: когда физически ощущаешь - как рутинная работа начинает обходить тебя стороной, процесс мелкой и не очень автоматизации затягивает) А на дорожку программиста вы уже встали, сойдя с пути вопрошающих "а нет ли случайно у кого то программы под описанные мною хотелки")
|
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Код:
С синими строками работают оба варианта (строятся вкладные и накладные фасады). Как правильно написать условие, чтобы выполнялся один вариант, в зависимости от (= Vibor "o_nkl"), или (= Vibor "o_vkl")? Мой, красный, конечно же, не работает. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
См.в сторону cond
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Вот так, тоже не работает.
Код:
При прописывании условия, стоки (синие (пост 4209)), убирать, или они должны оставаться? Последний раз редактировалось Alxndr1697, 09.04.2022 в 07:58. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Неправильно.
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Точно.
![]() Но, все равно, не работает. Отдельно (fasad_naklad), - работает. Отдельно (fasad_vklad), - работает. Вместе и с (cond), - строит оба варианта, только у накладного, почему-то не срабатывает команда "массив" ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Не хочу вникать в логику, но я бы подумал на предмет заменить
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Очевидно, что надо посмотреть, что находится в переменных H_fas_N, Z_r на момент выполнения команды array в проблемной сумме, яд.
|
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
----- добавлено через ~5 мин. ----- А вот Vibor, почему-то, - nil. Может тут собака зарыта? ----- добавлено через ~8 мин. ----- При включении обеих функций Vibor работает корректно. Мой мозг отказывается что-то понимать ![]() Последний раз редактировалось Alxndr1697, 11.04.2022 в 07:27. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я уже писал, что, по-хорошему, любая функция должна работать только с тем, что к ней пришло и не лезьть во внешние по отношению к ней переменные. Если у тебя ситуация такая, что каждый лезет куда вздумается и абсолютно бесконтрольно, то могу только посочувствовать. Ну или посоветовать переписать код.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Буду весьма признателен, если кто-нибудь найдет время и желание найти и исправить ошибки.
Программа должна строить накладные, или вкладные фасады, в зависимости от выбора, в заданном количестве и параметрами. (в диалоговом окне, думаю, все понятно) Модель "шкафчика" для экспериментов прилагаю. Диалоговое окно: Код:
Код:
Последний раз редактировалось Alxndr1697, 11.04.2022 в 21:47. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Сравни свой кусок кода (для начала):
Код:
Цитата:
Код переписывать лениво.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Опять опечатка
![]() К сожалению, работоспособность программы не изменилась. (кроме лишней буквы ничего не нашел) Цитата:
Понимаю ![]() ----- добавлено через ~12 мин. ----- Не могу понять, почему при "некорректно" работающей программе (включены (fasad_naklad) и (fasad_vklad)), Vibor возвращает "o_nkl", или "o_vkl", как и положено, а при удалении этих строк, Vibor возвращает nil. Последний раз редактировалось Alxndr1697, 13.04.2022 в 07:01. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А разве vibor функция, чтобы что-то возвращать? По-моему, это все же переменная, в которой что-то хранится. Не путай теплое с мягким. Как лично у меня выглядел бы код (правда, без основной реализации построения - на это уже нет ни времени, ни сил):
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Ухтыж
![]() Да это космос, для меня. В выходные попробую что-нибудь понять. Цитата:
----- добавлено через ~2 мин. ----- Жаль конечно, что моя программа не заработает ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Да ну, там все достаточно просто. Выполнено разделение логики (хотя бы частично), повторяющийся код вынесен в отдельные локальные функции - и все.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Код:
А если пытаться сходу и побыстрее, то получится "взрыв на макаронной фабрике", в котором никто не разберется. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Offtop: Конечно, стоило бы. Но на практике я все время забываю это сделать
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Подскажите, как создать группу?
В командной строке, - команда, выбор объектов, ентер. Пишу в программе (command-s "_.group" Bok_l Bok_r N_p Fr_ass ""), - не работает. Код:
Последний раз редактировалось Alxndr1697, 16.04.2022 в 21:24. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Создавай объекты некомандными методами. И насколько тебе нужен именно массив? Может, проще будет вообще все в блок засовывать сразу?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
По плану, эту программу дописать и заняться изучением.
Другого способа не вижу. Пробовал. Все равно, надо выбирать "второй" блок и проблема (для меня) в том, что если в рисунке предполагается потом рисовать ящики с другими параметрами, вставляется этотже блок. Решения не нашел. Хотел попробовать через группу, - не получилось, да и проблема с выбором осталась бы, наверное. ----- добавлено через ~2 мин. ----- Комп еще поломался((( |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Чего там изучать-то?
(vl-load-com) (defun c:Example_AddBox() ;; This example creates a box in model space. (setq acadObj (vlax-get-acad-object)) (setq doc (vla-get-ActiveDocument acadObj)) ;; Define the box (setq center (vlax-3d-point 5 5 0) boxLength 5 boxWidth 7 boxHeight 10) ;; Create the box (3DSolid) object in model space (setq modelSpace (vla-get-ModelSpace doc)) (setq boxObj (vla-AddBox modelSpace center boxLength boxWidth boxHeight)) ;; Change the viewing direction of the viewport to better see the box (setq NewDirection (vlax-3d-point -1 -1 1)) (setq activeViewport (vla-get-ActiveViewport doc)) (vla-put-Direction activeViewport NewDirection) (vla-put-ActiveViewport doc activeViewport) (vla-ZoomAll acadObj) ) По общей идеологии:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Легко Вам говорить)))
У меня, почему-то, не работает. Неужели нет решения? Осталась только эта команда для завершения. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Че ета не работает? Пример вызова есть, функция возвращает vla-указатель на созданный бокс. vla-copy для него, vla-move для созданной копии - и вперед!
![]() ----- добавлено через 35 сек. ----- В качестве подсказки: http://www.cad.dp.ua/stats/vla_doc.php
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
----- добавлено через 55 сек. ----- Полюбасу, чета не так делаю))) ----- добавлено через ~3 мин. ----- Цитата:
![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
Попробуй вызов, подставь свои значения, запомни результат. К примеру: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
ятд надо создать выборку объектов, которую затем можно запихнуть в массив:
Код:
и командные методы, тут я согласен с Алексеем, надо юзать activex!) |
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Заработало
![]() ----- добавлено через ~24 мин. ----- Тут, видимо произошло некоторое недопонимание. То, что я назвал ящиком, это не бокс, это "мебельный ящик" в самом прямом смысле слова, который состоит из пяти примитивов с четвертями и пазами. ----- добавлено через ~17 мин. ----- koMon Спасибо!!! Все получилось! Последний раз редактировалось Alxndr1697, 22.04.2022 в 22:21. |
|||
![]() |
|
||||
Да нет, я именно предлагал заменить рисование 3d боксов, команда box, вставкой блоков. Правда для операций вычитание... потребуется их членить.
Потому что никто не запрещает её использовать так) последовательно назначать ей следующий примитив после отрисовки второго ящика после последнего до операции отрисовки второго ящика до окончания примитивов базы. Как-то так, но сам вопрос не очень понятен. |
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
Вот и получается, что имя именно должно быть неизменным, а почему, мне не понятно. Хочу понять логику, когда переменная может переопределяться в процессе работы программы, а когда нет. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
"Имя" = "наименование переменной"?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Цитата:
|
||||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Прошу прощения за задержку, - умчался на работу.
Да. Цитата:
Собственно в этом и был вопрос, почему наименование переменной должно оставаться тем же? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну хотя бы потому, что внутрь одной переменной можно засовывать разные данные.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
если переменная больше не нужна - ее можно использовать повторно. Поскольку в лиспе динамическая типизация - то переменной можно присвоить любое другое значение.
И строка Код:
Код:
|
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
Для меня непонятным остается, почему, в данном примере, нельзя переименовать (создать новую) "синюю" переменную? Это я думаю, что она новая, а получается, что они все связаны. Как? |
|||
![]() |
|
||||
(setq entity(1) (entlast)) ; записываем в переменную entity последний примитив базы
; к базе добавляются примитивы... (while (setq entity(2) (entnext entity(1))...) ; записываем в переменную entity примитив следующий за примитивом, который записан в переменную entity (setq box_lower_sset (ssadd entity(2) box_lower_sset)) ; добавляем в набор примитив, записанный в переменную entity entity(1) и entity(2) связаны непосредственно. в первой итерации цикла while в entity(2) записывается примитив, который следует за примитивом, который записан в переменную entity(1) и который затем добавляется в набор box_lower_sset. итерации продолжаются до окончания примитивов в базе. то есть мы используем переменную entity для записи в неё каждого следующего примитива после маркировки последнего примитива и до добавления объектов второго ящика. всё логично и лаконично. но, если ну прямо, ну вот хочется поменять имя переменной в цикле while (не могу понять зачем), то придётся вводить новую переменную. хотя я опять сильно сомневаюсь в этом ли суть вопроса?) или какая суть вопроса?) Код:
|
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
имя переменной - это псевдоним области (ячейки) оперативной памяти чисто для программиста. Когда на начальном этапе писали на машинном языке (из-за ограниченных ресурсов первых ЭВМ), то там псевдонимов не было - работали напрямую с ячейками памяти. Потом по мере увеличения объемов памяти и производительности ЭВМ стали появляется промежуточные языки высокого уровня, где программист писал уже на более понятном языке языковые конструкции - а в процессе компиляции/интерпретации эти языковые конструкции превращались в машинный исполняемый код.
Насчет связанности - как уже ранее говорили, у каждой переменной есть своя область видимости: где ее могут читать и модифицировать. Есть свои нюансы: аргументы - по умолчанию обычно копируются значения и внутри функции работают уже с копиями входных значений. Локальные переменные функции - на входе в функцию либо при первом использовании под них выделяется память, при выходе из функции - память освобождается (как и из под скопированных аргументов). И есть глобальные переменные - под них выделена память, и они висят в отдельной области памяти, пока их в явном виде не удалят. И чтобы не было сюрпризов, надо писать код как говорил выше Алексей - функция принимает аргументы (копирует их во внутренние временные переменные), обрабатывает с использованием локальных переменных и возвращает результат. А глобальные переменные использовать только если уж совсем без них не обойтись, при этом желательно им давать смысловые длинные имена - чтобы случайно не было конфликтов из-за совпадения с локальными переменными. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
koMon, Сергей812 Спасибо, разобрался.
Цитата:
Вот в таком виде у меня в голове все устаканилось ![]() Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
(vla-put-displaylocked <vla-указатель> :vlax-true)
P.S. Здесь обучение лиспу, если что.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
инженер-гидротехник Регистрация: 08.02.2015
Москва
Сообщений: 46
|
Добрый день. Сейчас осваиваю программирование на LISP
Хочу сделать блок при помощи activeX Блок простой. Две отрезка под углом с сопряжением. Знаю как создать отрезки (при помjщи метода addline), но вот метода для создания сопряжения не нашел. Какой метод использовать что бы создать сопряжение между отрезками при помощи activeX? |
|||
![]() |
|
||||
инженер-гидротехник Регистрация: 08.02.2015
Москва
Сообщений: 46
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
vla-addarc
Правда, придется вычислять вообще все ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер-гидротехник Регистрация: 08.02.2015
Москва
Сообщений: 46
|
Вот кусок кода который хочу сделать. Упражнение просто для обучения. Блок из двух отрезков с сопряжением. ранее сделал такой же без ActiveX.
Насколько я понял дугу в блок можно запихать (по аналогии с линиями) только при помощи vla-addarc. другого пути нет? Может есть метод что бы запихнуть в блок вместе с линиями произвольный (в моем случае уже созданную дугу) vla Объект ? Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Команда не сработает. Я бы добавлял примитивы в пространство модели, делал над ними соответствующие операции, а потом уже указатели на отрезки + entlast (полученный в результате _.fillet) загонял в блок. Это (как мне кажется) будет одним из самых простых способов.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер-гидротехник Регистрация: 08.02.2015
Москва
Сообщений: 46
|
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
vla-copyobjects в помощь
![]() Командные методы создания блока не могу порекомендовать. ----- добавлено через ~22 мин. ----- Хотя, посмотрев на исходный код, можно использовать нечто типа Код:
----- добавлено через ~23 мин. ----- Offtop: Код особо не тестировал и не проверял. Так, в тепличных условиях...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Уважаемые Гуру, накидал код на скорую руку по печати выборочного фрагмента чертежа по заданным параметрам посредством программы приПринтер. Интересует вопрос, почему так долго выполняется программа? Это где то мой косяк или тут сложности "железного" плана - типа связь с сервером, настройка печати? Возможно ли как то найти причину тормоза?
Тут сам код. Offtop: Он изобилует комментариями, я для себя каждый шаг прописал. Как показала практика, код забывается быстрее чем хотелось бы, а когда нужно сделать или изменить быстро, то долго заново вникать в каждую строку. Потому что программировать приходится "раз в сто лет". А тут еще и обновление на новый автокад сделали (этакий подарок мне на 15-летие усердной службы на фирме - за что барину огромный поклон ![]() Код:
Оказалось все намного проще - нужно было сбросить системную переменную Backgroundplot в ноль. Увы, не догадался сразу. ![]() |
|||
![]() |
|
||||
Регистрация: 08.09.2013
Сообщений: 22
|
Здраствуйте в проектной организации у наших компьютерщиков я вытянул вот этот код
Код:
Код:
Последний раз редактировалось nikkomp, 26.10.2022 в 12:08. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А должен?
Offtop: И чем не устраивает почти штатный _.mocoro ?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Никак. Ты при всех операциях уже указываешь все необходимые точки.
P.S. И ты себе такие грабли подготовил - пальчики оближешь! Поменяй ради приколу copymode, посмотри, как оно работать будет.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
Подскажите пожалуйста такую ситуацию.
Делаю определенную замену текста в примитиве MLEADER: группа (304 . "заменяемый текст") посредством SUBST После выполнения entmode меняется цвет значения текста в MLEADER на значение "по слою", несмотря на то, что внутри MLEADER текст имеет свой цвет (знаю что не правильно, но так получилось) Код:
Последний раз редактировалось Sege, 03.11.2022 в 11:17. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Значит, меняется не только эта группа. Ну или их несколько.
А кто мешает работать через ActiveX? ----- добавлено через ~9 мин. ----- Кстати, приведи пример такой выноски - что-то мне не удалось сделать цвет только текста отличным от цвета мультивыноски.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
Цитата:
UDP: кажется понимаю в чем дело: в тексте мультивыноски в группе 304 уже сидит внутреннее форматирование цветом (304 . "{\\C4;СТАРЫЙ ТЕКСТ}") а SUBSTом мы тупо меняем на новое значение без учета знаков внутреннего форматирования, т.е. получается уже конструкция (304 . "НОВЫЙ ТЕКСТ") Последний раз редактировалось Sege, 03.11.2022 в 13:18. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Так у тебя там принудительное форматирование выставлено!
----- добавлено через ~2 мин. ----- Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
Цитата:
![]() Последний раз редактировалось Sege, 03.11.2022 в 15:00. |
|||
![]() |
|
||||
Регистрация: 19.08.2022
Сообщений: 71
|
Я вообще не разбираюсь в лиспах.
Есть лисп для быстрой печати, который я нашел по адресу (https://forum.dwg.ru/showthread.php?...FB%E1%EE%F0%F3). Вот фрагмент этого лиспа:↓↓↓ Код:
Например я знаю некоторые строчки: "A4" ;Формат листа бумаги ***меняем на "А3"-получаем формат А3 или "portrait" ;Ориентация чертежа ***меняем на "Landscape"- ориентация чертежа меняется на альбомную. ну и еще парочку строк знаю, а остальные нет. К примеру если я не хочу чтоб вписывалось, или хочу чтоб печать работала в пространстве листов и так далее, то на что надо заменить эти остальные строки, и какие варианты есть? Благодарю!☺ |
|||
![]() |
|
||||
Отопление и вентиляция Регистрация: 31.10.2008
Москва
Сообщений: 445
|
странно , а зачем печатать из пространства листа какой то кусок?
вы можете вбить (command "_.plot") и смотреть что вам выводит и какие варианты дает автокад, в некоторыхпараметрах можно ввести "?" чтобы посмотреть все варианты Соответвествно чтобы не из модели печатать нужно в 3 строке где сейчас "model" , нужно указать имя листа из которого печатать. обычно имя текущего листа можно получить через (getvar "CTAB") но тут он не работает. тоже самое если не хотите вписывать то в строке "_fit" нужно указать свое значение. |
|||
![]() |
|
||||
Регистрация: 19.08.2022
Сообщений: 71
|
Цитата:
я со всеми моментами разобрался в том числе и с "_fit", авот как его заставить чтоб этот лисп работал в пространстве Листов?? |
|||
![]() |
|
||||
Отопление и вентиляция Регистрация: 31.10.2008
Москва
Сообщений: 445
|
Так если у вас лист сформирован через публикацию "_PUBLISH" печатаешь любой лист , через page setup можно выставить любой другой формат. Зачем изобретать велосипед?
вместо "_fit" нужно указать масштаб например вот так "1:1". |
|||
![]() |
|
||||
Регистрация: 19.08.2022
Сообщений: 71
|
Цитата:
Спасибо! но я так и сделал и в остальных переменных тоже разобрался. Только вот осталась одна строчка. вот эта↓ "model" ; Имя листа или [?] <Модель>: В модели он шикарно работает, но как сделать так чтоб он работал и в листах? Что конкретно прописать в коде, чтоб он заработал и в пространстве Листа? (В лиспах не шарю вообще) ☺ |
|||
![]() |
|
||||
Отопление и вентиляция Регистрация: 31.10.2008
Москва
Сообщений: 445
|
а у меня все эти чертежи в одном пространстве Лист1
Рука-лицо. Зачем тогда вобще вам пространство листа тогда? Есть куча вариантов когда нижимаешь 1 кнопку и формируются все листы с нужными размерами листов https://forum.dwg.ru/showthread.php?t=104517 Что конкретно прописать в коде, чтоб он заработал и в пространстве Листа? Нужно указать имя листа |
|||
![]() |
|
||||
Регистрация: 19.08.2022
Сообщений: 71
|
Если бы не видовые экраны, то я бы пользовался только моделью.
Цитата:
Цитата:
Я пытался туда вбить имя листа, но лисп выдавал почемуто ошибку. Поэтому к вам и обратился☺ |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну так получи активное пространство и бери его имя, делов-то
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
(getvar "ctab") - вот тебе и имя активной закладки (в подавляющем большинстве случаев).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.08.2022
Сообщений: 71
|
Цитата:
(defun c:aaa1 () <(defun GetBoundingBox (en / obj minpt maxpt) (if (= (type en) 'ENAME) (progn (setq obj (vlax-ename->vla-object en)) (vla-getboundingbox obj 'minpt 'maxpt) (list (trans (vlax-safearray->list minpt) 0 1) (trans (vlax-safearray->list maxpt) 0 1) ) ;_ end of list ) ;_ end of progn ) ;_endof if progn ) ;_endof defun (princ "Выберите объект для печати") (setq box (GetBoundingBox (car(entsel)))); список из координат минимума и максимума габаритов выбранного объекта (setq xy1 (car box)); координаты для определения области печати, xy1 - левая нижняя, xy2 - правая верхняя (setq xy2 (car (cdr box))) (command "_.plot" "_Yes" (getvar "ctab") ; Имя листа или [?] <Модель>: "PDFCreator.pc3" ;Имя устройства вывода "A4" ;Формат листа бумаги "Millimeters" ;Единицы измерения размеров листа "portrait" ;Ориентация чертежа "_No" ;Перевернуть чертеж? "_Window" ;Печатаемая область xy1 ;Первая точка окна xy2 ;Вторая точка окна "1:1" ;[Вписать] "_center" ;Смещение от начала (x,y) или [Центрировать] "_No" ;Учитывать стили печати? "monochrome.ctb" ;Имя таблицы стилей печати "_yes" ;Учитывать веса линий? "As displayed" ;Режим вывода раскрашенных ВЭ "_No" ;Запись чертежа в файл "_No" ;Сохранить изменения параметров листа "_yes" ;Перейти к печати ) ;_ end of command> ) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну, во-первых, в расширенном редакторе есть возможность показывать нормально форматированный код.
Во-вторых, что там перед локальным defun'ом делает символ "<"? В-третьих, что за ошибка? И в каком месте? ----- добавлено через ~2 мин. ----- И зачем выполнять перевод точек из мировой системы в пользовательскую? Короче, проверяй значения каждой переменной перед вызовом команды
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ни разу не сталкивался. Приведи пример такого файла, где ctab возвращает неверный результат
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.08.2022
Сообщений: 71
|
Цитата:
Цитата:
Ошибка в том что лисп в пространстве листа не пашет! (а в пространстве модели работает прекрасно) Моя логика подсказывает что нужно изменить вот эту строчку ↓↓↓, но я могу и ошибаться (это просто мое мнение) "model" ; Имя листа или [?] <Модель>: (такая она была сначала) (getvar "ctab") ; Имя листа или [?] <Модель>: (такая стала она теперь, но по прежнему не пашет в простр-ве листа) Цитата:
пробовал разные все получилось (центрировать, замена формата и т.д.) кроме, того чтоб лисп работал в пространстве листа |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я про переменные, а не про печать. На твоем месте я бы почитал книгу "AutoCAD язык макрокоманд и создание макросов" (есть в Download). Спойлер: тогда поймешь, что сначала надо команду пройтись "руками", последовательно отвечая на все ее запросы - и тогда появится хоть какой-то шанс на то, что макрос/программа корректно сработает.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.08.2022
Сообщений: 71
|
Цитата:
----- добавлено через ~3 мин. ----- Какой у тебя лисп работает? Который ты во вложении скинул? (У меня он почему-то не пашет,попробовал значения некоторые поменять, тоже не работает) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну тут выбор-то не сильно богатый - либо самостоятельно разобраться и сделать как хочется, либо постоянно просить кого-то сделать.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 08.09.2013
Сообщений: 22
|
Здраствуйте, вот надыбал два lispa по копированию текста, нельзя ли их скомпоновать так чтобы, чтобы можно было копировать и вставлять текст в примитивы СПДС GraphiCS?
Код:
Код:
Последний раз редактировалось nikkomp, 02.12.2022 в 14:00. |
|||
![]() |
|
||||
Регистрация: 14.12.2008
Сообщений: 1,134
|
Команда получается из функции добавлением в начало функции символов "C:" (по русски можно сказать что это намек, что данная функция это команда)
После символа "/" указываются "внутренние переменные функции, которые впрочем можно не описывать. Поэтому функцию FHS можно упростить: Код:
И в итоге программа ничего не выдает на выходе |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
Цитата:
Значит в текущем файле не найдены штриховки.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Конструкция defun определяет функцию, в данном примере это функция FHS. Чтобы вызвать функцию, загруженную в автокад надо набрать в командной строке (FHS).
Если имя функции начинается с C: (например C:FHS) - то автокад уже воспринимает эту функцию как свою внутреннюю команду, и для вызова ее достаточно набрать все что написано после C: - т.е. просто FHS или же все название функции в круглых скобках (C:FHS). |
|||
![]() |
|
||||
Регистрация: 14.12.2008
Сообщений: 1,134
|
Понятно, добавил C: и после fhs функция выдала список штриховок. Вызов (fhs) не знал. Спасибо буду знать!
Не понимаю как несколько раз вызванная строка (setq l (cons h l)) создает список? Почему она каждый раз дополняет список, а не записывает его заново? Модифицировал функцию: Код:
Причем StyleName это "список символов", а HatchCol это список названий штриховок. Что там надо исправить? Последний раз редактировалось МишаИнженер, 07.12.2022 в 13:08. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
![]() Ты бы хоть писал где ошибка происходит, в какой строке... Если про 121 - то ошибка в (t (member StyleName HatchCol)) - lisp ищет функцию именем t. А тебе похоже нужно сравнение с истиной. И предвкушая будущее - не надо писать конструкт вида (if (= t (member StyleName HatchCol)) или (if (not (null (member StyleName HatchCol)))) - можно просто (if (member StyleName HatchCol) (setq l (cons h l)) - присваивает переменной l значение пары, в которую записывает имеющееся значение переменной l |
|||
![]() |
|
||||
Регистрация: 14.12.2008
Сообщений: 1,134
|
Я назначаю точку останова в AutoLisp, программа останавливается, я проверяю значения переменных, но потом все зависает. Приходится все останавливать и запускать все заново.
Насчет команды member мне кажется надо создать список из 1 аргумента. Но как это сделать? |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
так пошаговая отладка до строчки кода, на которой все зависнет/вылетит с ошибкой. Затем точка остановки на предыдущие строки и снова пошагово, контролируя при этом переменные. На любом языке так локализуются ошибки времени исполнения, если сразу не увидел причину.
|
|||
![]() |
|
||||
Регистрация: 14.12.2008
Сообщений: 1,134
|
Да надо сравнение с истиной
Цитата:
а получается ("знач1" "знач2" "знач3") Непонятно! |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Вообще говоря, если второй элемент не атом, т.е. если /b/ - список,
то (cons a b) просто добавляет первый элемент /а/ в начало списка. И, как правило, в этом функционале (cons … ) и используют.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
https://help.autodesk.com/view/ACD/2...E-F070F0A7CB2B
добавь в закладки! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Offtop: Мне интересно, насколько у народа хватит терпения объяснять, что справку все же не стоит игнорировать...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 14.12.2008
Сообщений: 1,134
|
Интересная идея и функция вроде подходит. Спасибо!
Исправил код Код:
Не могу найти справку на функцию Т. Как правильно её использовать и что это за функция (это функция из функций сравнения)? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Это что за бред зеленой лошади?
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Offtop: это просто лисп ТС "не зашел".. или его сразу "воспринимаешь", или опыт с "обычными" языками программирования вступает в постоянный конфликт с подходом к программированию в лиспе. Учитывая явное нежелание ТС хоть как-то систематизировать знания - это, похоже, надолго)
|
|||
![]() |
|
||||
Регистрация: 14.12.2008
Сообщений: 1,134
|
Если функция member возвратит номер позиции (не nil) значит это значение при конвертировании в булевский тип должно быть ИСТИНА, а функция T сравнивает аргумент с истиной. Если аргумент ИСТИНА, тогда функция T должна вернуть значение ИСТИНА.
Но почему функция Т не хочет выполняться? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Для ради приколу посмотри в справке примеры использования if в лиспе. В VBA ты тоже пишешь:
If value=1 Then True Else False End If ? ![]() ----- добавлено через ~2 мин. ----- Пара недель ненапряжного чтения и пара десятков собствнных экспериментов (только нормальных, а не простого копипастинга кода без малейшего понимания что куда и зачем) будут значительно более эффективны. Offtop: Но ТС, как тот комсомолец, без трудностей не может, похоже.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Т - это вроде логическая константа, а не функция. А if воспринимает nil как ложь - это вам любая справка скажет, если туда заглянете)
----- добавлено через ~2 мин. ----- Offtop: люди в свое время изучали языки программирования методом тыка, конечно.. но это уже лет этак 20+ неактуально в связи с появлением инета) |
|||
![]() |
|
||||
Регистрация: 14.12.2008
Сообщений: 1,134
|
Вот в таком виде получается доступ к командам если искомая штриховка находится в списке штриховок чертежа:
Код:
Может быть надо использовать функцию обнаружения ошибки чтобы обработать эту ошибку? Или надо создавать вместо списка штриховок чертежа - список штриховок АвтоКада. Наверное создание такого списка может потребовать несколько секунд и будет казаться долгим. Поэтому проще отловить факт появления ошибки и оценить это как отсутствие штриховки среди доступных штриховок АвтоКада. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Возможно. Но для этого надо хоть что-то прочитать из того, что уже не раз рекомендовали. Offtop: Ну или хотя б по ссылке пройти.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 14.12.2008
Сообщений: 1,134
|
Всегда было интересно: что обозначает переменная вызываемая без скобок и без функций?
До этого я считал, что это ошибка, случайно забытая переменная в тексте программы и стирал такие строки. Какой смысл просто печатать переменную в программе без функций? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А почитать, подумать, проанализировать - не?
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 04.12.2022
Сообщений: 33
|
Нужна помощь в корректировке лиспа Сумматор текста (автор Владимир Громов, корр.ZZZ, Евгений Елпанов, Вадим).
1. В лиспе есть "." и ",", но нет возможности выбрать(собственно выбор не нужен, нужна точка), сумма вставляется с ",". Если просто удалить "," пишет в КС: ; ошибка: слишком мало аргументов. Как можно вставку суммы производить с разделителем "."? 2. А ещё выскакивает табличка Сообщение AutoCad Сумма=2,18 Укажите точку вставки Надо жать на ОК, потом указывать точку вставки, ненужные движения. Можно убрать эту таблицу, просто указывать точку вставки суммы в чертеж. 3. Добавить возможность выбора высоты текста, или лучше по умолчанию 250. Такая странность, если установить текущим стиль текста с заданной высотой 250, текст вставляет "0" да ещё с поворотом 3 градуса, при этом, в окне показывается правильная сумма... Корректно работает только с высотой текста 2.5. Подскажите, пожалуйста, в чём затык. Код:
|
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
Цитата:
Цитата:
Код:
|
|||
![]() |
|
||||
Регистрация: 04.12.2022
Сообщений: 33
|
skkkk, спасибо большое, буду пробовать...
Всё работает, как хотелось! Только сумму меньше нуля выводит в виде .27 (а не 0.27) Это можно изменить? Вот подкорректированный код Код:
Последний раз редактировалось Konstr_pgs, 31.01.2023 в 12:14. Причина: исправлен код |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Сомневаюсь. Значение 3 как толковать? А 12? Как 12 или как 4+8? )))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Если верить справке (в которой - надо отметить - нет упоминания о "битовости" этой переменной), то:
4 Подавляет ведущие нули в десятичных размерах (например, 0,5000 записывается как ,5000) 8 Подавляет замыкающие нули в десятичных размерах (например, 12,5000 записывается как 12,5) 12 Подавляет и ведущие, и замыкающие нули (например, 0,5000 записывается как ,5) Тогда 12=8+4 Вот с "тройкой", действительно, кривовато как-то. Экспериментировать надо. Но для футов и дюймов не слишком оно актуально... Но - опять же: Команда: DIMZIN Новое значение DIMZIN <13>: 18 Требуется целое значение от 0 до 15. Что это, как не "битовость"?
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Уговорил, чертяка языкатый
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
Коллеги! Возможно торможу, но как с помощью ssget выбрать определенные объекты (например TEXT,MTEXT), которые находятся внутри заданной окружности.
Пока вижу только такой метод: (ssget "_W" '(x1 y1) '(x2 y2)) где x1 y1, x2 y2 - координаты рамки, описывающую окружность (т.е. надо вычислить две точки рамки-квадрата, с учетом координаты центра круга и радиуса) Или можно проще? Последний раз редактировалось Sege, 06.02.2023 в 09:55. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
все варианты ssget от Lee Mac. Есть еще ключ _WP - для непрямоугольных окон выбора.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Чисто теоретически можно высчитать несколько десятков точек (так сказать, аппроксимировать окружность полигоном) и выбирать уже не через _W, а через _CP (кажется, так)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
_CP - это захватывает объекты, находящиеся внутри полигона полностью и частично (т.е. пересекающие его).
_WP - только те объекты, которые полностью внутри полигона. экспериментируйте - что даст приемлемую погрешность выбора. Последний раз редактировалось Сергей812, 06.02.2023 в 10:52. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
Цитата:
но все-же проще оказалось просто получить координаты 2-х точек диагоналей "квадрата описывающий круг" и использовать "_W" |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
--- Правда, надо помнить, что при таких методах выбора надо, чтобы вся область была на экране.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Не уверен, если честно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 04.12.2022
Сообщений: 33
|
Как тексту поменять выравнивание, подскажите пожалуйста. Есть часть кода:
Код:
Здесь нет ml (Middleleft)? Или нужен какой-то цифровой код? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
dcl как dcl. В чем трудность пока не понимаю.
https://www.google.com/search?q=autolisp+dcl+alignment https://www.cadtutor.net/forum/topic...gnment-column/ https://www.afralisp.net/archive/lispa/lisp49a.htm Ну и так далее.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
alignment где ж еще. По ссылкам проходил? Смотрел что там предлагается?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
https://www.cadtutor.net/forum/topic...alignment-dcl/ ?
Offtop: Я сейчас не занимаюсь dcl, и прилично все позабыл.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 14.02.2023
Сообщений: 3
|
Здравствуйте.
Не могу разобраться, почему при сохранении чертежа например в C:\Folder\Чертеж.dwg и выполнении команды "vl-directory-files" я вижу список файлов и папок в Моих документах, но если я повторно открываю этот чертеж, команда выдает список файлов и папок в C:\Folder\ как мне было нужно. тоже самое с "findfile" И еще вопрос. Как правильно объяснить автолиспу, что последующий код нужно выполнять только после того, как отработал скрипт на питоне "(command "_.shell" "python convert.py")". Я Сделал это через создание вспомогательного файла в директории с проектом, но что то мне подсказывает это не самый лучший вариант) |
|||
![]() |
|
||||
Регистрация: 15.02.2023
Сообщений: 2
|
Добрый день, пробую изучать лисп. Хочу создать программу которая будет копировать объекты в буфер обмена с базовой точкой 0 0 0. Как не тыкаюсь-получаю ошибки(как минимум в 6 строке, дальше отладку не делал), в общем доступе найти решение не получилось, прошу помочь.
Код:
Последний раз редактировалось bloodassasinv, 15.02.2023 в 09:38. Причина: добавил код в текстовом виде |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Попробуй заменить command на command-s или vl-cmdf
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 14.02.2023
Сообщений: 3
|
Лисп будет работать с файлами из разных директорий, предусмотреть абсолютный путь невозможно.
Помогла бы функция для определения директории в который сохранен чертеж, но я такую не нашел. ----- добавлено через ~13 мин. ----- Все 3 варианта рабочие (command, command-s, vl-cmdf), но только если чертеж был запущен в нужной директории, а вот если он первый раз сохранен, то рабочая папка не определяется. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
(getvar "dwgprefix")
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
Как указать команде "_.offset" чтобы она сделала подобие замкнутого контура во внутрь (т.е. без указания это мышкой) ?
т.е. если pnt - это точка ВНУТРИ замкнутого контура, то offset это выполняет: (command "_.offset" 10 (car (entsel)) "_NONE" pnt "") Осталось понять каким образом найти координаты точки, которая находится внутри любого замкнутого контура.... upd: задача решена с помощью готового лиспа Код:
Последний раз редактировалось Sege, 22.02.2023 в 16:25. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
vl-cmdf в последних версиях всегда возвращает t, независимо ни от чего. Так что теперь придется делать нечто типа
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Свой вариант кода покажи. И "C:" должна остаться на английском, если что.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я проверил - все срабатывает нормально. Может, кодировка lsp-файла не ANSI?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Цитата:
Создал файл txt, в нем по умолчанию кодировка ANSI, скопировал прям из своего сообщения код, сохранил, расширение поменял на lsp, подгрузил в автокад и все равно не работает. Покрутил-повертел кодировку, реально в ней видимо была проблема. Спасибо. Последний раз редактировалось posetitel, 22.03.2023 в 10:12. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Короче, файл приложи
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 21.11.2014
Москва
Сообщений: 60
|
Пожалуйста, проконсультируйте меня. Встретил следущее выражение
![]() Я так понимаю, что это определение функции asd. defun - это оператор определения функции, а asd - сама функция, lays_1 lays_2 att k - это переменные. А вот для чего в конце стоит косая черта, что она означает, для чего служит и когда применяется? И почему именно в конце поставлена? Или это ошибка и косая черта должна стоять в начале, перед переменными? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
После обычно указываются имена локальных функций и переменных
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.08.2022
Сообщений: 71
|
Вопрос про наборы в лиспе:
Есть строчка в одном лиспе: (setq s11 (ssname s1 i)) Я так пологаю что она отвечает за извлечение примитивов из набора s1 по порядковому номеру. А как сделать так чтобы эти примитивы извлекались из набора не по порядковому номеру их создания, а в порядке расположения их в координатном пространстве. (то есть например по столбцам, сначала по оси "Y" по убыванию, далее если имеются еще столбцы с этими примитивами, то извлечение передвигается по оси "Х" по возрастанию и примитивы опять извлекаются по оси "Y" по убыванию и так далее, пока примитивы из набора не закончатся). Подскажите пожалуйста, как это осуществить? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Так а какая разниц? Сначала получи, потом сортируй как тебе надо.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Уважаемый, koMon, могли бы немного дополнить лисп, чтобы предварительно нужно было выбрать ячейку в таблице чертежа, текст из этой ячейки помещался в буфер и уже потом создавался слой с именем из буфера и вводилась команда для начертания полилинии.
Ну либо минуя промежуточный этап - буфер обмена: ввод команды лиспа, запрос от лиспа на выбор ячейки таблицы, далее создание слоя с именем соответствующем тексту из этой ячейки и команда черчения полилинии в созданном слое. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
posetitel, тут как бы обучение, а не просьбы модифицировать коды.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
posetitel, для получения текста из ячейки используй nentsel.
А для создания слоя уже на форуме было - https://forum.dwg.ru/showthread.php?t=80531 |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Привет всем!
Есть задача - сформировать новый список на основе другого списка, в соответствии с заданным целым числом. Число - количество элементов исходного списка, идущих от его начала. Таким образом, если мы передадим в функцию, в качестве аргументов, число 3 и список '(1 2 3 4 5 6), функция должна будет вернуть нам '(1 2 3). В свое время, написал для решения этой задачи итеративную функцию: Код:
Код:
|
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
koMon, круто, спасибо. Теперь все встало на свои места.
Сразу не допер, что (cons (car нужно применять не к списку, а к рекурсии возвращающей список. С твоего позволения, немного модифицировал твой код, убрав из него ненужные setq, так как аргументы входящие в функцию рекурсивно, сами меняют свое значение при каждом новом вызове функции (разумеется, если изменение значения аргумента прописано в теле функции). Итого, получилось: Код:
|
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Маленькое примечание.
Рекурсию при обработке списков нужно использовать очень осторожно - можно натолкнуться на "переполнение стека". Если список очень большой. Такие ошибки очень трудно потом отлавливать. Я, например, в принципе отказался от неё при обработке списков непредсказуемой длины. foreach - "наше всё" :-)
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
===AAA===
Безусловно, такая проблема существует. Но на практике, со stack overflow пока не сталкивался, возможно по причине того, что рекурсивные функции использую не так часто. При этом, неоднократно сталкивался с мнением, что LISP, это как раз тот язык, из всех прочих языков, где рекурсивные алгоритмы перебора списков (коллекций, последовательностей) смотрятся органичнее всего. Да и foreach, далеко не панацея. Так же, как панацеей могут не оказаться mapcar, или все семейство vl- функций относящихся к обработке списков. То есть, решить задачу с помощью foreach, наверное, можно любую, но иногда куда как проще (а также понятней, и логичней), к примеру, взять и использовать цикл while, пролистывая в его теле список при помощи cdr, и одновременно совершая кучу других действий. Ну, или воспользоваться рекурсивным алгоритмом. |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Дык одно дело сам LISP, другое - его реализация на конкретной программно-аппаратной платформе.
Я однажды столкнулся. Правда - давно. И памяти в компах с тех пор изрядно добавилось и версия Автокада поменялась. Однако с тех пор - ну её нафиг, эту рекурсию... Как элемент непредсказуемости.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
конструктор Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,108
|
|
|||
![]() |
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Здравствуйте. Тема изъезженная, понимаю. Необходимо создать LISP для импорта координат точек в AutoCAD и последующего построения точек по ним (с точками совсем не скоро). Исходник координат в Excel, перевожу в txt с разделением табуляцией.
Пока дошел вот до этого с выводом координат в командную строку (для наглядности, чтобы я понимал что КАД вообще этот файл видит и читает): Код:
"1254.65\t654.26\t6589.21" "206646.26\t5486.15\t164.25" "15.2664\t201.16\t023.254" "154.10\t2168.489\t456.15" "18.20\t45632.15\t2031.22" "1648.25\t20.15\t254.16" Условных 6 точек просто пока для эксперимента. Теперь цель заставить автокад понять что от нуля до первой табуляции это Х, от первой табуляции это Y, и последнее соотвественно Z. Вроде как должно решаться strlen и ascii, но в справочниках пишут "функция возвращает длину строковой константы...", если кто может разжевать как это понять и что есть константа в моем примере? Предупреждая вопросы - осваиваю это дело по учебе, интересно, но нифига не понятно, поэтому использовать чужой "импорт XYZ" не могу. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Все что сейчас напишу - сугубо личное мнение.
Первое и самое главное - имена. Имена функций, переменных и т.д. Когда код даже на 10 строк, понять, что в переменной q хранится, может быть затруднительно. Далее. LISP - язык списков, и этим желательно пользоваться. Соответственно чтение файла можно сделать так: Код:
Код:
Код:
Код:
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 18.05.2023 в 15:34. |
|||
![]() |
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Цитата:
![]() Выдает ошибку - слишком много аргументов. Остальные лиспы отключил, проблема не ушла. ----- добавлено через ~24 мин. ----- Цитата:
Код:
В командную строку выводит как вы и написали 3 значения в скобках, тут ок. Оно благодаря этому кусочку кода теперь понимает, что x=1254.65 y=654.26 z=6589.21? Подозреваю что нет. |
|||
![]() |
|
||||
Цитата:
----- добавлено через ~15 мин. ----- Код:
координата X 1-й точки (car (nth 0 point_list)) координата Y 1-й точки (cadr (nth 0 point_list)) координата Z 1-й точки (caddr (nth 0 point_list)) и т.д.
__________________
K Lisp Последний раз редактировалось koMon, 18.05.2023 в 14:58. |
||||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Цитата:
Список - это основная структура данных в LISP, и если вы планируете начать изучать программирование вам потребуется понять как устроен список, как он формируется и как его обрабатывать. Чтобы передать программе сведения о том, что в списке у вас какие-то данные нужно обратиться к элементам списка. Это осуществляется через определенные функции, например: car, cadr, nth, last. Но в данном случае, у вас список координат, а это значит, что вы вообще можете не указывать какая цифра является той или иной координатой. Вы просто передаете этот список соответствующей функции, которая без ваших дополнительных подсказок понимает что первый элемент списка это x, второй y, а третий z. Например, функция создания точки: Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Исправил опечатки. Offtop: Странно как-то код из VSCode копируется - то так, то этак.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Да в принципе точно так же - только разделителем для str-str-lst будет не "\t", а ";"
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Это применил. Вопрос в другом - как можно составить список, в котором будут данные такого типа: ("1" 4255443.36 12245413.22 623.56 "ладно") ? Т.е. читается строка из файла (четыре элемента) и записывается в список (символ число число символ). Сейчас у меня получается ("1" "4255443.36" "12245413.22" "623.56" "ладно") - все символьные значения. В принципе, потом после извлечения, можно применить atof для второго и третьего элементов.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
(setq str ' ("1" "4255443.36" "12245413.22" "623.56" "ладно"))
(setq res (list (car str) (atof (cadr str)) (atof (caddr str)) (atof (cadddr str)) (last str))) Примерно так, пишу на коленке
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Цитата:
steq point (read-line f1) - создаем переменную point, в которую cчитывает все что есть в переменной f1 (то есть в файле). Почему он считывает все строки, а не только первую? Код:
list - создаем список из данных переменной point strcat (сцепляет данные в 1 строку? так бы они были в виде списка), а read - считывает данные из этой строки? Если просто использовать (list point) - cписок не создаст? Код:
entmakex - создание примитива, понятно. list - не понимаю зачем тут? У нас уже есть один список, созданный ранее. Они как между собой? Конфликтуют, объединяются? cons 0 "POINT" - выбор типа примитива, мы указываем point-точка. cons 10 '(x1 y1 z1) - указываем координаты начальной точки. Почему-то не работает? Зачем перед скобками ' - апостроф? На команды (print y1) (print y2) не обращайте внимания, это я для себя визуализировал правильно ли я понял логику списка, гду nth0, где nth1, где car, cadr |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Andrey55,
Продолжим обучение ![]() Цитата:
Обрати внимание, что полностью данное выражение в коде указано так: (while (setq point (read-line f1)) while - это цикл, (setq point (read-line f1)) это условие при прохождении которого цикл будет выполняться. Фактически, (read-line f1) может вернуть либо значение строки, либо значение nil (логический ноль, false), в том случае, если будет попытка прочесть значение в файле идущее после последней строки. И в тот момент когда переменной point будет присвоено значение nil произойдет выход из цикла, потому что цикл while работает ровно до того момента, пока условие выполения цикла будет true. Соответственно, по-простому, выражение (while (setq point (read-line f1)) можно сформулировать так: "до тех пор, пока в файле читается строка цикл продолжится, но если строку прочитать не удалось цикл прекратится. То есть, первый вызов (read-line f1) в цикле считает первую строку, второй вторую строку и т.д. И в тот момент когда очередной вызов (read-line f1) дойдет до конца файла и попытается прочитать строку еще раз, а читать будет нечего так так последняя строка уже прочитана, то переменной point будет присвоено значение nil и будет осуществлен выход из цикла. Теперь рассмотрим что еще происходит в цикле. Каждый раз когда будет прочитана очередная строка, будет также выполнено следующее действие: (setq point_list (append point_list (list (read (strcat "(" point ")"))))) Так как выражения в LISP выполняются справа на лево, рассмотрим их в этом порядке: 1. (read (strcat "(" point ")")) Объединение полученной строки с символами открывающей и закрывающей скобки, после чего следует буквальное прочтение строки функцией read, в результате чего строка трансформируется в список. Для новичка звучит, наверное, немного запутано, но это один из своеобразных трюков LISP. Пользуясь терминологией языков со статической типизацией, условно можно сказать, что данная операция - это неявное приведение типа. Отмечу также, что выражение (read (strcat "(" point ")")) можно использовать ТОЛЬКО если в качестве разделителя между значением координат в текстовом файле используются пробелы, но если разделитель будет любым другим, например запятой, такой код не будет работать. В этом случае нужно будет преобразовать строку в список в соответствии с указанным разделителем. Для этого, ты можешь воспользоваться соответствующей функцией из кода Кулик Алексей aka kpblc, либо аналогичной функцией от Lee Mac'a. 2. (list (read (strcat "(" point ")"))) Полученный в первом выражении список мы помещаем внутрь еще одного списка. Предположим, в результате первого выражения мы получили список '(15.7 35.9 12.2), в таком случае выражение (list '(11.8 22.8 33.8)) вернет нам '((11.8 22.8 33.8)). Обрати внимание, количество скобочек удвоилось, сформировался, так называемый, список списков, то есть ранее полученный список был помещен внутрь нового списка. 3. (setq point_list (append point_list (list (read (strcat "(" point ")"))))) Так как значение переменной до ее инициализации всегда nil (логический ноль, false), то в данном случае при чтении первой строки мы, фактически, получим выражение (append nil '((11.8 22.8 33.8))), в результате чего переменной point_list будет присвоен все тот же список '((11.8 22.8 33.8)) (значения координат могут быть любые, я привожу эти цифры лишь в качестве примера). Самое интересное будет происходить при чтении второй и последующей строк: так как значение переменной point_list теперь не nil, а список '((11.8 22.8 33.8)), а в результате чтения второй строки был получен еще один список, предположим, такой '((55.8 66.8 77.8)), тогда после выполнения выражения (append '((11.8 22.8 33.8)) '((55.8 66.8 77.8))) переменной point_list будет присвоен список '((11.8 22.8 33.8) (55.8 66.8 77.8)). Соответственно, при каждой новой прочтенной в файле строке, внутрь некого общего списка будет добавляться список координат полученный из прочтенной строки. Таким образом, если строк в файле всего три, в итоге будет получено примерно следующее '((11.8 22.8 33.8) (55.8 66.8 77.8) (13.8 14.8 15.8)). То есть количество вложенных списков будет равно количеству строк. А теперь о том, как нам добавить в чертеж точки, в соответствии с полученными ранее координатами из файла. И тут могут быть два варианта действий. Вариант 1. Предположим, ты пишешь сложную программу с дополнительным интерфейсом, где ты можешь выбрать опцию изменения порядка координат, или изменения количества знаков после запятой, или любую другую опцию, посредством которой, ранее полученный список должен быть подвержен некой трансформации. Тогда рациональным вариантом будет последующая работа с ранее полученным списком списков. Этот вариант, для новичка, имхо, будет немного сложнее второго варианта, поэтому, пока я его не рассматриваю. Вариант 2. Добавление точек в чертеж по мере того как будут читаться строки в нашем файле. В этом случае список списков можно не формировать, а сразу же добавлять значение получаемых координат к формируемым на чертеже точкам. Код:
На счет апострофа - это тема более сложная, и пока, как новичку можно этот вопрос оставить. Вместо такого представления списка '(11.8 22.8 33.8), ты можешь использовать (list 11.8 22.8 33.8). Результат выражения будет аналогичным. Апостроф, если вкратце, позволяет прочитать выражение буквально, без применения функции, что в теории может улучшить производительность, так как мы не затрачиваем ресурсы на вычисление функции (что, впрочем, не относится к лямбде, а только к списку), но апостроф не может быть применим к переменным внутри списка, а только к непосредственным значениям. В общем, пока оставь эту тему и используй функцию list. Последний раз редактировалось Browning Zed, 21.05.2023 в 16:16. |
|||
![]() |
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Цитата:
![]() Логику работы while и read понял, c nil тоже все ясно. Цитата:
Если рассмотреть этот кусок (опять добавил свои корявки): Код:
Все таки при команде read формируется список вида (11.8 22.8 33.8 55.8 66.8 77.8 13.8 14.8 15.8)? Или командой read он просто считывает, а дальше мы со считанной информацией работаем - либо присваиваем переменную считанной информации, либо формируем список командой list? Код:
Код не работает, пишет "слишком много аргументов". Думал дело в том, что в txt стоит табуляция вместо пробела, но замена ничего не решила. |
|||
![]() |
|
||||
это относится к синтаксису языка, и никак не к разделению данных пробелом или табуляцией, которая формально является также пробелом, который в свою очередь является натуральным разделителем синтаксических лексем в лиспе.
если нужно нарисовать точки по координатам из примерного файла, то это можно сделать так, без излишней печати промежуточных данных в консоль. Код:
но всё же правильнее сначала прочитать данные, закрыть файл, а потом выводить данные, например в точки. Код:
__________________
K Lisp Последний раз редактировалось koMon, 22.05.2023 в 17:25. |
||||
![]() |
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Код:
И поправьте если не прав, командой list мы далее создаем список графических примитивов - точек? Я думал list создает только списки чисел, которые висят в памяти. Далее, как я понимаю foreach. Мы создаем точки entmake для каждой записи, которая встретится в списках point и point_list? Но при этом ранее мы координаты точек cons 10 point брали из списка point? И вот тут вопрос, почему мы берем оба списка point и point_list? Ведь у нас должно случиться задвоение/наложение точек при выводе графики? Список point у нас вида (11.23 45.78 2388.34 3737.122 22.34 11.33), а список point_list ((11.23 45.78 2388.34) (3737.122 22.34 11.33)) С функцией foreach попробовал разобраться еще Код:
POINT POINT_LIST А вторая строка возвращает, как и положено список координат ((1254.65 654.26 6589.21) (206646.0 5486.15 164.25).... Ведь они тождествены по сути? |
|||
![]() |
|
||||
функция cons добавляет элемент в начало списка point.
потому что это точечная пара, из которых строится ассоциативный список групповых списков (точечных пар) для создания, в данном случае, примитива точка. потому что точечная пара (0 . "point") это константа, которую проще процитировать арострОфом, нежели создавать из переменных/констант LISP акроним для LIST Processing и в нём всё списки, см. на скобочки) списки могут объёдинять всё что угодно. Цитата:
Цитата:
Цитата:
функция quote или сокращённый её вариант (') цитирует ровно то, к чему она применяется '(point point_list) вернёт список символов POINT и POINT_LIST, это видно по их верхнему регистру. можно проверить функцией type. функция print выводит в консоль содержимое списка point_list. ни разу. переменной n foreach присваивается каждый из двух символов списка сивмолов '(point point_list). (setq n_list '(point point_list))->(POINT POINT_LIST) см. выше.
__________________
K Lisp Последний раз редактировалось koMon, 23.05.2023 в 16:29. |
||||
![]() |
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Продолжаем движение. Решил маленько улучшить:
Код:
![]() Команду alert добавил, тоже работает. Сейчас буду пробовать прикрутить построение 3Dполилинии по этим точкам. |
|||
![]() |
|
||||
Flag 8 (bit 3) If this bit is set and bit 0 is not set, getfiled performs a library search for the file name entered. If it finds the file and its directory in the library search path, it strips the path and returns only the file name. (It does not strip the path name if it finds that a file of the same name is in a different directory.) If this bit is not set, getfiled returns the entire file name, including the path name. Set this bit if you use the dialog box to open an existing file whose name you want to save in the drawing (or other database).
открыть файл только по его имени конечно можно... (getfiled "Select file with coordinates" "d:/lisp/" "txt;doc;dwg;lsp" 2)
__________________
K Lisp |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Проверяй vla-get-visible, к примеру.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
(setq att (vl-remove-if (function (lambda(x) (equal (vla-get-visible x) :vlax-false))) att_list)
Примерно так
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
Цитата:
(#<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a188> #<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a2a8> #<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a3c8>) !att выводит такое же значение (#<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a188> #<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a2a8> #<VLA-OBJECT IAcadAttributeReference 0000014b6fa1a3c8>) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Блочок бы глянуть.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Кхм... В свойствах показывается далеко не один атрибут. Так что для начала надо понять, что значит "видимый".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
конструктор Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,108
|
Правда, нужен апостроф в автокаде, а в VeLisp и без апострофа работает.
|
|||
![]() |
|
||||
Регистрация: 30.06.2023
Сообщений: 2
|
Подскажите пожалуйста, как можно объединить два списка в один
есть список1 ("номер 1" "номер 2" "номер 3") есть список2 ("a" "b" "c") Как объединить эти два списка в один в следующей формате (("номер 1" "a") ("номер 2" "b") ("номер 3" "c")) Делаю так: (mapcar 'cons список1 список2) но на выходе получается (("номер 1" . "a") ("номер 2". "b") ("номер 3" . "c")) Последний раз редактировалось Alex_mur, 30.06.2023 в 11:06. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Товарищи, извините за детский вопрос, но как мне запустить нижние два лиспа?
Хэлп по запуску лиспов читал, но он не помог, т.к. в первом лиспе нет "defun", а во втором лиспе непонятно, как вводить исходные данные. первый лисп переименовывает слои, содержащие буквы ХХХ на буквы SSS Код:
Второй лисп делает тоже самое, только какие буквы менять и на какие менять нужно вводить, а вот как вводить: через слеш, через пробел или иначе, непонятно Код:
|
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Ок, с первым, видимо, не все просто.
Второй то можно же как-то запустить. У меня на чертеже есть слой "1_слой", я хочу переименовать 1_слой на 2_слой Я ввожу (rename-layers), в надежде на окно запроса аргумента, акад пишет "ошибка: слишком мало аргументов", пытаюсь ввести аргументы (rename-layers 1 2), пишет "неверный тип аргумента: stringp 1", пытаюсь переписать через скобки (rename-layers (1 2)), опять "ошибка: неверная функция: 1". Как задать аргументы у этой функции? Последний раз редактировалось posetitel, 07.07.2023 в 17:23. |
|||
![]() |
|
||||
Регистрация: 20.04.2011
Сообщений: 485
|
Вроде очень простая задача:
Нужно нарисовать полилинию из трех точек с последовательными привязками END, PER и опять END. Макрос на кнопку сочинил такой: ^C^C_polyline;end;\per;\end;\; Макрос работает, но надо сделать командой Не могу придумать как сделать на лиспе тож самое.. (command "_polyline" "_end") - закрывает чертеж ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Попробуй
(vl-cmdf "_.polyline" "_end" pause "_per" pause "_end" pause "") С какого перепугу у тебя чертеж закрывается - тайна лично для меня
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.04.2011
Сообщений: 485
|
Цитата:
Вот код полностью: Код:
.... Код не менял. Теперь вообще непонятно что происходит: Последний раз редактировалось gumel, 16.08.2023 в 10:05. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Да не должен чертеж-то закрываться, вот в чем прикол.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.04.2011
Сообщений: 485
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
ТЬфу, блин! Не _.polyline, а _.pline !!
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Да уже разобрались )))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Точка после 250 в данном случае не ошибка. LISP воспринимает 250. как число типа REAL (т.е. числа с десятичными разрядами), а 250 (без точки) - как целое число типа INTEGER
Цитата:
Возвращаясь к предыдущим твоим сообщениям: Вот именно в группе 62 для определения цвета должно быть число 74, а не 74. - номер цвета должен быть целочисленными (тип INTEGER), в противном случае LISP выдаст ошибку |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Необязательно существующего. Если слоя не будет, он создастся с настройками "по умолчанию".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Добрый день.
Как я мог бы получить из vla объекта мультивыноски данные о координатах указателья выноски(стрелка скажем), можете подсказать? А то дамп не дает этой информации Код:
Что я хочу сделать, найти самую ближайшую выноску из набора к текущей полилинии, вот прикинул вот такую функцию. Но протестировать возможности нет Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
(vlax-safearray->list (vlax-varant-value (vla-getleaderlinevertices multileader-object 0))) 0 - индекс выноски, с которой работаешь.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Цитата:
vlax-curve-getClosestPointTo vla-pl вторым аргументом принимает как раз точку. Спасибо ----- добавлено через ~52 мин. ----- В продолжении https://forum.dwg.ru/showpost.php?p=...postcount=4454 При отладке кода, у меня ругается лисп при вызове vlax-curve-getClosestPointTo, ошибка - unable to get ObjectID: nil, я так понимаю, что моя координата coordinate-mlead не является WSC, как я мог бы преобразоватьее в WSC? Гугл оперативно не дал ответ, а старая тема с CADUSER ничего не дала, кроме нерабочих ссылок. Поиск по dwg.ru безрезультатно Поиск по доку лиспа не помогло тоже, ничего не нашел по WSC, OSC Код:
Последний раз редактировалось gnuvse, 26.10.2023 в 14:36. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Не понимаю, как я мог бы отследить положение выноски на полилинии, чтобы оно было правильным, можете подсказать?
Пытался сравнивать координаты точек Пытался сранивать длины от начала линии до точки выноски Безуспешно на входе vla полилинии и набор выносок Код:
Последний раз редактировалось gnuvse, 26.10.2023 в 15:46. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
У мультивыносок гарантированно по одному "хвосту" или могут быть варианты?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Сам отфильтруешь лишнее:
Код:
"obj" - указатель на мультивыноску "pt" - начальная точка первого хвоста "closest" - ближайшая точка на полилинии "dist" - расстояние до полилинии
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Цитата:
UPD. Только я немного не понял, я получил массив структур данных, где выноски отсартированы по дистанции. А мне нужно было на выходе функции получить нужную выноску к передаваемой vla-pl и все PS> Код крутой у тебя Последний раз редактировалось gnuvse, 26.10.2023 в 18:09. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Так забирай car от результата и делай с ним чего хотишь, делов-то ) Это будет выноска, расстояние от полилинии до хвоста которой минимально. Берешь (cdr (assoc "obj" value)) - вот тебе указатель на выноску. Ну и теде.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Цитата:
Я понимаю, что для быстрого процессора это фигня, но все равно, хачем лишние телодвижения Я наковырял вот такой цикл, оно вроде даже работает, но честно признаться я немного не понимаю как оно работает. Ты мог бы немного пояснить? Самые близкие элементы по итогу имеют дистанцию 0, но мне немного непонятно, почему "(setq coordinate-mlead (cdr (nth key-coordinate-mlead (entget ent-mlead))))", вот это дает одинаковую координату с мультивыноской Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну, откуда и с какого перепугу ты берешь key-coordinate-mlead, я без понятия. И там в ename-представлении, ЕМНИП, не все настолько просто и однозначно, обычный (cdr (assoc ...)) может дать неправильные результаты. Кажется, там надо нечто типа
(cdr(assoc 10 (member '(0 . "{MLEADER_LINE") (entget (vlax-vla-object->ename vla-mleader-object))))) или что-то наподобие. Скажу честно, сейчас совсем в другой задаче, и ковыряться не могу. Касаемо что будет, если выноска попадает на пересечение двух и более полилиний? А сделать обработку сразу на список полилиний и список выносок не сложно, достаточо просто будет проходить (к примеру) по всем полилиниям, подставляя для сравнения постоянно уменьшающийся список выносок. Вариантов, конечно, масса, и мой гарантированно не является самым идеальным ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Цитата:
Да, твое решение универсальное, но мне как нубу, для практкии слишком сложновато все это разом охватить. Если будет время, просмотри пожалуйста, буду признателен |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Цитата:
Спасибо, а зачем мне начальные точки всех хвостов? =) Да, если честно я код понял, прогнал его, потестировал. Круто ты оперируешь функциональным программироанием, но при этом массивы во все поля, как-то необычно. Кажется что ты еще тот любитель common lisp'a =) но я продублирую, может поправишь: Код:
Тут загвоздка в том, что мне непонятно, почему мой код работает, и почему ближайшая выноска дает 0.0 дистанцию, а не 0.1 или 2.0, как буд-то какая-то фунция вычисляет от моей выноски до места касания с полилинией |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Пфффф... Попробую по шагам
Код:
Offtop: ПыСы До пн я вряд ли буду в адеквате, других задач накидали мама не балуй.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Дык ета... (vlax-dump-object objec t)
Прикол именно в последнем параметре - он показывает еще и методы, доступные для объекта. Ну или VBA-справку надо раскуривать.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
А что за последний параметр, у меня на выноску вот такое показывает, ничего похожего на координаты или название leader line vertices
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ты эту строку в консоли VLIDE выполни )))
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну на крайняк действительно поставь VBA-енаблер и справку под него )) Тож пользительная штука.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
|
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Цитата:
Но классно, я теперь буду в разных местах просматривать, осталось программировать научиться |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Доброго дня.
У меня накопилось несколько вопросов и просьб, можете помочь? Буду признателен. 1. Есть ли встроенная функция по декодированию списка-списков в список? А то я сам накодировал вот такую программу, просто чертим pline по вставленным блокам. Сама функция list-of-lists-pt->list делает то, что я описал. А как ее переписать в стиле lisp? Код:
Какие я тут вижу проблемы: а. Это определение этого места, то есть на пути от одной точки до другой стоит некое препятствие, может можно какой-то тестовый луч перед построением отправлять? б. После локализации места нужно нам найти точку, и добавить ее для построения линии, то есть это должно осуществляться до вызова list-pt->safearray, чтобы потом передать правильную длину для vla-make-safearray По-возможности, попробуйте мне описать словами, чтобы код я сам попробовал написать. 3. Порекомендуйте ссылки по изучению исходных кодов с форума, если возможно то не убер коды, а что-нибудь для новичка, чтобы развиваться. Наверняка вы уже на опыте можете отличить хороший и полезный код от посредственного, как мой например ![]() Последний раз редактировалось gnuvse, 01.11.2023 в 16:23. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
добавляем полилинию по точкам вставки выбранных блоков?
----- добавлено через ~2 мин. ----- (apply 'append '((1 2 3) (4 5 6) (7 8 9)))-> '(1 2 3 4 5 6 7 8 9)
__________________
K Lisp |
||||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Какой же это изящный чит с append. Переписал свою функцию для получения cписка точек из vla-list-bl в духе Lisp Код:
Лех, спасибо. Если у тебя будет чуть больше времени и вдруг станет жалко нуба в виде меня, пожалуйста ответь на другие вопросы. ----- добавлено через ~2 мин. ----- Цитата:
Спасибо за append, мне Леха подсказал уже, классная штука |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
Чего еще хотелось бы добавить. Точки вставки у тебя будут трехмерные, а координаты в полилинию надо передавать двумерные. Вариантов немного - либо каждую координату принудительно приводить к двумерному виду, либо создавать полилинию через entmake / entmakex. Второй вариант будет работать только в текущем документе, учти.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Цитата:
Сейчас только осознал, что если эксплуатировать мою программу, то проще будет просто ставить лишний мнимый блок на угол или подкорректировать линию. Потому что как это все будет работать с xref непонятно, он же не примитив. А можешь подсказать какие из твоих исходников я мог бы начать изучать? |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Не-а... У меня нормальных исходников-то практически нет. Могу посоветовать "САПР на базе" (в глубинах форума где-то скан есть). Можно сказать библия разработчика под кад ))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.04.2017
Сообщений: 136
|
Цитата:
----- добавлено через 46 сек. ----- А, тут дело в том, чтобы смотреть в комплексе и на код и Doc, потому что читать тоже полезно. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Товарищи, подскажите, возможно ли в принципе на лисп реализовать вот такую хотелку.
1) Есть в чертеже несколько поллиний, каждая полилиния в своем слое (например слой1, слой2, слой3). Я хочу секущей рамкой выбрать определенные полилинии, например, выбрал полилинию, находящуюся в слой1, и полилинию, находящуюся в слой3, и запомнить выбор в какую-нибудь переменную (тут вроде все выполнимо). 2) Далее необходимо во вторую переменную из заранее заготовленного экселя подгрузить таблицу соответствия величины диаметра названию всех слоев с полилиниями на чертеже. Ну т.е. в экселе в первом столбце названия слоев, а во втором столбце величина диаметра, получается слой1=10, слой2=20, слой3=30. 3) Далее внутри лиспа выполнить функцию, аналогичную функции экселя ВПР, т.е. соотнести слои из переменной 1 и слои в переменной 2, и в случае совпадения имен создать переменную 3, в которой будут уже не названия слоев, а числа соответствующие диаметрам каждого слоя (в примере получается 2 числа: 10 и 30). 4) Ну и самое простое - начертить кружочки с диаметрами из переменной 3. Теоретически, наверное, это реализуемо, если сначала выгрузить переменную 1 из действия 1) в эксель, уже в экселе с функцией ВПР обработать результат, там же сформировать команду черчения окружностей и потом просто скопировать готовую команду черчения окружностей в командную строку, но хотелось миновать задействования экселя в процессе работы лиспа. Смущают пункты 2 и 3, на VBA я сопоставление и выборку сделать смогу, а вот можно ли так на лиспе? Последний раз редактировалось posetitel, 03.12.2023 в 11:48. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
имхо, вместо экселя загружать из текстового файла в список точечные пары {имя слоя . диаметр}, и потом искать в этом списке по имени слоя. Т.е. в текстовом файле идет построчно имя слоя и на следующей строке сопоставленный слою диаметр. И тогда сформировать список примерно таким кодом:
Код:
Ну а получить потом из списка диаметр Код:
Последний раз редактировалось Сергей812, 03.12.2023 в 13:00. Причина: добавлен пример кода |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
В лиспе совсем-совсем новичок, сижу с рекомендуемой всем новичкам в этой теме талмудом на 1000 страниц и пытаюсь разобрать код, но все равно идет трудновато. Направьте в нужное русло, тем более тема соответствующая.
В общих чертах смысл первого кода ясен: пока в текстовом документе есть строчки, в переменную lLst слепляются точечные пары. Но хочу детально вникнуть, что делает каждая функция и тут затык получается. Непонятно выражение (while (and lKey lD). Ну т.е. я представляю, как оно обычно работает, но вот как конкретно в этом коде не догоняю. Переменные lKey lD, если их не объявить перед функцией while, сразу выдадут nil и цикл должен прерваться. В чем я заблуждаюсь в своих рассуждениях? Еще уточняющий вопрос: функция read-line автоматически перескакивает на следующую строчку? Т.е. выражения (setq lKey (read-line lF)) (setq lD (read-line lF)) сами читают строчки по очереди, не надо добавлять что-то вроде next read-line или read-line = read-line+1 ? Ну и самый важный вопрос от новичка: а как у вас получаются цветные слова? Как можно писать и обкатывать код на лиспе? А то я по старинке в блокноте пишу, потом пока загружу в автокад, пока напишу команду на выполнение... |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
да, т.е. она "проглатывает" символы конца текущей строки и указатель файла (это уже не к лиспу, а к самой операционной системе относится) стоит на начале следующей строки. А если файл закончился, то вернет nil. Ну для красоты перед вторым вызовом (setq lD (read-line lF)) можно было бы сперва проверить lKey <> nil - чтобы не пытаться читать завершенный файл еще раз.
если были успешно считаны обе связанные строки - в цикле пытаемся считать следующую пару значений. То же условие в строке 5 - если конец файла (или "накосячили" в файле и непарное количество значений), то просто не будет добавлено в список. Еще могут быть пустые строки в файле - тоже по хорошему их надо пропускать. ----- добавлено через ~2 мин. ----- ну вопрос валидации содержимого файла можно для упрощения проигнорировать - если это продукт для "личного" пользования. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Цитата:
(setq lKey (read-line lF)) (setq lD (read-line lF)) (while (and lKey lD) (if (and lKey lD) (setq lLst (append lLst (List (cons lKey lD))))) (setq lKey (read-line lF)) (setq lD (read-line lF)) ) чтобы перед циклом сначала были заданы переменные, которые уже считали по строчке из текстового файла. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
VLIDE либо VS Code с расширением AutoLISP (ИМХО)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
ну я в Notepad++ писал сейчас, там подсветка синтаксиса лиспа есть. А тестировать - autolisp внутренний язык приложения, поэтому без акада его (код) и не протестируешь в работе. Так что встроенный редактор акада и там сразу fixedsys (вроде) шрифт поставить - чтобы кириллица нормально отображалась.
|
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Товарищи, подскажите еще где смотреть описание команд, их параметры и очередность ввода, чтобы можно было написать в лиспе или в командной строке? В справочнике команд автокада приводится только общее описание, без описания, как пользоваться командой через командную строку.
Т.е., например, я взял из другого лиспа команду (command "_mleader" p1 p1 str) и пытаюсь разобраться как она работает. Интуитивно понятно, что p1 - это переменная координаты точки вставки стрелки, она в лиспе задается в другом месте, вторая p1 по идее должна быть переменная координаты вставки текста выноски, но они почему-то одинаковые, хотя по факту при выполнении лиспа все же в итоге запрашиваются на экране, ну а str - это содержание мультивыноски. Так вот если я попытаюсь ввести в команду в строчку вот так "_mleader 10.5 20.6 Текст", то автокад вообще выдаст ошибку, он не понимает мои координаты 10.5 и 20.6, а просит указать их на экране и вместо "текст" ждет ввода совсем других параметров команды mleader, таких как что указывать вначале положение стрелки выноски или положение текста выноски или вообще выбрать опции. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Самое простое - пытаться выполнять команды напрямую в ACAD. Помня о том, что точки, к примеру, задаются не
Код:
Код:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Цитата:
Ну и в общем случае, не для мультивыноски, а для построения других примитивов где посмотреть очередность и синтаксис параметров? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну, сначала-то было написаноа не
И я бы, если честно, не создавал бы командными методами мультивыноски, многострочные тексты, таблицы и до дури других типов примитивов, особенно если заранее известны все параметры. В Download есть книга В.Света "Язык макрокоманд", советую скачать и почитать - там про командные методы много всякого рассказано. В глубинах форума есть "САПР на базе AutoCAD - как это делается": мощнейший талмуд, больше 1000 страниц, практически библия для разработки под ACAD. Хорошо прочищает мозги, если ее осилить хотя бы наполовину ))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Обе книги нашел, монументальные, ничего не скажешь, надо прям вчитываться. Сходу пробежался, то что хотел не обнаружил.
Мне казалось должен быть простой список команд с синтаксисом написания, ну если возвращаться к мультивыноске, то что-то вроде: _mleader <arg1> <arg2> <arg3>, где <arg1> - координата первой точки, <arg2> - координата второй точки, <arg3> - содержание. Ну как обычно описывают функции, так и для команд должно быть что-то похожее. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Подобный подход работает далеко не для каждой команды, к сожалению.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
команды могут быть интерактивными, а функции - нет. В других языках функции могут быть переопределяемыми или с переменным числом аргументов, в лиспе с этим грустно все - насколько помню.
А чтобы был удобный вызов - пишутся на базе существующего языка программирования свои функции (классов в лиспе нет), и после отладки собираются в библиотеки для повторного использования. Собственно, книга <САПР на базе AutoCAD - как это делается> об этом всем и рассказывает. Другое дело, что писать сейчас САПР на лиспе - это очень на любителя, имхо) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
F1 ?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Подскажите простую вещь, самому допереть не получается.
Есть команда _SPDSNET_ExportACAD, которая должна взрывать все объекты spds extension (Autodesk SPDS) В составе лиспа, который в том числе должен вызывать и эту команду, у меня код выглядит так: (command "команда1") (command "_SPDSNET_ExportACAD" ) (command "команда2") и все бы ничего, но после вызова _SPDSNET_ExportACAD вылетает диалоговое окно с просьбой подтвердить действия (Все объекты безвозвратно расчленятся. Вы уверены? и кнопки ОК и Cancel). Как в тексте лиспа прописать автоматическое подтверждение? Последний раз редактировалось posetitel, 19.02.2024 в 10:17. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
да, я пытался через двойные кавычки, т.е. писал (command "_SPDSNET_ExportACAD" ""), но скорее всего после запуска команды и выскакивания меню лисп ставится на паузу и ждет действия от пользователя, т.е. даже двойные кавычки ждут, пока я не нажму кнопку в меню.
т.е не получается через двойные кавычки. Последний раз редактировалось posetitel, 19.02.2024 в 13:05. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Интересно, а эта команда имеет вариант недиалогового режима? Что будет, если перед именем команды поставить минус?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Значит влегкую не получится, диалог все равно будет вываливаться.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Хорошо, со всплывающим окном подтверждения придется мириться.
А можно ли как прописать условие проверки, выполнима ли команда _SPDSNET_ExportACAD? Т.е. чтобы если команда не найдена (модуль СПДС не установлен на машине), лисп продолжал выполнять следующие команды по списку, а не прерывался с ошибкой? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
vl-catch-all-apply - ИМХО самое простое
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
Параметр "_All", возможно, неверный. У меня взрывает только первый объект, а должен, вроде как, все ![]() Последний раз редактировалось Alxndr1697, 20.02.2024 в 12:25. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Угу, и разбить вообще все? Включая размеры, таблицы, что там еще попадется?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Да, хотел взрывать штатными средствами, раз есть такая опция, да и spds extension - очень специфические объекты, и лучше делать все так, как у них предусмотрел разработчик, иначе косяки вылезают в неожиданных местах.
Подскажите, как работает vl-catch-all-apply, какой у нее принцип? Ну т.е. эта функция похожа на оператор если: если ошибка делай то, если нет ошибки делай это? Т.е. после проверяемого условия мне нужно будет два раза написать продолжение кода, чтобы он выполнялся и при возникновении ошибки и без возникновения ошибки? |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Читай справку vl-catch-all-apply и vl-catch-all-error-p
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Это как?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Сносить SPDS Extension и дальше ExplodeAllProxy от А.Н.Ривилиса )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Учитывая, что SPDS Extension надо сносить средствами винды, насколько я помню?
----- добавлено через ~2 мин. ----- Ну а на старт каждого документа поставить нечто типа (if (= (getvar "demandload") 3) (alert "Сначала demandload в 2, а потом и поговорим") (progn (if explodeproxyinentity (vl-cmdf "_.explodeallproxy" "_.removeallproxy" "_n")) ----- добавлено через ~2 мин. ----- Код написан на коленке, и рабочим не является
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
То была шутка, конечно, не наудаляешься и не наставишься потом обратно этот модуль ради только взрывания его объектов.
Есть отдельная тема на форуме, как средствами лиспа взорвать, но в новой версии модуль опять перелопатили и тот лисп теперь не работает. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну, подобное я себе ставить как бы не собираюсь.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
подскажите еще по другой теме:
в коде присвоил переменной имя файла (setq с_dwg (strcat(getvar "DWGPREFIX")(getvar "DWGNAME"))) далее по этой переменной пытаюсь закрыть файл (vla-Close с_dwg :vlax-true) акад пишет ошибку: неверный тип аргумента: VLA-OBJECT "C:\\Users\\....имяфайла.dwg". в чем может быть дело? У Полещука функция vla-Close не описывается, хотя в примерах есть, например, на странице 402. добавлю, может это важно, что предварительно открываю другой документ т.е. код выглядит так: (setq с_dwg (strcat(getvar "DWGPREFIX")(getvar "DWGNAME"))) (vla-activate(vla-open (vla-get-documents (vlax-get-acad-object))(findfile o_dwg) :vlax-false)) (vla-Close с_dwg :vlax-true) вроде как пишут, что переменные при открытии другого чертежа обнуляются, но в коде ошибки верно указан файл и путь к нему, т.е. похоже неправильно что-то прописываю в функции закрытия Последний раз редактировалось posetitel, 21.02.2024 в 13:53. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Правильно. Потому что надо передавать указатель на документ, а не непонятную строку
----- добавлено через 59 сек. ----- Если что, лисп в каде работает только в текущем документе. И при смене документа можно словить самые разнообразные приколы, вплоть до остановки выполнения лиспа. ----- добавлено через ~2 мин. ----- ПыСы для работы с нетекущим документов настоятельно рекомендую использовать менее варварские способы. Например, ObjectDBX (ну или вообще поднимать отдельный экземпляр ACAD'а и работать с ним)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Напоминаю идею: получить переменные с именем открываемого (o_dwg) файла и закрываемого (с1_dwg), а потом открыть открываемый и закрыть закрываемый соответственно.
Код был примерно такой (setq с1_dwg (strcat(getvar "DWGNAME"))) (setq с2_dwg (vla-Item (vla-get-documents (vlax-get-acad-object)) с1_dwg)) (vla-activate(vla-open (vla-get-documents (vlax-get-acad-object))(findfile o_dwg) :vlax-false)) (vla-Close с2_dwg :vlax-true ) нужный файл открылся, но закрыть первый не смог, получил ошибку "Ошибка Automation. Чертеж занят." Скорее всего это из-за попытки закрыть документ из которого выполняется лисп, несмотря на то, что я уже открыл другой чертеж. Ну и вообще моя идея изначально плохая, как пишут выше. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я не очень понимаю глубинного смысла этой затеи, но как алгоритм:
- получить и запомнить "где-то снаружи" текущее значение SDI - Если SDI = 0, то пройтись по всей коллекции документов и позакрывать их - SDI в 0 - сохранить файл - в ком.строку послать нечто типа (vl-cmdf "_.close" "open" NewFileName.dwg) или каким-то другим способом попытаться открыть NewFileName.dwg - восстановить SDI из "где-то снаружи".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
конструктор Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,108
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
По-моему, что-то типа vla-vbaload
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Добродо времени суток, други. Ответите блудному автору на вопросик?
![]() Имею список наименований объектов. Там есть как блоки (в основном динамические) так и другие объекты (линии, размеры и т.п.) Что-то типа вот этого: Код:
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Можно, а в чем проблема?
(vl-remove-if-not '(lambda(x)(=(cdr(assoc 0 (entget x)))"INSERT")) <Твой список>)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110
|
Нужно проверить цвет ячейки таблицы (например что она красная)
(setq obj (vlax-ename->vla-object (car (entsel)))) (setq clr (vla-GetCellContentColor obj 1 1)) получаю значение ячейки 1,1 в виде #<VLA-OBJECT IAcadAcCmColor 000001da1a25e950> что дальше делать с полученным значением clr для его проверки (цвет равен красным) |
|||
![]() |
|
||||
Цитата:
![]()
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Sege, попробуй взять дамп clr.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Еще один вопрос. Имею блок (главнй блок) который в свою очередь состоит из блоков (второстипенные блоки).
Имея только Entity name одного из второстепенных блоков, возможно ли получить Entity name главного блока? Файл примера прикрепляю.
__________________
Блог |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Во-первых, ты получаешь указатель на вхождение блока или на его описание? Если на вхождение, то через OwnerId (или 330-ю группу) получить "владельца" можно. Если на описание - то никак: блок может быть вставлен куда угодно. Или вообще не вставлен.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Спасибо, получилось. Речь шла о вхождении блока.
__________________
Блог |
||||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Код:
Или тут - на VLisp или чистом лиспе https://lee-mac.com/effectivename.html Последний раз редактировалось name02, 15.05.2024 в 15:44. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Через ActiveX: vla-get-effectivename
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
просто получаете имена не самого исходного определения динблока, а промежуточных анонимных определений блоков - соответствующих заданному состоянию дин. параметров блока. А вот анонимные определения блоки будут ссылаться в качестве родительского элемента уже на искомый оригинальный динблок.
Последний раз редактировалось Сергей812, 15.05.2024 в 15:45. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Код:
|
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Ерунда эта появилась из-за авто переноса пользовательских настроек при установке AC2024. Я, в основном, работаю в AC2007. Пришлось возвращать настройки по умолчанию, а потом вручную настраивать автокад род себя и всё заработало нормально.
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Как организовать выбор объекта по условию? Есть простая функция entsel, но она выбирает любой тип объекта. А мне бы хотелось, чтобы выбирался только объект, удовлетворяющий некоторым условиям. Ну например, это должно быть вхождение блока с именем "абв". То есть если пользователь на запрос программы "Выберите объект" кликает на любой другой объект - ничего не должно происходить. И только если пользователь кликнул на вхождение блока с именем "абв" - продолжилось бы выполнение лисп-программы.
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
В функции ssget фильтрация есть. Получается такой функционал работает только для наборов, а для одиночного объекта нужно что-то изобретать?
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
в лиспе приходится постоянно что-то изобретать, как и в том же VBA - языки остановились в своем развитии *-цать лет назад.. Хотя для сравнения в том же .Net можно задать искомый тип примитива, но проверку на
надо будет делать отдельно в коде. Т.е. только частично код сокращается по сравнению с лиспом в данном случае. |
|||
![]() |
|
||||
Регистрация: 03.12.2009
Сообщений: 87
|
Кликнул по объекту entsel'ом, посмотрел что это через entget, если удовлетворило условие, продолжил выполнение кода, если нет, выполнил новый entsel (через while)
----- добавлено через ~1 мин. ----- Встроенной фильтрации в entsel'е нет |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Т.е. конструкция типа (ssget "_+.:S:L:E" '((0 . "INSERT")(2 . "АБВ")) не катит в принципе? )
Сейчас не у акада, проверить корректность синтаксиса не могу.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
делаете отдельный файл с функциями выбора примитивов и нужными фильтрациями. И эти функции возвращают значение или nil в случае отказа пользователя от выбора. Код будет гораздо читабельный основной.
Кстати, отказ пользователя от выбора в entsel вроде через генерацию ошибки идет - т.е. и это нужно тоже обработать. ----- добавлено через ~6 мин. ----- прикольно, только возвращает набор и не работает с динблоками, и отказ пользователя все равно обрабатывать надо |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ессно ) Вариантов решения чуть больше чем сопутствующих вопросов )))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
Код:
Как один из оооочень многих вариантов ----- добавлено через ~1 мин. ----- P.S. Код не проверял, некогда
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
У тебя выбор закольцован, у меня - нет
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Угу. Код писал на бегу так что сорян
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
![]() Код:
Вызывать так: Код:
Последний раз редактировалось skkkk, 12.06.2024 в 15:40. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
P.S.: При этом, после выполнения функции назначенная глобально одноимённая переменная так и осталась, какой была. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
А в лиспе, как понимаю, из-за динамической типизации уже изначально уже есть значение переменной - трактуемое как nil по умолчанию. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Сделал программку, которая подключает расширенные данные к объекту. Вроде бы код рабочий и она в 95% случаев работает так, как и ожидалось, но иногда расширенные данные по какой-то причине к объекту не подключаются. Не смог понять закономерность ошибки, чтобы понять что ее вызывает. Программка, конечно, получилась не самая простая, да и я не специалист по лиспу, так что есть вероятность, что просто я где-то начудил в коде, но возникает мысля, что с самими расширенными данными что-то не то. Подскажите, есть ли какая-то особенность расширенных данных, что они не всегда присоединяются к объекту? Или если такое происходит, то дело 100% в моем коде? Код не выкладываю, он довольно громоздкий, сложновато наверное будет в нем сходу понять в чем дело.
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
может пытаетесь совместить в XData идентификатор типа данных и сами данные другого типа вследствие пресловутой динамической типизации лиспа, например.
----- добавлено через ~8 мин. ----- а как обратиться к глобальной переменной, если в функции объявлена локальная с тем же именем? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
А разрешит лисп объявить в одной функции и аргумент, и локальную переменную с одинаковыми именами? Не говоря уже о том, как задавать значение глобальной переменной.
Просто как написали выше я понимаю так - что если объявлена локальная переменная в функции, по имени совпадающая с глобальной - то лисп вместо ошибки будет по тихому обращаться к локальной переменной вместо глобальной. И тогда это великолепный способ для программиста "выстрелить себе в ногу" - думая, что он (программист) работает с глобальной переменной, по факту на выходе из функции остаться со старым значением глобальной переменной. Последний раз редактировалось Сергей812, 13.06.2024 в 09:51. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Еще есть сомнение в том, что я регистрирую довольно много приложений для расширенных данных (regapp). Их всего порядка 30-ти разных. При этом часто происходит повторная регистрация одного и того же приложения, я перед этим не проверяю зарегистрировано ли оно уже до того. Как я понял в такой проверке нет особой нужды. Но может все таки это неправильно? Все же выложу функцию, где происходит добавление расширенных данных. Она на самом деле работает в связке с другими функциями, но может кто-то при беглом просмотре найдет здесь явный косяк из-за чего иногда расширенные данные не присоединяются к объекту. Вообще программа предназначена для добавления строк спецификации. Строка спецификации - это блок с атрибутами, которые я програмно заполняю на основе чтения данных из внешнего файла. А кроме атрибутов добавляю и расширенные данные, где содержится различная техническая информация, которая нужна мне для взаимодействия с внешним exe-приложением, с помощью которого я, собственно, и формирую строку спецификации. Код где-то может выглядить несуразным, но как я и говорил - не являюсь спецом по лиспу, где-то что-то в интернете нарыл из нужных мне функций и применил в своей программе как умел. Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я бы делал. А ограничение 16 кб это ж на все приложения, которые ты пытаешься на примитив засунуть. ЕМНИП, там еще и имена приложений участвуют в этом объеме.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
А для чего? Повторная регистрация ведь не дублирует приложение, там вроде просто возвращается nil и все.
У меня не больше 1 кб объем расширенных данных на объект получается. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
Цитата:
регистрация приложений идет в отдельном списке/словаре, а в XData записывается лишь какой-то идентификатор - соответствующий указанному строковому названию зарегистрированного приложения. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Когда вставил код функции сюда, то обратил, что среди локальных параметров подсветилась локальная переменная name, как будто это ключевое слово языка. В редакторе оно не подсвечивается. Имя name зарезервировано и его нельзя использовать для именования переменных?
|
|||
![]() |
|
||||
я же процитировал не расширенные данные.
__________________
K Lisp |
||||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Так надо модифицированный код предоставлять ИМХО
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
----- добавлено через ~24 мин. ----- а так пользуйтесь отладкой - пытаетесь в условии цикла запросить у логического значения T (в переменной blc) информацию через entget - тут даже лисп удивился) ----- добавлено через ~50 мин. ----- а происходит это по причине, написанной в справке Цитата:
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Вот так модифицировал, вроде работает. Я здесь перед циклом определяю переменную blc и удалил еще в условии цикла проверку blc на nil, а также присваивание blc=true, если ERRNO=52.
Код:
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
операция по умолчанию - если пользователь нажмет ввод в ответ на приглашение выбрать блок. А
Код:
----- добавлено через ~2 мин. ----- правда это не поможет, если пользователь нажмет Esc - для этого надо использовать функции лиспа vl-catch-all-*, как выше и показывали в примерах. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
В данном случае по нажатию ввода - ошибка. Но в любом случае <Отмена> - это же просто строка, а не какое-то ключевое слово, переменная или функция. Она же в сущности не работает. Или это просто такой стиль оформления запроса?
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
так трассировкой пройдите по коду и увидите - почему
естественно, предлагать пользователю выбрать ключевое слово для отмены выбора объекта - это уже издевательство над пользователем) |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
как в любом другом языке программирования - поставить точку (точки) остановки, загрузить активный лисп-документ или выделенный фрагмент из него в акад, а когда исполнение кода прервется на точке остановки - пошагово пройтись через F8 (все хоткеи прямо в меню редактора лиспа написаны) - контролируя значения переменных. Без умения трассировать код невозможно научиться писать нормальный код - даже если прочитаешь всю теорию об этом.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Это что-то из Civil, скорее всего. И вряд ли на это есть системная переменная.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Команда: (getvar "CGEOCS")
"UTM84-42N" Только чтение, а жаль. ![]() Можно поиграться. ![]() https://help.autodesk.com/view/ACD/2...6-DA4670D0F3FD Последний раз редактировалось 1958, 22.06.2024 в 08:07. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
В чистом ACAD - нет, насколько я знаю. Ты сначала в ACAD выстави demandload в 2, перегрузи - и смотри, отобразится или нет.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А, сорян. С этой ботвой толком не сталкивался
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Код изменяет регистр всех!!! Текстов на чертеже (без выбора) на верхний.
Как правильно добавить выбор текстов (по одному и рамкой), и чтобы объекты (не тексты), попавшие в рамку выбора игнорировались Я пытаюсь: Код:
Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Не страшно глобально обработчик ошибок переопределять? И системную переменную обратно не возвращать?
----- добавлено через ~2 мин. ----- Как вариант, без проверок: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну хотя бы тем, что в штатном обработчике ошибок может быть ооочень много всего намешано (особенно это касалось вертикалок).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
А если снести обработчик ошибок и добавить (SETVAR "CMDECHO" 1)? Код:
Последний раз редактировалось Ingpro, 05.07.2024 в 11:30. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А что ты будешь делать, если человек специально ставил cmdecho у себя в 0? Ну вот нравится ему такое, а ты тут со своим кодом - и выставляешь в 1. Хотя об этом тебя никто не просил.
Вывод: считывать значение системной переменной, устанавливать свое, и по окончании восстанавливать. В том числе и в случае ошибки.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Код:
Последний раз редактировалось Ingpro, 05.07.2024 в 14:10. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
А *error* куда пропала? В нём нужно прописать возврат переменной в случае выхода, к примеру, по Escape. Просто Алексей имел в виду, что её нужно объявить локальной, то есть прописать в первой строчке кода после слэша. Она будет тогда действовать только внутри функции команды c:ch-cs2, а не глобально.
|
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Код:
Код:
Последний раз редактировалось Ingpro, 05.07.2024 в 13:42. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Понятно, мой вариант кода никто не смотрел...
Опять же, пара вариантов как бы я их писал. Один через ename, второй через ActiveX. Без проверок Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Насколько я знаю, нет. Но после игрищ с этим зверем в вертикалках типа АА я зарекся вообще в его сторону смотреть. Уже проще через vl-catch-* работать, если припрет.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А поискать справку по strcase - нихьть?
https://www.progesoft.com/products/p...ctions/strcase https://www.lee-mac.com/textcasefunctions.html И тому подобное
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Ну в описании локальной функции *error* надо просто прописать строчку с возвращением запомненной в начале кода системной переменной. Эта функция запустится в случае ошибки и сделает всё, что в ней прописано.
Да, именно так. Удобное это семейство, но ведь тоже на каждое "узкое место" их ненапасёшься. Расскажи, пожалуйста, Алексей, как часто и в принципе - в каких местах рекомендуешь вставлять vl-catch-*? Интерактивный ввод? Вычисления, в которых изначально возможны ошибки? Так ведь можно прийти к тому, что чуть ли не каждую строку станет надо обернуть в это вээлкэтч) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну, лично у меня нет однозначных рекомендаций. В текущих реалиях обычно ставлю когда у пользователя что-то запрашиваю (эта ж зараза в любой момент может Esc нажать), ну и основную команду тоже оборачиваю. Так-то у vl-catch-* есть ограничение - не больше, кажется, 9 уровней вложенности. Так что приходится изгаляться
![]() P.S. Если с этими обертками переборщить, то скорость работы кода может кратно упасть.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Ну как это - "нет"?
![]() Цитата:
А вот почему-то до сих пор не догадался основную функцию в неё обернуть вместо *error*) Надо будет попробовать это сделать |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Подскажите, как программно настроить межстрочный интервал мультитекста в мультивыноске? В моем примере он установлен автоматически и равен 416,67 и выноска отображается криво (слева). Если его поменять хотя бы на 417 - выноска становится нормальная (справа)
----- добавлено через ~7 мин. ----- Цитата:
----- добавлено через ~17 мин. ----- Любое изменение межстрочного интервала в свойствах уже созданной выноски - приводит ее к нормальному виду. А вот программно почему-то отображается не так как надо. Если же выноска без ссылки на поле - программно отображается нормально. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Еще немного поковырялся. Выноска приходит в норму при изменении почти любых параметров мультитекста через панель свойств. А проблема кажется в том, что когда выноска формируется программно - я с помощью функции vla-GetBoundingBox определяю длину мультитекста для своих нужд. Но судя по всему в этот момент программа думает, что верхний текст - это "####" - поле до регенерации. И исходя из этого формирует мультивыноску. Но реальный текст "2" - поэтому выноска выглядит криво. Как с этой проблемой справиться? vla-regen перед vla-GetBoundingBox не помогает, это всего лишь позволяет при вставке выноски получить значение поля. Без vla-regen значение будет "####".
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Удалось сделать выноску нормального вида применив в конце лиспа функцию vla-put-TextJustify. Не проверял, но наверное многие функции изменения параметров мультитекста дали бы такой же результат, хотя вот изменение интервала между линиями (vla-put-TextLineSpacingDistance) не сработало.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А vla-update не сработает?
---- Offtop: Оставлю себе на память - сообщение №40 000...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Продолжаю ковыряться с выноской с полем. Образовалась новая проблема. Если поле изменено, то текст смещается относительно полки. Почти любое редактирование выноски через панель свойств приводит ее в норму. Это происходит из-за выравнивания текста выноски по центру. Если выравнивание стоит по умолчанию (влево), то выноска и при изменении поля сразу после регенерации выглядит нормально, то есть текст поля автоматом подстраивается под полку.
Возможное решение - отследить событие изменение содержимого поля и произвести формальное форматирование текста, чтобы он нормально соориентировался относительно полки. Можно ли повесить на мультивыноску с полем реактор, который будет отслеживать изменение содержимого поля? Я попробовал vlr-object-reactor с отслеживанием события :vlr-objectModified - оно не срабатывает при изменении содержимого поля после регенерации. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А если попробовать выполнить обновление поля? Принудительно, программно (ну, на крайний случай - командой)?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Восстановить как? Undo? Это не срабатывает.
Вообще нужен способ, который позволяет автоматически, условно скажем "обновить" выноску с полем, после того как выполнена регенерация. Как я вижу тут бы помог реактор, который бы выявил изменение содержимого выноски и в обработчике реактора я бы, например, включил Скрытие заднего плана и тут же выключил. Такие действия через панель свойств приводят выноску в норму. Вопрос в том, какой именно реактор здесь надо использовать? Кажется удобнее всего объектный реактор, но у меня не получилось через :vlr-objectModified. Этот реактор срабатывает, если двигать вершины выноски или вручную менять ее содержимое, но при обновлении поля через регенерацию - не срабатывает. Пробовал _updatefield - не помогает. |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Цитата:
Что-то давно у меня подобное было с "кривым отображением". Только таким способом и выкручивался. Может быть - и здесь поможет.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Сет, может, в этой теме найдётся решение?
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Прикрутил вот такой костыль к мультивыноскам. Создал командный реактор (cs_regen_reactor) и обработчик события :vlr-commandEnded (cs_regen). После выполнения регенерации выбираю все мультивыноски чертежа и центрирую содержимое мультитекста. Этот подход, конечно, некрасивый, но он работает - выноски с полями после регенерации выглядят нормально.
Код:
Но теперь в командной строке при выполнении других команд появляется мусор ![]() Цитата:
Последний раз редактировалось Сет, 26.07.2024 в 20:32. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
1. Тебе никто не помешает несколько раз зарегистрировать реактор - в текущих реалиях.
2. Кто мешает все же проверять - что болтается в наборе? 3. Не отслеживаешь заблокированные и замороженные слои. 4. ... Обрабатывать реактором вообще все - ИМХО ну так себе затея. Я бы подумал, что и как сделать, чтоб мультивыноска изначально строилась "нормально". Опять же дамп, проверки, изменения и теде. И, может быть, все сработает на реакторе окончания команды вставки мультивыноски. ЗЫ В реактор имя команды, насколько я помню, всегда приходит на английском языке. Могу ошибаться.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Да. Подправил код, добавил некоторые проверки, наверное еще не все. Код:
Пока да, надо подумать об этом тоже. Цитата:
Да, на английском. По крайней мере в моем случае. REGEN и REGENALL. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я бы заменил
Код:
Код:
Да че там думать - либо ssget "_.+:LX" (или как-то так), либо разблокировать слои и после обработки - восстанавливать все обратно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Что касается мультивыноски, то вышеописанная проблема со смещением содержимого поля относительно полки присутствует и для обычных автокадовских стандартных мультивыносок, если выставить выравнивание по центру. То есть врядли тут может быть проблема в моем коде, формирующем мультивыноску. Я его сюда не выкладываю, потому что он громоздкий, врядли кто-то будет в нем подробно разбираться.
|
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Сет, а что мешает сделать свой реген? Сейчас посмотрел свой код - в своё время так и сделал, оказывается, даже забыл уже об этом. Да, такая же проблема была со смещением, ещё года с 2008-го. При вызове сначала запускается цикл назначения всем мультивыноскам выравнивания: запоминается изначальное значение каждой мультивыноски, назначается другое, затем возвращается исходное, после этого все мультивыноски переносятся на передний план и, наконец, запускается штатная регенерация. И не нужно никаких реакторов.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
У меня и наоборот работает
Offtop: С учётом упорного нежелания Автодеска работать над устранением подобных багов от версии к версии, у меня подобных костылей уже с десяток, наверное, наберётся. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Так у меня же не просто выноска строится, там много всего наворочено, чтобы и поле из блока бралось, и некоторые элементы форматирования текста, и особенности задания выноски (используется dcl-окно), потому лисп громоздкий.
Это странно. Ведь текст в мультивыноске с полем сползает с полки как раз после регенерации. Потому что поля обновляются. В моем случае обработку мультивыносок нужно производить после регенерации. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Вообще, логично. У меня, помнится, не из-за полей съезжали выноски. А так, думаю, практичнее будет вместо регена применять к мультивыноскам команду _UPDATEFIELD, особенно на громоздких чертежах.
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Насчет недокументированности : https://www.lee-mac.com/ssget.html
А зачем ты вообще формируешь набор? Может, проще будет программно пройтись по пространствам модели / листов и набрать в один список все указатели на мультивыноски (заодно контролируя состояние слоя, тип аннотации и теде)?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Цитата:
Опционально было бы неплохо еще обрабатывать и выноски на блокированных слоях, но не стал заморачиваться с временной разблокировкой. Делаю функцию чисто для себя, а я не так уж и часто пользуюсь блокировкой слоев. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Можно ли использовать grread с объектной привязкой и ее отслеживанием?
Поиск в интернете дает довольно много разных решений на тему ПСЕВДО объектной привязки с функцией grread, но почему-то ни один из примеров у меня не работает как ожидается, то есть никакой объектной привязки нет. Например вот этот пример. Тут даже на демонстрационной гифке показана объектная привязка, но у меня почему-то эта функция так не работает. У меня Автокад 2022. В этой версии может уже пропали возможности, реализованные в этом примере? Обратил внимание, что все способы, которые попадались в поиске - довольно давние, около 15 лет им. В версии 2022 это уже не работает? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Сам по себе grread привязку не поддерживает. Решение, насколько я помню, было от Елпанова на theswamp.org, но оно настолько замороченное...
А тебе вообще зачем? Может, getpoint будет достаточно?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Хочу программно отрисовывать будущий вид создаваемых элементов, как это реализовано в оригинальных функциях автокад. Например ту же самую мультивыноску. Стандартная мультивыноска меня не устраивает. Рисую ее через vla-AddMLeader, далее меняю разные свойства. Нужно чтобы она была визуализирована, пока я перемещаю курсор по экрану. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я бы уже задумывался о применении NET и его транзитной (вроде так называется) графики. JIG, в общем.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
причем это будет штатный API акада, а не ежик из костылей)
----- добавлено через ~5 мин. ----- вот один из примеров для ознакомления от Kean Walmsley. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
----- добавлено через ~13 мин. ----- Или это имеется ввиду работа с ObjectArx? Как-то однажды попытался его освоить, но что-то не получилось с ходу написать dll, которая будет работать в среде автокад. Возможно из-за того, что писал в Embarcadero C++ Builder, хотя там рекомендуется Visual Studio, причем под разные версии ObjectArx - разные версии Visual Studio, такая "универсальность" отпугнула. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Дык ета... Сергей же ссылку дал - вот и вперед, с песнями ))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну да, у меня самого пока что с JIG так себе дела обстоят (
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
азы - это основы языка, как создать первый плагин под акад и т.п. А потом начинается чтение справки, форумов и пробы, пробы, пробы (благо сделать резервную копию кода программы не проблема). Копируете чужой код, пробуете.. Работает - начинаете разбирать каждую строчку и комментировать этот код. В голове начинает это все укладываться постепенно. Либо забыть про всё это
Цитата:
----- ну и еще одна ссылка - более подробного учебника за эти года, пожалуй, не видел. Пока еще доступно) Последний раз редактировалось Сергей812, 31.07.2024 в 14:54. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
adn-cis.org
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Повесил объектный реактор на динамический блок с атрибутами. В функции-обработчике события :vlr-subObjModified планировал менять некоторые динамические параметры. Однако получаю вот такую ошибку:
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А какой именно реактор был повешен? Хотя бы тип реактора.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Для С++/ObjectARX выделил отдельную тему: https://forum.dwg.ru/showthread.php?t=171769
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Странное поведение блока с параметром видимости (круг и овал). Сделал блок, у которого два состояния видимости. На блок повесил объектный реактор, который делает много всякого и среди прочего - читает состояние видимости:
Код:
1. Состояние, когда блок вставлен в чертеж, все с ним пока как надо. 2. Переключена видимость с круга на овал. Здесь уже проблемка - должны были появиться ручки линейного параметра, которые видны на картинке 3. Отмечу, что в этот момент уже сработал объектный реактор. 3. Нажимаю ESC и просто выделяю блок - теперь он снова выглядит как надо. 4. Переключаю видимость на круг - и снова визуальный дефект в виде ручек линейного параметра, которые должны были отключиться, так как относятся к состоянию видимости "овал". Здесь тоже срабатывает реактор. При этом достаточно просто выделить блок заново - все лишние ручки исчезают, а нужные появляются. А к чему я упомянул чтение параметра видимости, так это к тому, что если я в лисп к нему не обращаюсь, то ручки динамических параметров сразу отображаются как надо, не нужно дополнительно обновлять выделение блока. Что это за глюк такой и как можно его побороть? Напрашивается вариант с программным выделением блока, но какое-то некрасивое решение. Может можно как-то обновить отрисовку этого блока в конце кода функции-обработчике реактора? Update, redraw - не работают. ----- добавлено через ~30 мин. ----- Вот на что еще обратил внимание - после срабатывания реактора (п.2 и п.4) - сбрасывается выделение блока. В обычном блоке без реакторов при переключении видимости выделение не сбрасывается. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
В этом случае сбрасывается выделение.
А как выделить vla объект? Что-то у меня не получается. Код:
----- добавлено через ~8 мин. ----- Опечатка в переменных - ssobj и ssobjs. Добавил еще Код:
![]() ----- добавлено через ~15 мин. ----- Работает вот такая конструкция - после переключения видимости блок остается выделенным и все ручки соответствуют состоянию видимости, но решение какое-то кривое и некрасивое. Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
У меня крепнет подозрение, что все можно сделать значительно менее геморно - но для этого надо задачу знать, ради решения которой вся эта катавасия вообще стартанула.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Базовые требования: 1. Адаптация длины полки выноски к содержимому при вставке блока и редактировании. 2. Контроль положения текста относительно полки выноски (как для текста выше полки, так и для текста ниже полки). 3. Адаптация выносной линии, чтобы она всегда была по радиусу при смещении полки выноски. 4. При смещении полки выноски за ручку - отзеркаливание полки с текстом при условии, если точка полки пересекает вертикальную ось, проходящую через центр круга. 5. Работающие объектная привязка и ее отслеживание при добавлении блока узла и его изменении. 6. Вариации узла, где вместо круга - овал (вертикальный и горизонтальный). |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Похоже на позиционную выноску от СПДС. Если б не овал, можно было бы простой мультивыноской обойтись. Offtop: В свое время тоже бредил подобной идеей, но от реализации в конце концов отказался.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
А свой узел я реализовал через реакторы (ну, надо только еще горизонтальный овал доделать, но там все понятно - просто надо сесть и сделать). Он хорошо работает, мне просто не нравится реализация в частности вот этого момента с "нелегальными" ручками параметров, которые видны, хотя не должны быть видны. И наоборот - не видны тогда, когда должны быть видны. Хотелось бы более красивого решения, думаю у меня из-за недостатка знаний это сделано плохо. Странно, что чтение параметра видимости приводит к этой проблеме. ----- добавлено через ~60 мин. ----- Кажется разобрался в чем была проблема. Виновато вовсе не чтение параметра видимости, а функция vla-Update для блока после программной настройки динамических параметров. Вроде как пишут, что эта функция нужна, чтобы настроенные параметры вступили в действие и результат отобразился на экране. Но может быть это было нужно в ранних версиях Автокада (у меня Автокад 2022). Сейчас просто убрал эту функцию - и блок стал адекватно работать. И все параметры отображаются так, как я их программно настроил, и ручки у параметров правильные, и блок остается выделенным (в отличие от того, как было на скриншотах 2 и 4 выше, где у блока слетало выделение). |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Выявил интересную особенность по реакторам. Поправьте знающие, если я ошибаюсь.
Если повесить на примитив объектный реактор vlr-object-reactor, который отслеживает событие копирования :vlr-copied, то в функцию-обработчик передается в списке параметров имя объекта, созданного операцией копирования. Первая интересность состоит в том, что в самой функции-обработчике с этим объектом ничего сделать нельзя, потому что он еще не существует, ему всего лишь присвоено будущее имя. Чтобы работать с этой копией - нужна глобальная переменная, в которую я помещаю имя объекта и командный реактор vlr-command-reactor, который отслеживает событие окончания выполнения команды :vlr-commandEnded. В функции-обработчике этого события скопированный объект уже существует и с ним можно делать что угодно. Такой подход вполне работает с командой COPY. Однако объект скопировать можно еще и командой COPYCLIP и вставить командой PASTECLIP. И тут вторая интересность - после выполнения команды PASTECLIP объект, созданный копированием и от которого у нас есть только имя - все еще не существует. Соответственно в обработчике команды PASTECLIP ничего с объектом сделать нельзя. Судя по всему нужно делать еще один реактор типа vlr-acdb-reactor и там отслеживать событие добавления примитива :vlr-objectAppended и уже там делать то что надо с объектом, вставленным через буфер обмена. Попутно возник вопрос. Как проверить есть ли в базе примитивов чертежа объект с указанным именем? Это надо для проверки перед выполнением каких либо действий над объектом, когда после срабатывания реактора копирования есть только имя объекта, но нет понимания объект уже существует или еще нет. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ты под именем понимаешь handle? Если да, то handent для неправильного хендла вернет nil
Для операций копирования я бы, скорее всего, использовал командные реакторы - они как-то мне ближе.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну пробуй получить от него entget. nil - объекта еще нет
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
----- добавлено через ~4 мин. ----- Да, можно так проверять существует объект или нет. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Вопрос на форуме уже поднимался, тему искать лениво (да и в отпуске я, так что звиняй
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Может дело вкуса, мне объектный реактор вполне удобен. Хотя и он не без недостатков. Например событие редактирования сложного объекта, например блока, состоящего из нескольких полилиний и атрибутов, срабатывает несколько раз. Он реагирует на изменение каждой вершины полилинии. И чем сложнее блок- тем больше будет срабатываний. Не придумал как прервать эту цепочку срабатываний после первой сработки. Я сейчас работаю с блоком не таким уж большим. Событие модификации срабатывает не более десятка раз. Код в обработчике совсем небольшой - поэтому меня это не сильно напрягает. Основной код в обработчике командного реактора - он вызывается всегда один раз. К слову о прерывании цепочки срабатываний. Выключение реактора в функции-обработчике - почему-то не помогает. Других вариантов прервать цепочку не придумал. Код:
blc - блок, на который вешаю объектный реактор, cs_ModifiedNode - глобальная переменная, в которой содержится ссылка на измененный блок cs_NodeEventsCounter - глобальный счетчик, подсчитывает количество раз срабатывания реактора |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Вот это вообще не проблема ИМХО. vl-remove и вперед
![]() После своих экспериментов с реакторами базы данных чертежа я предпочитаю более топорные методы ![]() Я бы делал по-другому. В глобальную переменную в начале редактирования засовываешь, к примеру, 0. В конце редактирования добавляешь 1. Если общее количество <= 1, то выполнять обработку. Нет - значит нет. Это тупо как идея, без реализации.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
это потому что в лиспе нет idle реактора, насколько помню) Это где уж гарантировано закончилась транзакция БД, и можно отцепить обработчики изменений и сделать что-то с объектом без опасения повторного вхождения в обработчики изменений.
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Ты не совсем понял проблему. Нет возможности в какой-либо момент времени влиять на работу реактора в момент срабатывания события редактирования. Автокад помечает объект как редактируемый столько раз, сколько параметров было изменено при редактировании - и вот столько раз и вызывает функцию-обработчик. То есть вот это - "Если общее количество <= 1" - просто негде вставить. Произошло 10 изменений в блоке при редактировании - значит 10 раз вызовется функция-обработчик. Отменить ее вызов - не получается.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Думаешь, я просто так сказал про "топорные" подходы?
![]() ----- добавлено через ~1 мин. ----- А так - ну реально я бы смотрел в сторону MultiCAD, NET и пользовательских объектов.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Продолжаем про реакторы. Задача - при копировании объектов через буфер обмена нужно новые объекты включить в список владельцев реактора копирования (на самом деле еще и в список владельцев реактора изменения, но я это пока опустил для упрощения). Есть вот такой код:
Код:
P.S. При тестировании всего этого дела счетчик копирования у меня почему-то получает очень высокое значение - 43. ----- добавлено через ~24 мин. ----- Наверное действительно стоит добывать объекты через entlast. Последний раз редактировалось Сет, 06.08.2024 в 10:13. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Вот скажи, а на фига вообще объектный реактор-то?
Мне кажется, что, во-первых, не "при копировании", а "при завершении команды вставки из буфера обмена". Во-вторых, я не уверен, что твой код сработает при простом _.copy / _.mocoro. Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Для формирования списка копируемых объектов. Я пока не въехал вот в эту твою конструкцию, которая отвечает судя по всему за то же самое.
Код:
В моем случае объектный реактор легко формирует набор новых объектов. И проблема, которую я здесь обозначил, не в объектном реакторе, а в командном, там где я, собственно, обрабатываю команду COPY или PASTECLIP. С командой COPY нет проблем - она корректно обрабатывает мой список объектов, полученный в объектном реакторе. А вот PASTECLIP обрабатывается некорректно, потому что после окончания выполнения этой команды объекты еще не существуют - я не могу их обработать. Собственно тот же самый вопрос и к твоему коду. Обработав PASTECLIP ты оперируешь списком (*kpblc-ent-list*) реальных объектов или неких временных? Это твой реальных рабочий код или ты сейчас набросал его для пояснения своей мысли? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А ты проверь. А заодно и посмотри на справку по функции entnext
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Проверил - работает.
Но во-первых я все равно не понял как работает entnext. В справке указано, что entnext возвращает следующий за указанным примитив в базе данных. Нигде не нашел оговорки, что речь идет о только что добавленных примитивах или что-то типа того. Хотя по факту так и работает. Во-вторых - entnext расчленяет составные объекты и считает их отдельно. А мне нужно, чтобы блок считался за один объект. Наверняка это как-то можно сделать? |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Цитата:
"Последним" вполне может оказаться не "цельный" объект (типа отрезка), а "составной" (типа полилинии или блока с атрибутами). Поэтому (entnext) будет возвращать не "свежедобавленный" объект, а подобъект от уже существующего в базе объекта. Я в своё время делал так - добавлял в чертеж "отрезок", запоминал его как (entlast), от него искал добавленные примитивы и затем удалял его. Разумеется, с обвесом в виде проверок и удаления этого отрезка по ERROR. Не слишком изящно, но это было очень давно, ещё до появления (vl-load-com) ... И оно работало вполне себе стабильно.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
просто у любого объекта в БД чертежа есть уникальный идентификатор (UID). В качестве этого UID используется целое число и при добавлении каждого следующего объекта в БД чертежа просто добавляют единицу к этому числу - это достаточно для уникальности. Соответственно, если взять в качестве "опорной точки" некий объект чертежа и получить его UID - то все добавленные после него объекты будут иметь больший по значению UID в порядке их добавления (но могут быть и пропуски при удаленных объектах).
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
--- И этот UID называется хэндлом (DXF группа 5, насколько помню). Последний раз редактировалось Сергей812, 06.08.2024 в 16:07. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А фильтрация на что?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Так (entnext) идёт "вперёд" по базе данных.
Вызов (entnext) без параметра - первый примитив в базе. С параметром (entnext <имя_примитива>) - вперёд от указанного, включая субпримитивы. Пока база данных чертежа не закончится.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
О какой фильтрации речь? Проверять каждый примитив не является ли он субпримитивом и его не добавлять в список? А что является признаком этого? В справке пишут, что как-то через SEQEND можно добраться до родительских примитивов, но пример бы посмотреть. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ты специально не читаешь, да? )
Как пример: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
В таком виде хороший повод избавиться от объектного реактора с отслеживанием копирования.
----- добавлено через ~3 мин. ----- Цитата:
----- добавлено через ~9 мин. ----- Кстати, а автокад не захлебнется при копировании, если ему придется таким образом фильтровать 10 000 объектов, чтобы включить в целевой список только нужные блоки? |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
----- добавлено через ~16 мин. ----- а единственный порядок следования примитивов в БД чертежа - это их хэндлы (UID в виде 64-битных целых чисел) в порядке добавления в БД чертежа. Других явных признаков нет. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
----- добавлено через ~3 мин. ----- Все, дошло наконец. Первый вызов не (entnext nil). Там в качестве аргумента примитив (entlast), полученный перед копированием. ----- добавлено через ~7 мин. ----- Попробовал на 50 000 примитивов. Чувствуется лаг на несколько секунд на моем компьютере. Но он чувствуется и без фильтрации, и даже с отключенными реакторами. Так что особого влияния нет. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Он скорее захлебнется с объектными реакторами. И что-то мне сложно поверить, что у тебя будет несколько тысяч объектов. В конце концов, никто не мешает проверку вколотить в цикл сбора объектов.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Копирование больших массивов - вполне обычная задача в моей практике. Там и под 100 тысяч примитивов может быть. Ну например сформировал 100 листов чертежей и надо потом что-то в них поменять, но оставить для удобного просмотра рядом оригинальный вариант. Замечу, что я работаю только в пространстве модели, листами не пользуюсь. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Касаемо "глубоких" реакторов и их поведения : https://autolisp.ru/2020/02/18/acdb-reactors/ Именно из-за этих и подобных приколок я предпочитаю "топорные" методы.
Какая связь между сотнями листов, их копиями "рядом" и списками примитивов - как-то не догоняю.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Лист в данном случае - не автокадовская вкладка лист - а электронный эквивалент бумажного листа. Вот тут, например, 20 000 примитивов. Мне может понадобиться необходимость их скопировать в другое место пространства модели.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну хочешь - попробуй мой код, посмотри, "захлебнется" кад или нет. Подозреваю, что все сработает корректно - основная проблема будет при прорисовке, но вряд ли при обработке списка.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
А как ты определяешь получаешь ссылку на объект, который изменяется, чтобы обработать его изменение в командном реакторе? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Стоп. Командные реакторы у меня в реальных боевых условиях вообще слабо привязаны к объектам. Ну скопировал пользователь объект - и бог с ними, и с объектом, и с пользователем. Изменений объектов лично я предпочитаю непредсказуемо (для пользователя) не выполнять: лекарство может оказаться хуже болезни.
А необходимость "привязки" объектного реактора я бы делал примерно так: 1. В описании блока в словарь засунуть некую последовательность типа '("objreactor" . t). Решения в ынтырнетах есть ![]() 2. При открытии документа пройтись по всем описаниям блоков, найти те, у которых "надо привязывать" реактор 3. Пройтись по всем вхождениям таких блоков и прописать им объектный реактор 4. При выполнении команд копирования / вставки из буфера / внедрения стороннего файла как блока / внедрении внешней ссылки повторно выполнить п.3 --- Offtop: Хотя мне до сих пор кажется, что задачка своей сложностью выходит за рамки возможностей лиспа.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Не в точку, а в точку на линии. И не попасть, а ограничить ввод. Нужно чтобы при выборе третьей точки резиновая линия была зафиксирована на прямой проходящей через первые две точки.
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
А так, например, построить отрезок временный по первым двум точкам, и пускай пользователь привязкой пользуется при выборе 3-ей точки. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Если нет, то я эту третью точку пока думаю получать программно. Она будет на том же расстоянии от точки 2, что и указанная пользователем, но смещенная на линию 1-2. Этот вариант меня тоже устраивает, просто он чуть менее красив, чем если бы при выборе точки 3 резиновая линия изначально тянулась только по прямой 1-2. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
1. Режим может быть отключен пользователем
2. Никто не помешает вести перпендикулярно 3. Замучаешься обратно восстанавливать UCS
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Меняешь UCS, ждешь, что пользователь будет вести плюс-минус около оси Ox. А он бац - и вдоль оси Oy текущей UCS
А кто сказал, что при старте кода система координат была мировой?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Цитата:
----- добавлено через ~2 мин. ----- Кстати, проблему с перпендикулярным вводом частично можно уменьшить, если начало координат закинуть подальше, чтобы физически сложно было выбрать перпендикулярный режим. |
|||
![]() |
|
||||
Регистрация: 21.06.2013
Сообщений: 11
|
Доброй ночи!
Подскажите как в коде указать универсальный путь к файлу шаблона? Если ввести конструкцию %UserName% в пути напрямую, то не работает( Дали идею: (getenv "%appdata%") (getenv "%userprofile%") Но как применить в коде не знаю, мои знания в язык LISP равны нулю к сожалению( Код:
|
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
У тебя неправильно написаны переменные, нужно так:
(getenv "APPDATA") (getenv "USERPROFILE") Если нужно только имя пользователя: (getvar "LOGINNAME") Для объединения строк используется оператор strcat |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
ИМХО никак. В СОМ-модели соответствующие свойства вроде бы не проброшены, да и в ename-представлении динамический массив - всего лишь анонимный блок. Правда, со своими реакторами и словарями.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Поискал информацию в интернете - удивился, что ничего такого не нашлось по изменению свойств массивов. А ведь через палитру Свойства - это возможно. Получается надо удалять старый массив и затем создавать новый с нужными параметрами.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Или расковыривать словари на примитиве - насколько я помню, там что-то мелькало.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
А можно ли добраться простым способом до шага динамического массива? Вот здесь это сделано, но через открытие редактора блоков. Это слишком неудобно.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я же говорю - вскрывай словари.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну как-то так примерно
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Не придумал как сделать из набора примитивов обычный автокадовский массив с ручками, обернул набор в анонимный блок. Ниже реализация. Посмотрите, нет ли там каких-то явных глупостей в коде, может что-то можно сделать проще.
Функция создает объект, представляющий собой заводской сварной шов - небольшой отрезок с некоторым шагом. Геометрия пока жестко прописана в коде (длина отрезка и максимальный шаг отрезков). Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну создай перед while свой слой, и в конце после vla-put-textoverride добавь (vla-put-layer item <Имя твоего слоя>)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Как программно выбрать все тексты или Мтексты на чертеже с одинаковым содержанием,
указав на нужный текст в чертеже. Мтекст может быть многострочным. Код:
Но мне нужно выбрать текст на экране Код:
(<Имя объекта: 7ffffb0c620> (12816.6 1477.96 0.0)) (<Имя объекта: 7ffffb0c610> (11643.9 2491.88 0.0)) (<Имя объекта: 7ffffb0c630> (13407.1 1037.49 0.0)) Для мтекстов с одинаковым содержанием выводятся различные имена... Возможно ли выбрать одинаковые мтексты как одинаковые объекты, указав на мтекст-образец? |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
деформатирование исходного образца-мультитекста, в цикле по всем мультитекстам в чертеже деформатировать их содержимое и сравнивать "чистые" текстовые значения. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
From the point of view of banal erudition, not every individual (teapot) is able to understand the trends of paradoxical explanations.
Последний раз редактировалось Ingpro, 09.11.2024 в 20:07. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Offtop:
Цитата:
Мультитекст может содержать один и тот же текст, но с разными кодами форматирования. В Net это одна строчка для получения "чистого" текста, на лиспе люди тоже реализовывали - ищите. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
|
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Команда: (getpropertyvalue (car (entsel "\nМТекст: ")) "text")
выдает: МТекст: "Строка текста 1.\r\nСтрока текста 2." Как с помощью этой строки можно выделить все мтексты с таким содержанием? Просто для сравнения, если вызвать ком. ПОЛЕ, потом - объект-мтекст, то в окне содержимое выглядит по-другому (как в свойствах мтекста). или Команда: _LIST Выберите объекты: найдено: 1 MTEXT .............................. .............................. Содержание: Строка текста 1.\PСтрока текста 2. Последний раз редактировалось Ingpro, 10.11.2024 в 08:57. |
|||
![]() |
|
||||
Цитата:
там тоже с индексами аналогично? ----- добавлено через ~4 мин. ----- выбрать мтексты (все или выборочно) и проверять содержимое со [под]строкой поиска, например.
__________________
K Lisp Последний раз редактировалось koMon, 10.11.2024 в 09:07. |
||||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
да, тоже добавляет лишние слеши в текст. Можно собрать чистый текст вообще без форматирования (т.е. разбивка на строки и т.п. тоже уберется) через разбивку на фрагменты мультитекста с последующей сборкой выходной строки (десяток строк кода).
|
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А чем тебе не нравится vlac-dump-object?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Т.е. тебе TextString уже не канает? )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Формально - нет, конечно. :-)
TextString - с кодами форматирования Text - "чистое" содержание текста Пока не слишком актуально, но вдруг захочется применить какое-нибудь свойство, которое доступно по (dumpallproperties ...), но недоступно по (vlax-dump-object) ... и под наником. Уже - увы - только под ним.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Offtop: Бросай лисп, на NET все это доступно из коробки
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
ну тогда придется перейти на тот же Net - если возможностей нанолиспа будет уже не хватать)
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Пока все то же самое, что и под виндой. С некоторыми ограничениями на dcl, насколько я помню.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Я пытаюсь вызвать лисп "Sel-mtxt-rpl" из лиспа "repl", добавив эти строки
Код:
запускается первой, а (load "Sel-mtxt-rpl") вообще не срабатывает. Мне нужно, чтобы сначала сработал код "Sel-mtxt-rpl", затем "repl". Посоветуйте,плз, как это можно исправить. Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Вопрос больше подходит под https://forum.dwg.ru/showthread.php?t=22894
А так - загрузку кода и вызов sel-mtxt-rpl стоит засунуть внутрь тела основной команды.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Последний раз редактировалось Ingpro, 12.11.2024 в 10:45. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Перенес
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Offtop: Но дайте мне развидеть этот код...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
|
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Если честно, я как-то не очень понимаю логику, по которой вся эта связка должна работать. Но вот, как вариант - не включая мозг и не приходя в сознание
Код:
Пока бегал по делам, опередили )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 12.11.2024 в 14:17. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Ia?acao IOaenoa aey oeeuo?aoee: Он и в коде такой почему-то... строка 028 (заменить на: Образец МТекста для фильтрации ![]() Если можно я выложу эти коды в готовые программы, думаю многим будет полезен... |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Цитата:
1 Сделать по-русски поясняющие надписи во время работы команды 2 Многие переменные у тебя не объявлены локально - замусоривают память компьютера. Плюс теоретически имена переменных могут совпадать с переменными других программ - что может вызвать ошибки работы Поправь, не поленись, доведи до ума! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Исправил. Постоянно забываю про особенности копирования кода из VLIDE...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Последний раз редактировалось Ingpro, 13.11.2024 в 16:16. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Про переменные посмотри тут https://storage.piter.com/upload/new...00467/ch33.pdf pdf-страница номер 10 (описание функции defun).
Если кратко - то все что пишется в скобках после defun - локальные переменные, до знака "/" - аргументы функции (входные переменные), а после знака "/" - переменные используемые во время работы функции. И те и другие "живут" только во время выполнения кода функции |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я бы всерьез задумался о следующем:
1. Обработка ошибок, особенно для варианта запроса чего бы то ни было у пользователя 2. Практически полная переделка логики: какой смысл запрашивать по 100500 наборы, когда можно в лучшем случае обойтись одним? 3. Про области видимости и доступность переменных / локальных функций уже сказали.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Например: Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Переменные - да. Параметры вызова - до.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Это ты просто не видел
![]() До знака "/" записываются аргументы функции - т.е. какие-то данные (числа, строки, объекты и т.п.) что будет использоваться для вычисления итогового значения функции Код:
|
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
А те, которые нигде не объявляются - "глобальные"
Код:
После выполнения функции ты в любой момент сможешь узнать её значение, набрав в командной строке (princ a3) Вернее: а) В любой момент в текущем сеансе б) Пока её кто-нибудь не затрёт, забыв объявить в своей функции a3, как локальную переменную.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
А ещё: "Локальные переменные определяются в рамках заданной процедуры. Параметры, указанные в качестве аргументов в определении функции, также являются локальными переменными. Локальные переменные доступны только в рамках соответствующей функции. Как и глобальные переменные, локальные переменные также могут быть созданы с помощью конструкции setq". |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
На всякий случай пара ссылок (сам пользовался постоянно, да и сейчас юзаю, если приходится в VLIDE возвращаться): https://autolisp.ru/2009/09/10/vlide-misc-01/ ; https://autolisp.ru/2009/09/12/vlide-misc-02/
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
потому что функция (vl-remove-if) удаляет из списка все элементы, для которых результат функции '(lambda (x)) будет ложным (равно nil)
В первом варианте в (lambda (x)) возвращается сам элемент если его длина более 500 и nil в противном случае Во втором варианте у тебя для всех элементов результатом будет элемент списка (не nil), поэтому удаления из исходного списка не происходит В последнем варианте у тебя при прохождении по каждому элементу списка выполняется действие (entdel x) - т.е. удаляется элемент Если надо сформировать набор из НЕполилиний, то ssget надо написать так: (ssget "_X" '((-4 . "<NOT")(0 . "LWPOLYLINE")(-4 . "NOT>"))) Подробнее про фильтры тут |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Хочу просто выбрать полилинию и вставить площадь в кв. м (с коэф. 0.000001) в указанную точку на чертеже, и чтобы текст был подчеркнутый (%%u), но не знаю, как это сделать правильно. Знаю, есть много лиспов для площадей с полями и вставкой в таблицу, но мне это не надо... Где и как в коде прописать коэф. 0.000001 и подчеркивание %%u, подскажите, плз, и точка вставки не работает... В ком. строке пишет:
Команда: AR-OBJ Укажите точку вставки текста:Ошибка приложения: В команду послан неверный тип Выберите объекты: Площадь = 23336443.43, Периметр = 19566.58 Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
1. У тебя нет получения площади.
2. txt не создается, поскольку там не задана строка 3. Возможный вариант кода (без проверок): Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Select polyline <Cancel> : Insertion point <Cancel> : ; ошибка: неверный тип аргумента: lentityp #<VLA-OBJECT IAcadLWPolyline 0000000045fac808> |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
В 46 строке убери преобразование в vla-объект, я его по запарке повторно воткнул
----- добавлено через ~1 мин. ----- У меня ощущение, что ты код не проверял и в VLIDE его не смотрел ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
(cons 1 (strcat "%%u" (rtos (* (vla-get-area) 1e-6)) 2 14)) ; ошибка: слишком мало аргументов (cons 1 (strcat "%%u" (rtos (* (vlax-ename->vla-object ent) 1e-6)) 2 14)) ; ошибка: неверный тип аргумента: lentityp #<VLA-OBJECT IAcadLWPolyline 000000005856adc8> (cons 1 (strcat "%%u" (rtos (* (vla-get-area (vlax-ename)) 1e-6)) 2 14)) ; ошибка: no function definition: VLAX-ENAME |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
|
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Код Алексея aka kpblc из поста #4813 с исправленной 46 строкой
Проставляет площадь выбранной полилинии (текст подчеркнутый) Если не нужен подчеркнутый текст, то 46 (здесь уже 49) строка Код:
Код:
Код:
правильно ли будет добавить в код Код:
Последний раз редактировалось Ingpro, 07.12.2024 в 11:40. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
entmake / entmakex, насколько я помню, создают примитивы в текущей ПСК. А вот получение точек - тут плаваю, могут быть варианты.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Этот код проставляет площадь как бы в кв. футах 15,959,526 S.F. Но в кв. м это = 15.96 кв.м, т.е. эти цифры "похожи".
Реально 15.96 кв.м.= 171,79 кв. футов. И какой-то странный формат с двумя запятыми 15,959,526 S.F.... Но 1 кв. фут = 10,76 кв. м. Единицы чертежа у меня - миллиметры. Подскажите чайнику, плз, какая строка в коде отвечает за единицы площади? Как изменить квадратные футы на кв. метры? Код:
|
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Ты проверял работу программы на "эталонном" прямоугольнике (чью площадь можно самому посчитать)?
Программа считает не в футах или дюймах - она считает в просто единицах. Ты сам решаешь, что это за единицы - футы, миллиметры или метры например. В настройках автокада же указываются единицы для преобразования при вставке блоков или внешних ссылок (например генпланист рисует в метрах, а ты в миллиметрах - поэтому при вставке в твой чертеж генплан нужно увеличивать в 1000 раз). Эти настройки на замеры никак не влияют. Программа выполняет расчет в строках 080-085 и тамже через каждые три символа ставит запятые - видимо так принято там, где работате создатель программы |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
1. Форматируй код.
2. Проверяй единицы чертежа (те же _.dwgunts)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Запускай программу в VLIDE, ставь точки остановки и смотри значения переменных.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Если в 035-ой строке (setq txt1 (strcat txt1 ","))) заменить на ".", получается 15.959.526, а надо 15.96 Последний раз редактировалось Ingpro, 09.12.2024 в 09:22. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Почитай тут https://acad-prog.ru/vlisp/
Не туда смотришь - 80-ю строчку стирай, а в 84-й - удаляй одну скобку |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Туды жа:
https://autolisp.ru/2009/09/10/vlide-misc-01/ https://autolisp.ru/2009/09/12/vlide-misc-02/
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
|
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Ты читал мое сообщение ?
Ты же, блин, инженер - немного проанализируй код, подумай! Даю подсказку - строка 082 |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Есть код, который проставляет размеры прямоугольника в м и футах-дюймах:
1 3000 x 2000 9842'-6" x 6561'-8" У меня не получается убрать строку с футами-дюймами, чтобы осталось только 1 3000 x 2000 Код:
; ошибка: неверно сформированный список на входе Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Потому что код крайне желательно хоть как-то форматировать. Тогда его читать становится кратно проще:
Код:
Код:
Хотя я такой код вряд ли бы выпускал в большую жизнь.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну хотя бы потому, что отлова ошибок нет от слова совсем (попробуй в любой момент нажать Esc, порадуйся). Непонятна логика отмены, если что. По Ctrl-Z вроде бы будет откатываться создание каждого примитива, а вот надо оно так или как-то по-другому есть вопрос. (- (car p)(car p)) всегда (по идее) вернет 0 - какой смысл в вычислениях? Ну а про нейминг переменных вообще молчу )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
|
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Во многих программах нет отлова ошибок... потому что не все функции этого требуют? или по другим причинам? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Вопрос - что будет, если пользователь на запрос имени комнаты нажмет Esc? Или при запросе точки?
ИМХО код условия в while должен быть наподобие Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
----- добавлено через ~13 мин. ----- Цитата:
Enter room name: *Прервано* First point <Cancel> : *Прервано* ; ошибка: неверный тип аргумента: consp #<%catch-all-apply-error%> Код:
Последний раз редактировалось Ingpro, 23.12.2024 в 15:02. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А нечего просто копировать код ) Скобку перед and Пушкин ставить будет?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Вот только не надо - ты зачем строку 16 закомментировал?
----- добавлено через ~3 мин. ----- Скопируй свой код в VLIDE и там проверяй, где какая конструкция начинается и заканчивается.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
не, ну если начать нажимать что попало, например esc посерёд программы, то это естественно вызовет аварийное завершение, которое сбоем назвать можно с натяжкой. а если обходится без предыдущего, то вполне себе да)
__________________
K Lisp |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Лично я предпочитаю *error* не трогать.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Я хочу выбрать рамкой отдельные тексты и преобразовать в отдельные мтексты.
Express-команда TXT2MTX объединяет выбранные тексты в один мтекст. Если просто набрать в комстроке TXT2MTX (или _.txt2mtx) это работает. Код:
Неизвестная команда "TXT2MTX". <имя объекта: FF824700> Как можно исправить, плз? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Попробуй использовать handent
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
(ssname ss i)
преобразуется в (handent (cdr(assoc 5 (entget (ssname ss i))))) Как-то так примерно
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Код:
<имя объекта: FF824860> Последний раз редактировалось Ingpro, 25.12.2024 в 23:14. Причина: txt2mtxt исправлено |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ты со скобками в строке 6 не ошибся?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Изначально перед handent стояло 2 скобки.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
если это express-команда, и снова автокад 2015, то я думаю её нельзя вызвать функциями command*. нужно попробовать вариант что-то типа (c:txt2mtxt (ssname ss i))...
__________________
K Lisp |
||||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Код:
Код:
Последний раз редактировалось Ingpro, 25.12.2024 в 23:20. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Немного улучшил-упростил для использования:
- добавил обработку пустого набора - убрал ненужные выводы в командную строку и сообщение об ошибке - добавил отмену - Ctrl+Z вернет все в исходное состояние Код:
|
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
спасибо большое, теперь полноценный код, возврат к предыдущему состоянию сразу для всех текстов, а не по одному... Так намного удобнее! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Какова конечная цель? Потому как складывать системные ttf хрен пойми куда - так себе затея ИМХО.
----- добавлено через ~1 мин. ----- И, кстати. Начиная с какой-то версии ACAD ttf можно положить просто в каталоги поиска, фонт даже регистрировать не надо - он подхватится.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Просто хочу, чтобы мой стиль текста создавался при каждом открытии чертежа, у меня это получается, но нет уверенности в правильности кода...
Код:
Т. е. если я открываю чертеж, а в нём этот стиль уже есть?.. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Насколько я помню, начиная примерно с 2010 версии проверять наличие уже не надо - vla-add в таком случае получит указатель на существующий стиль / слой / ...
Но вот будет ли оно работать, если стиль уже был, но на него назначен shx шрифт - вопрос. Я б подумал на предмет применения стандартов.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну да. Там, насколько я помню, можно много чего настроить
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Как можно выделить все размеры только определенного стиля на всем чертеже (или выбрать рамкой) и удалить или заменить на другой стиль?
Пытаюсь выделить и удалить, но выдает ошибку: Код:
Последний раз редактировалось Ingpro, 14.01.2025 в 10:13. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Со скобками разберись. (ssget '((0 . "*DIMENSION"))), а не та дичь, которую ты написал )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Если стиль "Копия Основной" создать в чертеже, то замена происходит... Или так и надо? Последний раз редактировалось Ingpro, 13.01.2025 в 14:47. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Цитата:
Насчет копии и замены - ты же сам писал вот это: Цитата:
Ты отладку программы в VLIDE делаешь или в блокноте? |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
1 Функция subst возвращает список, в котором элемент (assoc 3 b) заменен на (3 . "Копия Основной").
2 Я бы удалял объекты не командными методами - не люблю засорять командную строку. Все аккуратнее выглядит. Ты какой справкой по лиспу пользуешься? |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Скачай офлайн справку https://dwg.ru/dnl/ri33 - там есть справка по всем лисповским функциям
Добавь эту справку в настройках автокада: И тут еще поменяй: И если ты программы пишешь в блокноте, то лучше переходи в VLIDE - там проще отслеживать и находить ошибки в коде |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Последний раз редактировалось Ingpro, 13.01.2025 в 19:18. |
|||
![]() |
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 170
|
Цитата:
|
|||
![]() |
|
||||
__________________
K Lisp Последний раз редактировалось koMon, 14.01.2025 в 13:12. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
https://dwg.ru/dnl/ri33 - от 2019 по 2025
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
На 2021 почему-то справки не нашлось в момент загрузки ((
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
А на эти ссылки вот такая реакция?.. Есть ли возможность приложить архив? Или добавить к https://dwg.ru/dnl/ri33 - от 2019 по 2025
Последний раз редактировалось Ingpro, 14.01.2025 в 13:52. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Цитата:
Админ одобрил, ссылки: _https://dwg.ru/dnl/15794 _https://dwg.ru/dnl/15795
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 14.01.2025 в 20:49. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Код:
для цвета RAL 3024 (при печати monochrome цвет - красный) эти строки не работают: Код:
В ком. строке: Требуется стандартное имя или номер цвета. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Для задания цвета в RGB
(command "_-layer" "_n" "IZM" "_c" "_T" "255,45,33" "IZM" "_s" "IZM" "_P" "_P" "IZM" "_s" "IZM" "") Для задания цвета прямо в RAL (command "_-layer" "_n" "IZM" "_c" "_COL" "ral classic" "RAL 3024" "IZM" "_s" "IZM" "_P" "_P" "IZM" "_s" "IZM" "") |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Спасибо большое, обе строки отлично работают!
|
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
А можно это сделать с помощью commаnd? (setvar "DIMSTYLE" "_01_100"); не устанавливает!, только выводит имя текущего размерного стиля Последний раз редактировалось Ingpro, 17.01.2025 в 18:32. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А зачем команда, если программно работает?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
1. Да, можно
2. В твоем лиспе как минимум нет меток начала / конца отмены 3. Сравни свои несколько штук setvar'ов, и, к примеру: Код:
Если что - такое форматирование выдала VSCode + AutoLisp Extension ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
DXF Reference + https://autolisp.ru/2010/04/06/text-...trib-entities/
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
"Вызывает антирес И такой ишо разрез:" где про это красиво написано, что эта строка должна выглядеть именно так (cons 10 (trans pt 1 0)? |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
|
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
А может кто-нибудь попробовать запустить у себя код из поста #4907?
В блокноте нормально отображается, а в командной строке и в подсказках на экране вот такая фигнематика: Выберите границу (полилинию): Укажите точку для вставки текста: Найдено объектов: Выберите границу (полилинию): Укажите точку для вставки текста: Найдено объектов: Кодировка UTF-8 пробы с другими кодировками ничего не дают, что можно ещё попробовать??? Другие коды нормально отображаются... |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Да гидрит твою налево!...
А должна быть ANSI, сколько раз уж говорить-то! Либо повторно скопировать код и сохранить в кодировке ANSI, либо заменить кодировку. в 99% случаев срабатывает технология: открыть, выделить все, скопировать, сменить кодировку, вставить, сохранить
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Если ANSI в блокноте, то нормальный вид превращается в Выберите границу (полилинию): Если по аглицки, то understand... Select the contour (polyline: Specify a point to insert the text: Objects found: Но вопрос про кодировку завис... |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ты внимательно прочитал? Скопировать нормальный вид, сменить кодировку, вставить поверх. В Notepad++ прекрасно работает.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Выбираю ANSI в блокноте и нормальные слова превращаются в ... смысл это копировать? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Пробовал, работает.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 26.12.2024
Сообщений: 2
|
Добрый день, у меня проблема с неправильной отрисовкой штриховки, после внимательного изучения проблему установил что проблема проявляется у тех штриховок у которых граница полилиния и Флаг замкнутости установлен в 0.
Посмотрите правильно ли я код из поста [4877"]https://forum.dwg.ru/showpost.php?p=2086777&postcount=4877[/url] переделал под свой случай Код:
Последний раз редактировалось Konstnt16, 27.01.2025 в 11:29. |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Стандартный виндосовский "Блокнот" автоматически правильно отображает
кодировку русских символов - что UTF-8, что ANSI. Дело в том, что в самом начале файла UTF-текста находятся спецсимволы, которые не отображаются на экране, но которые дают понять программе (в нашем случае - "Блокноту"), как нужно показывать очертания символов. Из-за этого и получается путаница. Вроде в "Блокноте" всё хорошо, а в Автокаде - ерунда. Нужно именно преобразовывать кодировку, но стандартный "Блокнот" для этого не годится. Нужен или Notepad++ или другой текстовый редактор, который умеет это дело.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А если поискать... К примеру, https://forum.dwg.ru/showpost.php?p=593640&postcount=11 + https://forum.dwg.ru/showpost.php?p=1811175&postcount=7 и тому подобные темы по поиску "burst lisp", к примеру
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
По идее код должен сработать в фоновом режиме (назначить слои объектам), но что-то идет не так:
Команда: PLACEOBJLAY ._LAYER Текущий слой: "Размеры" Задайте параметр [?/Создать/Установить/Новый/ПЕРеименоватЬ/Вкл/Откл/Цвет/Тип/вЕс/пРозрачность/Материал/пеЧать/Заморозить/РАзморозить/Блок/рАзблок/Конфигурация/опИсание/соГласовать/ВНешняя ссылка]: _New Имя нового слоя(ев): Circle-all Задайте параметр [?/Создать/Установить/Новый/ПЕРеименоватЬ/Вкл/Откл/Цвет/Тип/вЕс/пРозрачность/Материал/пеЧать/Заморозить/РАзморозить/Блок/рАзблок/Конфигурация/опИсание/соГласовать/ВНешняя ссылка]: _Color Новый цвет [изПалитры/Альбом] : 230 Неправильное ключевое слово. ; ошибка: Функция прервана. Код:
Как-то странно получается: слой 0 становится цветом 230, а слой "Circle-all" создается, но черным цветом... Последний раз редактировалось Ingpro, 07.02.2025 в 12:17. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
|
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Да, нет. Зато у тебя есть (command "._LAYER" "_New" layerName "_Color" (itoa layerColor) "") и после указания цвета, автокад спрашивает, какому слою его назначить - и по умолчанию предлагает имя активного слоя.
Ты же на это не обращаешь внимание и "жмешь" ввод, а надо дать имя layerName! |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
А если я захочу в этом же коде добавить другой новый слой и другие объекты для присвоения слоя... Код:
Последний раз редактировалось Ingpro, 07.02.2025 в 14:28. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Я б сделал, наверное, отдельную функцию, в которую передавать список точечных пар "Тип объекта" - "Имя слоя". По-быстрому накидал, особо не тестировал:
Код:
Выглядит стремно, согласен - но основной код команды занимает всего ничего ) И в принципе (надеюсь) понятно, что за чем идет, в какой последовательности, и кому и как передается ![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Цитата:
Цитата:
Заменяю 2 строки и -ура!- работает! Код:
Последний раз редактировалось Ingpro, 07.02.2025 в 15:17. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
ЕМНИП, для команды _.-layer есть еще и опция _make. Вроде бы и создает, и активирует слой сразу (проверить не могу, машину с кадом уже выключил).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Я пытаюсь сделать обратное коду из поста #4865 (преобразовать тексты в отдельные мтексты)
Код расчленяет мтексты, но в ком. строке пишет: Неизвестная команда "MTXT2TXT" Код:
(vl-cmdf "_justifytext" "_P" "" "_mc" "") но выравнивается только один из выбранных... Последний раз редактировалось Ingpro, 13.02.2025 в 22:09. |
|||
![]() |
|
||||
Регистрация: 13.02.2016
Сообщений: 64
|
Подскажите, пожалуйста, как грамотно реализовать?
Имеется список VLA-объектов (линии), имеется второй список VLA-объектов, который содержит в себе помимо прочих еще и объекты из списка №1. Как исключить из второго списка все объекты, содержащиеся в 1ом? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
(vl-remove-if '(lambda(x) (member x first-list)) second-list) :?:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.02.2016
Сообщений: 64
|
Подскажите, пожалуйста, можно ли избавиться от комбинации foreach-foreach и имеет ли смысл? При большом кол-ве объектов (линий) этот фрагмент кода изрядно подвисает.
И объясните еще для чего "reverse res"? Без переворота списка наблюдаю некорректную работу в коде, но не могу понять почему ![]() Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Без проверки работоспособности:
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Ну так я и мозг-то особо не подключал ) Если я правильно понял, то надо оставить отрезки, у которых совпадают начальные вершины? Если да, то можно block_cont_1 и block_cont_2 объединить и проходить уже по объединенному списку. Можно заменить элементы - сначала двумерные координаты, потом указатель на примитив, и обрабатывать на основании координат (не понадобится постоянно вычислять значения). Можно в процессе проходки по объединенному списку попробовать исключать из него уже обработанные варианты, можно... Пока что фантазия закончилась. И на написание кода сейчас меня 100% не хватит - сижу в другой задачке, и это надолго
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Апостроф в компилированном коде немного медленнее, насколько я помню. Ну и мне пару раз хватило словить ошибку PPT при форматировании кода
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.02.2016
Сообщений: 64
|
Благодарю! Я добавил все варианты как могут стыковаться отрезки друг с другом и завернул в цикл, чтобы находить полные цепочки отрезков, которые растут от линий из списка "block_cont_1". На выходе получаем список с несостыкованными отрезками (block_cont_2).
Код:
|
|||
![]() |
|
||||
Gretech89,
в чём главная идея? есть два сравниваемых списка контуров из отрезков. начинаем сравнивать, находим несовпадающие отрезки и выводим только их в список или ?
__________________
K Lisp Последний раз редактировалось koMon, 20.02.2025 в 12:07. |
||||
![]() |
|
||||
Gretech89,
если я правильно понимаю, то нужно в блоке найти сцепленные отрезки, при этом удалив отдельностоящие от сцепленных. и отдельностоящих и сцепленных может быть не одна группа или одна штука. то что я предложил ни при каких условиях этого не сделает, потому что нацелено на поиск совпадающих отрезков по вершинам только. см. ниже.
__________________
K Lisp |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Вы еще сюды добавьте коллинеарные отрезки ))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Что значит "сбоить"? Что пишется в консоли? Какие значения переменных при отладке? Про разницу между command, command-s, vl-cmdf в курсе?
P.S. ИМХО проще всего создавать полилинию чисто программно, без использования команд.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Начинает чертить не ступени, а какую-то ф---ю.
Ничего криминального не пишет... Укажите начальную точку: _.PLINE Начальная точка: Текущая ширина полилинии равна 0.00 Следующая точка или [Дуга/Полуширина/длИна/Отменить/Ширина]: Следующая точка или [Дуга/Замкнуть/Полуширина/длИна/Отменить/Ширина]: Следующая точка или [Дуга/Замкнуть/Полуширина/длИна/Отменить/Ширина]: |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.02.2016
Сообщений: 64
|
Подскажите, пожалуйста. К примеру: имеется вхождение блока "A". Внутри него блок "B". Я правильно понимаю, что блок "B" не является вхождением на чертеже, т.к. он внутри блока "A"?
В общем задача получить список вложенных блоков причем с определенным именем (имена у вложенных блоков в другие блоки начинаются с одних и тех же символов - "MACRO*"). Делаю я это так: Код:
|
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Вопрос по ssget с условием.
Имеются две переменные: lst - список точек и lay - название слоя. Кодом Код:
Мне нужно выбрать примитивы не принадлежащие слою lay. Попробовал так: Код:
В чем ошибка? Или ssget с методом "_F" фильтры со сложными условиями не поддерживается? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
М.б., так?
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Кстати.
К выбору "Линией" нужно относиться с осторожностью. Если среди выбираемых объектов есть тексты, то эта "линия" может оказаться как раз "между слов" или даже "между букв" и в результате объект окажется не выбранным.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Рахмат, понимаш, катта!
----- добавлено через ~1 мин. ----- Это относится и к пунктирным линиям. Но, что делать!? |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Цитата:
понадёжнее будет. Разве, что нужен какой-то "очень хитрый" контур выбора... Но у меня в реальности такой задачи пока не возникало.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Я сейчас как раз этот вариант рассматриваю.
Как можно изменить список координат типа lst = ((х1 у1) (х2 у2)...(х8 у9)), добавив к каждому элементу по (2 2)? (mapcar '+ lst '(2 2)) - результата не дает. ![]() Строить линию по списку lst, делать офсет в обе стороны и получать новый список для замкнутого контура - как-то муторно мне кажется. |
|||
![]() |
|
||||
Цитата:
Цитата:
__________________
K Lisp |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Без проверок:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
это вряд ли. физически линия определяется вершинами и линией между ними. пунктиры это графическое представление линии и не должны препятствовать выбору линии например линией выбора.
----- добавлено через ~4 мин. ----- не сработает сорян) сработает Код:
__________________
K Lisp Последний раз редактировалось koMon, 18.03.2025 в 21:02. |
||||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 626
|
Цитата:
а) Она есть не во всех версиях АвтоКада (кажется, появилась с версии 2021) б) В наноКаде (по крайней мере, в 23.1) её тоже нет в) В программе, где есть (ssget "_f" ... ) нужно будет озаботиться её проверкой и/или установкой. Так что "секрамка" - наше всё. :-)
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
ИМХО не лечится. Попробуй нечто типа
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
На https://forums.autodesk.com/t5/visua...r/td-p/9626606 нашел код для определения s/n флэшки:
Код:
Допустим есть список (setq lst (list -1754099887 175646485 927914207)), в котором перечислены серийные номера нескольких флэшек. Как определить, что флэшка (её серийный номер) попадает в этот список? Попытался сделать так: Код:
Что-то я с member напутал. ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А вот если код отформатировать, станет понятно, где скобки не на своих местах. Уж молчу про то, чтобы прогнать базовую функцию и узнать, чего она вообще возвращает. ))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 28.03.2025 в 14:57. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Функция member - самый простой способ определить вхождения одной величины в список.
Никому не известную величину в списке невозможно найти. Вообще никак Тем не менее, тема форума "Научите лиспу..." 1 Функция UsbDriveSerialNumber возвращает nil если в компьютер не воткнуто флешек, а если воткнуты - то список вида: (("D:" 1924838121)("H:" 191335465456)("F:" 456798431)) Количество элементов списка зависит от количества воткнутых в компьютер флешек 2 Берешь нужные флешки, втыкаешь в компьютер и запускаешь (UsbDriveSerialNumber) 3 Смотришь на номера и записываешь их в блокнот 4 Пишешь что-то вроде такого: Код:
|
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Спасибо!
Пункты 1-3 мне были понятны и вопросов не возникало: Цитата:
а именно: Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
А провернуть entget не судьба? )
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 11.07.2022
Сообщений: 765
|
Изменяю строку 18, но не получается
В 4 строке выбираютя, а в 18 проверяются, убрать проверку? Последний раз редактировалось Ingpro, 05.04.2025 в 08:08. |
|||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
Если ты используешь в ssget фильтры, то в наборе будут только объекты удовлетворяющие фильтру - других не будет. Это даже видно при выделении объектов
И присоединяюсь к Текст мультивыноски не в 1-й группе находится И лучше все-таки не (exit) использовать |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Да вашу ж за ногу! Разницу между MLEADER и MULTILEADER вообще видно или нет? 18 строка не нужна, у тебя проблема в фильтре ssget! Там кто править будет - Пушкин?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Доброго!
Имею динамический блок с атрибутами. Требуется маркировать этот блок при помощи мультивыноски (Multileader). Скрипт должен создавать мультивыноску, содержащую два поля, ссылающихся на блок: Первое поле — значение атрибута блока Второе — его длина (один из динамических параметров). Скрипт прекрасно работает, если ссылаться только на одно из этих полей — либо атрибут, либо длину. Однако, если попытаться объединить оба поля в один текст, мультивыноска создается, но остаётся пустой. Ниже приведены три команды. Они идентичны, за исключением одной закомментированной строки в test1 и test2. test1 и test2 работают корректно. test3 рисует мультивыноску, но текст в ней отсутствует. Я прилагаю файл .dwg, в котором показан результат выполнения каждой из команд. Надеюсь, кто-нибудь сможет объяснить вечному чайнику, почему test3 не работает ![]() Код:
__________________
Блог Последний раз редактировалось Red Nova, 10.04.2025 в 15:33. |
||||
![]() |
|
||||
Регистрация: 10.01.2020
Сообщений: 420
|
1 Ты не приложил функции (get-all-atts) и (Get-ObjectID-x86-x64)
2 Я нашел их в интернете, но test2 не запускается. Возможно ты не последний вариант программы выложил. Насколько можно судить (get-all-atts) возвращает список из точечных пар (ИМЯ_АТРИБУТА . ЗНАЧЕНИЕ) В строке 43 ты пытаешься скормить ей вот это (caddr (assoc "TYPE" attlst)) - результат caddr указанной точечной пары не существует - будет ошибка. Даже больше - для такой пары есть только car и cdr 3 Функция (Get-ObjectID-x86-x64) принимает в качестве аргумента только указатель на объект - ENAME или VLA-OBJECT Тебе нужно получить объект АТРИБУТ и уже его передавать в (Get-ObjectID-x86-x64) |
|||
![]() |
|
||||
Спасибо за ответы!
name02 Цитата:
koMon Работает! Но требует regen, а для большого файла это тормозить будет. Хотелось бы без regen
__________________
Блог Последний раз редактировалось Red Nova, 10.04.2025 в 15:49. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Можешь попробовать (entupd (entlast))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Не работает
![]() Также как и не работает (command ".updatefield" (entlast) "")
__________________
Блог |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Вставка в таблицу поля, соотвествующего площади примитива | Profan | Готовые программы | 272 | 06.06.2021 23:12 |
Сейсмозащита и сейсмоизоляция существующих, построенных зд. | IANationalInformAgentstvo | Прочее. Архитектура и строительство | 216 | 20.01.2015 16:51 |
Мониторы LCD CRT | Разное | 94 | 17.06.2008 10:51 | |
ЮМОР 2006 =) | Perezz!! | Разное | 1122 | 04.01.2007 00:46 |