Jump to content

Мультитекст по середине в центре (textalignmode)


Recommended Posts

Добрый вечер.
Меняю системную переменную textalignmode на значение 4 (по середине в центре) а мультитекст все равно привязывается  textalignmode 0 (вверху слева)
Как сделать так чтоб мультитекст всегда в центре был?

Link to comment
Share on other sites

9 часов назад, jackUAROBEY сказал:

textalignmode

да, подтверждаю, эта переменная походу тоже не работает (проверял в версии 6177)

Link to comment
Share on other sites

в нк23 textalignmode  то же муляж

приходится гамузом  текствыр

Link to comment
Share on other sites

:o муляж.  Мне для лиспа надо. Как вот теперь быть?
 

(command "_.mText"  ТОЧКА "_j" "_mc" "_w" (itoa (* 0 1) )  ЗНАЧЕНИЕ "")

Вот так в автокаде было.  В нанокад по такой цепочке не получается, думал через системную переменную решить. И там облом.

Edited by jackUAROBEY
Link to comment
Share on other sites

8 минут назад, jackUAROBEY сказал:

Мне для лиспа надо

В лиспе как раз несложно

 

(setq a (car (entsel))) ; Или любой другой способ получения имени объекта

(setq da (entget a)) ; получение списка DXF-кодов

(setq db (subst (cons 71 5) (assoc 71 da) da)) ; изменение текущего значения выравнивания на новое (5- середина по центру) в списке параметров

(entmod db); обновление элемента

 

Собственно третья строка и является прообразом внесения изменений в параметры элемента.

Такой вариант предпочтительнее использования функции (command ... за счет универсальности и независимости от платформы.

  • Like 2
Link to comment
Share on other sites

1 час назад, jackUAROBEY сказал:

(command "_.mText"  ТОЧКА "_j" "_mc" "_w" (itoa (* 0 1) )  ЗНАЧЕНИЕ "")

Вот так в автокаде было.  В нанокад по такой цепочке не получается, думал через системную переменную решить. И там облом.

Судя по фрагменту вы устанавливаете дополнительно способ выравнивания ( "_j" "_mc") и пользовательскую ширину ( "_w" (itoa (* 0 1) ))

 

Предлагаемый мной способ должен сделать фрагмент универсальным и независимым от среды (акад, нано)

Спойлер

(command "_.mText"  ТОЧКА  ТОЧКА  ЗНАЧЕНИЕ "") ;просто создание мтекста с параметрами поумолчанию

(setq a (entlast))

(setq da (entget a)) ; получение списка DXF-кодов

(setq da (subst (cons 71 5) (assoc 71 da) da)) ; изменение текущего значения выравнивания на новое (5- середина по центру) в списке параметров

(setq da (subst (cons 41 ШИРИНА) (assoc 41 da) da)); изменение пользовательской ширины

;аналогично можно изменить еще многие параметры 0

(entmod da); обновление элемента по переназначенным параметрам

 

А еще лучше вместо (command ... использовать функцию (entmake ... .

Но с ней нужно чутка повозиться.

Старания окупятся сторицей (скорость - выше на порядок, никаких проблем с включением/отключением привязок, создание слоев одновременно с созданием элементов и т.д.)

  • Like 1
Link to comment
Share on other sites

:offtopic:

Соглашусь с @EdwardSt - лучше используйте LISP, где это возможно. Скорость, гибкость, более широкие возможности.

Да, нужно потыкаться, но в сети уже давно всё есть - берите кусками код. Я вот в лисп почти не умею, но по кускам себе собрал кое-что. Вот как у меня выглядит описание команды вставки МТекста:

Спойлер
(vl-load-com)
(defun list->variantArray (ptsList / arraySpace sArray) (setq arraySpace (vlax-make-safearray vlax-vbdouble (cons 0 (- (length ptsList) 1)) ) ) (setq sArray (vlax-safearray-fill arraySpace ptsList)) (vlax-make-variant sArray) )
(defun PAV_InsMText (iStr iPoint iAng iAlign iWidth iHeight iStyle iColor) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (setq iPoint (list->variantArray (trans iPoint 1 0))) (setq aText (vla-AddMText (vla-get-modelspace doc) iPoint iWidth iStr)) (vlax-put-property aText "Lineweight" acLnWt030) (vlax-put-property aText "Height" iHeight) (vlax-put-property aText "AttachmentPoint" iAlign) (vlax-put-property aText "Rotation" (* pi (/ iAng 180.0))) (vlax-put-property aText "StyleName" iStyle) (vlax-put-property aText "InsertionPoint" iPoint) (vlax-put-property aText "Color" iColor) aText)

 

Громоздко, но один раз. Использовать просто:

(PAV_InsMText iStr iPoint iAng iAlign iWidth iHeight iStyle iColor)

Параметры очевидны - строка, точка, угол, выравнивание, ширина, высота, стиль, цвет.

Конкретно по выравниванию МТЕКСТа, внутри функции к тексту применяется

(vlax-put-property aText "AttachmentPoint" iAlign)

До этого параметру iAlign передано при вызове значение acAttachmentPointMiddleRight acAttachmentPointMiddleCenter. Середина по центру, то бишь.

Координату iPoint функции передаём в виде списка (там вообще всё в виде списков)

(list start_x start_y 0)

В общем, не так сильно сложно разобраться, если очень надо :) Главное - чуть мозг поправить на тему синтаксиса, которого в LISP нет, как сказал один программист :D

Скобки не после названия функции, а перед. (Название_функции Параметр1 Параметр2 ... ПараметрN), в любой параметр можно также записать функцию (Функция2 Число1 Число2). Всё скобками разделяется.

Это код из Шкалы - простенького лиспа для автонумерации шкал. Отдельно уже не пользуюсь, код перешёл в более комплексное решение.

Когда очень надо, ищу что-то рабочее, иду с конца - где вызывается конкретно нужная мне фукнция (в данном случае - вставка МТЕКСТа), смотрю её параметры, упрощаю, если мне не нужно столько параметров каждый раз, оборачиваю в свою более простую функцию и пользуюсь.

Пардон за оффтоп.

Edited by Kreator
Поправил значение
  • Like 1
  • Thanks 1
Link to comment
Share on other sites

14 часов назад, Kreator сказал:

acAttachmentPointMiddleRight. Середина по центру, то бишь.

Мне кажется, тут что-то не так :)

  • Haha 1
Link to comment
Share on other sites

14 часов назад, jackUAROBEY сказал:
22 часа назад, EdwardSt сказал:

(command "_.mText"  ТОЧКА  ТОЧКА  ЗНАЧЕНИЕ "")

так не получится. Не работает почему то.

Извиняюсь, не проверил работоспособность конструкции  в NC.

Отдельно попросил бы разработчиков обратить внимание на эту коллизию!!!!

В АС это работает.

 

Вот за это и не люблю функцию (command ...

Нет никакой гарантии в полной совместимости.

В общем, тем более имеет смысл уходить от использования этой функции по максимуму.

В дополнение к изложенному методу от @Kreator рекомендовал бы к использованию функцию (entmake,

Ее преимущество в том, что она вообще относится к базовым функциям автолиспа, не требует подключения к COM.

Она напрямую работает со структурой объектов DWG и почти один в один соотносится с записями объектов при сохранении файла в DXF-формате.

 

В вашем случае можно сразу создавать текст

Спойлер

(setq da (list '(0 . "MTEXT") '(100 . "AcDbMText") 
  (cons 10 (list 0 0 0)); точка вставки
  (cons 1 "строка"); строка
  
  ;далее необязательные параметры, которые при отсутствии заменяются параметрами по умолчанию
    (cons 71 5);способ выравнивания
    (cons 8 "новый_слой") ; имя слоя 

    ; и т.д. . список параметров с кодами можно найти в справке по DXF-кодам элементов
    ))

(entmake da)

 

Итого два оператора: формирование списка и создание элемента.

Первые три строки в операторе формирования списка - это обязательная часть, если хотим создать программно мтекст.

Остальное на ваше усмотрение.

При желании и с опытом это все можно будет располагать в одну строчку без использования вспомогательной переменной da.

  • Thanks 3
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...