Как установить размеры рамки вокруг Мтекст?

Автор Тема: Как установить размеры рамки вокруг Мтекст?  (Прочитано 1902 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн ElectricАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 81
  • Карма: 10
Есть многострочный текст в автокаде, выравнивание "середина по центру". Возможно ли программно установить точные размеры ограничивающей рамки вокруг Мтекста с помощью LISP?

Оффлайн slay_78

  • ADN OPEN
  • Сообщений: 2
  • Карма: 2
Добрый день. С такими вопросами хорошо справляется deepseek.
Вот пример запроса: "LISP: defun c:MTextSize, выбор MText, вывод ширины (41) и высоты (46) через rtos 2 3, обработка ошибок." (запрос тоже deepseek написал).
Вот пример кода от deepseek:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:MTextSize ( / ent data width height)
  2.   (setq ent (car (entsel "\nВыберите MText: ")))
  3.   (if ent
  4.     (progn
  5.       (setq data (entget ent))
  6.       (setq width (cdr (assoc 41 data)))  ; ширина опорного прямоугольника
  7.       (setq height (cdr (assoc 46 data)))  ; высота фона
  8.      
  9.       (princ (strcat "\n?? Ширина (DXF 41): " (rtos width 2 3)))
  10.       (princ (strcat "\n?? Высота (DXF 46): " (rtos height 2 3)))
  11.     )
  12.     (princ "\n? Объект не выбран или это не MText.")
  13.   )
  14.   (princ)
  15. )
  16. ;Важно! Свойство мтекста столбцы должно быть НЕТ, а не динамический как по умолчанию.
« Последнее редактирование: 09-08-2026, 00:39:42 от Александр Ривилис »

Оффлайн ElectricАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 81
  • Карма: 10
Добрый день. С такими вопросами хорошо справляется deepseek.
Вот пример запроса: "LISP: defun c:MTextSize, выбор MText, вывод ширины (41) и высоты (46) через rtos 2 3, обработка ошибок." (запрос тоже deepseek написал).
Вот пример кода от deepseek:

Спасибо за ответ. Но как раз с этой задачей Deepseek у меня и затупил  :)  Ни одно из предлагаемых им решений не работает правильно.

Ваш код считывает размеры рамки, моя задача в обратном, установить размеры точно. Допустим, хочу сделать рамку 500х500:

Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:MTextSize ( / ent data width height)
  2.   (setq ent (car (entsel "\nВыберите MText: ")))
  3.   (if ent
  4.     (progn
  5.       (setq data (entget ent))
  6.      
  7.       ;; --- Чтение текущих значений (для информации) ---
  8.       (setq width (cdr (assoc 41 data)))   ; ширина опорного прямоугольника
  9.       (setq height (cdr (assoc 46 data)))  ; высота фона
  10.      
  11.       (princ (strcat "\n?? Текущая ширина (DXF 41): " (rtos width 2 3)))
  12.       (princ (strcat "\n?? Текущая высота (DXF 46): " (rtos height 2 3)))
  13.      
  14.       ;; --- Установка новых значений 500 x 500 ---
  15.       (setq data (subst (cons 41 500.0) (assoc 41 data) data)) ; меняем ширину на 50
  16.       (setq data (subst (cons 46 500.0) (assoc 46 data) data)) ; меняем высоту на 50
  17.      
  18.       ;; --- Применяем изменения к объекту ---
  19.       (entmod data)
  20.       (entupd ent) ; обновляем экран
  21.      
  22.       (princ "\n?? Рамка MText установлена на 500 x 500.")
  23.     )
  24.     (princ "\n? Объект не выбран или это не MText.")
  25.   )
  26.   (princ)
  27. )
  28.  

Пишет:

Цитировать
?? Текущая ширина (DXF 41): 3.652
?? Текущая высота (DXF 46): 50.000
?? Рамка MText установлена на 500 x 500.

Хотя по факту рамка редактирования вокруг текста как была, так и осталась небольшой, при этом выравнивание "Середина по центру". Deepseek снова убеждает меня, что программно это сделать невозможно.

Отмечено как Решение Electric 11-08-2026, 06:44:58

Оффлайн slay_78

  • ADN OPEN
  • Сообщений: 2
  • Карма: 2
Добрый день. Ваш код работает с МТекстом у которого свойство столбцы установлено в нет, вместо динамический.

Оффлайн ElectricАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 81
  • Карма: 10
Добрый день. Ваш код работает с МТекстом у которого свойство столбцы установлено в нет, вместо динамический.

Да, Вы правы. Это наконец решило проблему:

Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:MTextSize ( / ent data width height coltype)
  2.   (setq ent (car (entsel "\nВыберите MText: ")))
  3.   (if ent
  4.     (progn
  5.       (setq data (entget ent))
  6.      
  7.       ;; --- Проверяем и отключаем динамические столбцы ---
  8.       ;; DXF 75 - тип столбцов:
  9.       ;; 0 = без столбцов (один столбец)
  10.       ;; 1 = динамические столбцы
  11.       ;; 2 = статические столбцы
  12.       (if (assoc 75 data)
  13.         (progn
  14.           (setq coltype (cdr (assoc 75 data)))
  15.           (princ (strcat "\n?? Текущий режим столбцов: " (itoa coltype)))
  16.           (if (/= coltype 0)
  17.             (progn
  18.               (setq data (subst (cons 75 0) (assoc 75 data) data))
  19.               (princ "\n?? Переключено в режим 'Один столбец'")
  20.             )
  21.           )
  22.         )
  23.         (progn
  24.           ;; Если DXF 75 нет, добавляем его (значение 0 = один столбец)
  25.           (setq data (append data (list (cons 75 0))))
  26.           (princ "\n?? Добавлен режим 'Один столбец'")
  27.         )
  28.       )
  29.      
  30.       ;; --- Теперь устанавливаем размеры ---
  31.       (setq width (cdr (assoc 41 data)))
  32.       (setq height (cdr (assoc 46 data)))
  33.      
  34.       (princ (strcat "\n?? Текущая ширина: " (rtos width 2 3)))
  35.       (princ (strcat "\n?? Текущая высота: " (rtos height 2 3)))
  36.      
  37.       ;; Устанавливаем 500 x 500
  38.       (setq data (subst (cons 41 500.0) (assoc 41 data) data))
  39.       (setq data (subst (cons 46 500.0) (assoc 46 data) data))
  40.      
  41.       ;; --- Применяем изменения ---
  42.       (entmod data)
  43.       (entupd ent)
  44.      
  45.       (princ "\n?? Готово! MText: режим 'Один столбец', размер 500 x 500")
  46.     )
  47.     (princ "\n? Объект не выбран или это не MText.")
  48.   )
  49.   (princ)
  50. )