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

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

Определение координат текста в многострочном тексте?

Ответ
Поиск в этой теме
Непрочитано 14.02.2018, 16:50 #1
Определение координат текста в многострочном тексте?
prajdziswet
 
Регистрация: 30.03.2015
Сообщений: 152

Определение координат текста в многострочном тексте?
можно ли найти координаты рамки описанного вокруг слова в многострочном тексте?
___________________________________________________________________
textbox - работает с однострочным текстом (в однострочном можно реализовать указаную выше задачу)
acet-geom-textbox - работает с многострочным текстом, но почему то он обрабатывает по имени а не по списку (даю разные dxf-списки c текстом оригинальным и dxf со словом укороченным - и выдает одинаковый результат)
vla-GetBoundingBox - работает с имененем через активХ, и выдаст рамку оригинального текста а не слова...

Можно конечно с какой то погрешностью релизовать через взрыв, а по однострочным текстам найти ПРИМЕРНОЕ расположнение слова.
А можно без взрыва "Определенить координаты текста в многострочном тексте? "

Заранее благодарю за подсказки?

п.с сама задача хочу реализовать поиск слов в многострочном тексте в блоках (или может уже кто-то реализовал)...
Просмотров: 7895
 
Непрочитано 14.02.2018, 17:49
#2
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


зачем искать координаты, если можно найти слово (ва) и подсветить их (поменять цвет на отличный от цвета основого текста).
koMon вне форума  
 
Непрочитано 14.02.2018, 18:02
#3
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


В любом случае надо найти слово и уж пооооооооооооотом координаты.
Setvar вне форума  
 
Автор темы   Непрочитано 14.02.2018, 18:23
#4
prajdziswet


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


Цитата:
Сообщение от koMon Посмотреть сообщение
зачем искать координаты, если можно найти слово (ва) и подсветить их (поменять цвет на отличный от цвета основого текста).
координаты нужны чтобы зумировать (пролистывать), а цвет не очень -
1) может в одном тексте это красный, другом тесте синий
2) да и потом надо будет скидывать этот цвет

Цитата:
Сообщение от Setvar Посмотреть сообщение
В любом случае надо найти слово и уж пооооооооооооотом координаты.
слово найти нету никакой сложности (получил текст, скинул форматирование и wcmatch)... надо координаты рамки над словом
prajdziswet вне форума  
 
Непрочитано 14.02.2018, 18:35
#5
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
надо координаты рамки над словом
Но там нет никакой рамки.
Setvar вне форума  
 
Автор темы   Непрочитано 14.02.2018, 18:54
#6
prajdziswet


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


Цитата:
Сообщение от Setvar Посмотреть сообщение
Но там нет никакой рамки.
Я понимаю "условно рамки" например функция acet-geom-textbox
Код:
[Выделить все]
 (acet-geom-textbox dxf-список 0)
(dxf-список - это что возвращает например entget)

у тебя возвращает координаты рамки если описать над всем текстом рамку, но у тебя же нет рамки над текстом...
а в данном случае мне надо над словом
prajdziswet вне форума  
 
Непрочитано 14.02.2018, 20:19
#7
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Далась тебе эта рамка.
Ты найди слово и координаты хотя бы его начала, а потом про рамку будешь вещать. Что ты там про однострочный текст писал? Про ПРИМЕРНОЕ расположение слова? А в мультитексте ты хочешь найти ТОЧНОЕ расположение слова? Ладно, не жмись, покажи, как ты определил примерное расположение слова в однострочном тексте.
Setvar вне форума  
 
Непрочитано 14.02.2018, 20:50
#8
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от Setvar Посмотреть сообщение
как ты определил примерное расположение слова
находишь "рамку" однострочного текста, находишь "рамку" строки до искомого слова, находишь "рамку" искомого слова. далее чистая арифметика. причём это будет не примерное, а точное положение слова, с учётом шрифтовых нюансов.
koMon вне форума  
 
Автор темы   Непрочитано 14.02.2018, 21:39
#9
prajdziswet


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


Цитата:
Сообщение от koMon Посмотреть сообщение
находишь "рамку" однострочного текста, находишь "рамку" строки до искомого слова, находишь "рамку" искомого слова. далее чистая арифметика. причём это будет не примерное, а точное положение слова, с учётом шрифтовых нюансов.
== это и ответ Setvar, но это однострочный текст а мне надо многострочный...
Код:
[Выделить все]
 (defun textfindfun (objent shablon /
		    poz text list1 list2 list3 shablontemp
		    point1 point2 point0 point00 pointser strfind temp temp1)
  
        ;учитывать регистр
      (if (/= tf_case "1")
      (setq strfind (strcase (cdr (assoc 1 objent))))
      (setq strfind (cdr (assoc 1 objent)))
	)
  (setq text (vl-string-trim " " strfind))
  
    (if (wcmatch text shablon)
      (progn
	(if (/= text "")
	(progn
	(if (= "*" (substr shablon 1 1))
	(setq shablontemp (substr shablon 2 (- (strlen shablon) 2))))
	(setq poz (vl-string-search shablontemp text))
	)
	  (setq poz 0)
	  )
	(if (/= nil poz)
	  (progn
	    ;координаты текста;vla-GetBoundingBox
	    (setq point0 (acet-geom-textbox objent 0))
	    (command "_line" (nth 0 point0) (nth 1 point0) "")
	    (setq point00 (nth 2 point0) point0 (nth 0 point0))
	    	    
	    (setq list1 (textbox objent ))
	    
	    (setq temp (cons 1 (substr text 1 poz)))
	    (if (/= "" (cdr temp))
	    (setq list2 (textbox (subst temp (assoc 1 objent) objent)))
	      (setq list2 (list (nth 0 list1) (list (car (nth 0 list1)) (nth 1 (nth 1 list1)))))
	      )

	    (if (/= tf_whole "1") (setq temp1 2) (setq temp1 0))
	    (setq temp (cons 1 (substr text (+ (+ 1 poz) (- (strlen shablon) temp1)))))
	    (if (/= "" (cdr temp))
	    (setq list3 (textbox (subst temp (assoc 1 objent) objent)))
	      (setq list3 (list (list (car (nth 1 list1)) (nth 1 (nth 0 list1))) (nth 1 list1)))
	      )
	    
	    (setq point2 (list
			   (- (nth 0 point00) (- (car (nth 1 list3)) (car (nth 0 list3))))
			   (nth 1 point00)
			  ))
	    (setq point1 (list
			   (+ (nth 0 point0) (- (car (nth 1 list2)) (car (nth 0 list1))))
			   (nth 1 point0)
			  ))
	    (setq pointser (list
			   (+ (/ (+ (car point2) (car point1)) 2) (car point2))
			   (+ (/ (+ (cadr point2) (cadr point1)) 2) (cadr point2))
			  ))
;;;
;;;	    (defun korpoint (pointkor pontsmes / x1 y1 x2 y2)
;;;	      (setq x1 (nth 0 pointkor) y1 (nth 1 pointkor)
;;;		    x2 (nth 0 pontsmes) y2 (nth 1 pontsmes))
;;;	      (list (+ x1 x2) (+ y1 y2))
;;;	      )
	    (command "_line" point1 point2 "")
	    (list point1 point2 pointser)
	 )
	  (setq poz nil)
	  )
     )
      (setq poz nil)
      )
 )
..чуть намудрил с координатамы (отлаживаю еще, но koMon прав (точнее считаю координаты до искомого слова и считаю длину остатка после искомого) так я нахожу координаты в однострочном тексте! Примерно так же поступаю при многострочном, но не в блоке: взрываю многострочный текст и получаю кучу однострочных (так я избавляюсь от подсчета в какой строке, а ПРИМЕРНО потому что при взрыве многострочного я скидыаю (не просто снимаю, есть фукнция что просто вернет текст без форматирования) форматирование текста и тем самым нарушаю расположения в строке.
При расположении текста в блоке я так не могу поступить:
1) придется взрывать два раза и возвращать два раза
2) блок может быть заблокирован от взрыва и придется снимать этот флаг
3) это занимает больше времени чем получить текст,через активХ , но взорвать я уже не могу (точнее не получилось...как бы выразится взорвать по имени в блоке многострочный, не взрывая блок, а потом вернуть)

функция для расположение в многострочном (не в блоке)
Код:
[Выделить все]
 (defun mtextfind (objent shablon / strfind nabor len i name poz1 text list1 temp)
  (setq text (UnFormat (cdr (assoc 1 objent)) T))
          ;учитывать регистр
      (if (/= tf_case "1")
      (setq text (strcase text))
	)
  (setq text (vl-string-trim " " text))
  
(if (wcmatch text shablon)
  (progn
    (command "_Explode" (cdr (assoc -1 objent)))
    (setq nabor (ssget "_p"))
    (setq len (sslength nabor) i 0)
    (repeat len
      (setq name (ssname nabor i) i (+ 1 i))
      (setq name (entget name))
      (if (/= (setq temp (textfindfun name shablon)) nil)
	(if (/= nil temp)
	  (setq poz1 (cons temp poz1))
       ));end if
      );end repeat
    (command "_u")
 ))
    (setq poz1 poz1)
)
функция получение всех примитивов в блоке,по имени q1 ...
Код:
[Выделить все]
 (defun blockfind ()
(setq templst nil)
(setq blocks 
           (vla-get-blocks
             (vla-get-activedocument
               (vlax-get-acad-object)
             )
           )
         )

(vlax-for y (vla-item blocks "q1") 
                (setq templst (cons y templst))
              )

(foreach name templst
  (print (entget (vlax-vla-object->ename name))) (princ)
	)

)
понятно, что куча работы например снять привязку, чтобы координаты не привязывались не понятно к чему, но это мелоч....ВОПРОС не в этом...

Последний раз редактировалось prajdziswet, 14.02.2018 в 21:51.
prajdziswet вне форума  
 
Непрочитано 14.02.2018, 23:08
#10
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


а в чём цель? слово нашлось, примерное положение нашлось, зум случился, а дальше что? чем взрывать блок, проще будет создать клон мтекста из блока и его уже взрывать.
koMon вне форума  
 
Автор темы   Непрочитано 15.02.2018, 07:28
#11
prajdziswet


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


насчет клона возможно да, хоть сам взрыв мне не особо нравится (просто хотелось более изячное решение...)

Цитата:
Сообщение от koMon Посмотреть сообщение
а в чём цель?
цель найти и зумировать, или тебе не приходилось искать текст по спецификации если длинная (например общая спецификация которая по 10 листов миниум), номер помещения и т.д + поиск по спдс-график (хоть я его не люблю, но строители постоянно пользуюся. Цель просто поиск - а там что тебя надо если подправить, то вручную подправишь; просто найти и посмотреть например сколько кол-во (например по спецификации) и т.д == иногда мно где надо просто найти, или проверить что везде подправил (поиск автокада не везде ищет, например в блоках, во-вторых можно установить маштаб -потому что например автокад =зумирует так что тебе надо иногда отменить поиск, чтобы увидеть более меньшем маштабе ...был инструмент с г-тулс, но он тоже не доконца ищет)

Вот и хочется более изячное решение, чем взрывать-создавать и т.д //так как все это отнимает время, автокад начинает проририсовывать и регенерировать...
prajdziswet вне форума  
 
Непрочитано 15.02.2018, 08:55
#12
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


ясно. насчёт взрыва, согласен, плохо. тогда считать строки, слова и т.д. или можно ещё замудрить например так: клонировать мтекст, искать построково нужное слово, найденную строку передать в дтекст, искать рамку, вычислять координаты рамки.
koMon вне форума  
 
Непрочитано 15.02.2018, 09:41
#13
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
это и ответ Setvar
Это только формально - ответ. На самом деле этот ответ показывает ущербность манипуляций. Особенно, когда искомое слово будет в тексте содержать ошибки.
Изячного решения здесь не будет. Так же как и изящного. Может получиться только грубое решение одноразового использования. Овчинка выделки не стоит. IMHO.
Offtop: Подозреваю, что некоторые гуру сейчас начнут головы ломать и копья. Зря.
Setvar вне форума  
 
Непрочитано 15.02.2018, 10:22
#14
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


не гуру, но что мешает разбить текст по словам и искать не строгое соответствие, а наиболее вероятное?
В простейшем варианте, это не так сложно: отсеиваем сначала слова по длине, а потом для оставшихся слов считаем коэффициент совпадения положения букв, выбираем слова с Мах коэффициентом.

Однако я так и не понял, зачем все это и стоит ли эта стрельба из гаубиц по муравьям тех затрат времени и сил на написание кода.
Boxa вне форума  
 
Автор темы   Непрочитано 15.02.2018, 11:46
#15
prajdziswet


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


Цитата:
Сообщение от koMon Посмотреть сообщение
ясно. насчёт взрыва, согласен, плохо. тогда считать строки, слова и т.д...
так тоже наверное не выйдет:
1) не понятно размеры мтекста (я имею введу поля относительно которых оно переносит (наверное где то содержится, но я не знаю.. в dxf-списке я их не заметил)
2) для того, чтобы посчитать туже строку надо разбить по определенному форматированию (будет влиять только тип шрифта,высота шрифта, растяжение и межстрочный интервал) и придется считать все это через textbox ...

Цитата:
Сообщение от Boxa Посмотреть сообщение
Однако я так и не понял, зачем все это и стоит ли эта стрельба из гаубиц по муравьям тех затрат времени и сил на написание кода.
Действительно , а зачем искать текст, писать на каком-то autolisp-е и вообще запускать Автокад

Спасибо за подсказки (насчет клона того же), пока оставил взырыв только в поиске не в блоке а потом возврат (хоть автокад как то сам ищет в многострочном тексте и позиционирует) а в блоке просто рамку всего текста (что не нравится конечно, но хоть как то укажет что там есть искомый текст)

Последний раз редактировалось prajdziswet, 15.02.2018 в 11:54.
prajdziswet вне форума  
 
Непрочитано 15.02.2018, 11:55
#16
Кулик Алексей aka kpblc
Moderator

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


Offtop: Вспоминаем про динамическое количество столбцов в MTEXT, возможное назначение ширины, поля, принудительное форматирование и т.п. - и становится очень весело.
ИМХО - создавать анонимный блок, внутрь него - копию MTEXT, и ее уже анализировать.
P.S. Это я еще не упоминаю про атрибуты, таблицы и значения тех же размеров...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.02.2018, 12:11
#17
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
Действительно , а зачем искать текст, писать на каком-то autolisp-е и вообще запускать Автокад
Вы ничего не перепутали, с Вами все в порядке? Прошу указать и процитировать мою запись, где я писал, что не нужно писать на лисп и запускать автокад?

Для Вас я попытаюсь расшифровать запись. Можно перестроить работу так, что бы не пришлось пользоваться поиском по мтексту в блоках и тогда можно будет нормально пользоваться штатными функциями автокада. Так ли нужно загонять МТекст в блок.
Boxa вне форума  
 
Непрочитано 15.02.2018, 13:15
#18
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
так тоже наверное не выйдет:
если каждая строка не содержит <cr> в конце, то это беда, поскольку если есть длинная строка, она же азац, ограниченный штриной мтекста или упаси ещё и колонками, то посчитать строки в таком абзаце та ещё задачка. я думаю для обработки мтекста в автокаде существует выделенный текстовый процессор, который и делает размещение-форматирование текста внутри контейнера мтекта, в тесном сотрудничистве с системным описанием шрифта.
koMon вне форума  
 
Автор темы   Непрочитано 15.02.2018, 21:57
#19
prajdziswet


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ИМХО - создавать анонимный блок, внутрь него - копию MTEXT, и ее уже анализировать.
А смысл загонять копию в анонимный блок, если анализировать то условно остается только textbox (acet-geom-textbox и vla-GetBoundingBox смысла не имеют, если только не плодить несколько копий мтекста с разной длиной исходного текста)... я понимаю если другое, что то может имел смысл анонимный блок...тут условно остается textbox (так он и без примитива-однострочного текста работает, только dxf-список)

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вспоминаем про динамическое количество столбцов в MTEXT, возможное назначение ширины, поля, принудительное форматирование и т.п. - и становится очень весело
поэтому я за взрыв текста )))))))

п.с и копию имеет создавать вне блока её можно лехко взорвать (правда я только команду Explode пробывал, а не vla-Explode в блоке..но вроде в блоке и она не даст взорвать мтекст + имеет смысл взрыв, что он разбивает текст в зависимости от форматирование и текст (теоретически остается на том же месте)
Нажмите на изображение для увеличения
Название: 01.png
Просмотров: 99
Размер:	21.3 Кб
ID:	199240
Нажмите на изображение для увеличения
Название: 02.png
Просмотров: 98
Размер:	14.1 Кб
ID:	199241

Да взрыв конечно не очень элегантная команда ==но лучше чем высчитывать положение текста...
____________________________________________________________________________________________________
----- добавлено через ~8 мин. -----
Цитата:
Сообщение от Boxa Посмотреть сообщение
Вы ничего не перепутали, с Вами все в порядке? Прошу указать и процитировать мою запись, где я писал, что не нужно писать на лисп и запускать автокад?
это я так отреагировал на...

Цитата:
Сообщение от Boxa Посмотреть сообщение
Однако я так и не понял, зачем все это и стоит ли эта стрельба из гаубиц по муравьям тех затрат времени и сил на написание кода.
Извиняюсь, а насчет того что блоке может быть мтекст можно кучу случаев придумаеть из жизни...например строители прописали номера помещений и обычно у них почемуто они не совсем по порядку идут = работать на взорваной подоснове тоже не фонтан....

А насчет того что Я так наехал

Цитата:
Сообщение от prajdziswet Посмотреть сообщение
Действительно , а зачем искать текст, писать на каком-то autolisp-е и вообще запускать Автокад
Извиняюсь.
________________________________________________________________________

п.с так что как и писал я оставил взрыв с возвратом вне блока, а в блоке только общую рамку текста а не слова (vla-GetBoundingBox)

Последний раз редактировалось prajdziswet, 15.02.2018 в 22:17.
prajdziswet вне форума  
 
Непрочитано 15.02.2018, 22:27
#20
Кулик Алексей aka kpblc
Moderator

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


prajdziswet, я не понимаю конечной задачи, но объясню причину, по которой я за работу внутри анонимного блока.
1. Работать с его составом можно достаточно легко (правда, acet-* там не сработает).
2. Для обработки блока его необязательно вставлять.
3. Если блок не вставлен, после закрытия файла он уничтожается автоматически.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Определение координат текста в многострочном тексте?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ручки в многострочном тексте Яблоко AutoCAD 12 20.02.2015 11:55
Определение координат динамического блока в среде VBA ArtemYa Программирование 8 03.12.2009 13:57
Изменение форматированного текста посредством lisp Tramp LISP 4 03.03.2006 11:28
Бледный русский язык в многострочном тексте dimoniy AutoCAD 8 09.11.2005 01:00
не работает переключение регистров в многострочном тексте Nika AutoCAD 3 20.05.2004 22:26