|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
|
||||
Цитата:
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,653
|
Цитата:
|
|||
|
||||
хм... что то лыжи не едут.
Вроде как с акад 2015 было новшество на тему командных методов command и vl-cmdf Сейчас заметил, что в акад 2021 благополучно работают коды, которые работать и не должны бы... они что ли вернули поддержку command для обратной совместимости?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ты не забывай еще и про наличие 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
С.-Петербург
Сообщений: 39,832
|
Кто это говорил и где? Она работает, только в другом режиме.
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 39,832
|
А не проще ли системную переменную менять?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ключи в реестре как правило все же меняются. Другой вопрос, что не стоит менять ключи, касающиеся самого ACAD'a. Так, например, можно поменять пути поддержки в реестре, и изменения даж сохранятся в реестре - но а) они не подхватятся и б) при закрытии ACAD'a все пути вернутся в начальное состояние. Поэтому и приходится работать через переменную окружения "ACAD".
По крайней мере такое было раньше, и я подозреваю, что вряд ли система изменилась.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
А с какого перепугу ты работаешь с переменной окружения, когда надо работать с системной переменной?
Не setenv / getenv, а setvar / getvar
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Если бы все было так просто. Системная переменная отвечает за другое - она активирует либо деактивирует функцию. Ключ в реестре же, ответственен за то будет или не будет присутствовать иконка данной функции в статус-баре. Мне нужно получить второе.
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Провокационные вопросы
1. Если поменять в самом каде - в реестре данные меняются? 2. Если "снаружи" руками поменять в реестре данные - статусная строка меняется? Если да, то сразу или нет? 3. Если реестр правился снаружи, что будет после выхода из када? Что-то у меня подозрения, что на лиспе подобное нереализуемо, да и не особо надо конечному пользователю.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ответ на второй вопрос - ключевой.
По поводу третьего: допустим, настройка включена. Меняется реестр, и тут же выход из ACAD. Что окажется в реестре?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Ну, меня и в таком виде бы устроило, с перезапуском программы.
Немного не понял как смоделировать подобную ситуацию. Изменить реестр с одновременным выходом из акада? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Изменить реестр. Закрыть кад. Проверить, что получилось в реестре.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Можно, почему нет?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Примерно так же, как вызываются стандартные функции. Я искренне не понимаю, в чем собственно "затык"?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Вызывай как
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Товарищи, помогите с командой: как сделать слой с именем из буфера обмена?
есть простой лисп (defun c:sloy () (command "-слой" ) (command "с" pause ^C^C) (command "ПЛИНИЯ") ) нужно, чтобы имя слоя не вводилось руками, а бралось из буфера и дальше выполнялась команда "ПЛИНИЯ" |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
ищите получение на лиспе содержимого буфера (встроенных методов вроде нет - так что через костыли), проверка: - что строка и не содержит запрещенных символов, и является ключем в таблице слоев - ну задавайте через тот же CLAYER.
----- добавлено через ~34 мин. ----- и при этом нет никаких гарантий, что в процессе работы другие программы не захотят использовать буфер обмена для своих нужд - он (буфер обмена) никак не защищен от изменений |
|||
|
||||
ну можно и без костылей. проверки на правильность имени слоя нет.
Код:
|
||||
|
||||
Регистрация: 24.03.2011
Сообщений: 12
|
Добрый день всем гуру Автокада!
Я пересел на новый компьютер и столкнулся с проблемой. Перестали работать некоторые мои программы. В частности перестали програмно заполнятся динамические блоки в мультивыноске. Вот такой кусочек кода: Код:
Новый комп AutoCad 2020, Win10, х64 Может быть кто-нибудь подскажет что делать, и куда копать? А то не хочется переделывать кучу утилит..... |
|||
|
||||
Регистрация: 24.03.2011
Сообщений: 12
|
Простите не понял вопроса...
----- добавлено через ~37 мин. ----- Ура! Заработало! Все дело оказалось в системной переменной ATTREQ. Сегодня перевел ее в "1" и все получилось. Только не понятно почему у меня вчера не получалось, я ведь ее менял. Вчера при ATTREQ="1" выскакивало окошко заполнения динамического блока вручную.... Видимо вчера я в процессе экспериментов изменил еще какую-то системную переменную... Вот бы узнать какую))).... |
|||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Доброго дня!
Хочу создать набор примитивов (текстов), в который входили бы только тексты-числа (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
С.-Петербург
Сообщений: 39,832
|
Если однострочные тексты не содержат букв и начинаются с чисел (возможно, пробелов) - то как вариант:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.03.2011
Сообщений: 12
|
|
|||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Добрый день!
Хочу построить перпендикулярный отрезок относительно точки на кривой. Используя 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
С.-Петербург
Сообщений: 39,832
|
Возможно, ОСК и МСК совпадают.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Все функции vlax-curve-... в случае выдачи результата в виде точки выдают их в МСК.
Исключением является vlax-curve-getFirstDeriv. Координаты вектора направленности выдаются в СКО. Как эти координаты преобразовать в МСК? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
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
С.-Петербург
Сообщений: 39,832
|
first deriv = первая производная от кривой в указанной точке. Вектор.
(vlax-curve-getPointAtParam (car (entsel)) 0.5) что вернет?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
|
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Где эта точка будет лежать? Скорее всего, на нижней горзонтальной грани прямоугольника. Вот вектор касательной и показывает направление Х
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Какая система координат для значений векторов??
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Параметр 0.5 говорит о том, что лежать она будет ровно посередине между нулевой и первой точкой полилинии. Функция vlax-curve-getPointAtParam вернет координаты этой точки в МСК, вот и все. Вектор направленности можно я так понимаю получить лишь функцией vlax-curve-getFirstDeriv
----- добавлено через ~2 мин. ----- А как это определить? Есть какая то системная переменная? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Еще раз. Первая производная - это первая производная. Вектор, а не точка. Трехмерный, поэтому там и три координаты. Получишь вторую производную - что будет?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
получу координаты вектора второй производной
От первой производной получу координаты вектора первой производной. Есть точка на кривой (в МСК), есть координаты вектора первой производной (в ОСК вопреки мануалу). Имею 2 точки - могу построить нормаль, но надо перевести координаты вектора первой производной (вектора направленности) из ОСК в МСК. КАК??? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Я не могу объяснить, что вектор не имеет координат. У него есть только направление, и все.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Ладно, как нормаль то построить тогда?
----- добавлено через ~6 мин. ----- Призадумался я что то... Физический смысл vlax-curve-getFirstDeriv я понимаю следующим образом. Есть точка на кривой, она является НАЧАЛОМ ВЕКТОРА, результирующая точка функции vlax-curve-getFirstDeriv (первой производной) - КОНЕЦ ВЕКТОРА. Конец вектора указывает его направление. Прошу поправить, если неправ. |
|||
|
||||
|
||||
|
||||
ятд, что поскольку первая производная это 3d вектор в мск, то его направление будет от нуля в мск до полученной 3d точки при выполнении функции получения первой производной.
|
||||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Функция vlax-curve-getFirstDeriv
Вычисляет первую производную (в МСК) к кривой в точке, заданной параметром. (vlax-curve-getFirstDeriv <кривая> <параметр>) Аргументы: <кривая> - примитив или VLA-объект, соответствующий кривой; <параметр> - значение параметра, определяющее положение точки на кривой. Возвращаемое значение - список из трех вещественных чисел (координаты вектора первой производной). Т.е первая точка вектора определяется аргументом <параметр> Вторая точка вектора - результат функции vlax-curve-getFirstDeriv Направление будет от первой точки (заданной аргументом параметр) ко второй (полученной из результата функции vlax-curve-getFirstDeriv) Вся беда в том, что координаты второй точки выдаются вопреки мануалу не в МСК, а в системе координат объекта. А функция trans их не преобразовывает, потому что, видимо, не воспринимает результат функции vlax-curve-getFirstDeriv как точку, а как "вектор" (чтобы дьявол его побери это не значило), хотя и принимает координаты конца вектора в качестве аргумента. КТО НИБУДЬ, ПОПРОБУЙТЕ ПОЖАЛУЙСТА, ИСПОЛНИТЬ КОД У СЕБЯ В АВТОКАДЕ Код:
|
|||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Т.е мануалы автокада врут.
vlax-curve-getFirstDeriv возвращает координаты вектора первой производной в СКО, а не МСК. И как тогда преобразовать координаты вектора первой производной из СКО в МСК Код ниже их не преобразовывает (trans (vlax-curve-getFirstDeriv (car (entsel)) 0.5) (car (entsel)) 0) С другой стороны координаты вектора первой производной не всегда лежат на кривой. Может в этом дело... Как тогда строить нормаль к кривой? Последний раз редактировалось megabeton, 11.10.2021 в 23:09. |
|||
|
||||
Да нет никакой координаты ско, первая производная это направление касательной в искомой точке. Вектору направления касательной не нужна связь с искомой точкой. Как я написал ранее, направление касательно определяется от нуля мск до результата первой производной. Перпендикуляр считать тупым прибавление к углу касательно половины пи. Skkk нарисовал произвольную полилиния, касательная в искомой точке ноль градусов, перпендикуляр плюс минус половина пи.
Вряд ли мануалы автокада могут так долго и продолжительно врать))) |
||||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
(300.0 0.0 0.0) тогда что это, если не внутренняя координата второй (первой после нулевой) точки полилинии?
Вот это ничего себе Цитата:
угол относительно каких точек берем? ----- добавлено через ~8 ч. ----- Все, понял. Неправ. Вечером уже тупил, с утра дошло. Слишком буквально воспринимал значение вектора, как направленного отрезка. Начальная точка вектора жестко ассоциировалась с точкой на кривой. Думаю слово АЗИМУТ быстрее вернуло бы меня в нужное русло)) Спасибо koMon skkkk kpblc Последний раз редактировалось megabeton, 11.10.2021 в 23:48. |
|||
|
||||
кстати очень похоже, что вектор второй производной будет не что иное как вектор нормали в искомой точке. и не надо делать лишних телодвижений)))
|
||||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Вторая производная по идее несет смысл степени изогнутости кривой в точке.
Для точки, лежащей посередине между двух точек прямой полилинии дает (0.0 0.0 0.0), т.е. изогнутость нулевая. Для аналогичных условий с полилинией-дугой выдает нечто (4.51197e-014 736.86 0.0), только не понятно, как правильно это интерпретировать в данном случае. Это координаты (и координаты ли) чего интересно? |
|||
|
||||
по идее да, но видимо не здесь. я попробовал для дуги и получил ровно вектор перпендикуляра)
|
||||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Вопрос по функции 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
С.-Петербург
Сообщений: 39,832
|
vl-catch-функции в руки Хотя я наверняка делал бы по-другому. Логику переписывал как минимум )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Сначала добейся, чтобы vla-offset (или что там на самом деле, не помню) нормально срабатывала. А потом уже можно хоть entlast сравнивать с предыдущим примитивом.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
|
||||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Хочу отбить площадь полилинии в "идеальном" месте внутри полилинии. Методом лучевого траассирования точка внутри не всегда получается в "идеальном" месте, может оказаться близко к краю. Если реализовать идею с подобием, неважно, какой изначальной формы полилиния, после подобия внутрь она будет стремится к упрощению формы и одновременно будет стремиться к "идеальному" центру. Иногда, после подобия это будут несколько полилиний, соответственно нам надо только выбрать наибольшую по площади и дальше офсетить.
Вот в конце получается ситуация, при которой офсет невозможен, и при этом программа не возвратила ни nil, ни T. Хотел понять, как это обойти, чтобы продолжить выполнения кода. Я так понимаю vl-catch поможет, пока правда не пробовал, руки не дошли. Сама конструкция кода неверная, привел для простого примера, такую вещь через while, а не через if надо реализовывать, но конечный затык в виде сообщения об ошибке идентичен. Если не лень, буду благодарен за любую посильную помощь в достройке кода ----- добавлено через ~22 мин. ----- Стоп, или это был философский вопрос, примерно как про смысл жизни?) |
|||
|
||||
нет, это был не философский вопрос))))
а если по-простецки, через штриховку? |
||||
|
||||
может. это я видимо не догнал. автоматом "отбить" площадь?
|
||||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Да, автоматом. В смысле извлечения площади полилинии и отбивки ее автоматом проблемы нет. Тут именно реализация определения точки вставки через офсет интересна.
----- добавлено через ~11 мин. ----- Нечто такое (while (vla-offset (vlax-ename->vla-object (entlast)) -50) (добавить в набор (entlast)) (после сообщения об ошибке в центре последней полилинии отбей точку) ) (удалить элементы набора) Последний раз редактировалось megabeton, 14.10.2021 в 15:31. |
|||
|
||||
офсет внутрь (отрицательное смещение) определяется ещё и направлением следования вершин плинии. против часовой - внутрь, по часовой - наружу.
|
||||
|
||||
Регистрация: 03.12.2009
Сообщений: 84
|
Да да, я в курсе, направление изменяемо, это не проблема. Плтуллс от 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
Сообщений: 84
|
Вопрос про отличие блоков, созданных разными способами.
Ситуация №1: Создал блок с помощью Код:
Код:
Код:
Создал блок через vla-copyobjects (взято отсюда https://forum.dwg.ru/showthread.php?t=76304) Код:
Код:
Результат – точка вставилась на чертеже в начало координат, а не в место вставки блока. Почему в одном случае (vlax-3d-point 0. 0. 0.) вставляет точку в точку вставки блока, а в другом в начало координат? Что нужно добавить в код к vla-copyobjects, чтобы он вел себя как при "_pasteblock" Заметил, что у первого блока в свойствах указано "Единицы блока - миллиметры", у второго "Единицы блока - безразмерный". |
|||
|
||||
немного к предыдущей теме.
Цитата:
В результате я определял положение точки относительно оси (криволинейной) таким куском кода: Код:
По текущему вопросу: Цитата:
Может, каким то невероятным образом, во втором случае базовая точка блока отличается от начала координат блока?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
|
||||
Регистрация: 20.04.2011
Сообщений: 402
|
Подскажите, есть ли изящный способ понять направление обхода по трём точкам? Пользователь указывает три точки на плоскости. Мне нужно понимать направление, - по часовой или против?.
Стоит задача вычислить точки Ферма-Торричелли в произвольном треугольнике. Алгоритм довольно простой и тестовый алгоритм у меня работает, но только в тех случаях когда точки указываются по часовой стрелке. Код пока такой: Код:
-------------- update сделал через скалярное произведение Код:
Последний раз редактировалось gumel, 22.10.2021 в 07:27. |
|||
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107
|
Что-то под конец рабочей недели запутался с формированием списков
Допустим есть список (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
С.-Петербург
Сообщений: 39,832
|
(append (list a b) (list c))
(cons c (list a b))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Цитата:
----- добавлено через ~10 мин. ----- в том же ObjectArx/.Net есть метод RemoveVertexAt, но в ActiveX его решили не "вытаскивать" в публичные методы, видимо |
|||
|
||||
Регистрация: 23.01.2005
spb
Сообщений: 120
|
всех с новым годом однако!
теперь вопрос. хочу ткнуть мышкой в экран и получить простенький текст с координатами ткнутой точки. соорудил следующее: (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
С.-Петербург
Сообщений: 39,832
|
luprec ?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Я бы думал в сторону "не сильно простого" кода. Что-нибудь такого типа (варианты разных систем координат не учитываются):
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
???
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
shishoq, чего такого? можно еще и закодить значение по умолчанию с возможность поменять на требуемое в процессе выполнения.
Код:
с прошедшими
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Здравствуйте. Я из начинающих липсогрызов, о которых в первом посте)
Подскажите, что у меня не так в программе. При открытии нового файла чертежа, она строит второй примитив, но некорректно, не строит в отрицательную сторону от точки 0.0.0. Потом "слетает" и выдает сообщение о том, что ящик нулевой длины не допускается. В консоли, списки координат выдает правильные. ----- добавлено через ~22 ч. ----- Разобрался. Привязки надо отключать. Последний раз редактировалось Alxndr1697, 06.02.2022 в 21:32. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
И при чем тут инетовская ошибка?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
А, сорри. Ну да, аркада померла уже очень давно
Как эрзац-альтернативу можно попытаться использовать https://autolisp.ru/2009/09/13/error-catch/ - но там совсем уж мало ((
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
atoi заменить на atof ?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Именно так. Спасибо.
Теперь у меня не получается извлечь данные из выпадающего списка. (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
С.-Петербург
Сообщений: 39,832
|
1. Со скобками совсем бяда
2. Функции nht не знаю. nth - да, слышал 3. Без хоть какого-то куска кода дальше разговаривать особого смысла не вижу.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
1. В сообщении, орфографические и программные. Но, я понял.
2. А вот это да, моя беда. Бывает, путаю местами буквы и потом теряю кучу времени на поиск ошибок. 3. Не хотел выкладывать, дабы не шокировать, но, видимо, придется. И да, я знаю, как с новичками бывает трудно Последний раз редактировалось Alxndr1697, 18.02.2022 в 07:11. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Код:
Offtop: Грабли №2 тоже могут подпортить жизнь. Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
По поводу граблей, там говорится про какие-то красные отрезки... В общем, проверить не получилось.
Вторые, для меня, - темный лес пока. По поводу оформления, понял. Скобки напротив и ключ на первое место. Код (setq s_k (atoi (get_tile "S_ko"))) возвращает номер строки выпадающего списка, а надо бы содержание. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ну так примени nth, делов-то
Оформление lsp/dcl кода - чистой воды вкусовщина, на мое кривое-косое-лысое-седое-далее по тексту мнение можно не ориентироваться.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Применяю, - ничего не получается.
(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
С.-Петербург
Сообщений: 39,832
|
Ну так передавай в dcl не ключи, а списки через те же start_list, add_list, end_list
Если будет интересно что и как еще можно в dcl сделать: https://autolisp.ru/2015/02/05/dcl-develop/
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
|
||||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Алексей, koMon, спасибо, но, еще раз, - я совсем начинающий и "чего проще..." и "перелопатить в список", для меня не так просто и не совсем понятно.
В итоге, на сегодняшний день, у меня так ничего и не получается. Руки опускаются... Перепробовал уже все (на свой взгляд, конечно). Прошу помощи в виде работающей функции. Только, пожалуйста, - попроще, чтобы можно было понять и разобраться новичку. Проблемы с функцией -функция raz_panel- ----- добавлено через ~2 мин. ----- Код:
----- добавлено через 29 сек. ----- Код:
Буду рад любой критике и поправкам! Последний раз редактировалось Alxndr1697, 22.02.2022 в 06:35. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
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
Подольск
Сообщений: 168
|
koMon, благодарствую! Благодаря вашей функции, нашел ошибки в своей и она работает, даже в моем варианте)))
----- добавлено через ~10 ч. ----- Вопрос: Как сделать, чтобы после неверного ввода осуществлялся не выход, а возврат в диалоговое окно, для последующего верного ввода? Код:
Подозреваю, что программу надо сначала вывести из состояния ошибки, или сброс, а потом запускать заново, но не знаю как. Код:
Последний раз редактировалось Alxndr1697, 24.02.2022 в 06:35. |
|||
|
||||
если речь идёт о компоненте диалога :edit_box, то проверять правильность введённых данных нужно на выходе из компонента/подтверждении введённых данных в компоненте, то есть должна быть функция проверки введённых данных по результату которой осуществится выход или не выход из компонента, причём это не должно влиять на выход их диалога.
|
||||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Прошу прощения, эту програмку я написал для примера, чтобы разобраться с диалоговым окном...А так-то, я "строю" шкаф
Цитата:
Код:
Код:
Код:
И, пользуясь случаем, просьба, если есть время и желание, посмотреть на наличие грубых ошибок, т.е. то, что надо исправить однозначно. Последний раз редактировалось Alxndr1697, 24.02.2022 в 21:43. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Насколько я помню, это выход не из диалога, а вообще из программы. Стараюсь подобного у себя не допускать.
Из исправлений, которые я бы сделал:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
1. Это удобство, или ошибка? И это делается при помощи вла? До него я еще не дошел.
2. Других вариантов пока не знаю. 3. Читаю все, что вы предлагаете, правда, не все понятно пока. 4. Какая это функция, дайте направление. 5. Спасибо, буду изучать. Представляете, - мне уже тоже))) но, как могу, так могу. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
может разбивать на подфункции?
и в более современных языках программирования с удобной средой разработки функция с ~15 аргументами вызовет определенное офигевание удивление) |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Offtop: https://autolisp.ru/2009/09/20/howto_undo/
Системная переменная nomutt (как минимум), если без команд ну вообще никуда и никак. Это не функция (по крайней мере штатная). А так-то можно нарисовать нечто типа: Код:
Сголашусь с Сергеем: Та же самая функция построения бокса - легко может быть сделана как локальная функция, которая возвращает либо указатель на созданный элемент, либо nil. А "снаружи" уже проверять результаты и предпринимать какие-то действия. Но это все так, размышления на тему. Мои слова не стоит воспринимать уж сильно всерьез
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Может. Дайте, пожалуйста, пример.
Почитав начало темы, я, видимо, сделал неправильный вывод. ----- добавлено через ~1 мин. ----- Посоветуйте учебник, видеокурс, или что-нибудь, где можно этому научиться. Последний раз редактировалось Alxndr1697, 25.02.2022 в 07:36. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Alxndr1697, сугубо ИМХО.
Если какой-то код длиннее 3..5 строк с оооочень незначительными изменениями (ну, например, имена используемых переменных) копипастится хотя бы раз - его надо в отдельную функцию выносить. Т.н. принцип DRY: Don't Repeat Yourself (никогда не повторяй за собой). Числа в именах переменных есть зло, если только у тебя не стоит задача максимально запутать код. Если в переменной, к примеру, хранятся координаты точки, то и называть ее надо максимально информативно. К примеру, base_point / top_left_point и т.д. ВО VLIDE Ctrl+Shift+Пробел помогут в наборе таких длинных имен. Ну и так далее. Цитата:
Ну и так далее.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Цитата:
и если на английском хотя бы читаете более менее - справка. Там тоже примеры кода есть. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
|
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Цитата:
Также внутри класса есть возможность создавать внутренние поля-переменные (куда заносятся те же параметры создания). А так же есть возможность создавать внутренние методы, имеющие доступы к этим полям (т.е. не надо загонять в аргументы внутренних методов) и эти методы выполняют каждый свой кусочек работы по созданию шкафа (т.е. можно отлаживать по отдельности). И при этом нет никаких конфликтов с другими частями программы даже при совпадении имен внутренних переменных и методов, так как инкапсуляция является одной из основ ООП. А в лиспе ничего этого нет - либо локальная переменная функции, либо глобальная переменная, значение которой может в любой момент изменить любая другая функция кода - о чем и писал Алексей выше Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ну, при желании и в лиспе можно "перегрузку" организовать
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Цитата:
|
|||
|
||||
Alxndr1697, это какой-то мебельный шкаф что ли?
|
||||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Да, он самый. Мне надоело перерисовывать чертежи, которые приходят мне в работу и дабы облегчить себе труд и сократить время перерисовки, решил "освоить" лисп, чисто в личных нуждах, а дальше посмотрим.
----- добавлено через ~15 мин. ----- Цитата:
Отчего-то я решил, что ЛИСП, - это азбука, не изучив которую, дальше нет смысла идти. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Сейчас пробую что-то ковырять в C#, весьма увлекательно. Правда, вопросы в 99% случаев не касаются ACAD'a
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
лисп - это лишь средство взаимодействия с базой данных чертежа и акадом в целом. Причем со своим синтаксисом и очень нишевой применимостью.
Если есть эксель, то можно попробовать перерисовывать через COM - интерфейс. Заодно в самом экселе делать расчеты и хранить вспомогательные данные на листах. Но через COM не все доступно. Последний раз редактировалось Сергей812, 26.02.2022 в 00:08. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Offtop: Сергей812, мне кажется, советовать VBA, да еще и с ранним связыванием... Я бы не стал двигаться по этому пути, честно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Offtop: ну это лишь один из вариантов, учитывая что VBA для мс офиса встроенный родной язык) А после отладки убирается ссылка на библиотеку акада и раннее связывание быстро переделывается на позднее. Но согласен - лучше, конечно, работать "изнутри" акада, а не через COM-прокладку со своими глюками.
|
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
Извините, пожалуйста, но у меня осталось желание "допилить" свой шкаф в лиспе))) |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
А также сделать надежные функции ввода данных, потому что штатные "get=xxx" не защищены от действий пользователя. Нажмет ESC и вся программа рухнет. Т.е. надо сформировать библиотеку функций - каждая из которых короткая, с минимумом аргументов. А уже с использованием библиотеки делать конечные команды-функции для конкретных шкафов-диванов, и вообще всяких "из досок". Каждая из них будет очень короткой, надежной и легко читаемой. Стоит подумать - а нужен ли вообще здесь диалог на DCL. Это ведь реликт давних времен, когда ничего лучшего не было. Разрабатывать такие диалоги не так уж и сложно, но очень муторно. В этих "шкафах" немного данных для ввода, причем многие из них условно-постоянные. Вполне может быть сделана "команда" с командной строкой, с опциями и значениями по умолчанию. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
Цитата:
Ооо, вот тут не соглашусь. В свое окно впихнул, как понимаю, с избытком, планировал еще пару параметров и, все равно, останется что подправить в модели. (Как говаривала Тося Кислицина, - "Из картошки, знаешь сколько блюд приготовить можно?" ))) |
|||
|
||||
|
||||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Цитата:
|
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
Спасибо. |
|||
|
||||
Я бы сказал, что сей труд весьма полезен когда уже научился кодить хоть что то. "САПР на базе..." неплохо вправляет мозги на тему систематизации в разработке кода.
А если говорить о повседневной шпаргалке, то скорее подойдет "AutoLisp и VisualLisp в среде Autocad" за авторством Полещука. Хотя при некоторой сноровке эту книгу заменит справка автокада, тем более что творение Полещука слегка устарело морально, акад все таки развивается помаленьку.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы... |
||||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
|
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Цитата:
----- добавлено через ~4 мин. ----- Цитата:
|
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
А если это условие не соблюдается? Что тогда делать?
P.S. Ползать по всей теме и разыскивать, в каком коде и в каком месте у тебя нестыковка - мне лениво и некогда. ----- добавлено через ~2 мин. ----- Тьфу, блин, не так! Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Код:
|
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
М-да, C#-подход уже накладывает свои ходы
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Это будет дальше следующим вопросом
Оно самое! Вот, догадывался, что с дублированием 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,381
|
|
|||
|
||||
чем именно лучше?)
эмм и потом... тут 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,381
|
Цитата:
Это просто пример. cond возвращает значение, а в ее ветвях можно записать любое выражение, также возвращающее значение. |
|||
|
||||
для понятия нахождения числа в диапазоне из двух других чисел cond ваще не вариант имхо) потому что заменяется простым if с проверкой and на граничность, что соответствует поставленному практическому вопросу, а не теории многочисленности вариантов.
|
||||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Извините, что не появлялся, уведомления почему-то не приходят, вот и думал , что тут тишина.
Вопрос, как и полагал, решил через cond: Код:
Что-то у меня с if не складывается) Что тут неправильно? Код:
пс. Решено. Замена eq на /= Последний раз редактировалось Alxndr1697, 19.03.2022 в 08:09. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
1. Зачем каждый раз вычислять (distance P_0 P_B) ? Не вижу, чтобы в данном коде переменные P_0 P_B менялись - чтобы была необходимость актуализации дистанции.
2. Здесь как раз напрашивается сделать функцию, куда передаются аргументы P_0 P_B, а возвращается длина направляющей. Либо -1, если менее 273 - а уже в вызывающей основной функции либо продолжение работы, либо alert. И так везде - где есть строго определенный законченный функционал, выносите в отдельную функцию, а в основном коде будет лишь одна строчка вызова этой функции. Читаемость кода будет гораздо лучше, и отладка проще. Есть, конечно, определенные затраты на вызов функции и обратный возврат к выполнению основной программы. Ну потом при необходимости где-то в одиночных критичных местах развернуть вызов функции в ее код с целью повышения быстродействия - но сама то программа уже будет готова, и ею уже можно будет практически пользоваться даже с этими временными лагами первое время. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
Буду признателен, если кто-нибудь напишет эту функцию ( без вла) и как ее потом вызывать, чтоб разобраться. ----- добавлено через ~5 мин. ----- Еще вопрос. Эту дистанцию можно было записать в переменную и уже, легче бы читалось. Сознательно пошел на этот шаг, чтобы уменьшить количество переменных. Это правильно, или нет? |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Цитата:
Цитата:
Код:
Ну а вызов - вызов же той же distance не вызывает затруднения, а ваша функция ничем не отличается для кода. Последний раз редактировалось Сергей812, 19.03.2022 в 12:00. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Сергей812 Благодарю!
Но, немного не пойму, зачем нужна функция? Если просто назначить переменную (setq Dist (distance P_0 P_B)) и заменить все (distance P_0 P_B) на Dist, будет неправильно? Пока нет возможности проверить... Последний раз редактировалось Alxndr1697, 20.03.2022 в 14:10. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Просто есть синтаксические ошибки (выявляется на этапе компиляции), есть явные ошибки типа передачи неинициализированных переменных и т.п. (обычно выявляются во время первых прогонов runtime), и есть логические ошибки. И если программа достаточно большая, но при этом не структурирована в логические законченные функциональные узлы (функции) - то можно очень долго заниматься поиском этих логических ошибок путем пошаговой отладки. И поддержка структурированных программ проще - вносятся изменения только куда нужно, не затрагивая уже работающее.
|
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Так это я знаю)
Делая в окне программы, я ввожу "интервал межу строками", а тут надо по другому. Как? Есть где-нибудь справочник (не справка автокада) со всеми командами, опциями команд и их последовательностью? Не всегда все так очевидно, как делаешь через окно автокада (командную строку). |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
По-моему, такого не существует. Только если постоянно эксперименты ставить. И то не факт, что удастся все варианты предусмотреть.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
|
||||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
|
|||
|
||||
Количество столбцов, расстояние между столбцами. Можно заменить на "" яд.
|
||||
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Приветствую. Споткнулся о простой, казалось бы, вопрос. Как можно зациклить вставку блока с последующим безболезненным выходом из цикла? Пробовал:
Код:
|
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
|
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Требуется помощь. Функции по отдельности работают, а вот в "кучу" собрать не могу. Причиной остановки указывает последнюю строчку (выделил красным) . Полагаю, что-то не так с переменными. Честно признаюсь, эта тема (аргументы, переменные, что где прописывать) мне непонятна, если кто может, - объясните, пожалуйста.
Код:
Код:
Последний раз редактировалось 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,038
|
терминологическое уточнение
не активные - а у переменных есть области видимости. И для лиспа всего два варианта - локальная видимость в пределах функции или глобальная для всего кода лиспа. Причем чтобы создать переменную с глобальной видимостью - в лиспе достаточно просто забыть указать переменную в теле функции или ошибиться с написанием идентификатора переменной в коде. |
|||
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Цитата:
От себя также добавлю, что по теме "область видимости в AutoLISP" есть замечательная статья на сайте Алексея Кулика. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Browning Zed, спасибо, очень доходчиво.
----- добавлено через ~6 мин. ----- Цитата:
Насчет имен, у меня, вроде, разные везде. Или, это просто предупреждение Последний раз редактировалось Alxndr1697, 01.04.2022 в 07:48. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Переделал программу. Теперь причиной остановки указывает выражение (выделил красным), которое в программах, по отдельности работало нормально.
Да что в нем не так??? Код:
Последний раз редактировалось Alxndr1697, 03.04.2022 в 19:09. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Какое сообщение об ошибке?
Offtop: Сугубо ИМХО: код следует переработать полностью. Начиная с переименования функций и их локализации и документирования, заканчивая общим принципом. Могу, если хочется, снять видосик, почему этот код не подлежит отладке.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Текстового сообщения нет, просто выделение.
Цитата:
Вот, его-то, я никак не поймаю, видимо. Последний раз редактировалось Alxndr1697, 03.04.2022 в 20:23. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Alxndr1697, видосик записать не удалось - что-то не то у меня с виртуалкой. Так что текстом
Прежде чем читать - все это личное мнение, никого ни к чему не обязывающее. Дисклеймер: будет много ссылок на мой сайтик. Представленный код невозможно протестировать. В принципе невозможно. Причина номер раз - это использование диалога (которого, естественно, у меня нет). Я понимаю, что можно покопаться по форуму и найти тот самый dcl. Но как-то подобное не комильфо - не проще ли создавать диалог "на лету"? Причина номер два - именования функций и переменных. Функция re_name (к примеру), судя по названию, должна там что-то переименовывать. А делает она совсем другое. Причина номер три - это видимость функций и переменных. Все внутренние функции объявлены как глобальные. Отличный шанс выстрелить себе в ногу Далее. Мое искреннее убеждение состоит в том, что любая (подчеркиваю - любая!), даже локальная, функция должна работать только с теми данными, которые в нее прилетели и не лезть во внешние переменные. Та же raz_fasad (кстати, по имени можно решить заранее - что оно делает?) у меня была бы переписана примерно так: Код:
Код:
Код:
Дальше - я бы постарался максимально отказаться от использования командных методов. Так, например Код:
Код:
Код:
Код:
На предмет переопределения глобального обработчика *error* я уже когда-то высказывался. Кстати, у тебя там не возвращаются обратно системные переменные. И метка окончания отмены не ставится, что может привести к неприятным последствиям. Ну и по поводу запроса точек и прочего Сорян, накидали работы. Пока заканчиваю.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
По поводу наименования функций - чтобы не запутаться, можно придерживаться псевдоиерархии:
Fasad_%Тип фасада%_Create - создание фасада Fasad_%Тип фасада%_Create_%Fun01% Fasad_%Тип фасада%_Create_%Fun02% - это подфункции создания отдельных частей фасада данного типа Fasad_%Тип фасада%_Create_%Fun03% и не надо их куда-то прятать, уже по идентификатору функции видно - где она должна вызываться. И что функция Fasad_%Тип фасада%_Create не может (не должна, точнее) вызываться внутри Fasad_%Тип фасада%_Create_%Fun01%. И данные передаются в эти подфункции через аргументы. И если под рукой тот же эксель - не ленитесь делать простейшие таблички копипастом: название функции, назначение аргументов, возвращаемое значение, примечание. В табличном виде гораздо проще воспринимать информацию, чем в простынях кода. |
|||
|
|||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
"На лету", - отличный вариант! Но,- VLA... Цитата:
Цитата:
Цитата:
Raz_fasad считывает содержимое из диалогового окна, вроде как размеры фасада. Такие уж у меня ассоциации. Хотя, в окне, назвал это параметрами)) А вот дальше, то самое Но, о котором писал выше. Мне жутко неудобно, что вы потратили на меня столько времени, но, в VLA я не понимаю, от слова совсем((( По поводу запроса точек, идею понял, попробую применить. ----- добавлено через ~11 мин. ----- Для этого у меня вся программа в комментариях. Это для форума я их "чищу", думаю, что они будут мешать. Последний раз редактировалось Alxndr1697, 04.04.2022 в 22:21. |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ага, только одно "но" - это callback. Которого особо не видать
Какое vla-? Тупо получение каталога временных файлов, создание файла, запись в него и далее по тексту. Вроде бы в ссылках было. Цитата:
Советую поискать на youtube видосики от Сергея Немчинского. Он, хотя и джавист, но вещи озвучивает очень серьезные и важные. В том числе и про правило 20/80, про чтение кода, про аналитику кода и все вот это вот.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
defun Имя_функции ( аргументы или параметры / локальные переменные)
1. Аргументы могут дублироваться (по имени) произвольное количество раз в разных функциях, но при этом конфликта не будет - так как область видимости аргумента: только внутри функции. 2. Локальные переменные - аналогично. это просто расширение лиспа, позволяющее делать многие вещи не через комстроку, а вызовом напрямую функций с передачей им необходимых аргументов. Ведь каждый раз, когда обращаетесь к командному процессору акада внутри функции - по сути прерываете выполнение функции с передачей управления самому акаду. И вернет ли акад управление в вашу функции сразу, или захочет чем-то своим заняться.. Никак не управляемо и не предсказуемо |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
Или, опять, что-то путаю? Код:
Цитата:
Внешние переменные, - это которые в DCL? Последний раз редактировалось Alxndr1697, 05.04.2022 в 07:33. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
"Внешние переменные" - это то, что по отношению к какой-то функции не прилетевшее в нее. Пример callback-функции я привел.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
Я не собираюсь становиться Программистом. Мне хотелось бы написать (самому) несколько программ, которые облегчат мне работу сегодня и, возможно, обеспечат мне ее в будущем. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Цитата:
Касаемо ошибки: проверяй, какие значения тебе прилетают. Точки останова в помощь ))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Offtop: когда физически ощущаешь - как рутинная работа начинает обходить тебя стороной, процесс мелкой и не очень автоматизации затягивает) А на дорожку программиста вы уже встали, сойдя с пути вопрошающих "а нет ли случайно у кого то программы под описанные мною хотелки")
|
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Код:
С синими строками работают оба варианта (строятся вкладные и накладные фасады). Как правильно написать условие, чтобы выполнялся один вариант, в зависимости от (= Vibor "o_nkl"), или (= Vibor "o_vkl")? Мой, красный, конечно же, не работает. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
См.в сторону cond
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Вот так, тоже не работает.
Код:
При прописывании условия, стоки (синие (пост 4209)), убирать, или они должны оставаться? Последний раз редактировалось Alxndr1697, 09.04.2022 в 07:58. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Неправильно.
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Точно. Спасибо.
Но, все равно, не работает. Отдельно (fasad_naklad), - работает. Отдельно (fasad_vklad), - работает. Вместе и с (cond), - строит оба варианта, только у накладного, почему-то не срабатывает команда "массив" |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Не хочу вникать в логику, но я бы подумал на предмет заменить
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Очевидно, что надо посмотреть, что находится в переменных H_fas_N, Z_r на момент выполнения команды array в проблемной сумме, яд.
|
||||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
----- добавлено через ~5 мин. ----- А вот Vibor, почему-то, - nil. Может тут собака зарыта? ----- добавлено через ~8 мин. ----- При включении обеих функций Vibor работает корректно. Мой мозг отказывается что-то понимать Последний раз редактировалось Alxndr1697, 11.04.2022 в 07:27. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Я уже писал, что, по-хорошему, любая функция должна работать только с тем, что к ней пришло и не лезьть во внешние по отношению к ней переменные. Если у тебя ситуация такая, что каждый лезет куда вздумается и абсолютно бесконтрольно, то могу только посочувствовать. Ну или посоветовать переписать код.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Буду весьма признателен, если кто-нибудь найдет время и желание найти и исправить ошибки.
Программа должна строить накладные, или вкладные фасады, в зависимости от выбора, в заданном количестве и параметрами. (в диалоговом окне, думаю, все понятно) Модель "шкафчика" для экспериментов прилагаю. Диалоговое окно: Код:
Код:
Последний раз редактировалось Alxndr1697, 11.04.2022 в 21:47. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Сравни свой кусок кода (для начала):
Код:
Цитата:
Код переписывать лениво.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Опять опечатка . (печатаю на клавиатуре, чтобы привыкнуть к раскладке и это, иногда, выдает подобные результаты, - копипаст мне в руки)))
К сожалению, работоспособность программы не изменилась. (кроме лишней буквы ничего не нашел) Цитата:
Понимаю ----- добавлено через ~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
С.-Петербург
Сообщений: 39,832
|
А разве vibor функция, чтобы что-то возвращать? По-моему, это все же переменная, в которой что-то хранится. Не путай теплое с мягким. Как лично у меня выглядел бы код (правда, без основной реализации построения - на это уже нет ни времени, ни сил):
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Ухтыж
Да это космос, для меня. В выходные попробую что-нибудь понять. Цитата:
----- добавлено через ~2 мин. ----- Жаль конечно, что моя программа не заработает |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Да ну, там все достаточно просто. Выполнено разделение логики (хотя бы частично), повторяющийся код вынесен в отдельные локальные функции - и все.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
Код:
А если пытаться сходу и побыстрее, то получится "взрыв на макаронной фабрике", в котором никто не разберется. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Offtop: Конечно, стоило бы. Но на практике я все время забываю это сделать
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Подскажите, как создать группу?
В командной строке, - команда, выбор объектов, ентер. Пишу в программе (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
С.-Петербург
Сообщений: 39,832
|
Создавай объекты некомандными методами. И насколько тебе нужен именно массив? Может, проще будет вообще все в блок засовывать сразу?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
По плану, эту программу дописать и заняться изучением.
Другого способа не вижу. Пробовал. Все равно, надо выбирать "второй" блок и проблема (для меня) в том, что если в рисунке предполагается потом рисовать ящики с другими параметрами, вставляется этотже блок. Решения не нашел. Хотел попробовать через группу, - не получилось, да и проблема с выбором осталась бы, наверное. ----- добавлено через ~2 мин. ----- Комп еще поломался((( |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Чего там изучать-то?
(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
Подольск
Сообщений: 168
|
Легко Вам говорить)))
У меня, почему-то, не работает. Неужели нет решения? Осталась только эта команда для завершения. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Че ета не работает? Пример вызова есть, функция возвращает vla-указатель на созданный бокс. vla-copy для него, vla-move для созданной копии - и вперед!
----- добавлено через 35 сек. ----- В качестве подсказки: http://www.cad.dp.ua/stats/vla_doc.php
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
----- добавлено через 55 сек. ----- Полюбасу, чета не так делаю))) ----- добавлено через ~3 мин. ----- Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Цитата:
Попробуй вызов, подставь свои значения, запомни результат. К примеру: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Цитата:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
ятд надо создать выборку объектов, которую затем можно запихнуть в массив:
Код:
и командные методы, тут я согласен с Алексеем, надо юзать activex!) |
||||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Заработало
----- добавлено через ~24 мин. ----- Тут, видимо произошло некоторое недопонимание. То, что я назвал ящиком, это не бокс, это "мебельный ящик" в самом прямом смысле слова, который состоит из пяти примитивов с четвертями и пазами. ----- добавлено через ~17 мин. ----- koMon Спасибо!!! Все получилось! Последний раз редактировалось Alxndr1697, 22.04.2022 в 22:21. |
|||
|
||||
Да нет, я именно предлагал заменить рисование 3d боксов, команда box, вставкой блоков. Правда для операций вычитание... потребуется их членить.
Потому что никто не запрещает её использовать так) последовательно назначать ей следующий примитив после отрисовки второго ящика после последнего до операции отрисовки второго ящика до окончания примитивов базы. Как-то так, но сам вопрос не очень понятен. |
||||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
Вот и получается, что имя именно должно быть неизменным, а почему, мне не понятно. Хочу понять логику, когда переменная может переопределяться в процессе работы программы, а когда нет. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
"Имя" = "наименование переменной"?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Цитата:
|
||||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Прошу прощения за задержку, - умчался на работу.
Да. Цитата:
Собственно в этом и был вопрос, почему наименование переменной должно оставаться тем же? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ну хотя бы потому, что внутрь одной переменной можно засовывать разные данные.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
если переменная больше не нужна - ее можно использовать повторно. Поскольку в лиспе динамическая типизация - то переменной можно присвоить любое другое значение.
И строка Код:
Код:
|
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
Для меня непонятным остается, почему, в данном примере, нельзя переименовать (создать новую) "синюю" переменную? Это я думаю, что она новая, а получается, что они все связаны. Как? |
|||
|
||||
(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,038
|
имя переменной - это псевдоним области (ячейки) оперативной памяти чисто для программиста. Когда на начальном этапе писали на машинном языке (из-за ограниченных ресурсов первых ЭВМ), то там псевдонимов не было - работали напрямую с ячейками памяти. Потом по мере увеличения объемов памяти и производительности ЭВМ стали появляется промежуточные языки высокого уровня, где программист писал уже на более понятном языке языковые конструкции - а в процессе компиляции/интерпретации эти языковые конструкции превращались в машинный исполняемый код.
Насчет связанности - как уже ранее говорили, у каждой переменной есть своя область видимости: где ее могут читать и модифицировать. Есть свои нюансы: аргументы - по умолчанию обычно копируются значения и внутри функции работают уже с копиями входных значений. Локальные переменные функции - на входе в функцию либо при первом использовании под них выделяется память, при выходе из функции - память освобождается (как и из под скопированных аргументов). И есть глобальные переменные - под них выделена память, и они висят в отдельной области памяти, пока их в явном виде не удалят. И чтобы не было сюрпризов, надо писать код как говорил выше Алексей - функция принимает аргументы (копирует их во внутренние временные переменные), обрабатывает с использованием локальных переменных и возвращает результат. А глобальные переменные использовать только если уж совсем без них не обойтись, при этом желательно им давать смысловые длинные имена - чтобы случайно не было конфликтов из-за совпадения с локальными переменными. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
koMon, Сергей812 Спасибо, разобрался.
Цитата:
Вот в таком виде у меня в голове все устаканилось koMon, спасибо за наглядный пример. Код:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
(vla-put-displaylocked <vla-указатель> :vlax-true)
P.S. Здесь обучение лиспу, если что.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
|
||||
|
||||
инженер-гидротехник Регистрация: 08.02.2015
Москва
Сообщений: 41
|
Добрый день. Сейчас осваиваю программирование на LISP
Хочу сделать блок при помощи activeX Блок простой. Две отрезка под углом с сопряжением. Знаю как создать отрезки (при помjщи метода addline), но вот метода для создания сопряжения не нашел. Какой метод использовать что бы создать сопряжение между отрезками при помощи activeX? |
|||
|
||||
инженер-гидротехник Регистрация: 08.02.2015
Москва
Сообщений: 41
|
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
vla-addarc
Правда, придется вычислять вообще все
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
инженер-гидротехник Регистрация: 08.02.2015
Москва
Сообщений: 41
|
Вот кусок кода который хочу сделать. Упражнение просто для обучения. Блок из двух отрезков с сопряжением. ранее сделал такой же без ActiveX.
Насколько я понял дугу в блок можно запихать (по аналогии с линиями) только при помощи vla-addarc. другого пути нет? Может есть метод что бы запихнуть в блок вместе с линиями произвольный (в моем случае уже созданную дугу) vla Объект ? Код:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Команда не сработает. Я бы добавлял примитивы в пространство модели, делал над ними соответствующие операции, а потом уже указатели на отрезки + entlast (полученный в результате _.fillet) загонял в блок. Это (как мне кажется) будет одним из самых простых способов.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
инженер-гидротехник Регистрация: 08.02.2015
Москва
Сообщений: 41
|
Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
vla-copyobjects в помощь А потом уже и vla-insertblock
Командные методы создания блока не могу порекомендовать. ----- добавлено через ~22 мин. ----- Хотя, посмотрев на исходный код, можно использовать нечто типа Код:
----- добавлено через ~23 мин. ----- Offtop: Код особо не тестировал и не проверял. Так, в тепличных условиях...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Инженер Регистрация: 27.04.2009
Deutschland
Сообщений: 208
|
Уважаемые Гуру, накидал код на скорую руку по печати выборочного фрагмента чертежа по заданным параметрам посредством программы приПринтер. Интересует вопрос, почему так долго выполняется программа? Это где то мой косяк или тут сложности "железного" плана - типа связь с сервером, настройка печати? Возможно ли как то найти причину тормоза?
Тут сам код. Offtop: Он изобилует комментариями, я для себя каждый шаг прописал. Как показала практика, код забывается быстрее чем хотелось бы, а когда нужно сделать или изменить быстро, то долго заново вникать в каждую строку. Потому что программировать приходится "раз в сто лет". А тут еще и обновление на новый автокад сделали (этакий подарок мне на 15-летие усердной службы на фирме - за что барину огромный поклон ) Код:
Оказалось все намного проще - нужно было сбросить системную переменную Backgroundplot в ноль. Увы, не догадался сразу. |
|||
|
||||
Регистрация: 08.09.2013
Сообщений: 21
|
Здраствуйте в проектной организации у наших компьютерщиков я вытянул вот этот код
Код:
Код:
Последний раз редактировалось nikkomp, 26.10.2022 в 12:08. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
А должен?
Offtop: И чем не устраивает почти штатный _.mocoro ?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Никак. Ты при всех операциях уже указываешь все необходимые точки.
P.S. И ты себе такие грабли подготовил - пальчики оближешь! Поменяй ради приколу copymode, посмотри, как оно работать будет.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107
|
Подскажите пожалуйста такую ситуацию.
Делаю определенную замену текста в примитиве MLEADER: группа (304 . "заменяемый текст") посредством SUBST После выполнения entmode меняется цвет значения текста в MLEADER на значение "по слою", несмотря на то, что внутри MLEADER текст имеет свой цвет (знаю что не правильно, но так получилось) Код:
Последний раз редактировалось Sege, 03.11.2022 в 11:17. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Значит, меняется не только эта группа. Ну или их несколько.
А кто мешает работать через ActiveX? ----- добавлено через ~9 мин. ----- Кстати, приведи пример такой выноски - что-то мне не удалось сделать цвет только текста отличным от цвета мультивыноски.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107
|
Цитата:
UDP: кажется понимаю в чем дело: в тексте мультивыноски в группе 304 уже сидит внутреннее форматирование цветом (304 . "{\\C4;СТАРЫЙ ТЕКСТ}") а SUBSTом мы тупо меняем на новое значение без учета знаков внутреннего форматирования, т.е. получается уже конструкция (304 . "НОВЫЙ ТЕКСТ") Последний раз редактировалось Sege, 03.11.2022 в 13:18. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Так у тебя там принудительное форматирование выставлено!
----- добавлено через ~2 мин. ----- Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107
|
Да, Алексей, это я уже увидел Т.е. тогда достаточно произвести обновление значения текста с сохранением внутреннего форматирования )
Последний раз редактировалось 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
С.-Петербург
Сообщений: 39,832
|
Ну так получи активное пространство и бери его имя, делов-то
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
(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
С.-Петербург
Сообщений: 39,832
|
Ну, во-первых, в расширенном редакторе есть возможность показывать нормально форматированный код.
Во-вторых, что там перед локальным defun'ом делает символ "<"? В-третьих, что за ошибка? И в каком месте? ----- добавлено через ~2 мин. ----- И зачем выполнять перевод точек из мировой системы в пользовательскую? Короче, проверяй значения каждой переменной перед вызовом команды
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ни разу не сталкивался. Приведи пример такого файла, где ctab возвращает неверный результат
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 19.08.2022
Сообщений: 71
|
Цитата:
Цитата:
Ошибка в том что лисп в пространстве листа не пашет! (а в пространстве модели работает прекрасно) Моя логика подсказывает что нужно изменить вот эту строчку ↓↓↓, но я могу и ошибаться (это просто мое мнение) "model" ; Имя листа или [?] <Модель>: (такая она была сначала) (getvar "ctab") ; Имя листа или [?] <Модель>: (такая стала она теперь, но по прежнему не пашет в простр-ве листа) Цитата:
пробовал разные все получилось (центрировать, замена формата и т.д.) кроме, того чтоб лисп работал в пространстве листа |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Я про переменные, а не про печать. На твоем месте я бы почитал книгу "AutoCAD язык макрокоманд и создание макросов" (есть в Download). Спойлер: тогда поймешь, что сначала надо команду пройтись "руками", последовательно отвечая на все ее запросы - и тогда появится хоть какой-то шанс на то, что макрос/программа корректно сработает.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 19.08.2022
Сообщений: 71
|
Цитата:
----- добавлено через ~3 мин. ----- Какой у тебя лисп работает? Который ты во вложении скинул? (У меня он почему-то не пашет,попробовал значения некоторые поменять, тоже не работает) |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ну тут выбор-то не сильно богатый - либо самостоятельно разобраться и сделать как хочется, либо постоянно просить кого-то сделать.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 08.09.2013
Сообщений: 21
|
Здраствуйте, вот надыбал два lispa по копированию текста, нельзя ли их скомпоновать так чтобы, чтобы можно было копировать и вставлять текст в примитивы СПДС GraphiCS?
Код:
Код:
Последний раз редактировалось nikkomp, 02.12.2022 в 14:00. |
|||
|
||||
Регистрация: 14.12.2008
Сообщений: 1,079
|
Команда получается из функции добавлением в начало функции символов "C:" (по русски можно сказать что это намек, что данная функция это команда)
После символа "/" указываются "внутренние переменные функции, которые впрочем можно не описывать. Поэтому функцию FHS можно упростить: Код:
И в итоге программа ничего не выдает на выходе |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Цитата:
Цитата:
Значит в текущем файле не найдены штриховки.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.01.2020
Сообщений: 185
|
Конструкция defun определяет функцию, в данном примере это функция FHS. Чтобы вызвать функцию, загруженную в автокад надо набрать в командной строке (FHS).
Если имя функции начинается с C: (например C:FHS) - то автокад уже воспринимает эту функцию как свою внутреннюю команду, и для вызова ее достаточно набрать все что написано после C: - т.е. просто FHS или же все название функции в круглых скобках (C:FHS). |
|||
|
||||
Регистрация: 14.12.2008
Сообщений: 1,079
|
Понятно, добавил C: и после fhs функция выдала список штриховок. Вызов (fhs) не знал. Спасибо буду знать!
Не понимаю как несколько раз вызванная строка (setq l (cons h l)) создает список? Почему она каждый раз дополняет список, а не записывает его заново? Модифицировал функцию: Код:
Причем StyleName это "список символов", а HatchCol это список названий штриховок. Что там надо исправить? Последний раз редактировалось МишаИнженер, 07.12.2022 в 13:08. |
|||
|
||||
Регистрация: 10.01.2020
Сообщений: 185
|
Ты бы хоть писал где ошибка происходит, в какой строке... Если про 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,079
|
Я назначаю точку останова в AutoLisp, программа останавливается, я проверяю значения переменных, но потом все зависает. Приходится все останавливать и запускать все заново.
Насчет команды member мне кажется надо создать список из 1 аргумента. Но как это сделать? |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
так пошаговая отладка до строчки кода, на которой все зависнет/вылетит с ошибкой. Затем точка остановки на предыдущие строки и снова пошагово, контролируя при этом переменные. На любом языке так локализуются ошибки времени исполнения, если сразу не увидел причину.
|
|||
|
||||
Регистрация: 14.12.2008
Сообщений: 1,079
|
Да надо сравнение с истиной
Цитата:
а получается ("знач1" "знач2" "знач3") Непонятно! |
|||
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 465
|
Вообще говоря, если второй элемент не атом, т.е. если /b/ - список,
то (cons a b) просто добавляет первый элемент /а/ в начало списка. И, как правило, в этом функционале (cons … ) и используют.
__________________
Счастливо, Алексей! |
|||
|
||||
Регистрация: 10.01.2020
Сообщений: 185
|
https://help.autodesk.com/view/ACD/2...E-F070F0A7CB2B
добавь в закладки! |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Offtop: Мне интересно, насколько у народа хватит терпения объяснять, что справку все же не стоит игнорировать...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 14.12.2008
Сообщений: 1,079
|
Интересная идея и функция вроде подходит. Спасибо!
Исправил код Код:
Не могу найти справку на функцию Т. Как правильно её использовать и что это за функция (это функция из функций сравнения)? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Это что за бред зеленой лошади?
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Offtop: это просто лисп ТС "не зашел".. или его сразу "воспринимаешь", или опыт с "обычными" языками программирования вступает в постоянный конфликт с подходом к программированию в лиспе. Учитывая явное нежелание ТС хоть как-то систематизировать знания - это, похоже, надолго)
|
|||
|
||||
Регистрация: 14.12.2008
Сообщений: 1,079
|
Если функция member возвратит номер позиции (не nil) значит это значение при конвертировании в булевский тип должно быть ИСТИНА, а функция T сравнивает аргумент с истиной. Если аргумент ИСТИНА, тогда функция T должна вернуть значение ИСТИНА.
Но почему функция Т не хочет выполняться? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Для ради приколу посмотри в справке примеры использования if в лиспе. В VBA ты тоже пишешь:
If value=1 Then True Else False End If ? ----- добавлено через ~2 мин. ----- Пара недель ненапряжного чтения и пара десятков собствнных экспериментов (только нормальных, а не простого копипастинга кода без малейшего понимания что куда и зачем) будут значительно более эффективны. Offtop: Но ТС, как тот комсомолец, без трудностей не может, похоже.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
Т - это вроде логическая константа, а не функция. А if воспринимает nil как ложь - это вам любая справка скажет, если туда заглянете)
----- добавлено через ~2 мин. ----- Offtop: люди в свое время изучали языки программирования методом тыка, конечно.. но это уже лет этак 20+ неактуально в связи с появлением инета) |
|||
|
||||
Регистрация: 14.12.2008
Сообщений: 1,079
|
Вот в таком виде получается доступ к командам если искомая штриховка находится в списке штриховок чертежа:
Код:
Может быть надо использовать функцию обнаружения ошибки чтобы обработать эту ошибку? Или надо создавать вместо списка штриховок чертежа - список штриховок АвтоКада. Наверное создание такого списка может потребовать несколько секунд и будет казаться долгим. Поэтому проще отловить факт появления ошибки и оценить это как отсутствие штриховки среди доступных штриховок АвтоКада. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Возможно. Но для этого надо хоть что-то прочитать из того, что уже не раз рекомендовали. Offtop: Ну или хотя б по ссылке пройти.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 14.12.2008
Сообщений: 1,079
|
Всегда было интересно: что обозначает переменная вызываемая без скобок и без функций?
До этого я считал, что это ошибка, случайно забытая переменная в тексте программы и стирал такие строки. Какой смысл просто печатать переменную в программе без функций? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
А почитать, подумать, проанализировать - не?
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 04.12.2022
Сообщений: 33
|
Нужна помощь в корректировке лиспа Сумматор текста (автор Владимир Громов, корр.ZZZ, Евгений Елпанов, Вадим).
1. В лиспе есть "." и ",", но нет возможности выбрать(собственно выбор не нужен, нужна точка), сумма вставляется с ",". Если просто удалить "," пишет в КС: ; ошибка: слишком мало аргументов. Как можно вставку суммы производить с разделителем "."? 2. А ещё выскакивает табличка Сообщение AutoCad Сумма=2,18 Укажите точку вставки Надо жать на ОК, потом указывать точку вставки, ненужные движения. Можно убрать эту таблицу, просто указывать точку вставки суммы в чертеж. 3. Добавить возможность выбора высоты текста, или лучше по умолчанию 250. Такая странность, если установить текущим стиль текста с заданной высотой 250, текст вставляет "0" да ещё с поворотом 3 градуса, при этом, в окне показывается правильная сумма... Корректно работает только с высотой текста 2.5. Подскажите, пожалуйста, в чём затык. Код:
|
|||
|
||||
Регистрация: 20.03.2008
Сообщений: 2,653
|
Цитата:
Цитата:
Цитата:
Код:
|
|||
|
||||
Регистрация: 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
С.-Петербург
Сообщений: 39,832
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Сомневаюсь. Значение 3 как толковать? А 12? Как 12 или как 4+8? )))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 465
|
Если верить справке (в которой - надо отметить - нет упоминания о "битовости" этой переменной), то:
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
С.-Петербург
Сообщений: 39,832
|
Уговорил, чертяка языкатый
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107
|
Коллеги! Возможно торможу, но как с помощью ssget выбрать определенные объекты (например TEXT,MTEXT), которые находятся внутри заданной окружности.
Пока вижу только такой метод: (ssget "_W" '(x1 y1) '(x2 y2)) где x1 y1, x2 y2 - координаты рамки, описывающую окружность (т.е. надо вычислить две точки рамки-квадрата, с учетом координаты центра круга и радиуса) Или можно проще? Последний раз редактировалось Sege, 06.02.2023 в 09:55. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
все варианты ssget от Lee Mac. Есть еще ключ _WP - для непрямоугольных окон выбора.
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Чисто теоретически можно высчитать несколько десятков точек (так сказать, аппроксимировать окружность полигоном) и выбирать уже не через _W, а через _CP (кажется, так)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
_CP - это захватывает объекты, находящиеся внутри полигона полностью и частично (т.е. пересекающие его).
_WP - только те объекты, которые полностью внутри полигона. экспериментируйте - что даст приемлемую погрешность выбора. Последний раз редактировалось Сергей812, 06.02.2023 в 10:52. |
|||
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107
|
Цитата:
но все-же проще оказалось просто получить координаты 2-х точек диагоналей "квадрата описывающий круг" и использовать "_W" |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Цитата:
--- Правда, надо помнить, что при таких методах выбора надо, чтобы вся область была на экране.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Не уверен, если честно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 04.12.2022
Сообщений: 33
|
Как тексту поменять выравнивание, подскажите пожалуйста. Есть часть кода:
Код:
Здесь нет ml (Middleleft)? Или нужен какой-то цифровой код? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
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
С.-Петербург
Сообщений: 39,832
|
alignment где ж еще. По ссылкам проходил? Смотрел что там предлагается?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
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
С.-Петербург
Сообщений: 39,832
|
Попробуй заменить 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
С.-Петербург
Сообщений: 39,832
|
(getvar "dwgprefix")
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107
|
Как указать команде "_.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
С.-Петербург
Сообщений: 39,832
|
vl-cmdf в последних версиях всегда возвращает t, независимо ни от чего. Так что теперь придется делать нечто типа
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Свой вариант кода покажи. И "C:" должна остаться на английском, если что.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Я проверил - все срабатывает нормально. Может, кодировка lsp-файла не ANSI?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Цитата:
Создал файл txt, в нем по умолчанию кодировка ANSI, скопировал прям из своего сообщения код, сохранил, расширение поменял на lsp, подгрузил в автокад и все равно не работает. Покрутил-повертел кодировку, реально в ней видимо была проблема. Спасибо. Последний раз редактировалось posetitel, 22.03.2023 в 10:12. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Короче, файл приложи
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 21.11.2014
Москва
Сообщений: 60
|
Пожалуйста, проконсультируйте меня. Встретил следущее выражениеdefun asd (lays_1 lays_2 att k / ).
Я так понимаю, что это определение функции asd. defun - это оператор определения функции, а asd - сама функция, lays_1 lays_2 att k - это переменные. А вот для чего в конце стоит косая черта, что она означает, для чего служит и когда применяется? И почему именно в конце поставлена? Или это ошибка и косая черта должна стоять в начале, перед переменными? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
После обычно указываются имена локальных функций и переменных
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 39,832
|
Так а какая разниц? Сначала получи, потом сортируй как тебе надо.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Уважаемый, koMon, могли бы немного дополнить лисп, чтобы предварительно нужно было выбрать ячейку в таблице чертежа, текст из этой ячейки помещался в буфер и уже потом создавался слой с именем из буфера и вводилась команда для начертания полилинии.
Ну либо минуя промежуточный этап - буфер обмена: ввод команды лиспа, запрос от лиспа на выбор ячейки таблицы, далее создание слоя с именем соответствующем тексту из этой ячейки и команда черчения полилинии в созданном слое. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
posetitel, тут как бы обучение, а не просьбы модифицировать коды.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.01.2020
Сообщений: 185
|
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
г. Норильск
Сообщений: 465
|
Маленькое примечание.
Рекурсию при обработке списков нужно использовать очень осторожно - можно натолкнуться на "переполнение стека". Если список очень большой. Такие ошибки очень трудно потом отлавливать. Я, например, в принципе отказался от неё при обработке списков непредсказуемой длины. foreach - "наше всё" :-)
__________________
Счастливо, Алексей! |
|||
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
===AAA===
Безусловно, такая проблема существует. Но на практике, со stack overflow пока не сталкивался, возможно по причине того, что рекурсивные функции использую не так часто. При этом, неоднократно сталкивался с мнением, что LISP, это как раз тот язык, из всех прочих языков, где рекурсивные алгоритмы перебора списков (коллекций, последовательностей) смотрятся органичнее всего. Да и foreach, далеко не панацея. Так же, как панацеей могут не оказаться mapcar, или все семейство vl- функций относящихся к обработке списков. То есть, решить задачу с помощью foreach, наверное, можно любую, но иногда куда как проще (а также понятней, и логичней), к примеру, взять и использовать цикл while, пролистывая в его теле список при помощи cdr, и одновременно совершая кучу других действий. Ну, или воспользоваться рекурсивным алгоритмом. |
|||
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 465
|
Дык одно дело сам LISP, другое - его реализация на конкретной программно-аппаратной платформе.
Я однажды столкнулся. Правда - давно. И памяти в компах с тех пор изрядно добавилось и версия Автокада поменялась. Однако с тех пор - ну её нафиг, эту рекурсию... Как элемент непредсказуемости.
__________________
Счастливо, Алексей! |
|||
|
||||
конструктор Регистрация: 21.07.2007
Петрозаводск
Сообщений: 1,982
|
|
|||
|
||||
Регистрация: 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
С.-Петербург
Сообщений: 39,832
|
Все что сейчас напишу - сугубо личное мнение.
Первое и самое главное - имена. Имена функций, переменных и т.д. Когда код даже на 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
С.-Петербург
Сообщений: 39,832
|
Исправил опечатки. Offtop: Странно как-то код из VSCode копируется - то так, то этак.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Да в принципе точно так же - только разделителем для str-str-lst будет не "\t", а ";"
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.04.2016
Сообщений: 72
|
Это применил. Вопрос в другом - как можно составить список, в котором будут данные такого типа: ("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
С.-Петербург
Сообщений: 39,832
|
(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
С.-Петербург
Сообщений: 39,832
|
Проверяй vla-get-visible, к примеру.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
(setq att (vl-remove-if (function (lambda(x) (equal (vla-get-visible x) :vlax-false))) att_list)
Примерно так
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107
|
Цитата:
(#<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
С.-Петербург
Сообщений: 39,832
|
Блочок бы глянуть.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 107
|
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Кхм... В свойствах показывается далеко не один атрибут. Так что для начала надо понять, что значит "видимый".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
конструктор Регистрация: 21.07.2007
Петрозаводск
Сообщений: 1,982
|
Правда, нужен апостроф в автокаде, а в 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
С.-Петербург
Сообщений: 39,832
|
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Товарищи, извините за детский вопрос, но как мне запустить нижние два лиспа?
Хэлп по запуску лиспов читал, но он не помог, т.к. в первом лиспе нет "defun", а во втором лиспе непонятно, как вводить исходные данные. первый лисп переименовывает слои, содержащие буквы ХХХ на буквы SSS Код:
Второй лисп делает тоже самое, только какие буквы менять и на какие менять нужно вводить, а вот как вводить: через слеш, через пробел или иначе, непонятно Код:
|
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Ок, с первым, видимо, не все просто.
Второй то можно же как-то запустить. У меня на чертеже есть слой "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
Сообщений: 402
|
Вроде очень простая задача:
Нужно нарисовать полилинию из трех точек с последовательными привязками END, PER и опять END. Макрос на кнопку сочинил такой: ^C^C_polyline;end;\per;\end;\; Макрос работает, но надо сделать командой Не могу придумать как сделать на лиспе тож самое.. (command "_polyline" "_end") - закрывает чертеж |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Попробуй
(vl-cmdf "_.polyline" "_end" pause "_per" pause "_end" pause "") С какого перепугу у тебя чертеж закрывается - тайна лично для меня
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 20.04.2011
Сообщений: 402
|
Цитата:
Вот код полностью: Код:
.... Код не менял. Теперь вообще непонятно что происходит: Последний раз редактировалось gumel, 16.08.2023 в 10:05. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Да не должен чертеж-то закрываться, вот в чем прикол.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 20.04.2011
Сообщений: 402
|
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
ТЬфу, блин! Не _.polyline, а _.pline !!
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Да уже разобрались )))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.01.2020
Сообщений: 185
|
Точка после 250 в данном случае не ошибка. LISP воспринимает 250. как число типа REAL (т.е. числа с десятичными разрядами), а 250 (без точки) - как целое число типа INTEGER
Цитата:
Возвращаясь к предыдущим твоим сообщениям: Вот именно в группе 62 для определения цвета должно быть число 74, а не 74. - номер цвета должен быть целочисленными (тип INTEGER), в противном случае LISP выдаст ошибку |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Необязательно существующего. Если слоя не будет, он создастся с настройками "по умолчанию".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
Добрый день.
Как я мог бы получить из vla объекта мультивыноски данные о координатах указателья выноски(стрелка скажем), можете подсказать? А то дамп не дает этой информации Код:
Что я хочу сделать, найти самую ближайшую выноску из набора к текущей полилинии, вот прикинул вот такую функцию. Но протестировать возможности нет Код:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Цитата:
(vlax-safearray->list (vlax-varant-value (vla-getleaderlinevertices multileader-object 0))) 0 - индекс выноски, с которой работаешь.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
Цитата:
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
Сообщений: 134
|
Не понимаю, как я мог бы отследить положение выноски на полилинии, чтобы оно было правильным, можете подсказать?
Пытался сравнивать координаты точек Пытался сранивать длины от начала линии до точки выноски Безуспешно на входе vla полилинии и набор выносок Код:
Последний раз редактировалось gnuvse, 26.10.2023 в 15:46. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
У мультивыносок гарантированно по одному "хвосту" или могут быть варианты?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Сам отфильтруешь лишнее:
Код:
"obj" - указатель на мультивыноску "pt" - начальная точка первого хвоста "closest" - ближайшая точка на полилинии "dist" - расстояние до полилинии
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
Цитата:
UPD. Только я немного не понял, я получил массив структур данных, где выноски отсартированы по дистанции. А мне нужно было на выходе функции получить нужную выноску к передаваемой vla-pl и все PS> Код крутой у тебя Последний раз редактировалось gnuvse, 26.10.2023 в 18:09. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Так забирай car от результата и делай с ним чего хотишь, делов-то ) Это будет выноска, расстояние от полилинии до хвоста которой минимально. Берешь (cdr (assoc "obj" value)) - вот тебе указатель на выноску. Ну и теде.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
Цитата:
Я понимаю, что для быстрого процессора это фигня, но все равно, хачем лишние телодвижения Я наковырял вот такой цикл, оно вроде даже работает, но честно признаться я немного не понимаю как оно работает. Ты мог бы немного пояснить? Самые близкие элементы по итогу имеют дистанцию 0, но мне немного непонятно, почему "(setq coordinate-mlead (cdr (nth key-coordinate-mlead (entget ent-mlead))))", вот это дает одинаковую координату с мультивыноской Код:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ну, откуда и с какого перепугу ты берешь 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
Сообщений: 134
|
Цитата:
Да, твое решение универсальное, но мне как нубу, для практкии слишком сложновато все это разом охватить. Если будет время, просмотри пожалуйста, буду признателен |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Цитата:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
Цитата:
Спасибо, а зачем мне начальные точки всех хвостов? =) Да, если честно я код понял, прогнал его, потестировал. Круто ты оперируешь функциональным программироанием, но при этом массивы во все поля, как-то необычно. Кажется что ты еще тот любитель common lisp'a =) но я продублирую, может поправишь: Код:
Тут загвоздка в том, что мне непонятно, почему мой код работает, и почему ближайшая выноска дает 0.0 дистанцию, а не 0.1 или 2.0, как буд-то какая-то фунция вычисляет от моей выноски до места касания с полилинией |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Пфффф... Попробую по шагам
Код:
Offtop: ПыСы До пн я вряд ли буду в адеквате, других задач накидали мама не балуй.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Дык ета... (vlax-dump-object objec t)
Прикол именно в последнем параметре - он показывает еще и методы, доступные для объекта. Ну или VBA-справку надо раскуривать.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
А что за последний параметр, у меня на выноску вот такое показывает, ничего похожего на координаты или название leader line vertices
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ты эту строку в консоли VLIDE выполни )))
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ну на крайняк действительно поставь VBA-енаблер и справку под него )) Тож пользительная штука.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
|
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
Цитата:
Но классно, я теперь буду в разных местах просматривать, осталось программировать научиться |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
Доброго дня.
У меня накопилось несколько вопросов и просьб, можете помочь? Буду признателен. 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
С.-Петербург
Сообщений: 39,832
|
Код:
Код:
__________________
Моя библиотека 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
Сообщений: 134
|
Какой же это изящный чит с append. Переписал свою функцию для получения cписка точек из vla-list-bl в духе Lisp Код:
Лех, спасибо. Если у тебя будет чуть больше времени и вдруг станет жалко нуба в виде меня, пожалуйста ответь на другие вопросы. ----- добавлено через ~2 мин. ----- Цитата:
Спасибо за append, мне Леха подсказал уже, классная штука |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Цитата:
Чего еще хотелось бы добавить. Точки вставки у тебя будут трехмерные, а координаты в полилинию надо передавать двумерные. Вариантов немного - либо каждую координату принудительно приводить к двумерному виду, либо создавать полилинию через entmake / entmakex. Второй вариант будет работать только в текущем документе, учти.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
Цитата:
Сейчас только осознал, что если эксплуатировать мою программу, то проще будет просто ставить лишний мнимый блок на угол или подкорректировать линию. Потому что как это все будет работать с xref непонятно, он же не примитив. А можешь подсказать какие из твоих исходников я мог бы начать изучать? |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Не-а... У меня нормальных исходников-то практически нет. Могу посоветовать "САПР на базе" (в глубинах форума где-то скан есть). Можно сказать библия разработчика под кад ))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 13.04.2017
Сообщений: 134
|
Цитата:
----- добавлено через 46 сек. ----- А, тут дело в том, чтобы смотреть в комплексе и на код и Doc, потому что читать тоже полезно. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Товарищи, подскажите, возможно ли в принципе на лисп реализовать вот такую хотелку.
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,038
|
имхо, вместо экселя загружать из текстового файла в список точечные пары {имя слоя . диаметр}, и потом искать в этом списке по имени слоя. Т.е. в текстовом файле идет построчно имя слоя и на следующей строке сопоставленный слою диаметр. И тогда сформировать список примерно таким кодом:
Код:
Ну а получить потом из списка диаметр Код:
Последний раз редактировалось Сергей812, 03.12.2023 в 13:00. Причина: добавлен пример кода |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
В лиспе совсем-совсем новичок, сижу с рекомендуемой всем новичкам в этой теме талмудом на 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,038
|
да, т.е. она "проглатывает" символы конца текущей строки и указатель файла (это уже не к лиспу, а к самой операционной системе относится) стоит на начале следующей строки. А если файл закончился, то вернет nil. Ну для красоты перед вторым вызовом (setq lD (read-line lF)) можно было бы сперва проверить lKey <> nil - чтобы не пытаться читать завершенный файл еще раз.
если были успешно считаны обе связанные строки - в цикле пытаемся считать следующую пару значений. То же условие в строке 5 - если конец файла (или "накосячили" в файле и непарное количество значений), то просто не будет добавлено в список. Еще могут быть пустые строки в файле - тоже по хорошему их надо пропускать. ----- добавлено через ~2 мин. ----- ну вопрос валидации содержимого файла можно для упрощения проигнорировать - если это продукт для "личного" пользования. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Цитата:
(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
С.-Петербург
Сообщений: 39,832
|
VLIDE либо VS Code с расширением AutoLISP (ИМХО)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
ну я в Notepad++ писал сейчас, там подсветка синтаксиса лиспа есть. А тестировать - autolisp внутренний язык приложения, поэтому без акада его (код) и не протестируешь в работе. Так что встроенный редактор акада и там сразу fixedsys (вроде) шрифт поставить - чтобы кириллица нормально отображалась.
|
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Товарищи, подскажите еще где смотреть описание команд, их параметры и очередность ввода, чтобы можно было написать в лиспе или в командной строке? В справочнике команд автокада приводится только общее описание, без описания, как пользоваться командой через командную строку.
Т.е., например, я взял из другого лиспа команду (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
С.-Петербург
Сообщений: 39,832
|
Самое простое - пытаться выполнять команды напрямую в ACAD. Помня о том, что точки, к примеру, задаются не
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Цитата:
Ну и в общем случае, не для мультивыноски, а для построения других примитивов где посмотреть очередность и синтаксис параметров? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ну, сначала-то было написаноа не
И я бы, если честно, не создавал бы командными методами мультивыноски, многострочные тексты, таблицы и до дури других типов примитивов, особенно если заранее известны все параметры. В Download есть книга В.Света "Язык макрокоманд", советую скачать и почитать - там про командные методы много всякого рассказано. В глубинах форума есть "САПР на базе AutoCAD - как это делается": мощнейший талмуд, больше 1000 страниц, практически библия для разработки под ACAD. Хорошо прочищает мозги, если ее осилить хотя бы наполовину ))
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Обе книги нашел, монументальные, ничего не скажешь, надо прям вчитываться. Сходу пробежался, то что хотел не обнаружил.
Мне казалось должен быть простой список команд с синтаксисом написания, ну если возвращаться к мультивыноске, то что-то вроде: _mleader <arg1> <arg2> <arg3>, где <arg1> - координата первой точки, <arg2> - координата второй точки, <arg3> - содержание. Ну как обычно описывают функции, так и для команд должно быть что-то похожее. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Подобный подход работает далеко не для каждой команды, к сожалению.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,038
|
команды могут быть интерактивными, а функции - нет. В других языках функции могут быть переопределяемыми или с переменным числом аргументов, в лиспе с этим грустно все - насколько помню.
А чтобы был удобный вызов - пишутся на базе существующего языка программирования свои функции (классов в лиспе нет), и после отладки собираются в библиотеки для повторного использования. Собственно, книга <САПР на базе AutoCAD - как это делается> об этом всем и рассказывает. Другое дело, что писать сейчас САПР на лиспе - это очень на любителя, имхо) |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
F1 ?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Подскажите простую вещь, самому допереть не получается.
Есть команда _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
Сообщений: 323
|
да, я пытался через двойные кавычки, т.е. писал (command "_SPDSNET_ExportACAD" ""), но скорее всего после запуска команды и выскакивания меню лисп ставится на паузу и ждет действия от пользователя, т.е. даже двойные кавычки ждут, пока я не нажму кнопку в меню.
т.е не получается через двойные кавычки. Последний раз редактировалось posetitel, 19.02.2024 в 13:05. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Интересно, а эта команда имеет вариант недиалогового режима? Что будет, если перед именем команды поставить минус?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Значит влегкую не получится, диалог все равно будет вываливаться.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Хорошо, со всплывающим окном подтверждения придется мириться.
А можно ли как прописать условие проверки, выполнима ли команда _SPDSNET_ExportACAD? Т.е. чтобы если команда не найдена (модуль СПДС не установлен на машине), лисп продолжал выполнять следующие команды по списку, а не прерывался с ошибкой? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
vl-catch-all-apply - ИМХО самое простое
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 24.01.2008
Подольск
Сообщений: 168
|
Цитата:
Параметр "_All", возможно, неверный. У меня взрывает только первый объект, а должен, вроде как, все Последний раз редактировалось Alxndr1697, 20.02.2024 в 12:25. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Угу, и разбить вообще все? Включая размеры, таблицы, что там еще попадется?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Да, хотел взрывать штатными средствами, раз есть такая опция, да и spds extension - очень специфические объекты, и лучше делать все так, как у них предусмотрел разработчик, иначе косяки вылезают в неожиданных местах.
Подскажите, как работает vl-catch-all-apply, какой у нее принцип? Ну т.е. эта функция похожа на оператор если: если ошибка делай то, если нет ошибки делай это? Т.е. после проверяемого условия мне нужно будет два раза написать продолжение кода, чтобы он выполнялся и при возникновении ошибки и без возникновения ошибки? |
|||
|
||||
Регистрация: 10.01.2020
Сообщений: 185
|
Читай справку vl-catch-all-apply и vl-catch-all-error-p
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Это как?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Цитата:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Сносить SPDS Extension и дальше ExplodeAllProxy от А.Н.Ривилиса )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Учитывая, что SPDS Extension надо сносить средствами винды, насколько я помню?
----- добавлено через ~2 мин. ----- Ну а на старт каждого документа поставить нечто типа (if (= (getvar "demandload") 3) (alert "Сначала demandload в 2, а потом и поговорим") (progn (if explodeproxyinentity (vl-cmdf "_.explodeallproxy" "_.removeallproxy" "_n")) ----- добавлено через ~2 мин. ----- Код написан на коленке, и рабочим не является
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
То была шутка, конечно, не наудаляешься и не наставишься потом обратно этот модуль ради только взрывания его объектов.
Есть отдельная тема на форуме, как средствами лиспа взорвать, но в новой версии модуль опять перелопатили и тот лисп теперь не работает. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
Ну, подобное я себе ставить как бы не собираюсь.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
подскажите еще по другой теме:
в коде присвоил переменной имя файла (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
С.-Петербург
Сообщений: 39,832
|
Правильно. Потому что надо передавать указатель на документ, а не непонятную строку
----- добавлено через 59 сек. ----- Если что, лисп в каде работает только в текущем документе. И при смене документа можно словить самые разнообразные приколы, вплоть до остановки выполнения лиспа. ----- добавлено через ~2 мин. ----- ПыСы для работы с нетекущим документов настоятельно рекомендую использовать менее варварские способы. Например, ObjectDBX (ну или вообще поднимать отдельный экземпляр ACAD'а и работать с ним)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 16.10.2013
Сообщений: 323
|
Напоминаю идею: получить переменные с именем открываемого (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
С.-Петербург
Сообщений: 39,832
|
Я не очень понимаю глубинного смысла этой затеи, но как алгоритм:
- получить и запомнить "где-то снаружи" текущее значение SDI - Если SDI = 0, то пройтись по всей коллекции документов и позакрывать их - SDI в 0 - сохранить файл - в ком.строку послать нечто типа (vl-cmdf "_.close" "open" NewFileName.dwg) или каким-то другим способом попытаться открыть NewFileName.dwg - восстановить SDI из "где-то снаружи".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
конструктор Регистрация: 21.07.2007
Петрозаводск
Сообщений: 1,982
|
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,832
|
По-моему, что-то типа vla-vbaload
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
Опции темы | Поиск в этой теме |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |