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

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

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

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

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

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

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

п.с сама задача хочу реализовать поиск слов в многострочном тексте в блоках (или может уже кто-то реализовал)...
Просмотров: 7897
 
Непрочитано 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 вне форума  
 
Непрочитано 16.02.2018, 06:54
#21
VVA

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


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
(правда я только команду Explode пробывал, а не vla-Explode в блоке..но вроде в блоке и она не даст взорвать мтекст + имеет смысл взрыв, что он разбивает текст в зависимости от форматирование и текст (теоретически остается на том же месте)
Почитай про vla-CopyObjects. Мтекст можно скопировать из пространства блока в пространство модели (или текущее пространство) без explode блока
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 16.02.2018, 12:42
#22
prajdziswet


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Мтекст можно скопировать из пространства блока в пространство модели
я правда думал не про vla-CopyObjects, а про простое думал entmake, entmode

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
я не понимаю конечной задачи, но объясню причину, по которой я за работу внутри анонимного блока.
Впринципе про анонимные блоки я слышал, может из твоей какой-то странички, но честно не разбирался..как что и как создавать ==НАДО как то мне до них будет долезть, очень полезная штука. Спасибо...

Просто я не сталкивался с анонимными блоками, но думаю что он будет работать как и простой, т.е
Например задача выше определить координаты рамки над словом в многострочном тексте = самое простое что я вижу взрыв (да не очень красивое) - и отмена взрыва
== но так это значительно быстрее чем вычислить и учесть все форматирование, мтекст взрывается согласно форматированию (скрин-шоты выше приводил) , да может возникнуть например слово разорвет и т.д (но они все решаемы, относительно быстро, да и второй возникает а надо бывает такую задачу решать = не думаю что кто-то будет специально например букву в слове делать другим шрифтом, высотой ...я пишу из своей практики)

Мне надо поиск текста - что-то вроде Автокадоского (просто не все есть или работает в автокаде), начал писать эту про-
грамму потому что тот же СПДС-график не находит (я его не переношу, а строители пользуются...) ==а значит и мне приходится работать с их поосновой...
prajdziswet вне форума  
 
Непрочитано 16.02.2018, 13:26
#23
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
он будет работать как и простой
Как бы да
1. Создать описание анонимного блока
2. В него скопировать обрабатываемый текст
3. Взорвать текст, используя vla-explode
4. Пройтись по результатам и вычислить нужные данные (я так понимаю, что для однострочного текста у тебя уже все работает)
5. Вернуть и дальше обрабатывать результаты.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.02.2018, 14:18
#24
koMon


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
2. В него скопировать обрабатываемый текст
3. Взорвать текст, используя vla-explode
а удастся ли взорвать мтекст в блоке?
koMon вне форума  
 
Непрочитано 16.02.2018, 14:59
#25
Кулик Алексей aka kpblc
Moderator

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


А почему нет? http://autolisp.ru/2014/07/29/explode-vs-vla-explode/
Слой только разблокировать и разморозить надо - вот и все.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.02.2018, 15:25
#26
koMon


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А почему нет?
ну уж точно не vla-explode
koMon вне форума  
 
Непрочитано 16.02.2018, 15:33
#27
Кулик Алексей aka kpblc
Moderator

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


А, да, приношу свои извинения. vla-explode на многострочный текст не действует
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.02.2018, 15:34
#28
koMon


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


да и сдаётся мне что взорвать мтекст ВНУТРИ блока вообще невозможно

----- добавлено через ~1 мин. -----
двигаемся опять к клонированию)
koMon вне форума  
 
Автор темы   Непрочитано 16.02.2018, 15:41
#29
prajdziswet


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


вы пока тут обсуждали я опробывал ...

наверное vla-Explode не работает на многострочном тесксте Нажмите на изображение для увеличения
Название: 03.png
Просмотров: 11
Размер:	45.2 Кб
ID:	199267
выдает "; ошибка: ActiveX Server возвратил ошибку: неизвестное имя: Explode"
что в простом блоке, что просто в модели...

да и
Код:
[Выделить все]
 (vlax-method-applicable-p name 'Explode)
выдало nil
prajdziswet вне форума  
 
Непрочитано 16.02.2018, 15:48
1 | #30
koMon


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


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
вы пока тут обсуждали я опробывал ...
практика - великое дело!
koMon вне форума  
 
Автор темы   Непрочитано 16.02.2018, 15:49
#31
prajdziswet


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


Спасибо
Цитата:
Сообщение от koMon Посмотреть сообщение
да и сдаётся мне что взорвать мтекст ВНУТРИ блока вообще невозможно
все теоретически обычными средствами и активХ наверное да, если конечно не входить в блок через командную строку, но тут "клонирование" снова наверное будет в приоритете ==это лучше, потому что скопировл из блока и взорвал ...чем + займет время на прорисовку в блоке и при выходе из блока

________________
Алексей скинь плиз ссылку на создание "анонимного блока", хочу почитать ..ато загуглил, нормальной ссылки что-то не нашел (как их создавать и т.д, на и на формуме поиск как -то криво выдал....может конечно и я сам криво искал...)

Последний раз редактировалось prajdziswet, 16.02.2018 в 16:55.
prajdziswet вне форума  
 
Непрочитано 16.02.2018, 15:52
#32
koMon


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


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
если конечно не входить в блок через командную строку
это как-то не по-программистки что-ли)))
однозначно клонирование мтекста, но конечно же не ent* функциями
koMon вне форума  
 
Автор темы   Непрочитано 16.02.2018, 16:02
#33
prajdziswet


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


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

Цитата:
Сообщение от koMon Посмотреть сообщение
не ent* функциями
ну честно говоря особо тут разницы не вижу, что через актив что так создавать результат будет один и тот же...удобно конечно через vla-CopyObjects , преимущество только вижу что имена у меня будут вла-объектами...
prajdziswet вне форума  
 
Непрочитано 16.02.2018, 16:29
#34
koMon


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


наверное это дело личных предпочтений, если конечно не заморачиваться на тему проверки быстроты выполнения, но вот сам же говорил привязки там всякие мешают, а в activex они и не мешают вовсе. это я к тому что в activeх как-то меньше зависишь от кучи системных переменных.
koMon вне форума  
 
Автор темы   Непрочитано 16.02.2018, 16:55
#35
prajdziswet


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


Да наверное это еще один + , правда я всеравно привязку отключаю на момент поиска (формирование списка координат по которым просто потом зумирую).
Правда я пока в блоке оставил общую рамку текста (да вопросы там не доконца решил, как оно координаты выдаст скорее всего для блока - а потом их надо будет смещать и маштабировать, поворот не учитываю..), а не в блоке через взрыв сделано.... Клонировать наверное буду пробывать для спдс-таблицы, если мне конечно даст прокси скопировать, да и подозрение что спдс -внутри блока не получиться взорвать ...
prajdziswet вне форума  
 
Непрочитано 16.02.2018, 17:11
#36
koMon


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


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

Цитата:
Сообщение от prajdziswet Посмотреть сообщение
…если мне конечно даст прокси скопировать …спдс -внутри блока не получиться взорвать
лучший автокад - это голый автоткад!
koMon вне форума  
 
Автор темы   Непрочитано 16.02.2018, 17:15
#37
prajdziswet


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


Цитата:
Сообщение от koMon Посмотреть сообщение
лучший автокад - это голый автоткад!
это да, как наш системный администратор автокад в шутку называет автогад = на что я ему, ты автокад не трогай )))
prajdziswet вне форума  
 
Непрочитано 16.02.2018, 17:26
#38
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
ссылку на создание "анонимного блока"
Да все элементарно (пишу без запущенного ACAD'a):
(setq def (vla-add (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) "*U" (vlax-3d-point '(0. 0. 0.)))
Вроде так. Посмотри в справке параметры вызова vla-add для разных случаев - там все описано.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.02.2018, 09:57
#39
prajdziswet


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


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

Пока до анонимных блоков не дошел, пока еще допиливаю потихоньку остальное ...

п.с потом выкину лисп, что получился...

----- добавлено через ~1 ч. -----
Просветите меня темного, как скопировать объект в образованный аннонимный блок ..что-то я запутался....
Код:
[Выделить все]
 
;создаем аннонимный блок
(setq def (vla-add (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0. 0. 0.)) "*U"))
;получаем вла-обект
(setq obj (vlax-ename->vla-object (ssname (ssget) 0)))
;создаем безопастный массив из одного элемента
(setq mass (vlax-make-safearray vlax-vbObject '(1 . 1)))
(vlax-safearray-put-element mass 1 obj)
;копируем? что -не то
(setq bl (vla-CopyObjects (vla-get-activedocument
               (vlax-get-acad-object)
             ) mass def)
       )
       )

Последний раз редактировалось prajdziswet, 18.02.2018 в 11:16.
prajdziswet вне форума  
 
Непрочитано 18.02.2018, 15:18
1 | #40
VVA

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


obj - список vla объектов
Пример отсюда
Код:
[Выделить все]
(vla-copyobjects (vla-get-activedocument (vlax-get-acad-object))
              (vlax-make-variant (vlax-safearray-fill
                  (vlax-make-safearray vlax-vbobject (cons 0 (1- (length obj))))
                  obj)) unnamed_block)))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 18.02.2018, 15:38
#41
prajdziswet


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


подправил на:
Код:
[Выделить все]
 (setq def (vla-add (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0. 0. 0.)) "*U"))
(setq obj (vlax-ename->vla-object (ssname (ssget) 0)))
(setq mass (vlax-make-safearray vlax-vbObject (cons 0 0)))
(vlax-safearray-put-element mass 0 obj)
(setq bl (vla-CopyObjects (vla-get-activedocument (vlax-get-acad-object))
	   (vlax-make-variant mass)
	   def
       ))
prajdziswet вне форума  
 
Автор темы   Непрочитано 18.02.2018, 16:35
#42
prajdziswet


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


Как и говорил прикрепляю свой код textfind.lsp а вот файл диалога почему-то не смог загрузить, наверное ограничение на сервере "некорректный файл"...

И еще интересно, как вставить аннонимный блок?
Код:
[Выделить все]
 (setq model_space (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
(vla-insertblock model_space (vlax-3d-point '(0. 0. 0.)) (vla-get-Name def) 1. 1. 1. 0)
никакого результата не наблюдаю....

п.с vla-Explode для спдс-объектов не действует, а в блоках не действует если через
Код:
[Выделить все]
 (command "_explode" name)
тоесть спдс-объекты как и мтекст взрываются только в модели... хотя вот не помню как взрывали прокси в "superflatten"...(но это так мысли вслух)

Последний раз редактировалось prajdziswet, 18.02.2018 в 17:20.
prajdziswet вне форума  
 
Непрочитано 19.02.2018, 08:23
#43
VVA

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


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
вот файл диалога почему-то не смог загрузить, наверное ограничение на сервере "некорректный файл"...
ZIP или RAR никто не запрещал

----- добавлено через ~9 мин. -----
Цитата:
Сообщение от prajdziswet Посмотреть сообщение
И еще интересно, как вставить аннонимный блок?
Без пациента трудно что-то посоветовать. Как вариант - единицы блока - парсеки, единицы чертежа - миллиметры.
Блок вставляется, но чтобы наблюдать результат нужен телескоп
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 19.02.2018, 09:00
#44
prajdziswet


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Как вариант - единицы блока - парсеки, единицы чертежа - миллиметры.
Блок вставляется, но чтобы наблюдать результат нужен телескоп
понял спасибо (уже не пробывал отыскать, да в данной задаче и не требоволась для меня - точнее тут оно ничего не дает)

Всем СПАСИБО....

Может примитивно, но как то так.... textfind.ZIP
prajdziswet вне форума  
Ответ
Вернуться   Форум 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