A.Kudrjashov 301 Опубликовано 8 октября, 2020 Жалоба Поделиться Опубликовано 8 октября, 2020 (изменено) Решил проверить состав команд 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.1Symbols - 9 Functions - 354 Global Variables - 8 Commands - 2 Это: (1) ошибка, (2) отражение реального положения дел в LISP nanoCAD или (3) принципиальный отход от программирования на LISP в nanoCAD ? Вложения: LISPDumpFile.lsp LISPDumpFile_out.rar LISP_Symbols.xlsx Изменено 8 октября, 2020 пользователем A.Kudrjashov Цитата Ссылка на сообщение Поделиться на другие сайты
EdwardSt 148 Опубликовано 8 октября, 2020 Жалоба Поделиться Опубликовано 8 октября, 2020 3 часа назад, A.Kudrjashov сказал: 1) Команду >(atoms-family 1) Может быть, проблемы с реализацией только этой функции? Спойлер А между тем Спойлер Т.е., переменная такая в нанокаде есть, значение ей присвоено, в операциях сложения корректно работает. Остальной код не ковырял. Выглядит все, в общем, достаточно прозрачно. Короче, подозрение на самый первый оператор по извлечению списка идентификаторов. Думаю, что тут ответ (1) - ошибка, причем в реализации отдельной служебной функции. Уф, отлегло ))) Цитата Ссылка на сообщение Поделиться на другие сайты
A.Kudrjashov 301 Опубликовано 9 октября, 2020 Автор Жалоба Поделиться Опубликовано 9 октября, 2020 (изменено) 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 Изменено 9 октября, 2020 пользователем A.Kudrjashov Цитата Ссылка на сообщение Поделиться на другие сайты
Andrey L 3 Опубликовано 9 октября, 2020 Жалоба Поделиться Опубликовано 9 октября, 2020 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 просто нет под рукой 2 1 Цитата Ссылка на сообщение Поделиться на другие сайты
EdwardSt 148 Опубликовано 9 октября, 2020 Жалоба Поделиться Опубликовано 9 октября, 2020 (изменено) 25 минут назад, Andrey L сказал: 20.1 просто нет под рукой Сапожник без сапог А вообще, прикольно. Неочевидно. но многое объясняет и есть логика Изменено 9 октября, 2020 пользователем EdwardSt Цитата Ссылка на сообщение Поделиться на другие сайты
A.Kudrjashov 301 Опубликовано 13 октября, 2020 Автор Жалоба Поделиться Опубликовано 13 октября, 2020 (изменено) В 09.10.2020 в 17:44, Andrey L сказал: Если не грузить (vl-load-com), то и в 20.0 неgusto добавлено через 1 минуту 20.1 просто нет под рукой Да, с (vl-load-com) различие 20.0 (пр-верх) и 20.1 всего в двух Symbols. Спойлер P.S.1 Может сделать выполнение команды (vl-load-com) автоматическим при запуске nanoCAD ? Выставить опцию "Использование LISP", при включении которой автоматически загружать поддержку VL- объектов. P.S.2 Решение понятно, но не вполне очевидно, почему: 1. Частично не опрашивается большая часть Глобальных переменных, в то время как другие опрашиваются ? Спойлер Спойлер 2. Почему не опрашиваются функции, не относящиеся к VL-.... ? Спойлер Понятно, что, по видимому, это связано с реализацией через VL-, но всё таки не вполне очевидно. Поэтому возвращаемся к PS.1 Изменено 13 октября, 2020 пользователем A.Kudrjashov 1 Цитата Ссылка на сообщение Поделиться на другие сайты
A.Kudrjashov 301 Опубликовано 14 октября, 2020 Автор Жалоба Поделиться Опубликовано 14 октября, 2020 (изменено) Чудеса машинной арифметики в 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) ) Спойлер Подозрение сразу упало на проблемы с Типом значения переменной. В описании 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: Спойлер nanoCAD: Спойлер Как то так .... Тестовый скрипт:gcd_test.lsp Upd. В дополнение Спойлер Изменено 15 октября, 2020 пользователем A.Kudrjashov 2 Цитата Ссылка на сообщение Поделиться на другие сайты
A.Kudrjashov 301 Опубликовано 16 октября, 2020 Автор Жалоба Поделиться Опубликовано 16 октября, 2020 (изменено) Вызов диалогового окна Справки. Функция acad_helpdlg в nanoCAD 20.1 определена, но либо выполняется с ошибкой, либо ругается на некорректное число аргументов. В nanoCAD 20.1 для вызова диалогового окна Справки необходимо использовать функцию help. В функцию передаются два параметра: <helpfile> - имя соответствующего файла помощи и <topic> - идентификатор соответствующего требуемого раздела помощи. Есть ещё третий параметр <command>, но понять как он работает и запустить его в работу так и не получилось. Описание данного параметра очень скудное. В Руководстве для AutoCAD и имя файла помощи и наименование раздела помощи задаются кратким именем, видимо предполагается, что поиск будет осуществляться в подкаталогах определенных "по умолчанию". В nanoCAD такое не проходит, поэтому и для "helpfile", и для "topic" необходимо задавать полноценное имя. Получить их можно открыв требуемый раздел в требуемой нам Справке. Рассмотрим на примере раздела "Динамический ввод". Спойлер Если щелкнуть ПрКлМ на шапке окна Справки то обнаружится пункт контекстного меню "Перейти на адрес в Интернете ..." Спойлер , после чего мы увидим текущий адрес необходимого нам раздела Справки Спойлер В моём случае он будет иметь следующее значение: "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 При вызове диалогового окна по умолчанию слева отображается последняя вкладка, которая была открыта в предыдущем сеансе просмотра Справки. Для перехода на соответствующий пункт Содержания достаточно щелкнуть по иконке "Найти". Спойлер P.S.2 Вызов соответствующего раздела Справки также можно организовать при помощи ярлыка Проводника. Пример ярлыка прилагается. nCad_Динамический ввод.rar Изменено 16 октября, 2020 пользователем A.Kudrjashov Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.