Перейти к содержанию

Адаптация Lisp под Nanocad


Рекомендуемые сообщения

Прошу помощи в адаптации Lisp под нанокад. А именно функцию команды PL-VFI

Я так понимаю вся истина кроется тут 

(ssget "_:L" '((0 . "*POLYLINE,LINE,ARC,CIRCLE"))))

А именно тут 

 "_:L"

pltools.lsp

Изменено пользователем aerohost
Ссылка на сообщение
Поделиться на другие сайты
  • Ответов 119
  • Дата создания
  • Последний ответ

Лучшие авторы в теме

Лучшие авторы в теме

Популярные посты

Есть еще txt-edit_Nc.lsp - удаляет форматирование для всего файла или выборочно.   Для сброса цвета - см. bgtools 3.11a_Nc_21.lsp - работающие команды отмечены + в BGINFO.   Насчет Stri

Попытался переписать функцию BounderyMText с применением входных параметров. В скрипте внес достаточно подробные комментарии, а также привел варианты вызова функции с различными параметрами. Запр

В продолжение темы. Конечно, победить метод 'Replace мне не удалось. Но, возможно, на наше счастье метод 'Execute работает штатно, что позволило внести некоторые изменения в код (извиняюсь з

Изображения в теме

Похоже, в нанокад режим "_: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 …)

В принципе, такая функция-обертка может быть довольно сложной по содержанию.

Можно даже реализовать какие-нибудь свои изощренные сценарии)

 

 

Ссылка на сообщение
Поделиться на другие сайты

Режим выбора :L действительно не реализован. Поднял приоритет задачи.

Ссылка на сообщение
Поделиться на другие сайты
13 часов назад, ISL сказал:

Режим выбора :L действительно не реализован.

 

Есть возможность получить список реализованных режимов?

Похоже, ":L" - не единственный из них.

Ссылка на сообщение
Поделиться на другие сайты

Если что-то не работает – присылайте код.

Ссылка на сообщение
Поделиться на другие сайты

Функцию PL-VFI адаптировал. Соответствующую часть прокомментировал, чтобы можно было нормально читать.
В конце файла добавил функцию обертку nano:ssget-l.

Будет время, постепенно постараюсь пройтись по всему файлу целиком.

В приложенном тестовом файле синие полилинии на не заблокированных слоях, а зеленые - на заблокированных.
На нулевом слое полилиния, которую обрабатываем.
Результат:
До.

Спойлер

image.thumb.png.48dec43ed0cd3f1286d36cecc3ea6d91.png

 

После обработки.

Спойлер

image.thumb.png.8005bb01b1e321b7e825e5510795bcf5.png

 

P.S. Обратите внимание, что там в исходном варианте фильтром отбрасываются полилинии, содержащие кривые и сплайны, а также 3D полилинии.

Пока как то так.

Файлы:
_PL-VFI_Test.dwg

 

pltools_nano.lsp

Изменено пользователем A.Kudrjashov
Ссылка на сообщение
Поделиться на другие сайты
6 часов назад, aerohost сказал:

я что то делаю не так ...


Я завтра посмотрю. Но, как минимум, я бы сравнил величину "допуска (1)" с размерностями объектов.
Я рисовал на шару, когда проверял, допуск не менял, оставил тот. что по умолчанию (0.001).

Сначала выбирал режущие кромки (синие и зеленые), потом целевую полилинию (белую).
По отдельности тоже проверял.

Не проверял опцию "С продолжением". У меня здесь все полилинии пересекаются. Но, поскольку это базовая функция LISP, думаю, что проблем быть не должно.

P.S.
Там упрощенно алгоритм следующий:
1. Находятся точки пересечения режущих с целевой.
2. К этим точкам пересечения находится параметр ближайшей вершины.
3. У ближайшей вершины определяются целочисленные ограничения параметра сверху и снизу.
4. Далее оценивается попадает ли точка пересечения в коридор (+/- Допуск по отношению к целочисленной границе). Если не попадает, то добавляется на целевую полилинию

Собственно, действий не так много, можно всю цепочку повторить вручную в командной строке и посмотреть, где алгоритм не срабатывает.
Либо поставить в критичных местах PRINC для отслеживания.

Ссылка на сообщение
Поделиться на другие сайты
1 час назад, A.Kudrjashov сказал:


Я завтра посмотрю. Но, как минимум, я бы сравнил величину "допуска (1)" с размерностями объектов.
Я рисовал на шару, когда проверял, допуск не менял, оставил тот. что по умолчанию (0.001).

Сначала выбирал режущие кромки (синие и зеленые), потом целевую полилинию (белую).
По отдельности тоже проверял.

Не проверял опцию "С продолжением". У меня здесь все полилинии пересекаются. Но, поскольку это базовая функция LISP, думаю, что проблем быть не должно.

P.S.
Там упрощенно алгоритм следующий:
1. Находятся точки пересечения режущих с целевой.
2. К этим точкам пересечения находится параметр ближайшей вершины.
3. У ближайшей вершины определяются целочисленные ограничения параметра сверху и снизу.
4. Далее оценивается попадает ли точка пересечения в коридор (+/- Допуск по отношению к целочисленной границе). Если не попадает, то добавляется на целевую полилинию

Собственно, действий не так много, можно всю цепочку повторить вручную в командной строке и посмотреть, где алгоритм не срабатывает.
Либо поставить в критичных местах PRINC для отслеживания.

Спойлер

4ba7fc351df03b7fa7ebfb91b0304afa.gif
 

 

Может какая то переменная nanocada у нас отличается, то и разный результат ? 

Изменено пользователем aerohost
Ссылка на сообщение
Поделиться на другие сайты
9 часов назад, aerohost сказал:

Может какая то переменная nanocada у нас отличается, то и разный результат ? 


Сразу должен сказать, что я практически не трогал текст, а только структурно разобрал его, прокомментировал, поставил вопросы и добавил nano:ssget-l.

1. Синяя и белая полилинии должны находиться на разблокированных слоях, но на всякий случай можно проверить, что они попадают в требуемую выборку.
Вот здесь (nano:ssget-l) раскомментировать PRINC 

Спойлер

image.png.09112a096cf444eb9ffe2be7db82fe8e.png


2. Следующий спорный момент, который я пока не трогал - это определение "Режима продолжения кромки".
В исходном тексте предполагается ввод кучи альтернативных ключей

Спойлер

image.png.2bf272471b887999dd812ee2f8b23279.png

 

а анализируется всего один

Спойлер

image.png.c6e9f6ec81c34648816319fcee5edfd2.png

Хотя он должен сказываться только в случае выбора режима "С продолжением" через E(lat). Во всех остальных случаях будет "Без продолжения". 


Здесь же можно принципиально проверить размерность массива результатов пересечений (RET)
 

3. Далее, последнее препятствие на пути добавления вершин - это попадание точки пересечений в доверительный интервал от целочисленных границ Параметра ближайшей точки целевой полилинии. Проверяем здесь:

Спойлер

image.png.da3e6b41f4120baf4ba7111bef3b14c9.png

 

Вот сюда можно добавить (progn <script>);progn else.

Спойлер

image.png.678f845266f2def2166456f6770cc58e.png


В общем, надо смотреть где происходит сбой.

(Выше нумерация по предыдущему файлу)

 

Upd.
Прикладываю LSP файл с отладочными строками.
Там еще в коде устранения дублирующих полилиний, похоже, была ошибка.
Вот здесь (нумерация по новому файлу). Не очень критично, но тем не менее.

Спойлер

image.png.4d1c851164f2b98eab772e6dfa34c6f1.png


Файл с отладочными строками (alert и princ), выделенными ;;; DEBUG

(Переменная в самом начале файла)

pltools_nano_2020-03-21_02.lsp

Изменено пользователем A.Kudrjashov
Ссылка на сообщение
Поделиться на другие сайты
В 21.03.2020 в 06:35, A.Kudrjashov сказал:


Сразу должен сказать, что я практически не трогал текст, а только структурно разобрал его, прокомментировал, поставил вопросы и добавил nano:ssget-l.

1. Синяя и белая полилинии должны находиться на разблокированных слоях, но на всякий случай можно проверить, что они попадают в требуемую выборку.
Вот здесь (nano:ssget-l) раскомментировать PRINC 

  nano:ssget-l (1) (Показать контент)

image.png.09112a096cf444eb9ffe2be7db82fe8e.png


2. Следующий спорный момент, который я пока не трогал - это определение "Режима продолжения кромки".
В исходном тексте предполагается ввод кучи альтернативных ключей

  PL-VFI (1_1) (Показать контент)

image.png.2bf272471b887999dd812ee2f8b23279.png

 

а анализируется всего один

  PL-VFI (1_2) (Показать контент)

image.png.c6e9f6ec81c34648816319fcee5edfd2.png

Хотя он должен сказываться только в случае выбора режима "С продолжением" через E(lat). Во всех остальных случаях будет "Без продолжения". 


Здесь же можно принципиально проверить размерность массива результатов пересечений (RET)
 

3. Далее, последнее препятствие на пути добавления вершин - это попадание точки пересечений в доверительный интервал от целочисленных границ Параметра ближайшей точки целевой полилинии. Проверяем здесь:

  PL-VFI (2) (Показать контент)

image.png.da3e6b41f4120baf4ba7111bef3b14c9.png

 

Вот сюда можно добавить (progn <script>);progn else.

  PL-VFI (2_2) (Показать контент)

image.png.678f845266f2def2166456f6770cc58e.png


В общем, надо смотреть где происходит сбой.

(Выше нумерация по предыдущему файлу)

 

Upd.
Прикладываю LSP файл с отладочными строками.
Там еще в коде устранения дублирующих полилиний, похоже, была ошибка.
Вот здесь (нумерация по новому файлу). Не очень критично, но тем не менее.

  Проверка на дубли (Показать контент)

image.png.4d1c851164f2b98eab772e6dfa34c6f1.png


Файл с отладочными строками (alert и princ), выделенными ;;; DEBUG

(Переменная в самом начале файла)

pltools_nano_2020-03-21_02.lsp 211 \u043a\u0411 · 1 загрузка

Спойлер

5c98d4f8c8fffc6c21dbacfefa8cf6db.gif

 

Изменено пользователем aerohost
Gif
Ссылка на сообщение
Поделиться на другие сайты

Gif файл у меня не открывается.
Видимо криво записался на форуме.


Последний вариант. Добавлены PL-CW и PL-CCW.
Комментарии внутри.
pltools_nano_2020-03-21_04.lsp
 

Изменено пользователем A.Kudrjashov
Ссылка на сообщение
Поделиться на другие сайты

 

В 21.03.2020 в 14:47, A.Kudrjashov сказал:

Gif файл у меня не открывается.
Видимо криво записался на форуме

У меня почему то не заводится. Фото перекрепил

 

Изменено пользователем aerohost
Ссылка на сообщение
Поделиться на другие сайты
5 часов назад, aerohost сказал:

У меня почему то не заводится. Фото перекрепил

Теперь антивирус ругается на место размещения GIF.
К чему такие сложности ?
В Программах находим "Ножницы" и далее - Скопировать и Вставить.

Но я там в тексте вывел практически всю отладочную информацию ... надо смотреть по месту, где и что не срастается !
Alert показывают ключевые этапы, которые либо выполняются, либо нет.
А все остальное генерируется в командную строку ... или не генерируется.

.... есть одно подозрение, но попозже.

Upd.
В nanoCAD 11 у меня в функции PL:AddVX не выполняется вот такая конструкция:

Спойлер

image.png.e6acb044904cb0e57f08febbda683454.png

 

Когда я обхожу ее и делаю тупое присвоение ширине 0, то все работает.

Спойлер

image.png.b7bd485bef5c76498d5af13110a1b020.png


С кодом надо разбираться !.. :(
 

Изменено пользователем A.Kudrjashov
Ссылка на сообщение
Поделиться на другие сайты
4 часа назад, A.Kudrjashov сказал:

Теперь антивирус ругается на место размещения GIF.
К чему такие сложности ?
В Программах находим "Ножницы" и далее - Скопировать и Вставить.

Но я там в тексте вывел практически всю отладочную информацию ... надо смотреть по месту, где и что не срастается !
Alert показывают ключевые этапы, которые либо выполняются, либо нет.
А все остальное генерируется в командную строку ... или не генерируется.

.... есть одно подозрение, но попозже.

Upd.
В nanoCAD 11 у меня в функции PL:AddVX не выполняется вот такая конструкция:

  Скриншот1 (Показать контент)

image.png.e6acb044904cb0e57f08febbda683454.png

 

Когда я обхожу ее и делаю тупое присвоение ширине 0, то все работает.

  Скриншот 2 (Показать контент)

image.png.b7bd485bef5c76498d5af13110a1b020.png


С кодом надо разбираться !.. :(
 

Я уже понял что ты мегамозг и решишь это как семочки пощелкать 🤣 будем ждать финальную версию

Ссылка на сообщение
Поделиться на другие сайты

На 20ой версии завелся PL-VFI, на 11 не хочет

Спойлер

7014aef024fd5512672809d353a58fa5.gif
 

Спойлер

4b3cde6414fb3481d76000f878b30133.gif
 

 

Изменено пользователем aerohost
Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, aerohost сказал:

получится завести PL-VFI под nanocad 11 ?


Я обошел там в коде, как и писал, неработающую функцию.

Проверьте под nanoCAD 11 вот этот скрипт. У меня PL-VFI под NC11 работает.
pltools_nano_2020-03-25_01.lsp
 

Ссылка на сообщение
Поделиться на другие сайты
7 часов назад, A.Kudrjashov сказал:


Я обошел там в коде, как и писал, неработающую функцию.

Проверьте под nanoCAD 11 вот этот скрипт. У меня PL-VFI под NC11 работает.
pltools_nano_2020-03-25_01.lsp
 

Завелся, ура !

Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...

... первое полное приближение вместе с описанием проблемных мест выложил здесь

 

Изменено пользователем A.Kudrjashov
Ссылка на сообщение
Поделиться на другие сайты
  • 5 месяцев спустя...

Доброго времени суток. Работаю в заводском отделе генплана, установлен Нанокад Геоника. Так как нам часто заказывают схемы с подсчетом площадей заводских объектов и их координатами, попробовал использовать лиспы, в частности лисп для простановки площади объекта. При попытке указать объект, площадь которого нужно вывести в виде текста, нанокад выдает ошибку:

 

<Площадь> Выберите или нарисуйте [Полилиния/Установки/Выбор] <Выбор>:  В

Выберите полилинию, круг, сплайн, эллипс или дугу или штриховку

ошибка: неверная строка режима SSGET

 

Собственно, вопрос: что поменять в коде, чтобы лисп корректно работал? Лисп прикладываю ниже.

 

PTLB2.lsp

Ссылка на сообщение
Поделиться на другие сайты
7 часов назад, Генпланист сказал:

<Площадь> Выберите или нарисуйте [Полилиния/Установки/Выбор] <Выбор>:  В

Выберите полилинию, круг, сплайн, эллипс или дугу или штриховку

ошибка: неверная строка режима SSGET

 

Получается, что не работает фрагмент кода:

       (ssget "_:S:E" (if (= what "Area") '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE,HATCH"))  '((0 . "LINE,*POLYLINE,ARC,CIRCLE"))) )

В программе-конкуренте данная конструкция срабатывает.

Это означает, что в нанокаде не полностью реализована данная функция, кстати, весьма нетривиальная и цветистая.

 

Установленные методы 

  ":Е" - все примитивы, попадающие в прицел устройства указания;

  ":S" - допускает выбор только одного объекта.

Не понимаю именно такой выбор методов, не хватает воображения :stena:

 

Судя по контексту, в данном месте предполагается указать единственный элемент из указанных типов в прицеле курсора.

Можно попробовать разбить данное выражение на более простые конструкции.

Например,

   (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)

не выдает ожидаемого результата (программа валится).

Возможно, объектная модель нанокада отличается от модели акада и не содержит такого метода.

Не стал выяснять, для чего он в этом коде и можно ли без него обойтись... 

Изменено пользователем EdwardSt
Ссылка на сообщение
Поделиться на другие сайты
Цитата

Похоже 

     (vlax-invoke-method util "GetObjectIdString" obj :vlax-False)

не выдает ожидаемого результата (программа валится).

Возможно, объектная модель нанокада отличается от модели акада и не содержит такого метода.

 

 

Да уж, в ходе моего гугления по сайтам типа dwg.ru выяснилось, что далеко не все лиспы, на "ура" воспринимаемые Акадом, так же хорошо воспринимаются Нанокадом :unsure: -включая популярные лиспы от Lee Mac.

В итоге, обратившись к САПРовцам, ограничился вот этим:

stroka МОЯ.lsp

 

Пытался использовать lispы, которые бы показывали значение площади в виде поля (которое изменяется при регенерации) - как правило, выдают ошибку...=((

 

И еще: если кто-нибудь знает, как прописать функции типа разбивки пикетажа или формирования профиля в виде макроса - очень прошу, поделитесь :rolleyes:

Изменено пользователем Генпланист
Ссылка на сообщение
Поделиться на другие сайты
  • 8 месяцев спустя...

Бился с адаптацией под Nanocad лиспа для получения точек полилинии в формате для тахеометров лейка, ничего к сожалению не получается.

Может кто нибудь помочь в этом непростом деле?

exp_gsi.LSP

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!

×
×
  • Создать...