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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Автоматический подбор высоты текста

Автоматический подбор высоты текста

Ответ
Поиск в этой теме
Непрочитано 23.07.2007, 09:19 #1
Автоматический подбор высоты текста
Ax3
 
Programming, automation, CADs, GISs. "Теплоком"
 
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 306

Здравствуйте, коллеги!
Подскажите, плз, такую вещь.
Надо вписать mtext в заданный прямоугольник. Как программно определить, что текст, введенный пользователем, выходит за границы этого прямоугольника?
Это нужно для того, чтобы в зависимости от количества слов выбирать высоту текста так, чтобы он поместился в прямоугольник. Причем высоту текста надо выбирать из стандартного ряда, то есть fit не подходит.

Всем успехов!
Просмотров: 14316
 
Автор темы   Непрочитано 25.07.2007, 14:46
#2
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Может, подскажет кто хотя бы где копать?
dxf, activex? или, может, я плохо хелп смотрел. Что-то никак ничего похожего не найду.
Или самому считать, умножая кол-во символов в тексте на их среднюю ширину?
Ax3 вне форума  
 
Непрочитано 25.07.2007, 14:55
#3
Кулик Алексей aka kpblc
Moderator

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


Используй textbox - имхо самое то.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.07.2007, 15:25
#4
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


в смысле
Код:
[Выделить все]
(texbox <что-нибудь>)
?
Ax3 вне форума  
 
Непрочитано 25.07.2007, 15:27
#5
Yura

ЦТП, котельные, отопление, вентиляция
 
Регистрация: 21.02.2007
Кишинев
Сообщений: 548
<phrase 1= Отправить сообщение для Yura с помощью Skype™


Да, у меня эта команда тоже че-то не прошла... :cry:
И в хэлпе че-то не видать...
Yura вне форума  
 
Непрочитано 25.07.2007, 15:44
#6
Кулик Алексей aka kpblc
Moderator

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


В смысле наподобие:
Код:
[Выделить все]
(defun test (str)
  (textbox (list '(0 . "MTEXT")
                 '(100 . "AcDbEntity")
                 '(100 . "AcDbMText")
                 '(10 0. 0. 0.0)
                 '(40 . 2.5)
                 '(41 . 0.0)
                 '(71 . 1)
                 '(72 . 1)
                 (cons 1 str)
                 '(7 . "Standard")
                 '(210 0.0 0.0 1.0)
                 '(11 1.0 0.0 0.0)
                 '(50 . 0.0)
                 '(73 . 1)
                 ) ;_ end of list
           ) ;_ end of textbox
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2007, 15:45
#7
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Ax3
в смысле
Код:
[Выделить все]
(texbox <что-нибудь>)
?
Пример:
Код:
[Выделить все]
(textbox '((40 . 1200.0) (1 . "ergereagaeg") (41 . 0.85) (7 . "RomanS")))
Но это годится только для однострочных. С многосторчным, честно говоря - не знаю, как быть. Есть вариант подбора создавать примитив, потом проверять его размер (vla-GetBoundingBox ...), если не входит - уменьшать размер и проверять снова... Но не знаю, как это будет работать - не пробовал.
Alaspher вне форума  
 
Непрочитано 25.07.2007, 15:56
#8
Кулик Алексей aka kpblc
Moderator

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


> Alaspher : для многострочного надо просто полный список задавать, достаточный для entmakex - как правило, срабатывает
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2007, 16:05
#9
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


> Алексей
Голову на это не поставлю, но моя думай - нифига не выйдет. Попробуй получить реальные точки имеющегося многострочного текста.
Alaspher вне форума  
 
Непрочитано 25.07.2007, 16:54
#10
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


С mtext у меня через textbox что-то не получается как Алексей предлагает. А с boundingbox тоже засада. Если width у mtext не равна нулю то boundingbox возвращает прямоугольник с шириной равной width даже если слово, которое не перенеслось, выходит за эти габариты. А если width приравнять нулю то текст может разъехаться, когда переносы строк установлены не жестко, и результат все равно будет не корректный (разве что обязать пользователя расставлять переносы строк).

Как идея: может взрывать mtext и анализировать набор однострочных текстов?

Кстати, что касается textbox недавно столкнулся с одной особенностью - если в начале текста есть пробелы или что-то вроде "%%u ля-ля-ля " (у меня был именно такой вариант) то функция игорирует такие вещи и не понятно как привязать ее результат "на местности". boundingbox - в отличии от textbox работает более корректно и результат дает сразу "с привязкой к месту", но имеет дело только с реальными объектами - вот и выбирай, как говорится.
AY вне форума  
 
Непрочитано 25.07.2007, 17:02
#11
Кулик Алексей aka kpblc
Moderator

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


Alaspher, как всегда, прав. Код
Код:
[Выделить все]
(textbox (vl-remove-if '(LAMBDA(x) (member(car x) '(-1 5 330)))(entget (entlast))))
вываливает 0xC0000005 (Нарушение доступа). Ессно, (entlast) - многострочник. Исключение необязательных групп тоже ничего не дает.
P.S. Проверял на ADT 2k5 Eng +SP1, ADT 2k6 Rus + SP1. Запуск ADT как ACADa проблему не решает. Кошмар...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2007, 17:13
#12
VVA

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


Варианты в порядке бреда:
1. копировать mtext в укромное место, там взрывать и брать textbox'ы того, что осталось. Правда потеряется, если есть, форматирование.
2. создать блок (можно анонимный), скопировать в него mtext и попробывать определить boundingbox блока.
Все на основе догадок, без проверок и гарантий
VVA вне форума  
 
Непрочитано 25.07.2007, 17:18
#13
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>VVA
С блоком результат такой же как напрямую с mtext, т.е. со всеми камнями о которых я писал выше.
AY вне форума  
 
Непрочитано 25.07.2007, 17:48
#14
VVA

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


У меня получилось так
Код:
[Выделить все]
(setq lst (ACET-GEOM-OBJECT-POINT-LIST (car(entsel)) 1e-3))
(setq cc (getvar "CECOLOR"))
(setvar "CECOLOR" "1")
(command "_pline")
(foreach pt lst
  (command "_none" pt))
(command "")(command)
(setvar "CECOLOR" cc)
Нужен установленный Express Tools
VVA вне форума  
 
Непрочитано 25.07.2007, 18:11
#15
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>VVA
Действительно mtext обрабатывется корректно в отличии от boundingbox (хотя рамка получается чуть больше, но это, пожалуй, несущесвенно). А вот простой текст содержащий такую строку "%%u asdfsdf " обрабабатывается не корректно в отличии от того же boundingbox. Как написал Крыс - Кошмар...

ps Выходит сами писатели автокадовские используют ACET-GEOM-OBJECT-POINT-LIST, а простым смертным глючный boundingbox подсовывают. Молодцы, молодцы...
AY вне форума  
 
Непрочитано 25.07.2007, 18:18
#16
VVA

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


Тоже сталкивался с тем, что acet-* ф-ции работают иногда более корректно. Правда почитать что-нубудь негде.
Нашел описания здесь http://www.theswamp.org/index.php?topic=13719.0 но там только названия. Там есть еще ACET-GEOM-TXTBOX. правда не знаю что ей скармливать в качестве аргументов.
VVA вне форума  
 
Непрочитано 25.07.2007, 18:35
#17
VVA

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


А вот еще одна ACET-GEOM-TEXTBOX
Код:
[Выделить все]
(setq lst (ACET-GEOM-TEXTBOX (entget (car(entsel))) 1e-3)) 
(setq cc (getvar "CECOLOR")) 
(setvar "CECOLOR" "1") 
(command "_pline") 
(foreach pt lst 
  (command "_none" pt)) 
(command "_close")(command) 
(setvar "CECOLOR" cc)
VVA вне форума  
 
Непрочитано 26.07.2007, 09:41
#18
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


ACET-GEOM-TXTBOX - даже лучше работает с mtext, однако с однострочным текстом проблемы остаются. Впрочем как, показали тесты проблемы с перфиксными пробелами имеются только у ttf-шрифтов; shx - обрабатываются корректно.

Короче, вывод - наиболее корректны следующие связки:
Mtext - (ACET-GEOM-TXTBOX ...) [ExpressTools]
Text - (vla-GetBoundingBox ...)
AY вне форума  
 
Автор темы   Непрочитано 26.07.2007, 14:37
#19
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


:shock:
Парни, я с трудом поспеваю за ходом ваших мыслей!
У меня такая проблема.
В чертеже есть несколько mtext'ов. Пользователь редактирует mtext.
Не работают вот эти варианты:

Код:
[Выделить все]
(defun app_func (calling-reactor commandInfo / einf_ ename_ etype_ tbox_)
  (setq ename_ (cadr commandInfo))
  ;(print)
  ;(print ename_)
  (setq einf_ (entget ename_))
  ;(print einf_)
  (setq etype_ (assoc 0 einf_))
  (setq etype_ (cdr etype_))
  ;(print etype_)
  (if (= etype_ "MTEXT") (setq tbox_ (textbox (list (cons -1 ename_)))))
  (print tbox_)
)
(vlr-acdb-reactor nil '((:vlr-objectModified  . app_func)))
возвращает nil. Не пойму, в чем подвох. При попытке указания полного списка
Код:
[Выделить все]
(defun app_func (calling-reactor commandInfo / einf_ ename_ etype_ tbox_)
  (setq ename_ (cadr commandInfo))
  ;(print)
  ;(print ename_)
  (setq einf_ (entget ename_))
  ;(print einf_)
  (setq etype_ (assoc 0 einf_))
  (setq etype_ (cdr etype_))
  ;(print etype_)
  (if (= etype_ "MTEXT") (setq tbox_ (textbox einf_)))
  (print tbox_)
)
(vlr-acdb-reactor nil '((:vlr-objectModified  . app_func)))
тоже nil. Ерунда какая-то

Зато вариант
Код:
[Выделить все]
(defun app_func (calling-reactor commandInfo / einf_ ename_ etype_ tbox_)
  (setq ename_ (cadr commandInfo))
  ;(print)
  ;(print ename_)
  (setq einf_ (entget ename_))
  ;(print einf_)
  (setq etype_ (assoc 0 einf_))
  (setq etype_ (cdr etype_))
  ;(print etype_)
  (if (= etype_ "MTEXT") (setq tbox_ (textbox (list (cons 1 "test_text")))))
  (print tbox_)
)
(vlr-acdb-reactor nil '((:vlr-objectModified  . app_func)))
работает. Но очевидная проблема - если два одинаковых текста в чертеже, то... Ну короче понятно.

В чем проблеме, никак не догоню.
Ax3 вне форума  
 
Автор темы   Непрочитано 26.07.2007, 14:44
#20
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Еще раз перечитал. Не в том ли проблема, что textbox анализирует текст виртуальный, в смысле строку, передаваемую ей в качестве аргумента, и никак не связана с текстом на чертеже?
Ax3 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Автоматический подбор высоты текста

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск