aerohost Posted March 19, 2020 Report Share Posted March 19, 2020 (edited) Прошу помощи в адаптации Lisp под нанокад. А именно функцию команды PL-VFI Я так понимаю вся истина кроется тут (ssget "_:L" '((0 . "*POLYLINE,LINE,ARC,CIRCLE")))) А именно тут "_:L" Спойлер https://dwg.ru/dnl/607 https://www.caduser.ru/forum/topic47618.html Спойлер http://lostpic.net/image/zk0o pltools.lsp Edited March 19, 2020 by aerohost Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted March 19, 2020 Report Share Posted March 19, 2020 Похоже, в нанокад режим "_:L" не поддерживается. В справке по автолиспу этому режиму предположительно (написано не очень понятно) соответствует режим ":L" - Allows for the selection of unlocked layers onlу - выбор элементов только на разблокированных слоях). При адаптации придется определяться, чем это заменить. Например: Вариант 1 В рассматриваемой функции PL-VFI ssget вызывается два раза - для выбора секущих и выбора полилиний, в которые вставляются вершины. Можно использовать режим (ssget "P" …) - предыдущий выбор для секущих. Т.е., можно ПЕРЕД вызовом функции выбрать набор объектов-секущих, а потом уже вызвать функцию. А в самой функции выбор полилиний для добавления вершин сделать в цикле с режимом (ssget ":S" …) Вариант 2 создать функцию - обертку типа (defun MYssgetL …), в которой будет эмуляция нужного режима ":L" или любого другого неподдерживаемого. А в основной функции вызов (ssget "_:L" …) заменить на (MYssgetL …) В принципе, такая функция-обертка может быть довольно сложной по содержанию. Можно даже реализовать какие-нибудь свои изощренные сценарии) 1 Quote Link to comment Share on other sites More sharing options...
ISL Posted March 19, 2020 Report Share Posted March 19, 2020 Режим выбора :L действительно не реализован. Поднял приоритет задачи. Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted March 20, 2020 Report Share Posted March 20, 2020 13 часов назад, ISL сказал: Режим выбора :L действительно не реализован. Есть возможность получить список реализованных режимов? Похоже, ":L" - не единственный из них. Quote Link to comment Share on other sites More sharing options...
ISL Posted March 20, 2020 Report Share Posted March 20, 2020 Если что-то не работает – присылайте код. Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted March 20, 2020 Report Share Posted March 20, 2020 Эх! Хотелось бы избегать лепешек, а не разгребать последствия) Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted March 20, 2020 Report Share Posted March 20, 2020 (edited) Функцию PL-VFI адаптировал. Соответствующую часть прокомментировал, чтобы можно было нормально читать. В конце файла добавил функцию обертку nano:ssget-l. Будет время, постепенно постараюсь пройтись по всему файлу целиком. В приложенном тестовом файле синие полилинии на не заблокированных слоях, а зеленые - на заблокированных. На нулевом слое полилиния, которую обрабатываем. Результат: До. Спойлер После обработки. Спойлер P.S. Обратите внимание, что там в исходном варианте фильтром отбрасываются полилинии, содержащие кривые и сплайны, а также 3D полилинии. Пока как то так. Файлы:_PL-VFI_Test.dwg pltools_nano.lsp Edited March 20, 2020 by A.Kudrjashov 2 Quote Link to comment Share on other sites More sharing options...
aerohost Posted March 20, 2020 Author Report Share Posted March 20, 2020 Я или тупой или я что то делаю не так ... Спойлер Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted March 20, 2020 Report Share Posted March 20, 2020 6 часов назад, aerohost сказал: я что то делаю не так ... Я завтра посмотрю. Но, как минимум, я бы сравнил величину "допуска (1)" с размерностями объектов. Я рисовал на шару, когда проверял, допуск не менял, оставил тот. что по умолчанию (0.001). Сначала выбирал режущие кромки (синие и зеленые), потом целевую полилинию (белую). По отдельности тоже проверял. Не проверял опцию "С продолжением". У меня здесь все полилинии пересекаются. Но, поскольку это базовая функция LISP, думаю, что проблем быть не должно. P.S. Там упрощенно алгоритм следующий: 1. Находятся точки пересечения режущих с целевой. 2. К этим точкам пересечения находится параметр ближайшей вершины. 3. У ближайшей вершины определяются целочисленные ограничения параметра сверху и снизу. 4. Далее оценивается попадает ли точка пересечения в коридор (+/- Допуск по отношению к целочисленной границе). Если не попадает, то добавляется на целевую полилинию Собственно, действий не так много, можно всю цепочку повторить вручную в командной строке и посмотреть, где алгоритм не срабатывает. Либо поставить в критичных местах PRINC для отслеживания. Quote Link to comment Share on other sites More sharing options...
aerohost Posted March 20, 2020 Author Report Share Posted March 20, 2020 (edited) 1 час назад, A.Kudrjashov сказал: Я завтра посмотрю. Но, как минимум, я бы сравнил величину "допуска (1)" с размерностями объектов. Я рисовал на шару, когда проверял, допуск не менял, оставил тот. что по умолчанию (0.001). Сначала выбирал режущие кромки (синие и зеленые), потом целевую полилинию (белую). По отдельности тоже проверял. Не проверял опцию "С продолжением". У меня здесь все полилинии пересекаются. Но, поскольку это базовая функция LISP, думаю, что проблем быть не должно. P.S. Там упрощенно алгоритм следующий: 1. Находятся точки пересечения режущих с целевой. 2. К этим точкам пересечения находится параметр ближайшей вершины. 3. У ближайшей вершины определяются целочисленные ограничения параметра сверху и снизу. 4. Далее оценивается попадает ли точка пересечения в коридор (+/- Допуск по отношению к целочисленной границе). Если не попадает, то добавляется на целевую полилинию Собственно, действий не так много, можно всю цепочку повторить вручную в командной строке и посмотреть, где алгоритм не срабатывает. Либо поставить в критичных местах PRINC для отслеживания. Спойлер Может какая то переменная nanocada у нас отличается, то и разный результат ? Edited March 20, 2020 by aerohost Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted March 21, 2020 Report Share Posted March 21, 2020 (edited) 9 часов назад, aerohost сказал: Может какая то переменная nanocada у нас отличается, то и разный результат ? Сразу должен сказать, что я практически не трогал текст, а только структурно разобрал его, прокомментировал, поставил вопросы и добавил nano:ssget-l. 1. Синяя и белая полилинии должны находиться на разблокированных слоях, но на всякий случай можно проверить, что они попадают в требуемую выборку. Вот здесь (nano:ssget-l) раскомментировать PRINC Спойлер 2. Следующий спорный момент, который я пока не трогал - это определение "Режима продолжения кромки". В исходном тексте предполагается ввод кучи альтернативных ключей Спойлер а анализируется всего один Спойлер Хотя он должен сказываться только в случае выбора режима "С продолжением" через E(lat). Во всех остальных случаях будет "Без продолжения". Здесь же можно принципиально проверить размерность массива результатов пересечений (RET) 3. Далее, последнее препятствие на пути добавления вершин - это попадание точки пересечений в доверительный интервал от целочисленных границ Параметра ближайшей точки целевой полилинии. Проверяем здесь: Спойлер Вот сюда можно добавить (progn <script>);progn else. Спойлер В общем, надо смотреть где происходит сбой. (Выше нумерация по предыдущему файлу) Upd. Прикладываю LSP файл с отладочными строками. Там еще в коде устранения дублирующих полилиний, похоже, была ошибка. Вот здесь (нумерация по новому файлу). Не очень критично, но тем не менее. Спойлер Файл с отладочными строками (alert и princ), выделенными ;;; DEBUG (Переменная в самом начале файла) pltools_nano_2020-03-21_02.lsp Edited March 21, 2020 by A.Kudrjashov Quote Link to comment Share on other sites More sharing options...
aerohost Posted March 21, 2020 Author Report Share Posted March 21, 2020 (edited) В 21.03.2020 в 06:35, A.Kudrjashov сказал: Сразу должен сказать, что я практически не трогал текст, а только структурно разобрал его, прокомментировал, поставил вопросы и добавил nano:ssget-l. 1. Синяя и белая полилинии должны находиться на разблокированных слоях, но на всякий случай можно проверить, что они попадают в требуемую выборку. Вот здесь (nano:ssget-l) раскомментировать PRINC nano:ssget-l (1) (Показать контент) 2. Следующий спорный момент, который я пока не трогал - это определение "Режима продолжения кромки". В исходном тексте предполагается ввод кучи альтернативных ключей PL-VFI (1_1) (Показать контент) а анализируется всего один PL-VFI (1_2) (Показать контент) Хотя он должен сказываться только в случае выбора режима "С продолжением" через E(lat). Во всех остальных случаях будет "Без продолжения". Здесь же можно принципиально проверить размерность массива результатов пересечений (RET) 3. Далее, последнее препятствие на пути добавления вершин - это попадание точки пересечений в доверительный интервал от целочисленных границ Параметра ближайшей точки целевой полилинии. Проверяем здесь: PL-VFI (2) (Показать контент) Вот сюда можно добавить (progn <script>);progn else. PL-VFI (2_2) (Показать контент) В общем, надо смотреть где происходит сбой. (Выше нумерация по предыдущему файлу) Upd. Прикладываю LSP файл с отладочными строками. Там еще в коде устранения дублирующих полилиний, похоже, была ошибка. Вот здесь (нумерация по новому файлу). Не очень критично, но тем не менее. Проверка на дубли (Показать контент) Файл с отладочными строками (alert и princ), выделенными ;;; DEBUG (Переменная в самом начале файла) pltools_nano_2020-03-21_02.lsp 211 \u043a\u0411 · 1 загрузка Спойлер Edited March 22, 2020 by aerohost Gif Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted March 21, 2020 Report Share Posted March 21, 2020 (edited) Gif файл у меня не открывается. Видимо криво записался на форуме. Последний вариант. Добавлены PL-CW и PL-CCW. Комментарии внутри.pltools_nano_2020-03-21_04.lsp Edited March 21, 2020 by A.Kudrjashov Quote Link to comment Share on other sites More sharing options...
aerohost Posted March 21, 2020 Author Report Share Posted March 21, 2020 (edited) В 21.03.2020 в 14:47, A.Kudrjashov сказал: Gif файл у меня не открывается. Видимо криво записался на форуме У меня почему то не заводится. Фото перекрепил Edited March 22, 2020 by aerohost Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted March 21, 2020 Report Share Posted March 21, 2020 (edited) 5 часов назад, aerohost сказал: У меня почему то не заводится. Фото перекрепил Теперь антивирус ругается на место размещения GIF. К чему такие сложности ? В Программах находим "Ножницы" и далее - Скопировать и Вставить. Но я там в тексте вывел практически всю отладочную информацию ... надо смотреть по месту, где и что не срастается ! Alert показывают ключевые этапы, которые либо выполняются, либо нет. А все остальное генерируется в командную строку ... или не генерируется. .... есть одно подозрение, но попозже. Upd. В nanoCAD 11 у меня в функции PL:AddVX не выполняется вот такая конструкция: Спойлер Когда я обхожу ее и делаю тупое присвоение ширине 0, то все работает. Спойлер С кодом надо разбираться !.. Edited March 21, 2020 by A.Kudrjashov Quote Link to comment Share on other sites More sharing options...
aerohost Posted March 21, 2020 Author Report Share Posted March 21, 2020 4 часа назад, A.Kudrjashov сказал: Теперь антивирус ругается на место размещения GIF. К чему такие сложности ? В Программах находим "Ножницы" и далее - Скопировать и Вставить. Но я там в тексте вывел практически всю отладочную информацию ... надо смотреть по месту, где и что не срастается ! Alert показывают ключевые этапы, которые либо выполняются, либо нет. А все остальное генерируется в командную строку ... или не генерируется. .... есть одно подозрение, но попозже. Upd. В nanoCAD 11 у меня в функции PL:AddVX не выполняется вот такая конструкция: Скриншот1 (Показать контент) Когда я обхожу ее и делаю тупое присвоение ширине 0, то все работает. Скриншот 2 (Показать контент) С кодом надо разбираться !.. Я уже понял что ты мегамозг и решишь это как семочки пощелкать 🤣 будем ждать финальную версию Quote Link to comment Share on other sites More sharing options...
aerohost Posted March 22, 2020 Author Report Share Posted March 22, 2020 (edited) На 20ой версии завелся PL-VFI, на 11 не хочет Спойлер Спойлер Edited March 22, 2020 by aerohost Quote Link to comment Share on other sites More sharing options...
aerohost Posted March 25, 2020 Author Report Share Posted March 25, 2020 A.Kudrjashov, получится завести PL-VFI под nanocad 11 ? Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted March 25, 2020 Report Share Posted March 25, 2020 3 минуты назад, aerohost сказал: получится завести PL-VFI под nanocad 11 ? Я обошел там в коде, как и писал, неработающую функцию. Проверьте под nanoCAD 11 вот этот скрипт. У меня PL-VFI под NC11 работает.pltools_nano_2020-03-25_01.lsp 2 Quote Link to comment Share on other sites More sharing options...
aerohost Posted March 25, 2020 Author Report Share Posted March 25, 2020 7 часов назад, A.Kudrjashov сказал: Я обошел там в коде, как и писал, неработающую функцию. Проверьте под nanoCAD 11 вот этот скрипт. У меня PL-VFI под NC11 работает.pltools_nano_2020-03-25_01.lsp Завелся, ура ! Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted April 7, 2020 Report Share Posted April 7, 2020 (edited) ... первое полное приближение вместе с описанием проблемных мест выложил здесь Edited April 7, 2020 by A.Kudrjashov Quote Link to comment Share on other sites More sharing options...
Генпланист Posted September 22, 2020 Report Share Posted September 22, 2020 Доброго времени суток. Работаю в заводском отделе генплана, установлен Нанокад Геоника. Так как нам часто заказывают схемы с подсчетом площадей заводских объектов и их координатами, попробовал использовать лиспы, в частности лисп для простановки площади объекта. При попытке указать объект, площадь которого нужно вывести в виде текста, нанокад выдает ошибку: <Площадь> Выберите или нарисуйте [Полилиния/Установки/Выбор] <Выбор>: В Выберите полилинию, круг, сплайн, эллипс или дугу или штриховку ошибка: неверная строка режима SSGET Собственно, вопрос: что поменять в коде, чтобы лисп корректно работал? Лисп прикладываю ниже. PTLB2.lsp Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted September 22, 2020 Report Share Posted September 22, 2020 (edited) 7 часов назад, Генпланист сказал: <Площадь> Выберите или нарисуйте [Полилиния/Установки/Выбор] <Выбор>: В Выберите полилинию, круг, сплайн, эллипс или дугу или штриховку ошибка: неверная строка режима SSGET Получается, что не работает фрагмент кода: (ssget "_:S:E" (if (= what "Area") '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE,HATCH")) '((0 . "LINE,*POLYLINE,ARC,CIRCLE"))) ) В программе-конкуренте данная конструкция срабатывает. Это означает, что в нанокаде не полностью реализована данная функция, кстати, весьма нетривиальная и цветистая. Установленные методы ":Е" - все примитивы, попадающие в прицел устройства указания; ":S" - допускает выбор только одного объекта. Не понимаю именно такой выбор методов, не хватает воображения Судя по контексту, в данном месте предполагается указать единственный элемент из указанных типов в прицеле курсора. Можно попробовать разбить данное выражение на более простые конструкции. Например, (setq a (ssget "_:S" (if (= what "Area") '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE,HATCH")) '((0 . "LINE,*POLYLINE,ARC,CIRCLE"))) )) просто вернет набор ровно из одного элемента подходящего типа (вроде, именно это и требуется) или nil. Фактически вам будет необходимо дополнительно отработать только именно эту возможность (пустой набор). PS. Более серьезная проблема вырисовалась дальше Похоже (vlax-invoke-method util "GetObjectIdString" obj :vlax-False) не выдает ожидаемого результата (программа валится). Возможно, объектная модель нанокада отличается от модели акада и не содержит такого метода. Не стал выяснять, для чего он в этом коде и можно ли без него обойтись... Edited September 22, 2020 by EdwardSt 1 Quote Link to comment Share on other sites More sharing options...
Генпланист Posted September 28, 2020 Report Share Posted September 28, 2020 (edited) Цитата Похоже (vlax-invoke-method util "GetObjectIdString" obj :vlax-False) не выдает ожидаемого результата (программа валится). Возможно, объектная модель нанокада отличается от модели акада и не содержит такого метода. Да уж, в ходе моего гугления по сайтам типа dwg.ru выяснилось, что далеко не все лиспы, на "ура" воспринимаемые Акадом, так же хорошо воспринимаются Нанокадом -включая популярные лиспы от Lee Mac. В итоге, обратившись к САПРовцам, ограничился вот этим: stroka МОЯ.lsp Пытался использовать lispы, которые бы показывали значение площади в виде поля (которое изменяется при регенерации) - как правило, выдают ошибку...=(( И еще: если кто-нибудь знает, как прописать функции типа разбивки пикетажа или формирования профиля в виде макроса - очень прошу, поделитесь Edited September 28, 2020 by Генпланист Quote Link to comment Share on other sites More sharing options...
tok Posted June 3, 2021 Report Share Posted June 3, 2021 Бился с адаптацией под Nanocad лиспа для получения точек полилинии в формате для тахеометров лейка, ничего к сожалению не получается. Может кто нибудь помочь в этом непростом деле? exp_gsi.LSP Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.