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

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

Поиск слова(предложения) во всех файлах AutoCad

Ответ
Поиск в этой теме
Непрочитано 27.09.2009, 16:48 #1
Поиск слова(предложения) во всех файлах AutoCad
h0h01
 
Регистрация: 19.01.2009
Сообщений: 24

Существует ли функция поиска слова(предложения) в нескольких десятках файлов одновременно, и заменой его на друрое сразу во всех файлах? Если да, то как ею пользоваться, и нужно ли открывать все эти файлы вручную?
Заранее благодарен.
Просмотров: 13965
 
Непрочитано 27.09.2009, 18:10
#2
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Команда _Find. Файлы надо открывать
Vova вне форума  
 
Непрочитано 28.09.2009, 10:50
#3
Suvor

Инженер
 
Регистрация: 07.08.2007
Беларусь
Сообщений: 27


Существует программа Archivarius 3000. Вкратце принцип действия таков: задаем нужную папку, программа индексирует находящиеся внутри файлы (понимает около 200 типов файлов) и сохраняет результат в собственную базу. При необходимости можно обновить базу для изменившихся и новых файлов.

При запросе на поиск слов или фраз Archivarius 3000 ищет в собственной базе. У меня порядка 10000 файлов DWG, поиск занимает буквально 1-2 секунды.
Suvor вне форума  
 
Автор темы   Непрочитано 28.09.2009, 11:09
#4
h0h01


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


Спасибо за ответ, окно выскакивает, но фразу почему-то не находит, может я что-то нетак делаю...
-Открываю пачку файлов, потом пишу _Find, потом в графу "Fing text string" ввожу искомую фразу, а в графу "Replace with" фразу, на которую надо заменить, потом кликаю Find, но ничего не находит
-Archivarius 3000 пока не пробовал, но сейчас попробую.
h0h01 вне форума  
 
Непрочитано 28.09.2009, 11:23
#5
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от h0h01 Посмотреть сообщение
Спасибо за ответ, окно выскакивает, но фразу почему-то не находит, может я что-то нетак делаю...
-Открываю пачку файлов, потом пишу _Find, потом в графу "Fing text string" ввожу искомую фразу, а в графу "Replace with" фразу, на которую надо заменить, потом кликаю Find, но ничего не находит
Команда _find работает только с активным документом. (как работает, какие можно задавать маски и т.д. - можно почитать в справке..) Что бы автоматически искать / менять текст во множестве файлов, не обойтись без программирования.. (VBA, Lisp) И такого рода программы уже создавались. (Mass Update, например)..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 28.09.2009, 11:34
#6
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,826
<phrase 1=


Цитата:
Сообщение от h0h01 Посмотреть сообщение
Спасибо за ответ, окно выскакивает, но фразу почему-то не находит, может я что-то нетак делаю...
-Открываю пачку файлов, потом пишу _Find, потом в графу "Fing text string" ввожу искомую фразу, а в графу "Replace with" фразу, на которую надо заменить, потом кликаю Find, но ничего не находит
-Archivarius 3000 пока не пробовал, но сейчас попробую.
см.
Нажмите на изображение для увеличения
Название: FindRE.JPG
Просмотров: 359
Размер:	32.0 Кб
ID:	26580
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Автор темы   Непрочитано 28.09.2009, 13:09
#7
h0h01


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


Archivarius 3000 Ничего не находит
А по примеру тоже ничего, правда у меня стоит Mechanics, а слова находятся в тех.требованиях,- может в этом проблема(после расчленения тоже ничего не получилось) ?
h0h01 вне форума  
 
Непрочитано 28.09.2009, 16:34
#8
Хмурый


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


h0h01, а Настройки (options) команды _find посмотреть? Может там выключен поиск для объектов нужного типа
Хмурый вне форума  
 
Непрочитано 28.09.2009, 16:42
#9
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от h0h01 Посмотреть сообщение
Archivarius 3000 Ничего не находит
А по примеру тоже ничего, правда у меня стоит Mechanics, а слова находятся в тех.требованиях,- может в этом проблема(после расчленения тоже ничего не получилось) ?
Ну, объекты Mechanics с помощью обычного _find не найти.. Скорее всего, там должна быть какая-то утилита для этого (как, например в СПДС - на рисунке..). А когда расчленяются они - что за объекты получаются (если в окне свойств посмотреть)?
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.jpg
Просмотров: 135
Размер:	50.7 Кб
ID:	26596  
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 28.09.2009, 16:57
#10
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Какой версии автокад, и есть-ли на нем Service pack? В 2009 без оного команда Find работает некорректно
Vova вне форума  
 
Непрочитано 28.09.2009, 17:14
#11
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,826
<phrase 1=


h0h01, посмотри здесь может поможет
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 28.09.2009, 18:50
#12
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,992


засунь следующий код (программа поиска и замены текста в чертеже) в acad.mnl:
Код:
[Выделить все]
 ;-============-; 
    ;- Text  Find -; 
    ;-    *~*     -; 
    ;  Written by -; 
    ; Mark Mercier ; 
    ;   05-06-09   ; 
    ;-============-; 

(defun c:tfind2 () 
  (tfind2fun nil nil 0) 
) ;_ end of defun 

(defun tfind2fun (inputF inputR caseSn / goto goWhile strinF strinR selSet selTxt searep case count error) 
    ; 01 Create selection set. GOTO 02 if success, or GOTO 08 if fail 
    ; 02 Check passed input. If both nil, GOTO 03. If first string and second nil, GOTO 06. If both strings, GOTO 07. Otherwise, return error and GOTO 08 
    ; 03 Display menus and obtain data from user. If Search, GOTO 04. If Replace, GOTO 05 
    ; 04 Search option selected. Prompt user for single search term. GOTO 06 
    ; 05 Replace option selected. Prompt user for search term and replace term. GOTO 07 
    ; 06 One string has been passed. Assume automatic search. GOTO FINISH 
    ; 07 Two strings have been passed. Assume automatic replace. GOTO FINISH 
    ; 08 FINISH. Return errors or messages if needed. 
  (vl-load-com) 
  (setq goTo 1) 
  (setq goWhile 1) 
  (setq count 0) 
  (if (not (mlml (list caseSn) (list 0 1))) 
    (progn (setq goWhile nil) (princ "\nCase selection not recognized.")) 
  ) ;_ end of if 
  (if (= caseSn 0) 
    (setq case "N") 
    (setq case "Y") 
  ) ;_ end of if 
  (while goWhile 
    (cond 
      ((= goTo 1) 
       (if (setq selSet (extTxtPt (ssget "X"))) 
         (setq goTo 2) 
         (setq error "\nSelection set not found." 
               goTo  8 
         ) ;_ end of setq 
       ) ;_ end of if 
      ) 
      ((= goTo 2) 
    ; Check input, pass to whatever. 
       (cond 
         ((and (= inputF nil) (= inputR nil)) 
          (setq goTo 3) 
         ) 
         ((and (= (type inputF) 'STR) (= inputR nil)) 
          (setq strinF inputF) 
          (setq goTo 6) 
         ) 
         ((and (= (type inputF) 'STR) (= (type inputR) 'STR)) 
          (setq strinF inputF) 
          (setq strinR inputR) 
          (setq goTo 7) 
         ) 
         (t 
          (setq error "\nPassed arguments are not accepted.") 
          (setq goTo 8) 
         ) 
       ) ;_ end of cond 
      ) 
      ((= goTo 3) 
    ; Obtain desired option from user 
       (while (not 
                (mlml (list (setq searep (strcase (getstring nil "\nSelect option [Find/Replace/Quit/Case]: ")))) 
                      (list "F" "FIND" "R" "REPLACE" "Q" "QUIT" "C" "CASE") 
                ) ;_ end of mlml 
              ) ;_ end of not 
       ) ;_ end of while 
       (cond 
         ((mlml (list searep) (list "F" "FIND")) 
          (setq goTo 4) 
         ) 
         ((mlml (list searep) (list "R" "REPLACE")) 
          (setq goTo 5) 
         ) 
         ((mlml (list searep) (list "Q" "QUIT")) 
          (setq goTo 8) 
         ) 
         ((mlml (list searep) (list "C" "CASE")) 
          (while (not (mlml (list (setq case (strcase (getstring nil "\nCase sensitive? [Yes/No]: ")))) 
                            (list "Y" "YES" "N" "NO") 
                      ) ;_ end of mlml 
                 ) ;_ end of not 
          ) ;_ end of while 
         ) 
       ) ;_ end of cond 
      ) 
      ((= goTo 4) 
    ; Obtain search string from user, set to strinF 
       (while (eq "" (setq strinF (getstring t "\nEnter search term: ")))) 
       (setq goTo 6) 
      ) 
      ((= goTo 5) 
    ; Obtain search string and replace string from user, set to strinF and strinR respectively 
       (while (eq "" (setq strinF (getstring t "\nEnter find term: ")))) 
       (while (eq "" (setq strinR (getstring t "\nEnter replace term: ")))) 
       (setq goTo 7) 
      ) 
      ((= goTo 6) 
    ; Search drawing for strinF 
       (cond 
         ((mlml (list case) (list "Y" "YES")) 
    ; Compare using (vl-string-search strinF input), view selection 
    ; use "while" to get all search occurances 
          (foreach selVar selSet 
            (if (vl-string-search strinF (nth 0 selVar)) 
              (progn 
                (setq count (1+ count)) 
                (if (/= (getvar "ctab") (caddr selVar)) 
                  (command "ctab" (caddr selVar)) 
                ) ;_ end of if 
                (command "zoom" "c" (trans (cadr selVar) 0 1) (* 32 (nth 3 selVar))) 
                (getstring "\nPress 'Enter' to continue: ") 
              ) ;_ end of progn 
            ) ;_ end of if 
          ) ;_ end of foreach 
         ) 
         ((mlml (list case) (list "N" "NO")) 
    ; Compare using (vl-string-search (strcase strinF) (strcase input)), view selection 
    ; use "while" to get all search occurances 
          (foreach selVar selSet 
            (if (vl-string-search (strcase strinF) (strcase (nth 0 selVar))) 
              (progn 
                (setq count (1+ count)) 
                (if (/= (getvar "ctab") (caddr selVar)) 
                  (command "ctab" (caddr selVar)) 
                ) ;_ end of if 
                (command "zoom" "c" (trans (cadr selVar) 0 1) (* 32 (nth 3 selVar))) 
                (getstring "\nPress 'Enter' to continue: ") 
              ) ;_ end of progn 
            ) ;_ end of if 
          ) ;_ end of foreach 
         ) 
       ) ;_ end of cond 
       (if (= count 0) 
         (setq error "\nNo matches found.") 
         (setq error (strcat (itoa count) " matches found.")) 
       ) ;_ end of if 
       (setq goTo 8) 
      ) 
      ((= goTo 7) 
    ; Replace strinF with strinR 
       (cond 
         ((mlml (list case) (list "Y" "YES")) 
    ; Compare using (vl-search-string strinF input), modify using (vl-string-subst) within a while loop 
          (foreach selVar selSet 
            (setq selTxt (nth 0 selVar)) 
            (setq seaLoc 0) 
            (while (setq seaLoc (vl-string-search strinF selTxt seaLoc)) 
              (setq selTxt (vl-string-subst strinR strinF selTxt seaLoc)) 
              (setq seaLoc (+ seaLoc (strlen strinR))) 
              (setq count (1+ count)) 
            ) ;_ end of while 
            (vla-put-textstring (vlax-ename->vla-object (nth 4 selVar)) selTxt) 
          ) ;_ end of foreach 
         ) 
         ((mlml (list case) (list "N" "NO")) 
    ; Compare using (vl-string-search (strcase strinF) (strcase input)), modify using (vl-string-subst) within a while loop 
          (foreach selVar selSet 
            (setq selTxt (nth 0 selVar)) 
            (setq seaLoc 0) 
            (while (setq seaLoc (vl-string-search (strcase strinF) (strcase selTxt) seaLoc)) 
              (setq selTxt (strcat (substr selTxt 1 seaLoc) strinR (substr selTxt (+ 1 seaLoc (strlen strinF))))) 
              (setq seaLoc (+ seaLoc (strlen strinR))) 
              (setq count (1+ count)) 
            ) ;_ end of while 
            (vla-put-textstring (vlax-ename->vla-object (nth 4 selVar)) selTxt) 
          ) ;_ end of foreach 
         ) 
       ) ;_ end of cond 
       (if (= count 0) 
         (setq error "\nNo occurances found.") 
         (setq error (strcat (itoa count) " occurances modified.")) 
       ) ;_ end of if 
       (setq goTo 8) 
      ) 
      ((= goTo 8) 
       (if error 
         (princ error) 
       ) ;_ end of if 
       (setq goWhile nil) 
      ) 
    ) ;_ end of cond 
  ) ;_ end of while 
  (princ) 
) ;_ end of defun 

(defun mlml (inSMLChar inSMLStri / returnVarMS toCheck chkWith) 
  (setq returnVarMS nil) 
  (if (and (= (type inSMLChar) 'list) 
           (= (type inSMLStri) 'list) 
      ) ;_ end of and 
    (progn 
      (foreach toCheck inSMLStri 
        (foreach chkWith inSMLChar 
          (if (eq toCheck chkWith) 
            (setq returnVarMS t) 
          ) ;_ end of if 
        ) ;_ end of foreach 
      ) ;_ end of foreach 
    ) ;/progn 
  ) ;_ end of if 
  returnVarMS 
)   ; Checks a list to see if a member of that list is the same as a member of another list. Returns T or nil 

(defun extTxtPt (ssList / subVar getEnt entTyp entTxt entPnt entLay entHgt grp66 entAtt getEntAtt entAttTyp uniLst) 
  (setq uniLst nil) 
  (setq subVar 0) 
  (if ssList 
    (repeat (sslength ssList) 
      (setq getEnt (entget (cadr (car (ssnamex ssList subVar))))) 
      (setq entTyp (cdr (assoc 0 getEnt))) 
      (cond 
        ((or (= entTyp "TEXT") (= entTyp "MTEXT")) 
         (setq entTxt (cdr (assoc 1 getEnt))) 
         (setq entPnt (cdr (assoc 10 getEnt))) 
         (setq entHgt (cdr (assoc 40 getEnt))) 
         (setq entLay (cdr (assoc 410 getEnt))) 
         (setq entNam (cdr (assoc -1 getEnt))) 

         (setq uniLst (append uniLst (list (list entTxt entPnt entLay entHgt entNam)))) 
        ) 
        ((= entTyp "INSERT") 
         (setq grp66 (assoc 66 getEnt)) 
         (if grp66 
           (progn 
             (setq entAtt (entnext (cdr (assoc -1 getEnt)))) 
             (setq getEntAtt (entget entAtt)) 
             (setq entAttTyp (cdr (assoc 0 getEntAtt))) 
           ) ;_ end of progn 
         ) ;_ end of if 
         (while (= entAttTyp "ATTRIB") 
           (setq entTxt (cdr (assoc 1 getEntAtt))) 
           (setq entPnt (cdr (assoc 10 getEntAtt))) 
           (setq entHgt (cdr (assoc 40 getEntAtt))) 
           (setq entLay (cdr (assoc 410 getEntAtt))) 
           (setq entNam (cdr (assoc -1 getEntAtt))) 

           (setq uniLst (append uniLst (list (list entTxt entPnt entLay entHgt entNam)))) 

    ; Get next entity. 
           (setq entAtt (entnext (cdr (assoc -1 getEntAtt)))) 

    ; Get ent and ent type 
           (setq getEntAtt (entget entAtt)) 
           (setq entAttTyp (cdr (assoc 0 getEntAtt))) 
         ) ;_ end of while 
        ) 
        (t 
        ) 
      ) ;_ end of cond 
      (setq subVar (1+ subVar)) 
    ) ;_ end of repeat 
  ) ;_ end of if 
  uniLst 
)   ; Return list of all text-based objects (Text, MText, Attribute) in the current drawing

а после этот (код запускает поиск и замену определенного текста):
Код:
[Выделить все]
(tfind2fun "Искомый текст" "Другой текст" 0)
где 0 - без учена регистра, 1 - с учетом регистра


Потом этот (код закрывает текущий чертеж с сохраненем):
Код:
[Выделить все]
(command "_.vbastmt" "ThisDrawing.Close True")
Открывай нужные файлы, текст автоматически заменится, файл сохранится и закроется.
Потом эту самодеятельность надо будет удалить
Nike вне форума  
 
Автор темы   Непрочитано 29.09.2009, 16:22
#13
h0h01


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


Спасибо огромное за советы!
буду пробовать... как только получится чего, то отпишу результаты
h0h01 вне форума  
 
Непрочитано 22.10.2009, 14:50
#14
Electra

Инженер-антрополог
 
Регистрация: 16.02.2009
Moscow
Сообщений: 97


Цитата:
Сообщение от h0h01 Посмотреть сообщение
Спасибо огромное за советы!
буду пробовать... как только получится чего, то отпишу результаты
ну как результаты?
Electra вне форума  
 
Непрочитано 12.07.2020, 20:53
#15
Бульмен


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


Цитата:
Сообщение от Suvor Посмотреть сообщение
Существует программа Archivarius 3000. Вкратце принцип действия таков: задаем нужную папку, программа индексирует находящиеся внутри файлы (понимает около 200 типов файлов) и сохраняет результат в собственную базу. При необходимости можно обновить базу для изменившихся и новых файлов.

При запросе на поиск слов или фраз Archivarius 3000 ищет в собственной базе. У меня порядка 10000 файлов DWG, поиск занимает буквально 1-2 секунды.
Suvor вне форума вставить имя Обратить внимание модератора на это сообщение
А у меня она находит от силы 10% dwg-файлов.

Посоветуйте программу поиска в dwg-файлах. Причём созданных не только автокадом, но и всякими сторонними утилитами.
Версия автокада 2019.
Кроме betntey view и dwgsee я ничего не нашёл, чтобы прям показывало найденное слово на чертеже
Бульмен вне форума  
 
Непрочитано 12.07.2020, 21:28
#16
Кулик Алексей aka kpblc
Moderator

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


Эт как "показать"? Учитывая, что работа выполняется не в текущем документе?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.07.2020, 22:12
#17
Бульмен


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


"Работа" вообще не производится. Более того, не установлен. Но нужно найти в dwg-файлах нужный текст и посмотреть, где этот текст находится.
P.S. Странные вопросы задаёте.
В dwgsee pro не работали что ли?

"Работа" вообще не выполняется. Более того, автокад даже не инсталлирован на компе.
Нужно просто найти заданный текст в массиве dwg-файлов и посмотреть, где он находится на чертеже

Последний раз редактировалось Кулик Алексей aka kpblc, 13.07.2020 в 08:21.
Бульмен вне форума  
 
Непрочитано 13.07.2020, 01:17
#18
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,049


видимо, смесь акадовского (_find) поисковика текста и внешней БД - чтобы кликнул и открылся файл (при необходимости), переключилось на нужное пространство и позиционировало по тексту в центре.
Сергей812 вне форума  
 
Непрочитано 13.07.2020, 05:36
#19
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,875


Цитата:
Сообщение от Бульмен Посмотреть сообщение
у меня она находит от силы 10% dwg-файлов.
Скорее всего, это файлы формата AutoCAD 2000: в нем текстовые строки сохранялись как текст внутри файла. Поздние форматы уже сжаты/зашифрованы.

Я когда-то для себя такую штуку делал:
Код:
[Выделить все]
<html>
<head><meta name=vs_targetSchema content="HTML 4.0">
<style>
.fileLink {
	color: blue;
	cursor: hand;
	text-decoration: underline;
}
</style>

<script language=jscript>

function onSelectPath()
{
	try {
		var sh = new ActiveXObject("Shell.Application");
		var folder = sh.BrowseForFolder(0, "", 0);
		if(folder)
			txt_Path.value = folder.Items().Item().Path;
	} catch(e) {
	}
}

// Оформительские штучки
function CLEAR_STATUS()
{
	p_Status.innerHTML = "";
}

function PRINT_STATUS_GRREN(s)
{
	p_Status.innerHTML += "<font color=green><b>" + s + "</b></font><br>";
}

function PRINT_STATUS_RED(s)
{
	p_Status.innerHTML += "<font color=red><b>" + s + "</b></font><br>";
}

function PRINT_STATUS_ERROR(s)
{
	PRINT_STATUS_RED("Ошибка: " + s);
}

function CLEAR_RESULT()
{
	p_Result.innerHTML = "";
}

function PRINT_RESULT_FILE(fileName)
{
	var re = new RegExp("\\\\", "g");
	var fileNameJS = fileName.replace(re, "\\\\");

	p_Result.innerHTML += "<span class=fileLink onclick=\"Run('" + fileNameJS + "');\">" + fileName + "</span><br>"; 
}

function PRINT_RESULT_FOLDER(folderName)
{
	p_Result.innerHTML += "<b>" + folderName + "</b><br>";
}

function PRINT_RESULT(s)
{
	p_Result.innerHTML += s + "<br>";
}

// объект, собирающий и выводящий найденные строки
function ResultPrinter()
{
	this.MaxLines = 10;
	this.CurrLine = 0;
	this.Lines = new Array();

	this.formatLine = function(s)
	{
		return "<font color=green>&nbsp;&nbsp;&nbsp;" + s + "</font>";
	}

	this.addLine = function(s)
	{
		if(this.CurrLine < this.MaxLines){
			this.Lines.push(s);
			this.CurrLine++;
		} else if(this.CurrLine == this.MaxLines) {
			this.Lines.push("...");
			this.CurrLine++;
		}
	}

	this.printLines = function()
	{
		for(var i = 0; i < this.Lines.length; i++)
			PRINT_RESULT(this.formatLine(this.Lines[i]));
	}
}


// Объекты доступа к ACAD
var g_Acad     = null;
var g_Document = null;
// Объект доступа к файловой системе
var g_FSO  = null;
// Объект выдачи результатов поиска в файле
var g_ResultPrinter = null;
// Собственно шаблон поиска
var g_RegExp = null;

// Проверка расширения
function isAutocadFile(fileName)
{
	return g_FSO.GetExtensionName(fileName).toLowerCase() == "dwg";
}

// Поиск в текстах
function findInText(text)
{
	var txt = text.TextString;
	if(g_RegExp.test(txt)) {
		g_ResultPrinter.addLine(txt);
		return true;
	} else {
		return false;
	}
}

// Поиск в мтекстах
function findInMText(mtext)
{
	var txt = mtext.TextString;
	if(g_RegExp.test(txt)) {
		g_ResultPrinter.addLine(txt);
		return true;
	} else {
		return false;
	}
}

// Поиск в атрибутах
function findInAttribute(attribute)
{
	var txt = attribute.TextString;
	if(g_RegExp.test(txt)) {
		g_ResultPrinter.addLine(txt);
		return true;
	} else {
		return false;
	}
}


// Поиск в атрибутах вставленного блока
function findInAttributeReference(attributeReference)
{
	var txt = attributeReference.TextString;
	if(g_RegExp.test(txt)) {
		g_ResultPrinter.addLine(txt);
		return true;
	} else {
		return false;
	}
}

// Поиск в таблицах
function findInTable(table)
{
	var result = false;
	for(var row = 0; row < table.Rows; row++)
		for(var col = 0; col < table.Columns; col++) {
			var txt = table.GetText(row, col);
			if(g_RegExp.test(txt)) {
				g_ResultPrinter.addLine(txt);
				result |= true;
			} 
		}
	return result;
}

// Поиск в блоках
function findInBlock(block)
{
	var result = false;
	var ents = new Enumerator(block);
	for(; !ents.atEnd(); ents.moveNext()) {
		var ent = ents.item();
		result |= findInEntity(ent);
	}
	return result;
}

</script>

<script language=VBScript>
function findInBlockReference(blockReference)
	findInBlockReference = false

'	if blockReference.HasAttributes then
'		attrs = blockReference.GetAttributes
'		For i = LBound(attrs) To UBound(attrs)
'			window.alert(attrs(i).TextString())
'		    'findInBlockReference = findInBlockReference and findInAttributeReference(attrs(i))
'		Next
'	end if

	set block = g_Document.Blocks.Item(blockReference.Name)
	findInBlockReference = findInBlockReference and findInBlock(block)
end function
</script>

<script language=JScript>
// Поиск в очередном объекте ACAD
function findInEntity(ent)
{
	var result = false;	
	switch(ent.ObjectName){
	case "AcDbText":
		result |= findInText(ent);
		break;
	case "AcDbMText":
		result |= findInMText(ent);
		break;
	case "AcDbTable":
		result |= findInTable(ent);
		break;
	case "AcDbBlockReference":
		result |= findInBlockReference(ent);
		break;
	default:
		break;
	}
	return result;
}

// Поиск в модели или на листе
function findInSpace(space)
{
	var result = false;
	var ents = new Enumerator(space);
	for(; !ents.atEnd(); ents.moveNext()) {
		var ent = ents.item();
		result |= findInEntity(ent);
	}
	return result;
}

// Поиск внутри файла
// null, если ничего не найдено
function findInFile(fileName)
{
	var result = false;
	try {
		g_Document = g_Acad.Documents.Open(fileName, true);
		g_ResultPrinter = new ResultPrinter();
		
		result |= findInSpace(g_Document.ModelSpace);
		result |= findInSpace(g_Document.PaperSpace);
	} catch (error) {
		//PRINT_STATUS_ERROR(error.desctiption + ". Файл: " + fileName);
		PRINT_STATUS_ERROR("Ошибка в файле: " + fileName);
	} finally {
		try { g_Document.Close(false); } catch(error) {}
		return result;
	}
}


// Собственно поиск - в каталоге и в подкаталогах
function Find(folder)
{
	PRINT_RESULT_FOLDER(folder.Path);

	// Поиск в файлах
	var files = new Enumerator(folder.Files);
	for(; !files.atEnd(); files.moveNext()) {
		var file = files.item();
		if(isAutocadFile(file.Path))
			if(findInFile(file.Path)) {
				PRINT_RESULT_FILE(file.Path);
				g_ResultPrinter.printLines();
			}
	}

	// Поиск в подкаталогах
	var subFolders = new Enumerator(folder.SubFolders);
	for(; !subFolders.atEnd(); subFolders.moveNext()) {
		var subFolder = subFolders.item();
		Find(subFolder);
	}
}


// Обработчик кнопки ПОИСК
function onFind()
{
	try {
		CLEAR_STATUS();
		CLEAR_RESULT();

		g_Acad   = new ActiveXObject("Autocad.Application");
		g_Acad.Visible = true;
		g_FSO    = new ActiveXObject("Scripting.FileSystemObject");
		g_RegExp = new RegExp(txt_Pattern.value, "i");
		var folder = g_FSO.GetFolder(txt_Path.value);
		Find(folder);
	} catch(error) {
		PRINT_STATUS_RED("ОШИБКА: " + error.description);
	} finally {
		try { g_Acad.Quit(); } catch(error) {}
		try { g_FSO = null;  } catch(error) {}
	}
}

// Запуск файла по ссылке
function Run(fileName)
{
	try {
		var sh = new ActiveXObject("WScript.Shell");
		sh.Run("\"" + fileName + "\"");
	} catch (error) {
	}
}

</script>
</head>
<body>
<p>Искать текст:</p>
<p><input id=txt_Pattern type=text style="width:100%;"></p>
<p>Где искать:</p>
<p><input id=txt_Path type=text value="C:\" style="width:100%;">
 <input id=btn_SelectPath type=button value=Выбрать... onclick="onSelectPath();" ></p>
<p>
 <input id=btn_Find type=button value=Искать onclick="onFind();"></p>
<p>
<hr width="100%" size=1>
<p id=p_Status></p>
<hr width="100%" size=1>
<p id=p_Result></p>
</body>
</html>
Для поиска загружает новое скрытое окно автокада, открывает в нем файлы, ищет в них текст и собирает список найденных. Открыть найденный файл будет можно по гиперссылке. Поиск через JavaScript, так что поддерживаются его регулярные выражения. Сохранить с расширением HTA и запустить как обычную программу.

P.S.
Сейчас у меня Автокада нет, если что не контачит - не помогу.
Нубий-IV вне форума  
 
Непрочитано 13.07.2020, 08:24
#20
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Бульмен Посмотреть сообщение
Более того, автокад даже не инсталлирован на компе.
DWG формат зашифрован и просто так вскрытию не поддается. Надо устанавливать либо ACAD, либо nanoCAD, либо что-то еще, что открывает dwg-файлы и позволяет их программно обрабатывать. Ну или изучай методы программной работы с DwgTrueView - может, чего и получится.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Поиск слова(предложения) во всех файлах AutoCad

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск фрагмента текста в текстовых файлах Nike Разное 23 14.05.2019 07:14
Искатель ссылок в файлах Autodesk Inventor (поиск применяемостей) Бриг Прочее ПО от Autodesk 14 24.05.2009 19:57
поиск в dwg файлах chater Прочее. Программное обеспечение 2 22.03.2009 23:25
Поиск всех примитивов по цвету на одном слое GGarry Программирование 11 18.12.2008 00:11
Поиск в AutoCad 2009 dudin AutoCAD 6 16.11.2008 19:03