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

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

Удаление текста из файла.

Ответ
Поиск в этой теме
Непрочитано 09.04.2008, 06:55 #1
Удаление текста из файла.
Залётный
 
Регистрация: 15.04.2005
Сообщений: 243

Задача:
Необходимо перенести любой текст в файле (текст, мултилайн текст, атрибуты, текст в блоках и т.д.) на отдельный слой, или просто удалить любой текст из файла.

Описание проблемы.

Получены чертёжи от смежников в которых всё находится на одном слое. Все элементы блоков находятся на слое 0. Необходимо перенести любые текстовые объекты, в том числе входящие в состав блоков на отдельный слой, или просто удалить их.

Нужно решение для групповой обработки файлов - возможность запускать программу из командной строки т.е. для включения её в скрипт.

Первоначально задача выглядела очень просто -

1. сделать explode(burst) всех блоков два или три раза т.к. блоки содержат внутри себя другие блоки.
2. создать отдельный слой.
3. селектировать text(mtext) объекты.
4. перенести их на новый слой.

При быполнении burst появлялись новые видимые объекты.
Причина - в череже использовались блоки одной длины (состоящие из нескольких более коротких блоков) и при необходимости они клипались. При выполнении explode(burst) проявлялась невидимая часть этих блоков.
В блоки в качестве элементов включены атрибуты, обычный текст и мультилайн текст. С атрибутами проблема решается довольно просто - команда find и заменить текст помаске * на пробел. Кроме того можно воспользоваться attstrip.vlx от DotSoft:
http://www.dotsoft.com/freestuff.htm

Имеется ли возможность перенести все текстовые элементы на отдельный слой, или полностью удалить их из файла или обнулить, чтобы он стал нивидимым?

Последний раз редактировалось Залётный, 09.04.2008 в 14:54.
Просмотров: 5750
 
Непрочитано 09.04.2008, 20:53
#2
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Пробуй лиспик, может чего не учёл...
Код:
[Выделить все]
 ;команда   del-txt
(defun C:del-txt (/ adoc item block)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vlax-for block (vla-get-blocks adoc)
    (vlax-for item block
      (cond ((member (setq typ (vla-get-objectname item))
                     '("AcDbText" "AcDbMText" "AcDbAttributeDefinition")
                     ) ;_ end member
             (vl-catch-all-apply 'vla-delete (list item))
             )
            ((= typ "AcDbBlockReference")
             (if (or (setq var (vla-getattributes item))
                     (setq var (vla-GetConstantAttributes item))
                     ) ;_ end or
               (foreach atr (vlax-safearray->list (vlax-variant-value var))
                 (vl-catch-all-apply 'vla-delete (list atr))
                 ) ;_ end foreach
               ) ;_ end if
             )
            ) ;_ end cond
      ) ;_ end vlax-for
    ) ;_ end vlax-for
  ) ;_ end defun
Евгений А. вне форума  
 
Непрочитано 09.04.2008, 20:57
#3
Кулик Алексей aka kpblc
Moderator

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


Евгений А., может, проще установить тогда свойство Visible в :vlax-false?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.04.2008, 21:00
#4
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Проще, но этого не просили
Евгений А. вне форума  
 
Автор темы   Непрочитано 09.04.2008, 21:24
#5
Залётный


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


Цитата:
Сообщение от Евгений А. Посмотреть сообщение
Пробуй лиспик, может чего не учёл...
Получил:

; error: ActiveX Server returned an error: Invalid index
Залётный вне форума  
 
Непрочитано 09.04.2008, 22:10
#6
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Вот немного переделал
Код:
[Выделить все]
 ;êîìàíäà   del-txt
(defun C:del-txt (/ item block atr)
  (vlax-for block (vla-get-blocks
                    (vla-get-activedocument (vlax-get-acad-object))
                    ) ;_ end vla-get-blocks
    (vlax-for item block
      (cond ((member (setq typ (vla-get-objectname item))
                     '("AcDbText" "AcDbMText" "AcDbAttributeDefinition")
                     ) ;_ end member
             (vl-catch-all-apply 'vla-delete (list item))
             )
            ((= typ "AcDbBlockReference")
             (if (equal (vla-get-hasattributes item) :vlax-true)
               (foreach atr (vlax-safearray->list
                              (vlax-variant-value (vla-GetAttributes item))
                              ) ;_ end vlax-safearray->list
                 (vl-catch-all-apply 'vla-delete (list atr))
                 ) ;_ end foreach
               ) ;_ end if
             )
            ) ;_ end cond
      ) ;_ end vlax-for
    ) ;_ end vlax-for
  ) ;_ end defun
;(C:del-txt)
Но! Сам столкнулся с этой ошибкой - очень похоже на глюк Автокада. Ошибка появляется при повторном включении программы (конкретно (vla-get-hasattributes item) выдаёт true даже если аттрибутов уже нету. Если файл сохранить, закрыть и открыть заново - то ошибки уже нету. Странно...????
Евгений А. вне форума  
 
Непрочитано 09.04.2008, 22:22
#7
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Вот лови - сделал отлов ошибки (???), вроде не вылетает теперь.
Код:
[Выделить все]
;команда   del-txt
(defun C:del-txt (/ item block atr msg)
  (vlax-for block (vla-get-blocks
                    (vla-get-activedocument (vlax-get-acad-object))
                    ) ;_ end vla-get-blocks
    (vlax-for item block
      (cond ((member (setq typ (vla-get-objectname item))
                     '("AcDbText" "AcDbMText" "AcDbAttributeDefinition")
                     ) ;_ end member
             (vl-catch-all-apply 'vla-delete (list item))
             )
            ((= typ "AcDbBlockReference")
             (and (equal (vla-get-hasattributes item) :vlax-true)
                  (not
                    (vl-catch-all-error-p
                      (setq msg (vl-catch-all-apply
                                  'vlax-safearray->list
                                  (list (vlax-variant-value (vla-GetAttributes item)))
                                  ) ;_ end vl-catch-all-apply
                            ) ;_ end setq
                      ) ;_ end vl-catch-all-error-p
                    ) ;_ end not
                  (foreach atr msg
                    (vl-catch-all-apply 'vla-delete (list atr))
                    ) ;_ end foreach
                  ) ;_ end and
             )
            ) ;_ end cond
      ) ;_ end vlax-for
    ) ;_ end vlax-for
  ) ;_ end defun
;(C:del-txt)
Евгений А. вне форума  
 
Автор темы   Непрочитано 09.04.2008, 22:28
#8
Залётный


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


Цитата:
Сообщение от Евгений А. Посмотреть сообщение
Вот немного переделал
Спасибо!

Великолепно работает. Остаётся сделать регенерацию.
Залётный вне форума  
 
Непрочитано 10.04.2008, 11:22
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


>Евгений А. Есть еще 2 момента. Рассуждения сугубо теоретические и для Залетного может быть роли не играют.
Проходя по блокам, ты не преверяешь обрабатываемый блок на предмет не внешняя ли это ссылка и еще у блоков могут быть постоянные атрибуты.
Код:
[Выделить все]
;;;Сохранение состояния слоев с разморозкой и разблокировкой
;;;Документа Doc
(defun mip:layer-status-save (Doc)
    (setq *MIP_LAYER_LST* nil)
    (vlax-for item (vla-get-layers Doc) 
      (setq *MIP_LAYER_LST* (cons (list item 
                                  (cons "freeze" (vla-get-freeze item)) 
                                  (cons "lock" (vla-get-lock item)) 
                                  ) ;_ end of cons 
                            *MIP_LAYER_LST* 
                            ) ;_ end of cons 
            ) ;_ end of setq 
      (vla-put-lock item :vlax-false) 
      (vl-catch-all-apply '(lambda () (vla-put-freeze item :vlax-false))) 
      ) ;_ end of vlax-for 
    ) ;_ end of defun
;;;Восстановление состояния слоев
(defun mip:layer-status-restore () 
    (foreach item *MIP_LAYER_LST*
      (if (not (vlax-erased-p (car item))) 
        (vl-catch-all-apply 
          '(lambda () 
             (vla-put-lock (car item) (cdr (assoc "lock" (cdr item))))
             (vla-put-freeze (car item) (cdr (assoc "freeze" (cdr item))))
             ) ;_ end of lambda 
          ) ;_ end of vl-catch-all-apply 
        ) ;_ end of if 
      ) ;_ end of foreach
    (setq *MIP_LAYER_LST* nil)
    ) ;_ end of defun
;;; Удаление текстов из документа
;;;Doc - указатель на обрабатываемый объект
(defun DellAllTextObjects (Doc / Count DelObjList)
(setq Count 0)
(vlax-for Blk (vla-get-Blocks Doc)
 (if (= (vla-get-IsXref Blk) :vlax-false)
  (vlax-for Obj Blk
    (setq DelObjList (list Obj))
   (if (or
         (member (vla-get-objectname Obj)
                 '("AcDbText" "AcDbMText" "AcDbAttributeDefinition" "AcDbAttribute")
                 ) ;_ end member
         (and
           (= (vla-get-objectname Obj) "AcDbBlockReference")
           (vlax-property-available-p obj 'Hasattributes)
    (eq :vlax-true (vla-get-HasAttributes obj))
           (setq DelObjList (append (vlax-invoke obj 'Getattributes)
     (vlax-invoke obj 'Getconstantattributes)
                             )
                 )
           )
         )
         
    (progn
      (foreach itm DelObjList
        (vl-catch-all-apply 'vla-delete (list itm))
        (setq count (1+ count))
        ) ;_ end foreach
    )
    )
  )
 )
  )
  count
)
;команда   del-txt
(defun C:del-txt ( / *error* Doc)
  (vl-load-com)
  (defun *error* (msg)(princ msg)
    (mip:layer-status-restore)(princ))
  (setq Doc (vla-get-activedocument (vlax-get-acad-object)))
  ;;Размораживаем, разблокируем слои, сохранив их сосотяние
  (mip:layer-status-save Doc)
  (princ "\nУдалено ")(princ (DellAllTextObjects Doc))
  (princ " из ")(princ (vla-get-name Doc))(terpri)
  (mip:layer-status-restore)
  (vla-Regen Doc acAllViewports)
  (princ)
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 10.04.2008, 19:57
#10
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


VVA, я так глобально и не хотел даже думать, а делать... и так устаю. Всё сказанное верно и нужно - снимаю шляпу.
Непонравилась только эта строка:
(vl-catch-all-apply '(lambda () (vla-put-freeze item :vlax-false)))
так Крыс всегда делает, а мне нравится так
(vl-catch-all-apply 'vla-put-freeze (list item :vlax-false))
Евгений А. вне форума  
 
Непрочитано 10.04.2008, 22:00
#11
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Единственно, если нет уверенности, что функция определена, то вариант
(vl-catch-all-apply (function (lambda () .....)))
абсолютно надежен.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 10.04.2008, 22:48
#12
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Цитата:
Сообщение от Pastor Посмотреть сообщение
Единственно, если нет уверенности, что функция определена, то вариант
(vl-catch-all-apply (function (lambda () .....)))
абсолютно надежен.
Я имею в виду конкретный случай, когда получается "маслянное масло". Про надёжность ничего против не имею, но бесполезную избыточность не приветствую. Конкретно к VVA - только уважуха !
Евгений А. вне форума  
 
Непрочитано 10.04.2008, 22:50
#13
Кулик Алексей aka kpblc
Moderator

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


Отвлеченно: а если надо защищать не одно действие, а несколько? Я несколько раз втупую вбил "не то", с тех пор просто привык использовать неименованные функции в catch-error.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.04.2008, 10:58
#14
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
так Крыс всегда делает, а мне нравится так
(vl-catch-all-apply 'vla-put-freeze (list item :vlax-false))
Так они в свое время и были сделаны на основе его ф-ций Хотя я тоже в большинстве случаев предпочитаю lambda
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 11.04.2008, 11:23
#15
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Отвлеченно: а если надо защищать не одно действие, а несколько?
Вот именно в этом случае надо использовать Lambda, а получается что всё под одну гребёнку - мол не надо ДУМАТЬ. Я понимаю, что процессору пофигу чего обрабатывать, но ведь бред например придумывать такой код:
(defun main_put-freeze (layer flag / )
(vla-put-freeze layer flag)
)

Или это нормально??? Всего несколько лишних байтов...
Евгений А. вне форума  
 
Непрочитано 11.04.2008, 12:07
#16
Кулик Алексей aka kpblc
Moderator

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


Ага, именно "под одну гребенку". Зато все параллельно, перпендикулярно и покрашено в зеленый цвет.
Кстати, вот именно так код и приводит к ошибкам. ИМХО надо:
Код:
[Выделить все]
(defun main_put-freeze (layer freeze)
  (if (not
	(equal (vla-get-activelayer (vla-get-document layer)) layer)
	) ;_ end of not
    (vla-put-freeze
      layer
      (if freeze
	:vlax-true
	:vlax-false
	) ;_ end of if
      ) ;_ end of vla-put-freeze
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.04.2008, 12:56
#17
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


кто о чём....
Евгений А. вне форума  
 
Непрочитано 11.04.2008, 13:01
#18
Кулик Алексей aka kpblc
Moderator

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


Да ладно тебе, не бушуй. Я только-только отвлекся от ADT...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.04.2008, 14:00
#19
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Да я воще месяцев 6 не программировал....
Евгений А. вне форума  
 
Непрочитано 14.04.2008, 18:01
#20
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Небось, ObjectARX учил?
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 15.04.2008, 21:41
#21
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Удаление прокси из файла CAD tokhot AutoCAD 18 13.07.2019 20:27
Удаление не используемых блоков из файла Гузалия AutoCAD 3 13.12.2007 10:06
Програмное удаление файла. Holon Программирование 9 13.10.2007 17:53
структурированный список Holon Программирование 22 11.09.2007 14:09