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

LISP вставить -mtext с предварительными настройками


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

Бодрого дня.

Подскажите как поправить 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>...:

 

Но сам текст в чертеже не заполняется (пустой)

А хотелось бы еще сделать "преднастройку"  размешать по центру.

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

Я бы рекомендовал вообще уменьшать количество использований (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

 

Такая конструкция работает значительно быстрее, универсальнее.

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

Ссылка на сообщение
Поделиться на другие сайты
(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 минуту

Непонятно почему не принимает запрошенную точку

 

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

10 . tochka ) ;точка вставки

3де координаты

Смотри как выше в примере

Преобразовать надо?

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

Вместо '(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)


 

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

ошибка: неверный тип аргумента: INT: CONS

в строке :

(cons 10 tochka ) ;точка вставки с DXF-кодом 10

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

Я в lisp вообще никак. После Autocad правлю, чтоб работало, а тут одни грабли, а я как слепой. :(  

добавлено через 5 минут
47 минут назад, doctorraz сказал:

3де координаты

Смотри как выше в примере

Преобразовать надо?

В Acad не надо было преобразовывать, точка бралась с 3d координатами

Ссылка на сообщение
Поделиться на другие сайты
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) - код группы

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

В Acad не надо было преобразовывать

В АК много чего работало..

В nano наоборот, импортозамещение

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

В АК много чего работало..

В nano наоборот, импортозамещение

Потому и предлагаю уходить от (command., т.к. это платформо - зависимое решение. 

Подходит только для команд с одинаковыми ключами в AC и NC.

 

Предложенный метод универсален для обеих САПР и версий до дедовских времен АС (c NC не знаю, когда была реализована поддержка entmake)

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

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

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

Использование vla-... , vlax-... позволяет иногда создавать очень эффективные коды.

Достигается это за счет их ориентированности на объектную модель приложения.

В этом и сила этих функций, и их слабость.

Сила в использовании уже множества реализованных функций-методов.

А слабость - в заточенности на конкретное приложение.

И в общем случае нет никакой гарантии, что объектные модели у NC и AC совпадут для данного элемента до последнего свойства.

А значит, универсального кода для обеих платформ может и не получиться.

 

Использование же классических функций автолиспа позволяет создавать коды, ориентированные не на приложение, а на результирующий dxf=dwg файл.

Если присмотреться к файлу , сохраненному в DXF-формате, в котором будет создан mtext с помощью функции (entmake, то можно будет увидеть практически вышеизложенный код, только перечисления в нем будут не в виде списков '(...), а просто в каждой строке по отдельному значению.

Т.е. код  напрямую транслируется в dxf-структуру.

Ориентированность на результирующий файл, а не на приложение - это залог универсальности кода в обеих системах.

 

Код без vlax-функций может работать даже на (не сочтите за ругательство)  DOSовских версиях акада :privet:.

Если же требуется достаточно серьезная обработка данных, да еще и с пересчётом геометрии (не наш пример, вынесенный в обсуждаемую ветку), то лучше использовать боле эффективные объектно-ориетированные методы (vla-... , vlax-...) c возможной потерей совместимости на других платформах.

 

 

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

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

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

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

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

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

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

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

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

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

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