gizmo_zx Posted August 5, 2021 Report Share Posted August 5, 2021 (edited) Бодрого дня. Подскажите как поправить lisp из Autocad, в Nano не взлетел (defun C:raschdu_t (/) (vl-load-com) (setq tochka (getpoint "\n Точка вставки?")) (setq tochka3 (mapcar '+ tochka '(-8.5 -19.1 0.0))) (command "_.-mtext" tochka3 "_j" "_tc" "_l" "_e" "" tochka3 "Вывод текста" "" ) ;_ end of command (princ) ) (prompt "\n\t***\tПрограмма загружена.\n\t***\t Команда для выполнения: raschdu_t\t***") (princ) Ошибка "Неправильный ключ или команда. Введите (') для команды или (?) для математического выражения: _.-mtext" Как я понял не работают "настройки" Мтекста. Сократил Lisp до такого (defun C:raschdu_t (/) (vl-load-com) (setq tochka (getpoint "\n Точка вставки?")) (setq ttext "@text@") (setq tochka3 (mapcar '+ tochka '(-8.5 -19.1 0.0))) (command "-mtext" tochka3 tochka3 ttext "" ) ;_ end of command (princ) ) (prompt "\n\t***\tПрограмма загружена.\n\t***\t Команда для выполнения: raschdu_t\t***") (princ) Ответ Nanocad: Команда: raschdu_t RASCHDU_T - RASCHDU_T Точка вставки? Команда: -mtext MT,MTEXT,T,МТ,МТЕКСТ,Т - Многострочный текст... Укажите первый угол: -8.5,-19.1,0 Укажите противоположный угол: -8.5,-19.1,0 Ввод текста. Закончить ввод по <Ctrl>+<Enter> или отменить по <Esc>...: @text@ Ввод текста. Закончить ввод по <Ctrl>+<Enter> или отменить по <Esc>...: Но сам текст в чертеже не заполняется (пустой) А хотелось бы еще сделать "преднастройку" размешать по центру. Edited August 5, 2021 by gizmo_zx Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted August 5, 2021 Report Share Posted August 5, 2021 Я бы рекомендовал вообще уменьшать количество использований (command ..., т.к. снижается универсальность и скорость выполнения. В качестве альтернативы предложил бы Спойлер (setq d (list ;формируем список с параметрами '(0 . "MTEXT") '(100 . "AcDbMText") '(10 -873.76 -198.079 0.0) ;точка вставки '(40 . 100.0) ;высота '(71 . 5) ;Способ выравнивания '(1 . "test") ; строка )) (entmake d) Список других DXF-кодов при необходимости можно найти в справке. Минимальными являются, похоже, группы с кодами 0, 100, 10 и 1 Такая конструкция работает значительно быстрее, универсальнее. Можно создавать объекты даже на заблокированных и замороженных слоях без переключений, заморочек с привязками и т.д. 3 Quote Link to comment Share on other sites More sharing options...
gizmo_zx Posted August 5, 2021 Author Report Share Posted August 5, 2021 (defun C:raschdu_t (/) (vl-load-com) (setq tochka (getpoint "\n Точка вставки?")) (setq d (list ;формируем список с параметрами '(0 . "MTEXT") '(100 . "AcDbMText") '(10 . tochka ) ;точка вставки '(40 . 2.5) ;высота '(71 . 5) ;Способ выравнивания '(1 . "test") ; строка )) (entmake d) (princ) ) (prompt "\n\t***\tПрограмма загружена.\n\t***\t Команда для выполнения: raschdu_t\t***") (princ) NanoГад говорит: ошибка: неверный тип аргумента: 2D/3D point: TOCHKA добавлено через 1 минуту Непонятно почему не принимает запрошенную точку Quote Link to comment Share on other sites More sharing options...
doctorraz Posted August 5, 2021 Report Share Posted August 5, 2021 (edited) 16 минут назад, gizmo_zx сказал: 10 . tochka ) ;точка вставки 3де координаты Смотри как выше в примере Преобразовать надо? Edited August 5, 2021 by doctorraz Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted August 5, 2021 Report Share Posted August 5, 2021 (edited) Вместо '(10 . tochka ) нужно вставить (cons 10 tochka) Спойлер (defun C:raschdu_t (/ tochka d ) (vl-load-com); для данного фрагмента абсолютно ненужная команда (setq tochka (getpoint "\n Точка вставки?")) (setq d (list ;формируем список с параметрами '(0 . "MTEXT") '(100 . "AcDbMText") (cons 10 tochka ) ;точка вставки с DXF-кодом 10 '(40 . 2.5) ;высота '(71 . 5) ;Способ выравнивания '(1 . "test") ; строка )) (entmake d) (princ) ) (prompt "\n\t***\tПрограмма загружена.\n\t***\t Команда для выполнения: raschdu_t\t***") (princ) Edited August 5, 2021 by EdwardSt Quote Link to comment Share on other sites More sharing options...
gizmo_zx Posted August 5, 2021 Author Report Share Posted August 5, 2021 ошибка: неверный тип аргумента: INT: CONS в строке : (cons 10 tochka ) ;точка вставки с DXF-кодом 10 добавлено через 3 минут Я в lisp вообще никак. После Autocad правлю, чтоб работало, а тут одни грабли, а я как слепой. добавлено через 5 минут 47 минут назад, doctorraz сказал: 3де координаты Смотри как выше в примере Преобразовать надо? В Acad не надо было преобразовывать, точка бралась с 3d координатами Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted August 5, 2021 Report Share Posted August 5, 2021 10 минут назад, gizmo_zx сказал: ошибка: неверный тип аргумента: INT: CONS Внимательно! апостроф перед (cons нужно тоже убрать В лиспе '(10 0.0 0.0 0.0) - вместе с апострофом эквивалентно (cons 10 (list 0.0 0.0 0.0)) без апострофа Здесь (list 0.0 0.0 0.0) - это точка вставки, она же полученная в примере tochka3 Поэтому '(cons 10 (list 0.0 0.0 0.0)) интерпретируется, как ошибка, т.к вместо cons ожидается целое число (INT) - код группы 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted August 5, 2021 Report Share Posted August 5, 2021 18 минут назад, gizmo_zx сказал: В Acad не надо было преобразовывать В АК много чего работало.. В nano наоборот, импортозамещение Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted August 5, 2021 Report Share Posted August 5, 2021 1 минуту назад, doctorraz сказал: В АК много чего работало.. В nano наоборот, импортозамещение Потому и предлагаю уходить от (command., т.к. это платформо - зависимое решение. Подходит только для команд с одинаковыми ключами в AC и NC. Предложенный метод универсален для обеих САПР и версий до дедовских времен АС (c NC не знаю, когда была реализована поддержка entmake) 1 Quote Link to comment Share on other sites More sharing options...
lidia.antipina.ru Posted August 5, 2021 Report Share Posted August 5, 2021 (edited) ;;LA пример добавления объекта MText в пространство модели. По следам Справка AutoCAD 2019 ;; (StAddMtext 0 100 5000 "AAAA dddd ccc" 5 300.0) (defun StAddMtext (X Y width text just h / ;LA добавила параметры acadObj adoc modelSpace MTextObj corner) ;LA добавила лок. переменные ;; This example creates an MText object in model space. (setq acadObj (vlax-get-acad-object)) (setq adoc (vla-get-ActiveDocument acadObj)) ;; Define the multiline text object (setq corner (vlax-3d-point X Y 0)) ;LA точка вставки Mtext ; (setq width 5000) ;LA ширина текста) ; (setq text "This is the text String for the mtext Object") ;LA Текст ;; Creates the mtext Object (setq modelSpace (vla-get-ModelSpace adoc)) (setq MTextObj (vla-AddMText modelSpace corner width text)) ; (vlax-ename->vla-object (car (entsel))) ;LA добавила. Но это лишнее, если известен MTextObj ;далее взять свойства и задать AttachmentPoint = 5 (just=5) ;Lineweight = -1 - пользовательская высота по умолчанию, задать h=5 ;(vlax-put-property obj property arg) (vlax-put-property MTextObj 'AttachmentPoint just) (vlax-put-property MTextObj 'InsertionPoint (list X Y 0)) (vlax-put-property MTextObj 'Height h) (princ) ) Edited August 5, 2021 by lidia.antipina.ru 2 Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted August 5, 2021 Report Share Posted August 5, 2021 Использование vla-... , vlax-... позволяет иногда создавать очень эффективные коды. Достигается это за счет их ориентированности на объектную модель приложения. В этом и сила этих функций, и их слабость. Сила в использовании уже множества реализованных функций-методов. А слабость - в заточенности на конкретное приложение. И в общем случае нет никакой гарантии, что объектные модели у NC и AC совпадут для данного элемента до последнего свойства. А значит, универсального кода для обеих платформ может и не получиться. Использование же классических функций автолиспа позволяет создавать коды, ориентированные не на приложение, а на результирующий dxf=dwg файл. Если присмотреться к файлу , сохраненному в DXF-формате, в котором будет создан mtext с помощью функции (entmake, то можно будет увидеть практически вышеизложенный код, только перечисления в нем будут не в виде списков '(...), а просто в каждой строке по отдельному значению. Т.е. код напрямую транслируется в dxf-структуру. Ориентированность на результирующий файл, а не на приложение - это залог универсальности кода в обеих системах. Код без vlax-функций может работать даже на (не сочтите за ругательство) DOSовских версиях акада . Если же требуется достаточно серьезная обработка данных, да еще и с пересчётом геометрии (не наш пример, вынесенный в обсуждаемую ветку), то лучше использовать боле эффективные объектно-ориетированные методы (vla-... , vlax-...) c возможной потерей совместимости на других платформах. 2 Quote Link to comment Share on other sites More sharing options...
gizmo_zx Posted August 6, 2021 Author Report Share Posted August 6, 2021 Всем огромное спасибо. Работает как надо Quote Link to comment Share on other sites More sharing options...
lidia.antipina.ru Posted August 6, 2021 Report Share Posted August 6, 2021 Прежде чем публиковать проверила под Nc 20.x 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.