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))
Навигация
Перейти к полной версии