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

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

Решил проверить состав команд LISP в nanoCAD 20.1 ... печалька ! :(

Проверка показала резкое сокращение числа Symbols распознаваемых стандартным LISP.

Проверка проводилась через

1) Команду >(atoms-family 1)

2) Скрипт LISPDumpFile.lsp (Прилагается)

 

В результате получилось:

Спойлер

 

ACAD 2015
Symbols - 133
Functions - 3427
Global Variables - 1118
Commands - 368
 

NC 11
Symbols - 132
Functions - 2529
Global Variables - 948
Commands - 2

 

NC 20.0
Symbols - 132
Functions - 2555
Global Variables - 948
Commands - 2

 

NC 20.1
Symbols - 9
Functions - 354
Global Variables - 8
Commands - 2

 


Это: (1) ошибка, (2) отражение реального положения дел в  LISP nanoCAD или (3) принципиальный отход от программирования на LISP в nanoCAD ?

Вложения:

LISPDumpFile.lsp

 

LISPDumpFile_out.rar

LISP_Symbols.xlsx

 

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

1) Команду >(atoms-family 1)

Может быть, проблемы с реализацией только этой функции?

 

Спойлер

image.png.f8789cbc5e2914accea0ba28bf330a0a.png

 

А между тем

Спойлер

image.png.ea72d411569bcdc6db58ea375fa96166.png

 

Т.е., переменная такая в нанокаде есть, значение ей присвоено, в операциях сложения корректно работает.

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

Короче, подозрение на самый первый оператор по извлечению списка идентификаторов.

 

Думаю, что тут ответ (1) - ошибка, причем в реализации отдельной служебной функции. Уф, отлегло )))

 

 

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

Может быть, проблемы с реализацией только этой функции?


Я тоже думаю, что проблема локальная. Но, не факт, что только в этой функции. 
Пусть разработчики смотрят.

Надо бы найти или придумать какой-то LISP-modernizr, но пока ничего кроме проверки Symbols в голову не пришло. После выходных попробую обработчик ошибок покопать.

P.S.
У Autodesk тоже не всё хорошо. Нижеследующий банальный скрипт в nanoCAD всех версий отрабатывается нормально, а в AutoCAD 2015 выдаёт какую то ХХХХ.
Скрипт:

Спойлер

(defun c:LISPSimpleForEach (/ afList nSyms)
   (setq afList (atoms-family 1))
   (setq nSyms 0)
   
   (foreach item afList
      (progn
         (setq nSyms (1+ nSyms))
         (princ nSyms)(princ "\n")
      )
   ); foreach
   
   (princ)
); defun c:LISPSimpleForEach


Результат:ACAD_2015_Test_Foreach.txt
 

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


NC 20.0

Команда: (load "d:\\LISPDumpFile.lsp")
C:LISPDUMPFILE
Команда: LISPDUMPFILE

LISPDUMPFILE - LISPDUMPFILE
AutoLISP Symbols and Functions count: 
Symbols - 9
Functions - 354
Global Variables - 8
Commands - 2

 

В NC 20.3 будет:

Команда: (vl-load-com)

Команда: (load "d:\\LISPDumpFile.lsp")

C:LISPDUMPFILE

Команда: LISPDUMPFILE

LISPDUMPFILE - LISPDUMPFILE

AutoLISP Symbols and Functions count:

Symbols - 130

Functions - 2566

Global Variables - 953

Commands - 2

добавлено через 0 минут

Если не грузить  (vl-load-com), то и в 20.0 неgusto

добавлено через 1 минуту

20.1 просто нет под рукой

Ссылка на сообщение
Поделиться на другие сайты
25 минут назад, Andrey L сказал:

20.1 просто нет под рукой

Сапожник без сапог :D

 

А вообще, прикольно.

Неочевидно. но многое объясняет и есть логика

Изменено пользователем EdwardSt
Ссылка на сообщение
Поделиться на другие сайты
В 09.10.2020 в 17:44, Andrey L сказал:

Если не грузить  (vl-load-com), то и в 20.0 неgusto

добавлено через 1 минуту

20.1 просто нет под рукой


Да, с (vl-load-com) различие 20.0 (пр-верх) и 20.1 всего в двух Symbols.

Спойлер

image.png.15a160a66b083abcc68502fe9f13f4cc.png

 

P.S.1 
Может сделать выполнение команды (vl-load-com) автоматическим при запуске nanoCAD ? Выставить опцию "Использование LISP", при включении которой автоматически загружать поддержку VL- объектов.

P.S.2
Решение понятно, но не вполне очевидно, почему:
1. Частично не опрашивается большая часть Глобальных переменных, в то время как другие опрашиваются ?

 

Спойлер

image.thumb.png.6b5173d4dfed4fe538a9b135afa585fb.png

 

Спойлер

image.thumb.png.e05284bbc1b6299992ad66a6804c5571.png

 

2. Почему не опрашиваются функции, не относящиеся к VL-.... ?

Спойлер

image.thumb.png.3c5b74a1109667ebd883c9e16d3d87f7.png

 

Понятно, что, по видимому, это связано с реализацией через VL-, но всё таки не вполне очевидно. Поэтому возвращаемся к PS.1

 

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

Чудеса машинной арифметики в LISP.
(Не только nanoCAD, но и AutoCAD)

 

1.

Проверяем работу LISP функции GCD - вычисление наибольшего общего делителя.

 

Для этого пишем очень простую функцию:

Спойлер

 

(defun GCD_TEST (n1 n2 / x1 x2 y1 y2 z)
   (setq x1 n1)
   (setq x2 n2)
   
   (setq y1 (* 12 x1))
   (setq y2 (* 12 x2))
   
   (princ "x1: ")
   (princ x1)
   (princ " type: ")
   (princ (type x1))
   (princ "\n")

   (princ "x2: ")
   (princ x2)
   (princ " type: ")
   (princ (type x2))
   (princ "\n")

   (princ "y1 = 12 * x1: ")
   (princ y1)
   (princ " type: ")
   (princ (type y1))
   (princ "\n")

   (princ "y2 = 12 * x2: ")
   (princ y2)
   (princ " type: ")
   (princ (type y2))
   (princ "\n")
   
   (princ "x1_2 = y1 / 12: ")
   (princ (/ y1 12))
   (princ " type: ")
   (princ (type (/ y1 12)))
   (princ "\n")

   (princ "x2_2 = y2 / 12: ")
   (princ (/ y2 12))
   (princ " type: ")
   (princ (type (/ y2 12)))
   (princ "\n")
   
   (setq z (gcd y1 y2))
   
   (princ "z = (gcd y1 y2): ")
   (princ z)
   (princ " type: ")
   (princ (type z))
   (princ "\n")
   
   (princ)
)

 

 

Которая при отправке в неё значений 384756847 и 2364756 даёт неправильный результат, поскольку естественным образом наибольший общий делитель ожидается не меньше чем 12 !

Спойлер

(defun C:GCD_TEST1 (/)
   (GCD_TEST 384756847 2364756)
   
   (princ)
)

 

Спойлер

image.png.e69c555b23e0bebe8ade30eb9415b6e3.png

 

Подозрение сразу упало на проблемы с Типом значения переменной. В описании GCD сказано, что данная функция работает только с INT. А в руководстве AutoLISP говорится, что INT - это целочисленные значения в пределах -32768 и 32767.

 

Однако, на скриншоте видно, что вычисленные значения, выходящие за рамки указанного диапазона ( -32768 и 32767), LISP функцией type также воспринимаются, как INT ! В итоге, в результате исследований выяснилось, что в данном конкретном случае неверно вычисляется выражение 12 * 384 758 647, которое должно быть равно 4 617 082 164, а не 322 114 868 ! Полученное в результате умножения значение превысило Границу и мы получили в целом неверный результат.

 

2. Проверяем где именно проходит граница между типами значений, интерпретируемыми как INT и REAL. Предполагаем, что это будет 32-битное число.

Спойлер

 

(defun C:TEST_INT_REAL (/)
   (setq xInt (- (expt 2 31) 1))

   (princ "Type from Variable:\n")
   (princ "xInt: ")
   (princ xInt)
   (princ " type: ")
   (princ (type xInt))
   (princ "\n")
   
   (princ "xInt + 1: ")
   (princ (+ xInt 1))
   (princ " type: ")
   (princ (type (+ xInt 1)))
   (princ "\n\n")

   (princ "Type from Number:\n")
   (princ "type 2 147 483 646: ")
   (princ (type 2147483646))
   (princ "\n")
   (princ "type 2 147 483 647: ")
   (princ (type 2147483647))
   (princ "\n")
   (princ "type 2 147 483 648: ")
   (princ (type 2147483648))
   (princ "\n")
   (princ "type - 2 147 483 646: ")
   (princ (type -2147483646))
   (princ "\n")
   (princ "type - 2 147 483 647: ")
   (princ (type -2147483647))
   (princ "\n")
   (princ "type - 2 147 483 648: ")
   (princ (type -2147483648))
   (princ "\n")
)

 

 

И получаем занимательный результат !

- Сначала "переходим через границу" добавляя единицу к максимальному значению 2 147 483 647. Причём переход "в минус" однозначно показывает, что это действительно максимальное значение.

- Определяем границы для значений переменных

- Определяем границы для числовых значений
AutoCAD:

Спойлер

image.png.6c91b42726e41d6b19fb5f135c42fafe.png

 

nanoCAD:

Спойлер

image.png.f324652fbd8ff74406fbb65533f094bb.png

 

Как то так .... :(

 

Тестовый скрипт:
gcd_test.lsp

 

Upd. В дополнение

Спойлер

image.png.42c2af7015eeaab83b2073abbcdc8250.png

 

 

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

Вызов диалогового окна Справки.

 

Функция acad_helpdlg в nanoCAD 20.1 определена, но либо выполняется с ошибкой, либо ругается на некорректное число аргументов.

 

В nanoCAD 20.1 для вызова диалогового окна Справки необходимо использовать функцию help.

 

В функцию передаются два параметра: <helpfile> - имя соответствующего файла помощи и <topic> - идентификатор соответствующего требуемого раздела помощи.

Есть ещё третий параметр <command>, но понять как он работает и запустить его в работу так и не получилось. Описание данного параметра очень скудное.

 

В Руководстве для AutoCAD и имя файла помощи и наименование раздела помощи задаются кратким именем, видимо предполагается, что поиск будет осуществляться в подкаталогах определенных "по умолчанию". В nanoCAD такое не проходит, поэтому и для "helpfile", и для "topic" необходимо задавать полноценное имя.

 

Получить их можно открыв требуемый раздел в требуемой нам Справке.

Рассмотрим на примере раздела "Динамический ввод".

Спойлер

image.png.86c9140d1a36e9b86fdab379dc741621.png

 

Если щелкнуть ПрКлМ на шапке окна Справки то обнаружится пункт контекстного меню "Перейти на адрес в Интернете ..."

Спойлер

image.png.d54308e70d9fb4740a93babfede6f144.png

 

, после чего мы увидим текущий адрес необходимого нам раздела Справки

Спойлер

image.png.08083599f7a8877c014629efc33e9bf2.png

 

В моём случае он будет иметь следующее значение:

"mk:@MSITStore:D:\Program%20Files\Nanosoft\nanoCAD%20x64%20Plus%2020.1\Help\NCad.chm::/html/IDT_ObjEdit_DinInput.htm#Динамический_ввод"

 

Нас интересуют две составляющие этого адреса:

<helpfile>: "D:\\Program%20Files\\Nanosoft\\nanoCAD%20x64%20Plus%2020.1\\Help\\NCad.chm", вводится полный путь, наклонная черта экранируется "\\"

<topic>: "html/IDT_ObjEdit_DinInput", вводится путь без начального "/" и без указания расширения ".htm", которое будет подставлено по умолчанию.

 

Теперь команда вызова требуемого раздела Справки будет выглядеть следующим образом:

>(help "d:\\Program files\\Nanosoft\\nanoCAD x64 Plus 20.1\\help\\nCad.chm" "html/IDT_ObjEdit_DinInput")

 

P.S.1

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

Для перехода на соответствующий пункт Содержания достаточно щелкнуть по иконке "Найти".

Спойлер

image.png.fcb6ed452a5c5c2dd4b8d11ec9d198df.png

 

P.S.2

Вызов соответствующего раздела Справки также можно организовать при помощи ярлыка Проводника. Пример ярлыка прилагается.

nCad_Динамический ввод.rar

 

 

 

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

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

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

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

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

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

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

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

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

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

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