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

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

Преобразование полей в текст

Ответ
Поиск в этой теме
Непрочитано 22.06.2006, 12:30 #1
Преобразование полей в текст
YuraVel
 
проектирование предприятий
 
Регистрация: 22.06.2006
Сообщений: 7

Возможно профи откликнутся и подскажут...

Как преобразовать несколько обновляемых полей в соответственный текст одним махом?
Просмотров: 17271
 
Непрочитано 22.06.2006, 12:51
#2
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,326


_explode не помогает?
Хмурый вне форума  
 
Автор темы   Непрочитано 22.06.2006, 14:32
#3
YuraVel

проектирование предприятий
 
Регистрация: 22.06.2006
Сообщений: 7


Цитата:
Сообщение от Хмурый
_explode не помогает?
Он то конечно помагает, но хочется что-бы таблицы остались таблицами, а MText остался MText-ом, нужен другой вариант...
YuraVel вне форума  
 
Непрочитано 22.06.2006, 15:47
#4
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


По первой прикидке так:
Заменяет field и field в блоках на соответствующий текст.
Код можно оптимизировать выведя повторяющийся в отдельную функцию.
Код:
[Выделить все]
(vl-load-com)
(defun C:field-to-text ()
  (if
    (and
      (setq txt-nabor (ssget '((0 . "mtext,insert"))))
      (setq txt-nabor (mapcar 'vlax-ename->vla-object
			      (vl-remove-if
				'listp
				(mapcar	'cadr
					(ssnamex txt-nabor)
				)
			      )
		      )
      )
    )

     (mapcar
       '(lambda	(x / dict)
	  (cond
	    (
	     (and
	       (= (vla-get-objectname x) "AcDbMText")
	       (= (vla-get-HasExtensionDictionary x) :vlax-true)
	     )
	     (vlax-for item (setq dict (vla-GetExtensionDictionary x))
	       (if
		 (= (vla-get-name item) "ACAD_FIELD")
		  (progn
		    (vla-remove dict "ACAD_FIELD")
		    (vla-put-textstring
		      x
		      (vl-string-trim "%<>" (vla-get-textstring x))
		    )
		  )
	       )
	     )
	    )
	    (
	     (= (vla-get-objectname x) "AcDbBlockReference")
	     (vlax-for item2 (vla-item (vla-get-blocks
					 (vla-get-ActiveDocument
					   (vlax-get-acad-object)
					 )
				       )
				       (vla-get-name x)
			     )
	       (if
		 (and
		   (= (vla-get-objectname item2) "AcDbMText")
		   (= (vla-get-HasExtensionDictionary item2) :vlax-true)
		 )
		  (vlax-for item3
			    (setq dict (vla-GetExtensionDictionary item2))

		    (if
		      (= (vla-get-name item3) "ACAD_FIELD")
		       (progn
			 (vla-remove dict "ACAD_FIELD")
			 (vla-put-textstring
			   item2
			   (vl-string-trim
			     "%<>"
			     (vla-get-textstring item2)
			   )
			 )
		       )
		    )
		  )
	       )
	     )
	    )
	  )
	)
       txt-nabor
     )
  )
  (princ)
)
Эдуард вне форума  
 
Непрочитано 23.06.2006, 04:21
#5
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Идея понятна. только написано уж больно "в лоб", причем с kpblc'овским смешением стилей. По-моему, так будет элегантнее:
Код:
[Выделить все]
 (defun conv (x / dict)
  (if (and (= (vla-get-objectname x) "AcDbMText")
           (= (vla-get-HasExtensionDictionary x) :vlax-true))
    (setq dict (vla-GetExtensionDictionary x))
    (vlax-for item dict
      (if (= (vla-get-name item) "ACAD_FIELD")
        (progn (vla-remove dict "ACAD_FIELD")
          (vla-put-textstring x (vl-string-trim "%<>" (vla-get-textstring x)))))))
);defun
;
(defun C:field-to-text ( / adoc bks ass)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))) 
  (mapcar '(lambda (x y) (set x (vlax-get-property adoc y))) '(ass bks) 
    '(ActiveSelectionset Blocks)) 
  (if (> (vla-get-count ass) 0) (vla-clear ass))
  (vla-SelectOnScreen ass)
  (if (>= (vla-get-count ass) 1)
    (vlax-for x ass
      (cond ((= (vla-get-objectname x) "AcDbBlockReference")
             (vlax-for it (vla-item bks (vla-get-name x)) (conv it)));block
            ((= (vla-get-objectname x) "AcDbMText")
             (conv x))));vlax-for
  (princ) 
);end
Лентяй вне форума  
 
Непрочитано 23.06.2006, 12:45
#6
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


>Лентяй.
Не считаю смешение стилей чем-то криминальным. Чем удобно - тем и
пользуюсь. Данный стиль никак не связан с Алексеем(Крысом).

Может жить и Ваш вариант , однако.

1.В функции field-to-text перед (princ) пропущена закрывающая скобка.
2.В функции conv перед (setq dict (vla-GetExtensionDictionary x))
пропущен progn.
Эдуард вне форума  
 
Непрочитано 23.06.2006, 13:44
#7
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Кроме того, если расширить действие функции в части "убийства"
field в примитиве acad_table , то необходимо найти связь этого
примитива с блоком *T в котором и находятся данные Field's.
Через ActiveX это достаточно неудобно , а в entget данные об имени блока лежат на поверхности (в DXF 2).
И как тогда не смешивать стили?
Эдуард вне форума  
 
Непрочитано 24.06.2006, 06:05
#8
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от Эдуард
>Лентяй.
Не считаю смешение стилей чем-то криминальным.
А вот это - сугубо вопрос вкуса и стиля.
Цитата:
Чем удобно - тем и пользуюсь. Данный стиль никак не связан с Алексеем(Крысом).
Не считаю удобством неизбежные скачки entname -> vla-object и обратно. Для программ kpblc'а это весьма характерно.
Цитата:
Может жить и Ваш вариант , однако.
1.В функции field-to-text перед (princ) пропущена закрывающая скобка.
2.В функции conv перед (setq dict (vla-GetExtensionDictionary x))
пропущен progn.
А вот за это - спаибо. Конструктивная критика всегда категорически приветствуется. [sm2200]
Цитата:
Через ActiveX это достаточно неудобно , а в entget данные об имени блока лежат на поверхности (в DXF 2).
С каких пор вытащить имя блока средствами ActiveX стало проблемой?
Лентяй вне форума  
 
Автор темы   Непрочитано 26.06.2006, 10:56
#9
YuraVel

проектирование предприятий
 
Регистрация: 22.06.2006
Сообщений: 7


Незнаю как оно у Вас работает возможно я что-то не тосделал.

Я создал кнопку в Custmize, в Macros вписал выше выложенные коды (кнопки две) и ни одна не работает, после запуска кода Лентяя, даже после поправок, почемуто вызывает меню Custmize, я его долко пытаюсь закрыть (эдак раз 5), а если АвтоКАД только открыл и запускаю програму тогда открывается справка смотри ниже скопировал из текстового окна:


Открывается файл формата AutoCAD 2004.
Выполняется регенерация листов.
Выполняется регенерация модели.

AutoCAD Express Tools Copyright © 2002-2004 Autodesk, Inc.

Утилиты меню AutoCAD загружены.
Команда:
Команда:
Команда: _(defun Команда LISP недоступна.

Команда: conv Неизвестная команда "CONV". Для вызова справки нажмите F1.

Команда: (x / dict) ; ошибка: no function definition: X

Команда:
_HELP
Команда: СПРАВКА
Команда: СПРАВКА
Команда: (if (and (= (vla-get-objectname x) "AcDbMText")
((_> (= (vla-get-HasExtensionDictionary x) :vlax-true))
(_> (progn (setq dict (vla-GetExtensionDictionary x))
((_> (vlax-for item dict
(((_> (if (= (vla-get-name item) "ACAD_FIELD")
((((_> (progn (vla-remove dict "ACAD_FIELD")
(((((_> (vla-put-textstring x (vl-string-trim "%<>"
(vla-get-textstring x)))))))
(_> )
; ошибка: неверный тип аргумента: VLA-OBJECT nil

Команда: defun Неизвестная команда "DEFUN". Для вызова справки нажмите F1.

Команда:
СПРАВКА
Команда:
СПРАВКА
Команда: СПРАВКА
Команда:
СПРАВКА
Команда: (defun C:field-to-text ( / adoc bks ass)
(_> (vl-load-com)
(_> (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(_> (mapcar '(lambda (x y) (set x (vlax-get-property adoc y))) '(ass bks)
((_> '(ActiveSelectionset Blocks))
(_> (if (> (vla-get-count ass) 0) (vla-clear ass))
(_> (vla-SelectOnScreen ass)
(_> (if (>= (vla-get-count ass) 1)
((_> (vlax-for x ass
(((_> (cond ((= (vla-get-objectname x) "AcDbBlockReference")
(((((_> (vlax-for it (vla-item bks (vla-get-name x)) (conv it)))
((((_> block
((((_> ((= (vla-get-objectname x) "AcDbMText")
(((((_> (conv x))))
((_> vlax-for)
(_> (princ)
(_> )
; ошибка: синтаксическая ошибка

Команда: end
Неизвестная команда "END". Для вызова справки нажмите F1.

Команда:
Команда:
Команда: _ai_selall Выбор объектов...готово.

Команда: *Прервано*
YuraVel вне форума  
 
Автор темы   Непрочитано 26.06.2006, 10:58
#10
YuraVel

проектирование предприятий
 
Регистрация: 22.06.2006
Сообщений: 7


С кодом Эдуарда тоже самое

Объясните, пожалуйста уж очень хочется пользоватся
YuraVel вне форума  
 
Непрочитано 19.12.2006, 14:43
#11
Peter

строительство
 
Регистрация: 27.02.2005
Украина
Сообщений: 320


Ребята подскажите что сделать чтоб фон Fields появился. Вставляю поле , а фона нет. Где это настраивается , спасибо.
__________________
С ув. Петр
Peter вне форума  
 
Непрочитано 19.12.2006, 14:52
#12
Кулик Алексей aka kpblc
Moderator

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


FIELDDISPLAY :
Цитата:
Type: Integer
Saved in: Registry
Initial value: 1

Controls whether fields are displayed with a gray background. The background is not plotted.


0 Fields are displayed with no background

1 Fields are displayed with a gray background
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.12.2006, 15:58
#13
Peter

строительство
 
Регистрация: 27.02.2005
Украина
Сообщений: 320


Sorry за беспокойство. Про сис. переменные я забыл. Спасибо.
__________________
С ув. Петр
Peter вне форума  
 
Непрочитано 20.12.2006, 07:51
#14
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,825


Цитата:
Сообщение от YuraVel
Я создал кнопку в Custmize, в Macros вписал выше выложенные коды (кнопки две) и ни одна не работает, после запуска кода Лентяя, даже после поправок, почемуто вызывает меню Custmize, я его долко пытаюсь закрыть (эдак раз 5), а если АвтоКАД только открыл и запускаю програму тогда открывается справка смотри ниже скопировал из текстового окна:
Неправильно сделал. Это не макрос, а программа.
Прогу надо скопировать в блокнот, сохранить с расширением lsp и поместить его в автозагрузку. А макрос на кнопку сделать такой
Код:
[Выделить все]
^C^Cfield-to-text
Krieger вне форума  
 
Непрочитано 30.01.2011, 20:09
#15
Kraggash


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


Господа! А не появилось ли по данной теме что-нить нового за прошедшие года? Автодеск сам эту команду так и не сделал до сих пор?
З.Ы. И да, оба лиспа таки не фурычат. Лисп Эдуарда запускается, просит выбрать объекты, но объекты выбрать не удается. Лисп Лентяя выдает ошибку при запуске ( и с progn'ом, и без). Досадно.
З.З.Ы. Я понимаю, что прошло 4,5 года.
__________________
Автырь благодарит редактыря и корректыря за предоставленный ему шанец!

Последний раз редактировалось Kraggash, 30.01.2011 в 20:47.
Kraggash вне форума  
 
Непрочитано 31.01.2011, 10:57
#16
VVA

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


Родственная тема
Как все поля чертежа сразу преобразовать в текст?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 14.04.2015, 13:53
#17
slayeroker


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


Может это уже где-то описывалось, но я для себя нашел способ как поле преобразовать в текст. Изначально создать поле в многострочном тексте и потом разбить в однострочный. Просто )
slayeroker вне форума  
 
Непрочитано 14.04.2015, 14:30
#18
Deniska_che

Генпланист
 
Регистрация: 19.04.2013
St. Petersburg
Сообщений: 154


и получить в каждой строчке по несколько однострочных текстов. не есть удобно
Deniska_che вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Преобразование полей в текст

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

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