| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Вставить текст в центр прямоугольника

Вставить текст в центр прямоугольника

Ответ
Поиск в этой теме
Непрочитано 17.05.2016, 15:18 #1
Вставить текст в центр прямоугольника
protorgovec
 
газо- нефтепереработка
 
Уфа
Регистрация: 22.07.2015
Сообщений: 98

Добрый день.
Возникла небольшая проблемка, может кто подскажет.
Код:
[Выделить все]
(vla-AddText (vla-get-PaperSpace Ch2) "1. Общие допуски ГОСТ 30893.2-mK." (vlax-3D-point 35 77 0) 5)
в нужные координаты вставляет текст.
А как прописать, что бы вставлял в центр нужного прямоугольника. Как задаются координаты этого прямоугольника? И как заставить ,что если текст выходит за рамки, что бы играл коэффициентом ширины? Нужен именно однострочный, переносы нельзя.
Просмотров: 7090
 
Непрочитано 17.05.2016, 16:08
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Получи границы созданного текста через vla-getboundingbox и выполняй соответствующие вычисления.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.05.2016, 16:50
#3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


В лиспе есть ф-ция textbox
Почитай тему Автоматический подбор высоты текста Там рассматривали, что точнее определяет габарит текста (мтекста): textbox, boundingbox, ACET-GEOM-OBJECT-POINT-LIST, ACET-GEOM-TXTBOX,
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 17.05.2016, 17:33
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Насколько я помню, textbox и acet-* могут работать только с объектом текста, который лежит в текущем пространстве. Могу ошибаться.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.05.2016, 10:49
#5
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Получи границы созданного текста через vla-getboundingbox и выполняй соответствующие вычисления.
Получил эти границы
Код:
[Выделить все]
 (vla-getboundingbox T2 'minp 'maxp)
(vlax-safearray->list minp)
(vlax-safearray->list maxp)
Знаю координаты и прямоугольника куда вписать, а как заставить что бы он менял ширину текста? Не могу понять
protorgovec вне форума  
 
Непрочитано 18.05.2016, 11:03
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Сними дамп объекта - увидишь свойство ScaleFactor. С ним и работай.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.05.2016, 15:15
#7
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сними дамп объекта - увидишь свойство ScaleFactor. С ним и работай.
Снял дамп
Код:
[Выделить все]
 (vlax-dump-object T1 T)
много свойств. А почему не ставит такое свойство, как длина текста? Вообще можно как то определить длину текста? Что то не могу найти про длину текста ничего
protorgovec вне форума  
 
Непрочитано 18.05.2016, 15:21
#8
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Если текст - строка, то функция (strlen "текст")
Получишь количество символов.
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 18.05.2016, 15:26
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


protorgovec, ты сначала расскажи, что в твоем понимании "длина текста". Количество символов?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.05.2016, 15:28
#10
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Fedorino Посмотреть сообщение
Получишь количество символов.
Количество символов мне наверное не поможет. Мне нужна длина в мм. А можно ли определив координаты описанного прямоугольника вокруг текста
Код:
[Выделить все]
 (vla-getboundingbox T1 'minp 'maxp)
вытащить координаты Х? Там бы уже я через математику

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ты сначала расскажи, что в твоем понимании "длина текста". Количество символов?
Длина мне нужна в мм
protorgovec вне форума  
 
Непрочитано 18.05.2016, 15:37
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Можно. Вытаскивай.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.05.2016, 15:41
#12
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Можно. Вытаскивай.
аж настроение поднялось
А можешь подсказать как?
protorgovec вне форума  
 
Непрочитано 18.05.2016, 15:51
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,041


Цитата:
Сообщение от protorgovec Посмотреть сообщение
Длина мне нужна в мм
distance ?
Сергей812 вне форума  
 
Автор темы   Непрочитано 18.05.2016, 15:57
#14
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
distance ?
distance мне выдает 0
protorgovec вне форума  
 
Непрочитано 18.05.2016, 15:57
#15
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Гидрит вашу перекись марганца за ногу! Получили minp, maxp, а дальше кто будет преобразования делать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.05.2016, 16:00
#16
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Гидрит вашу перекись марганца за ногу! Получили minp, maxp, а дальше кто будет преобразования делать?
Ну дурная у меня голова а нога тут не при чем , забыл я про это. Сейчас сделаю

----- добавлено через ~21 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Гидрит вашу перекись марганца за ногу! Получили minp, maxp, а дальше кто будет преобразования делать?
О смотрю видео с тобой хоть увидел своего подсказчика

----- добавлено через ~60 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Гидрит вашу перекись марганца за ногу! Получили minp, maxp, а дальше кто будет преобразования делать?
Не могу понять, как преобразовывать координаты (((( совсем глупый!

----- добавлено через ~2 ч. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Гидрит вашу перекись марганца за ногу! Получили minp, maxp, а дальше кто будет преобразования делать?
Алексей, подскажи:
Код:
[Выделить все]
 (vla-getboundingbox T1 'minp 'maxp) (setq Xt1 (vlax-safearray->list minp)) (setq Xt2 (vlax-safearray->list maxp))
(setq Dlt1 (DISTANCE Xt2 Xt1))
(if (> Dlt1 120) (vla-put-ScaleFactor T1 0.6))
он назначает ширину 0,6 но в реале ширина текста не меняется. Не могу понять почему
protorgovec вне форума  
 
Непрочитано 18.05.2016, 19:27
#17
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


vla-getboundingbox не пойдет. Нарисуй один текст горизонтальный, второй - под углом (например 45 градусов)
Выполни код и посмотри, какие габариты возвращает vla-getboundingbox
Код:
[Выделить все]
(setq T1 (vlax-ename->vla-object(car(entsel "Select text"))))
 (vla-getboundingbox T1 'minp 'maxp) 
(setq Xt1 (vlax-safearray->list minp))
(setq Xt2 (vlax-safearray->list maxp))
(command "_PLINE" "_non"  Xt1 "_non" (list(car Xt1)(cadr Xt2)) "_non" Xt2 "_non" (list(car Xt2)(cadr Xt1)) "_C")
А вот пример ACET-GEOM-OBJECT-POINT-LIST Можно почитать дальше, пост #15
На картинке черным - результат vla-getboundingbox, красным - код из поста #14 по ссылке (ACET-GEOM-OBJECT-POINT-LIST )

----- добавлено через ~10 мин. -----
Цитата:
Сообщение от protorgovec Посмотреть сообщение
И как заставить ,что если текст выходит за рамки, что бы играл коэффициентом ширины?
Как вариант
Код:
[Выделить все]
(setq dst (getdist "\nУкажите требуемую длину текста :"))
(setq txt (car(entsel "\nВыберите текст")))
(setq ScaleFactor (cdr(assoc 41 (entget txt))))
(setq lst (ACET-GEOM-OBJECT-POINT-LIST txt 1e-3))
(while (> (setq Ltxt (distance (car lst) (cadr lst))) dst)
  (setq ScaleFactor (- ScaleFactor 0.01))
  (entmod (subst (cons 41 ScaleFactor)(assoc 41 (entget txt))(entget txt)))
  (entupd txt)
  (setq lst (ACET-GEOM-OBJECT-POINT-LIST txt 1e-3))
  )
Миниатюры
Нажмите на изображение для увеличения
Название: bb.png
Просмотров: 22
Размер:	6.5 Кб
ID:	170610  
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 18.05.2016 в 19:37.
VVA вне форума  
 
Непрочитано 18.05.2016, 20:59
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Цитата:
Сообщение от protorgovec Посмотреть сообщение
он назначает ширину 0,6 но в реале ширина текста не меняется. Не могу понять почему
Либо REGENMODE в 1, либо vla-update для примитива текста.
VVA, я же говорю, что предложенные тобою функции работают только с примитивами, лежащими в текущем пространстве (единственное исключение, кажется - это textbox, но в какой СК он возвращает значения, я не знаю).

----- добавлено через 35 сек. -----
Добавлю: предварительно получить нормаль объекта и углы его поворота - не вопрос.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.05.2016, 21:02
#19
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от VVA Посмотреть сообщение
vla-getboundingbox не пойдет. Нарисуй один текст горизонтальный, второй - под углом (например 45 градусов)
Выполни код и посмотри, какие габариты возвращает vla-getboundingbox
Код:
[Выделить все]
(setq T1 (vlax-ename->vla-object(car(entsel "Select text"))))
 (vla-getboundingbox T1 'minp 'maxp) 
(setq Xt1 (vlax-safearray->list minp))
(setq Xt2 (vlax-safearray->list maxp))
(command "_PLINE" "_non"  Xt1 "_non" (list(car Xt1)(cadr Xt2)) "_non" Xt2 "_non" (list(car Xt2)(cadr Xt1)) "_C")
А вот пример ACET-GEOM-OBJECT-POINT-LIST Можно почитать дальше, пост #15
На картинке черным - результат vla-getboundingbox, красным - код из поста #14 по ссылке (ACET-GEOM-OBJECT-POINT-LIST )

----- добавлено через ~10 мин. -----

Как вариант
Код:
[Выделить все]
(setq dst (getdist "\nУкажите требуемую длину текста :"))
(setq txt (car(entsel "\nВыберите текст")))
(setq ScaleFactor (cdr(assoc 41 (entget txt))))
(setq lst (ACET-GEOM-OBJECT-POINT-LIST txt 1e-3))
(while (> (setq Ltxt (distance (car lst) (cadr lst))) dst)
  (setq ScaleFactor (- ScaleFactor 0.01))
  (entmod (subst (cons 41 ScaleFactor)(assoc 41 (entget txt))(entget txt)))
  (entupd txt)
  (setq lst (ACET-GEOM-OBJECT-POINT-LIST txt 1e-3))
  )
спасибо. завтра на работе посмотрю. Только (command) не для меня я все это пытаюсь делать в неактивном документе
protorgovec вне форума  
 
Непрочитано 18.05.2016, 22:43
#20
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от protorgovec Посмотреть сообщение
Только (command) не для меня
command чертит полилинию вокруг текста, это для наглядности.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 18.05.2016, 23:39
#21
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Цитата:
Сообщение от protorgovec Посмотреть сообщение
в неактивном документе
Тогда только ActiveX, только хардкор
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.05.2016, 06:41
#22
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Либо REGENMODE в 1, либо vla-update для примитива текста.
VVA, я же говорю, что предложенные тобою функции работают только с примитивами, лежащими в текущем пространстве (единственное исключение, кажется - это textbox, но в какой СК он возвращает значения, я не знаю).
Доброе утро. не знаю почему так, но придя с утра на работу, ничего не меняя 4 раза прогнал прогу, и все 4 раза он менял фактор ширины прикола конечно не понял, но все работает
Спасибо большое за ваши подсказки. Спасибо что вы есть!!!!!!!

----- добавлено через ~3 ч. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Получи границы созданного текста через vla-getboundingbox и выполняй соответствующие вычисления.
Алексей, вот что получилось у меня, может кому то пригодится
Код:
[Выделить все]
 (setq T1 (vla-AddText (vla-get-PaperSpace Ch2) P (vlax-3D-point 33 26 0) 3))
(vla-getboundingbox T1 'minp 'maxp) (setq Xt1 (vlax-safearray->list minp)) (setq Xt2 (vlax-safearray->list maxp))
(setq Dlt1 (DISTANCE Xt2 Xt1))
(while (> Dlt1 23)
(vla-getboundingbox T1 'minp 'maxp) (setq Xt1 (vlax-safearray->list minp)) (setq Xt2 (vlax-safearray->list maxp))
(setq Dlt1 (DISTANCE Xt2 Xt1))
(setq Sh1 (vla-get-ScaleFactor T1))
(if (> Dlt1 23) (vla-put-ScaleFactor T1 (- Sh1 0.05))))
Но вот у меня остался один вопрос, именно касательно темы по умолчанию точка привязки текста стоит слева, как ее переместить в центр текста?

----- добавлено через ~7 ч. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тогда только ActiveX, только хардкор
Люди помогите, не могу понять как выравнить текст по центру понимаю что нужно задать параметр тексту bottomcenter, но как не могу понять. Пробывал так же как и с фактором ширины, но он вообще не принимаем данное словосочетание
protorgovec вне форума  
 
Автор темы   Непрочитано 20.05.2016, 12:56
#23
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тогда только ActiveX, только хардкор
Добрый день. Подскажите. Пытаюсь определить координаты точки привязки текста
Код:
[Выделить все]
 (setq obj (vlax-ename->vla-object (car (entsel))))
(setq temp (vla-GetAttachmentPoint obj 2 1))
Все как у Полищука, стр. 418-419, но в ответ получаю: ActiveX Server возвратил ошибку: неизвестное имя: GetAttachmentPoint
У меня автокад 2015
protorgovec вне форума  
 
Непрочитано 20.05.2016, 15:14
#24
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


protorgovec, у Полищука GetAttachmentPoint объект: Table указано.

ищи свойство InsertionPoint
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 20.05.2016, 16:32
#25
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


... Или TextAlignmentPoint (если не ошибаюсь)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.05.2016, 19:56
#26
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Fedorino Посмотреть сообщение
у Полищука GetAttachmentPoint объект: Table указано.
Да, уже после понял что это не для текста. Просто времени на это мало, читаю в попыхах. Книжка не тонкая, еще не все выучил что где примерно. Спасибо за подсказку

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Или TextAlignmentPoint (если не ошибаюсь)
Спасибо за подсказку, надеюсь в понедельник выйду на работы заставлю текст вставать как надо
Алексей, а какие лучше переменные вводить, если не желательно глобальные? Глобальные чем то плохи? Как опытный программист скажешь?
protorgovec вне форума  
 
Непрочитано 21.05.2016, 22:15
#27
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Глобальные плохи тем, что их начинаешь использовать даже когда они явно не объявлены. Меняются они тоже глобально. В одной функции у тебя D1 - диаметр внешний, во второй - внутренний. При этом в первой он целый, во второй - с плавающей точкой. В первой ты ее используешь в запросе типа:
(defun f1()
(if (not d1) (setq d1 10))
(getint (strcat "\nВведите значение внешнего диаметра <" (itoa d1) "> : ")))
)
Во второй:
(defun f2()
(if (not d1) (setq d1 12.5))
(getint (strcat "\nВведите значение внутреннего диаметра <" (rtos d1 2 4) "> : "))
)
В принципе, оба запроса верные. Только вызывать их один за другим не рекомендую: получишь ошибку на втором вызове.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.05.2016, 22:22
#28
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Глобальные плохи тем, что их начинаешь использовать даже когда они явно не объявлены. Меняются они тоже глобально. В одной функции у тебя D1 - диаметр внешний, во второй - внутренний. При этом в первой он целый, во второй - с плавающей точкой. В первой ты ее используешь в запросе типа:
(defun f1()
(if (not d1) (setq d1 10))
(getint (strcat "\nВведите значение внешнего диаметра <" (itoa d1) "> : ")))
)
Во второй:
(defun f2()
(if (not d1) (setq d1 12.5))
(getint (strcat "\nВведите значение внутреннего диаметра <" (rtos d1 2 4) "> : "))
)
В принципе, оба запроса верные. Только вызывать их один за другим не рекомендую: получишь ошибку на втором вызове.
Да я вроде бы когда пишу, рядом всегда бумажка с записанными всеми переменными. Очень внимательно слижу что бы переменные не повторялись. Да и после все эти переменные обнуляю, что бы если запускаю какую нибудь вторую программу, что бы не было повторений.

----- добавлено через ~10 ч. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Или TextAlignmentPoint (если не ошибаюсь)
Пробывал:
Код:
[Выделить все]
 (vla-get-Alignment T2)
(vla-put-Alignment T2 acAlignmentCenter)
Он мне ставит вторую точку выравнивания с отметкой 0,0 (координаты формата листа, текст стоит на том же месте.
InsertionPoint-точка вставки, мне нужна точка выравнивания.
TextAlignmentPoint - тоже самое что и при Alignment.
Почему так?
protorgovec вне форума  
 
Непрочитано 23.05.2016, 08:43
#29
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Некоторые вещи разбирал тут: http://autolisp.ru/2010/04/06/text-and-attrib-entities/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.05.2016, 09:12
#30
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Некоторые вещи разбирал тут: http://autolisp.ru/2010/04/06/text-and-attrib-entities/
Почитал получается не одно свойство для текста нужно программно менять. Тогда наверное я оставлю по умолчанию слева, длину отыграю фактором ширины, если не влазиет. А если уж нормоконтроль заортачится что мол не совсем поцентру, ладно, подвину вручную
protorgovec вне форума  
 
Непрочитано 23.05.2016, 09:28
#31
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


Ох, как же с тобой тяжело... Поменяй выравнивание, потом TextAlignmentPoint, потом InsertionPoint - в чем трудность-то?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.05.2016, 11:39
#32
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ох, как же с тобой тяжело...
ну, может это просто тебе кажется? я же написал. Я понял что нужно несколько параметров поменять. Просто для себя нашел иное решение.
protorgovec вне форума  
 
Непрочитано 23.05.2016, 19:40
#33
nick49


 
Регистрация: 14.12.2007
Сообщений: 19


to protorgovec
Нашел у Lee Mac Programming лисп
http://www.lee-mac.com/assoctextbox.html
Вложения
Тип файла: rar AssociativeTextboxV1-2.rar (5.5 Кб, 16 просмотров)
nick49 вне форума  
 
Автор темы   Непрочитано 24.05.2016, 06:18
#34
protorgovec

газо- нефтепереработка
 
Регистрация: 22.07.2015
Уфа
Сообщений: 98


Цитата:
Сообщение от nick49 Посмотреть сообщение
to protorgovec
Нашел у Lee Mac Programming лисп
http://www.lee-mac.com/assoctextbox.html
Спасибо!
protorgovec вне форума  
 
Непрочитано 24.05.2016, 17:50
1 | #35
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Хотелось для наглядности сделать красиво, но пошли затыки, и в результате получился вот такой модуль. Проверял в Model space, но почти уверен, что будет работать и в неактивном документе, и в Paper space.
Код:
[Выделить все]
 (vl-load-com)
(setq str "1. Общие допуски ГОСТ 30893.2-mK." ;Переменная с текстовой строкой (можно организовать выбор из списка и т.п.)
      txt(vla-AddText(vla-get-ModelSpace(vla-get-ActiveDocument(vlax-get-acad-object)))str(vlax-3D-point 0 0 0) 5);создаём
      ;текстовый объект в произвольных координатах в том же пространстве, где находится прямоугольник
      rt(vlax-ename->vla-object(ssname(ssget "_:S" '((0 . "LWPOLYLINE")))0))
      co(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates rt))));Выбираем прямоугольник
      ;и получаем список координат вершин
(vla-put-Alignment txt acAlignmentMiddleCenter);задаём тексту выравнивание посередине по центру
(vla-put-TextAlignmentPoint txt(vlax-3D-point
(inters(list(car co)(cadr co))(list(nth 4 co)(nth 5 co))(list(caddr co)(cadddr co))(list(nth 6 co)(nth 7 co)))))
;задаём точку вставки посередине прямоугольника
(setq rt_lst(list(list(list(car co)(cadr co))(list(caddr co)(cadddr co)))
		 (list(list(caddr co)(cadddr co))(list(nth 4 co)(nth 5 co)))
		 (list(list(nth 4 co)(nth 5 co))(list(nth 6 co)(nth 7 co)))
		 (list(list(nth 6 co)(nth 7 co))(list(car co)(cadr co))))
;Тупо создаём список для обхода по 4 сторонам прямоугольника
      ind_dl(vl-sort-i rt_lst(function(lambda(pt1 pt2)(>(distance (car pt1)(cadr pt1))(distance(car pt2)(cadr pt2)))))))
;Получаем набор индексов списка, отсортированных по длине сторон (мы не знаем, в каком порядке они создавались)
(if(>(setq rot
(min(angle(car(nth(car ind_dl) rt_lst))(cadr(nth(car ind_dl) rt_lst)))
    (angle(car(nth(cadr ind_dl) rt_lst))(cadr(nth(cadr ind_dl) rt_lst)))))(/ pi 2))
  (setq rot(- rot pi)))
(vla-put-Rotation txt rot)
;из длинных сторон выбираем наименьшее направление, которое ближе всего к горизонтали и задаём поворот текста,
;если текст вверх ногами - переворачиваем на 180
(if(>(setq delta(-
(distance'(0.0 0.0 0.0)(list(caadr(textbox(entget(vlax-vla-object->ename txt))))0.0 0.0))
(distance(car(nth(car ind_dl) rt_lst))(cadr(nth(car ind_dl) rt_lst)))
))0);Если расстояние от точки вставки до конца textbox больше длины прямоугольника,
  (progn(setq insp(polar(vlax-safearray->list(vlax-variant-value(vla-get-InsertionPoint txt)))rot(/ delta 2))
	      alp(polar insp rot(distance(car(nth(car ind_dl) rt_lst))(cadr(nth(car ind_dl) rt_lst)))))
;вычисляем положение точек привязки текста, исходя из этой разности длин и известного угла поворота
  (vla-put-Alignment txt acAlignmentFit);задаём тексту выравнивание по ширине 
(vla-put-InsertionPoint txt(vlax-3D-point insp))
(vla-put-TextAlignmentPoint txt(vlax-3D-point alp));и указываем точки, определяющие при таком выравнивании его габариты
    );end of progn
  );end of if
P_S вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Вставить текст в центр прямоугольника

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Как вставить текст в AutoCad? Александр36 Программирование 20 01.12.2010 22:24
Как вывести текст в model из приложения написанного на lisp? paradoxvaha AutoCAD 3 16.04.2007 03:54
Многострочный текст в атрибутах медвежонок AutoCAD 1 09.06.2006 12:05
Вставить текст программно Flint Программирование 13 03.10.2003 10:24