jackUAROBEY Posted January 23 Report Share Posted January 23 Добрый вечер. Меняю системную переменную textalignmode на значение 4 (по середине в центре) а мультитекст все равно привязывается textalignmode 0 (вверху слева) Как сделать так чтоб мультитекст всегда в центре был? Quote Link to comment Share on other sites More sharing options...
XPom Posted January 24 Report Share Posted January 24 9 часов назад, jackUAROBEY сказал: textalignmode да, подтверждаю, эта переменная походу тоже не работает (проверял в версии 6177) Quote Link to comment Share on other sites More sharing options...
doctorraz Posted January 24 Report Share Posted January 24 в нк23 textalignmode то же муляж приходится гамузом текствыр Quote Link to comment Share on other sites More sharing options...
jackUAROBEY Posted January 24 Author Report Share Posted January 24 (edited) муляж. Мне для лиспа надо. Как вот теперь быть? (command "_.mText" ТОЧКА "_j" "_mc" "_w" (itoa (* 0 1) ) ЗНАЧЕНИЕ "") Вот так в автокаде было. В нанокад по такой цепочке не получается, думал через системную переменную решить. И там облом. Edited January 24 by jackUAROBEY Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted January 24 Report Share Posted January 24 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 ... за счет универсальности и независимости от платформы. 2 Quote Link to comment Share on other sites More sharing options...
jackUAROBEY Posted January 24 Author Report Share Posted January 24 (setq ryz "К1") (command "_.mText" (getpoint) (getpoint) ryz) почему текст не добавляется? Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted January 24 Report Share Posted January 24 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 ... . Но с ней нужно чутка повозиться. Старания окупятся сторицей (скорость - выше на порядок, никаких проблем с включением/отключением привязок, создание слоев одновременно с созданием элементов и т.д.) 1 Quote Link to comment Share on other sites More sharing options...
Kreator Posted January 24 Report Share Posted January 24 (edited) Соглашусь с @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 нет, как сказал один программист Скобки не после названия функции, а перед. (Название_функции Параметр1 Параметр2 ... ПараметрN), в любой параметр можно также записать функцию (Функция2 Число1 Число2). Всё скобками разделяется. Это код из Шкалы - простенького лиспа для автонумерации шкал. Отдельно уже не пользуюсь, код перешёл в более комплексное решение. Когда очень надо, ищу что-то рабочее, иду с конца - где вызывается конкретно нужная мне фукнция (в данном случае - вставка МТЕКСТа), смотрю её параметры, упрощаю, если мне не нужно столько параметров каждый раз, оборачиваю в свою более простую функцию и пользуюсь. Пардон за оффтоп. Edited January 25 by Kreator Поправил значение 1 1 Quote Link to comment Share on other sites More sharing options...
jackUAROBEY Posted January 24 Author Report Share Posted January 24 8 часов назад, EdwardSt сказал: (command "_.mText" ТОЧКА ТОЧКА ЗНАЧЕНИЕ "") так не получится. Не работает почему то. Quote Link to comment Share on other sites More sharing options...
XPom Posted January 25 Report Share Posted January 25 14 часов назад, Kreator сказал: acAttachmentPointMiddleRight. Середина по центру, то бишь. Мне кажется, тут что-то не так 1 Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted January 25 Report Share Posted January 25 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. 3 Quote Link to comment Share on other sites More sharing options...
Kreator Posted January 25 Report Share Posted January 25 4 часа назад, XPom сказал: Мне кажется, тут что-то не так Поправил Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.