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

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

Работа с очень длинным MTEXT

Ответ
Поиск в этой теме
Непрочитано 15.09.2006, 23:25 #1
Работа с очень длинным MTEXT
Reflex
 
Программирование
 
Питер
Регистрация: 15.09.2006
Сообщений: 4

Здравствуйте!

Такая проблемма, пишу программу на AutoLISP'e, да в принципе уже почти написал. Цели программы из всего выделенного пользователем выдрать MTEXT'ы и TEXT'ы и заменить все встреченные в них шрифты на какой то свой. Для TEXT'а я просто создаю стиль и присваиваю его. А вот с длинным MTEXT'ом случилась беда... я считал что все содержание MTEXT'а хранится в виде:
Код:
[Выделить все]
(( -1 .  )
(0. "MTEXT")
...
(1. "Собственно здесь содержание")
...
)
А оказалось, что при больших размерах текста оно хранится в таком виде:
Код:
[Выделить все]
(( -1 .  )
(0. "MTEXT")
...
(3. "Первый кусок")
(3. "Второй кусок")
(3. "Третий кусок")
...
(1. "n-ый (последний) кусок")
...
)
Собственно вопрос:
Как выдрать содержание и сохранить его в переменную, а затем вернуть обработанное содержимое назад?

Для короткого MTEXT'а я делаю так:
Код:
[Выделить все]
; Извлечение
  (setq text (cdr (assoc 1 (setq e (entget (ssname ss c))))))

...

; Возвращение
  (setq	e
	 (subst	(cons 1 text)
		(assoc 1 e)
		e
	 )
  )
  (entmod e)
И все замечательно работает.

Буду благодарен любой инфе по теме и/или кускам кода... кускам кода даже, наверное, больше :)

PS: что то мне никак не зарегистрироваться на AutoLISP.RU было, зарегистрировался на DWG.RU, а потом только на AutoLISP.RU...
Просмотров: 4469
 
Непрочитано 17.09.2006, 12:04
#2
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Тут проще "объектным" способом. Получаем текст полностью:
Код:
[Выделить все]
(setq tStr(vla-get-TextString(setq vlaObj(vlax-ename->vla-object eName))))
Обрабатываем и вставляем обратно:
Код:
[Выделить все]
(vla-put-TextString vlaObj tStr)
{Smirnoff} вне форума  
 
Непрочитано 17.09.2006, 14:37
#3
Залётный


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


На прошлой неделе нужно было убрать внутереннее форматирование Mtext. Нашёл лиспик StripMtext от Steve Doman.
Цитируется здесь:
http://discussion.autodesk.com/threa...sageID=4842110
правда пришлось убрать проверку версии т.к. он сначала не захотел работаь под ADT2006.
Сайт разработчика и последняя версия программы:
http://www.users.qwest.net/~sdoman/
Не уверен, что это то, чтоты ищешь, но может поможет.
Залётный вне форума  
 
Автор темы   Непрочитано 18.09.2006, 12:14
#4
Reflex

Программирование
 
Регистрация: 15.09.2006
Питер
Сообщений: 4


{Smirnoff}, спасибо, помогло, теперь работает...

А где найти инфу по "объектному" способу? А то в справке по LISP'y, который идет в комплекте с 2006 AutoCAD'ом ничего по этой теме нет

PS: вопрос не совсем по теме у меня код вида:
Код:
[Выделить все]
(defun C:TXT ()
  (setq sblip (getvar "blipmode"))
  (setq scmde (getvar "cmdecho"))
  (setvar "blipmode" 0)
  (setvar "cmdecho" 0)
  ...
  (command "_.style" fsName fName 2.5 "1.0" "0" "" "" "") 
  ...
  (setvar "blipmode" sblip)
  (setvar "cmdecho" scmde)
  (princ)
)
(princ "  Комманда TXT загружена. ")
(princ)
Так вот при вызове строчки (command) в AutoCAD'е в консоли выводится надпись "Неизвестная команда "TXT". Для вызова справки нажмите F1."
Если закомментировать вызов строчки (command) такое сообщение невыводится...
Из-за чего так происходит... как бороться?
Reflex вне форума  
 
Непрочитано 18.09.2006, 12:50
#5
Кулик Алексей aka kpblc
Moderator

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


http://dwg.ru/forum/viewtopic.php?t=6282 - посмотри...
А также http://www.cad.dp.ua/stats/content.p...t=vla_doc.html
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.09.2006, 13:06
#6
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Сообщение от Reflex
{Smirnoff}, спасибо, помогло, теперь работает...

А где найти инфу по "объектному" способу? А то в справке по LISP'y, который идет в комплекте с 2006 AutoCAD'ом ничего по этой теме нет

PS: вопрос не совсем по теме у меня код вида:
Код:
[Выделить все]
(defun C:TXT ()
  (setq sblip (getvar "blipmode"))
  (setq scmde (getvar "cmdecho"))
  (setvar "blipmode" 0)
  (setvar "cmdecho" 0)
  ...
  (command "_.style" fsName fName 2.5 "1.0" "0" "" "" "") 
  ...
  (setvar "blipmode" sblip)
  (setvar "cmdecho" scmde)
  (princ)
)
(princ "  Комманда TXT загружена. ")
(princ)
Так вот при вызове строчки (command) в AutoCAD'е в консоли выводится надпись "Неизвестная команда "TXT". Для вызова справки нажмите F1."
Если закомментировать вызов строчки (command) такое сообщение невыводится...
Из-за чего так происходит... как бороться?
Насчет "обектного" метода.
В "чистом" виде справку по работе с VisualLISP можно найти наверное только в книге Полещука и Лоскутова "AutoLISP и VisualLISP в среде AutoCAD" (и других тех же авторов). Однако в автокадовской справке есть все функции VisualLISP а, свойства, методы и события для различных объектов а также структуру объектой модели надо смотреть в разделе ActiveX and VBA Reference т. е собственно говоря в справке по VBA для AutoCAD.

"Неизвестная команда "TXT" выводится потому что где то внутри (command ....) есть лишний ввод "". С command надо быть поосторожнее, т. к. синтаксис раздичных команд может менятся от версии к версии а также зависеть от системных переменных. 95% того что можно сделать с command можно сделать другими способами.
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 18.09.2006, 20:21
#7
Reflex

Программирование
 
Регистрация: 15.09.2006
Питер
Сообщений: 4


Всем спасибо, теперь все Ok.

Если кому нужно, то вот она... моя втрая LISP прога (первая суммировала длины выбранных линий)

Программа найдет в выделенном пользователем объеме все текстовые поля и назначит им шрифт ISOCPEUR.
Код:
[Выделить все]
(defun c:TXT ()
					;(princ "\nКомманда TXT")
  (setq sblip (getvar "blipmode"))
  (setq scmde (getvar "cmdecho"))
  (setvar "blipmode" 0)
  (setvar "cmdecho" 0)

  (vl-load-com)

  (setq fName "ISOCPEUR")
  (setq fsName (strcat fName " (do not modify)"))

  (setq ss (ssget))

  (if ss
    (progn
      (command "_.style" fsName fName 2.5 "1.0" "0" "" "")

      (setq c 0
	    n (sslength ss)
      )
      (while (< c n)
	(if (= "MTEXT" (cdr (assoc 0 (setq e (entget (ssname ss c))))))
	  (progn
	    (setq text (vla-get-textstring
			 (setq
			   vlaObject
			    (vlax-ename->vla-object (ssname ss c))
			 )
		       )
		  tLen (strlen text)
		  tPos 1
	    )
	    (while (< tPos (- tLen 2))
	      (if (= "\\f" (substr text tPos 2))
		(progn
		  (setq tfStart tPos)
		  (while (/= "|" (substr text tPos 1))
		    (setq tPos (1+ tPos))
		  )
		  (setq tfEnd tPos)
		  (setq
		    text (strcat (substr text 1 (+ tfStart 1))
				 fName
				 (substr text tfEnd (- tLen tfEnd -1))
			 )
		  )
		  (setq e (entget (ssname ss c)))
		  (setq	e
			 (subst	(cons 7 fsName)
				(assoc 7 e)
				e
			 )
		  )
		  (entmod e)
		  (vla-put-TextString vlaObject text)
		)
	      )
	      (setq tPos (1+ tPos))
	    )
	  )
	)
	(if (= "TEXT" (cdr (assoc 0 (setq e (entget (ssname ss c))))))
	  (progn
	    (setq e (entget (ssname ss c)))
	    (setq e
		   (subst (cons 7 fsName)
			  (assoc 7 e)
			  e
		   )
	    )
	    (entmod e)
	  )
	)
	(setq c (1+ c))
      )
    )
  )
  (setvar "blipmode" sblip)
  (setvar "cmdecho" scmde)
  (princ)
)
(princ "  Комманда TXT загружена. ")
(princ)


Цитата:
Сообщение от {Smirnoff}
С command надо быть поосторожнее, т. к. синтаксис раздичных команд может менятся от версии к версии а также зависеть от системных переменных. 95% того что можно сделать с command можно сделать другими способами.
Спасибо за совет... но я незнаю как создать новый стиль без использования command. Да и незачем я пишу для себя.

PS: Если код откровенно лажевый... то не судите строго, для второго раза могло быть и хуже :roll:
Reflex вне форума  
 
Непрочитано 18.09.2006, 21:02
#8
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


А ведь слово "Команда" пишется с одним "м".
Profan вне форума  
 
Автор темы   Непрочитано 19.09.2006, 00:05
#9
Reflex

Программирование
 
Регистрация: 15.09.2006
Питер
Сообщений: 4


2 Profan, конструктивная критика
Енто такс сказать Енглиш входит в нашу жизнь коmmанда, от слова command
Reflex вне форума  
 
Непрочитано 19.09.2006, 08:07
#10
Кулик Алексей aka kpblc
Moderator

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


http://dwg.ru/forum/viewtopic.php?t=4680
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Работа с очень длинным MTEXT