Jump to content

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


aerohost
 Share

Recommended Posts

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

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

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

А именно тут 

 "_:L"

pltools.lsp

Edited by aerohost
Link to comment
Share on other sites

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

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

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

 

 

  • Like 1
Link to comment
Share on other sites

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

Link to comment
Share on other sites

13 часов назад, ISL сказал:

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

 

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

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

Link to comment
Share on other sites

Функцию 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

Edited by A.Kudrjashov
  • Like 2
Link to comment
Share on other sites

6 часов назад, aerohost сказал:

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


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

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

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

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

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

Link to comment
Share on other sites

1 час назад, A.Kudrjashov сказал:


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

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

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

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

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

Спойлер

4ba7fc351df03b7fa7ebfb91b0304afa.gif
 

 

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

Edited by aerohost
Link to comment
Share on other sites

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

Edited by A.Kudrjashov
Link to comment
Share on other sites

В 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

 

Edited by aerohost
Gif
Link to comment
Share on other sites

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


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

Edited by A.Kudrjashov
Link to comment
Share on other sites

 

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

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

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

 

Edited by aerohost
Link to comment
Share on other sites

5 часов назад, aerohost сказал:

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

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

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

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

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

Спойлер

image.png.e6acb044904cb0e57f08febbda683454.png

 

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

Спойлер

image.png.b7bd485bef5c76498d5af13110a1b020.png


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

Edited by A.Kudrjashov
Link to comment
Share on other sites

4 часа назад, A.Kudrjashov сказал:

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

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

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

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

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

image.png.e6acb044904cb0e57f08febbda683454.png

 

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

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

image.png.b7bd485bef5c76498d5af13110a1b020.png


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

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

Link to comment
Share on other sites

3 минуты назад, aerohost сказал:

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


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

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

  • Like 2
Link to comment
Share on other sites

7 часов назад, A.Kudrjashov сказал:


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

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

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

Link to comment
Share on other sites

  • 2 weeks later...

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

 

Edited by A.Kudrjashov
Link to comment
Share on other sites

  • 5 months later...

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

 

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

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

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

 

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

 

PTLB2.lsp

Link to comment
Share on other sites

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)

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

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

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

Edited by EdwardSt
  • Like 1
Link to comment
Share on other sites

Цитата

Похоже 

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

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

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

 

 

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

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

stroka МОЯ.lsp

 

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

 

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

Edited by Генпланист
Link to comment
Share on other sites

  • 8 months later...

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

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

exp_gsi.LSP

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...