Jump to content

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


Recommended Posts

Бодрого дня.

Подскажите как поправить 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 by gizmo_zx
Link to comment
Share on other sites

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

 

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

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

  • Like 3
Link to comment
Share on other sites

(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 минуту

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

 

Link to comment
Share on other sites

16 минут назад, gizmo_zx сказал:

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

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

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

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

Edited by doctorraz
Link to comment
Share on other sites

Вместо '(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 by EdwardSt
Link to comment
Share on other sites

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

в строке :

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

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) - код группы

  • Like 1
Link to comment
Share on other sites

18 минут назад, gizmo_zx сказал:

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

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

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

Link to comment
Share on other sites

1 минуту назад, doctorraz сказал:

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

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

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

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

 

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

  • Like 1
Link to comment
Share on other sites

;;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 by lidia.antipina.ru
  • Like 2
Link to comment
Share on other sites

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

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

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

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

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

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

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

 

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

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

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

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

 

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

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

 

 

  • Like 2
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...