ADN Club > AutoLisp / VisualLISP и DCL

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

(1/1)

Electric:
Есть многострочный текст в автокаде, выравнивание "середина по центру". Возможно ли программно установить точные размеры ограничивающей рамки вокруг Мтекста с помощью LISP?

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

--- Код - Auto/Visual Lisp [Выбрать] ---(defun c:MTextSize ( / ent data width height)  (setq ent (car (entsel "\nВыберите MText: ")))  (if ent    (progn      (setq data (entget ent))      (setq width (cdr (assoc 41 data)))  ; ширина опорного прямоугольника      (setq height (cdr (assoc 46 data)))  ; высота фона            (princ (strcat "\n?? Ширина (DXF 41): " (rtos width 2 3)))      (princ (strcat "\n?? Высота (DXF 46): " (rtos height 2 3)))    )    (princ "\n? Объект не выбран или это не MText.")  )  (princ));Важно! Свойство мтекста столбцы должно быть НЕТ, а не динамический как по умолчанию.

Electric:

--- Цитата: slay_78 от 07-08-2026, 23:07:39 ---Добрый день. С такими вопросами хорошо справляется deepseek.
Вот пример запроса: "LISP: defun c:MTextSize, выбор MText, вывод ширины (41) и высоты (46) через rtos 2 3, обработка ошибок." (запрос тоже deepseek написал).
Вот пример кода от deepseek:

--- Конец цитаты ---

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

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


--- Код - Auto/Visual Lisp [Выбрать] ---(defun c:MTextSize ( / ent data width height)  (setq ent (car (entsel "\nВыберите MText: ")))  (if ent    (progn      (setq data (entget ent))            ;; --- Чтение текущих значений (для информации) ---      (setq width (cdr (assoc 41 data)))   ; ширина опорного прямоугольника      (setq height (cdr (assoc 46 data)))  ; высота фона            (princ (strcat "\n?? Текущая ширина (DXF 41): " (rtos width 2 3)))      (princ (strcat "\n?? Текущая высота (DXF 46): " (rtos height 2 3)))            ;; --- Установка новых значений 500 x 500 ---      (setq data (subst (cons 41 500.0) (assoc 41 data) data)) ; меняем ширину на 50      (setq data (subst (cons 46 500.0) (assoc 46 data) data)) ; меняем высоту на 50            ;; --- Применяем изменения к объекту ---      (entmod data)      (entupd ent) ; обновляем экран            (princ "\n?? Рамка MText установлена на 500 x 500.")    )    (princ "\n? Объект не выбран или это не MText.")  )  (princ)) 
Пишет:


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

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

slay_78:
Добрый день. Ваш код работает с МТекстом у которого свойство столбцы установлено в нет, вместо динамический.

Electric:

--- Цитата: slay_78 от 11-08-2026, 06:39:44 ---Добрый день. Ваш код работает с МТекстом у которого свойство столбцы установлено в нет, вместо динамический.

--- Конец цитаты ---

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


--- Код - Auto/Visual Lisp [Выбрать] ---(defun c:MTextSize ( / ent data width height coltype)  (setq ent (car (entsel "\nВыберите MText: ")))  (if ent    (progn      (setq data (entget ent))            ;; --- Проверяем и отключаем динамические столбцы ---      ;; DXF 75 - тип столбцов:       ;; 0 = без столбцов (один столбец)      ;; 1 = динамические столбцы      ;; 2 = статические столбцы      (if (assoc 75 data)        (progn          (setq coltype (cdr (assoc 75 data)))          (princ (strcat "\n?? Текущий режим столбцов: " (itoa coltype)))          (if (/= coltype 0)            (progn              (setq data (subst (cons 75 0) (assoc 75 data) data))              (princ "\n?? Переключено в режим 'Один столбец'")            )          )        )        (progn          ;; Если DXF 75 нет, добавляем его (значение 0 = один столбец)          (setq data (append data (list (cons 75 0))))          (princ "\n?? Добавлен режим 'Один столбец'")        )      )            ;; --- Теперь устанавливаем размеры ---      (setq width (cdr (assoc 41 data)))      (setq height (cdr (assoc 46 data)))            (princ (strcat "\n?? Текущая ширина: " (rtos width 2 3)))      (princ (strcat "\n?? Текущая высота: " (rtos height 2 3)))            ;; Устанавливаем 500 x 500      (setq data (subst (cons 41 500.0) (assoc 41 data) data))      (setq data (subst (cons 46 500.0) (assoc 46 data) data))            ;; --- Применяем изменения ---      (entmod data)      (entupd ent)            (princ "\n?? Готово! MText: режим 'Один столбец', размер 500 x 500")    )    (princ "\n? Объект не выбран или это не MText.")  )  (princ))

Навигация

[0] Главная страница сообщений

Перейти к полной версии