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

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

Поиск и замена текста

Ответ
Поиск в этой теме
Непрочитано 11.11.2009, 22:49 #1
Поиск и замена текста
TechNick
 
Инженер
 
Нижний Новгород
Регистрация: 19.04.2006
Сообщений: 15

Добрый день. Такой вопросик очень нужно решить.
На чертеже существует около тысячи однострочных текстов с подписями марок дорожного ограждения видов:
1. 11ДО-ММ.2(564)У2
2. 11ДО-ММ.2(256)У3
3. 11ДО-ММ.2(64)У4
4. 11ДО-ММ.2(98)У5

Где текст в скобках указывает протяженность и везде разный. Надо преобразовать к такому виду соответственно:
1. 11ДО/190-0.75(0.15)-3.0-0.9(564)
2. 11ДО/250-0.75(0.15)-2.0-0.9(256)
3. 11ДО/300-0.75(0.15)-4.0-0.9(64)
4. 11ДО/350-0.75(0.15)-4.0-1.25(98)
Как это сделать наиболее быстро ума не приложу. Помогите кто знает
Просмотров: 98420
 
Непрочитано 11.11.2009, 23:11
#2
Кулик Алексей aka kpblc
Moderator

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


В поиск !
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2009, 00:07
#3
Nike

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


Программа замены фрагментов текста:
Код:
[Выделить все]
;-============-; 
    ;- Text  Find -; 
    ;-    *~*     -; 
    ;  Written by -; 
    ; Mark Mercier ; 
    ;   05-06-09   ; 
    ;-============-; 

(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 "старый текст" "новый текст" 1)
где ключик <1> - с учетом регистра, а если <2> - без учета регистра, Создавай по каждому фрагменту команду замены, например:

Код:
[Выделить все]
(tfind2fun "11ДО-ММ.2(564)У2" "11ДО/190-0.75(0.15)-3.0-0.9(564)" 1)
(tfind2fun "11ДО-ММ.2(256)У3" "11ДО/250-0.75(0.15)-2.0-0.9(256)" 1)
и вперед!
Nike вне форума  
 
Непрочитано 12.11.2009, 08:35
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Что-то есть у меня подозрение, что автор хотел немного другого:
у него есть:
Цитата:
Сообщение от TechNick Посмотреть сообщение
1. 11ДО-ММ.2(564)У2
2. 11ДО-ММ.2(256)У3
3. 11ДО-ММ.2(64)У4
4. 11ДО-ММ.2(98)У5
Надо чтобы
1) "У#" в конце удалилось
2) "-ММ.2" заменилось на:
  • "/190-0.75(0.15)-3.0-0.9" если У2 в конце
  • "/250-0.75(0.15)-2.0-0.9" если У3 в конце
  • "/300-0.75(0.15)-4.0-0.9" если У4 в конце
  • "/350-0.75(0.15)-4.0-1.25" если У5 в конце
TechNick, так?
Do$ вне форума  
 
Автор темы   Непрочитано 12.11.2009, 09:43
#5
TechNick

Инженер
 
Регистрация: 19.04.2006
Нижний Новгород
Сообщений: 15
<phrase 1=


Да именно так. У# не нужны, а вот числа в скобках нужно оставить так как их гигантское колличество вариантов в чертеже, заменив только середину строки
TechNick вне форума  
 
Непрочитано 12.11.2009, 10:29
#6
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Программу нужно искать или писать. На 98% уверен, что стандартными средствами не решить.
Предлагаю поискать в темах внизу (похожие темы), если ничего не найдется - описать как можно подробнее, как предполагается использовать программу, выложить файл-пример (если возможно).
Ключевые вопросы примерно такие:
  • Каким образом выбирать текст? (Варианты: вручную по одному/рамкой/предварительным _qselect и т.п., автоматически - по слою/цвету/размеру/содержанию и т.п.)
  • Замена производится только в однострочном тексте или еще в многострочном, в атрибутах блока и т.п.?
  • Что будет являться индикацией удачного завершения работы программы? (Варианты: весь измененный текст выделяется цветом/переносится в новый слой с оригинальным именем/ничего не происходит/выводится сообщение "столько-то текстов было изменено"...)
Чем больше информации - тем больше шансов получить то, что нужно
Do$ вне форума  
 
Непрочитано 12.11.2009, 10:39
1 | #7
Nike

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


тогда так, без всяких программ

Для У2:

1. Выбрать все тексты, содержащие фрагмент "У2" (по маске):

Сервис/Быстрый выбор (_qselect)
- Применить: ко всему чертежу
- Тип объектов: текст
- Свойство: Содержимое
- Оператор: * Поиск с глобальными символами
- Значение: *У2
ОК

2. Поиск и замена "-ММ.2" на "/190-0.75(0.15)-3.0-0.9"; "У2" на "" в выделенных текстах:

Правка/Найти (_find)
- Найти: "-ММ.2"
- Заменить: "/190-0.75(0.15)-3.0-0.9"
- Область поиска: Выбранные объекты
Заменить все
(не закрывая окно поиска)
- Найти: "У2"
- Заменить: ""
- Область поиска: Выбранные объекты
Заменить все

Повторить п1,2 для У3,У4,У5

Последний раз редактировалось Nike, 12.11.2009 в 10:46.
Nike вне форума  
 
Непрочитано 12.11.2009, 11:29
1 | #8
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Действительно работает!
Подозревал, что _find это умеет, оказалось, что нужно только в настройках покопаться
Миниатюры
Нажмите на изображение для увеличения
Название: find_replace.jpg
Просмотров: 2913
Размер:	42.9 Кб
ID:	28713  
Do$ вне форума  
 
Непрочитано 12.11.2009, 11:47
#9
Nike

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


А я с удивлением обнаружил, что в _qselect можно делать выбор по маске
Миниатюры
Нажмите на изображение для увеличения
Название: qselect.jpg
Просмотров: 2479
Размер:	42.1 Кб
ID:	28714  
Nike вне форума  
 
Автор темы   Непрочитано 12.11.2009, 21:31
#10
TechNick

Инженер
 
Регистрация: 19.04.2006
Нижний Новгород
Сообщений: 15
<phrase 1=


Цитата:
Сообщение от Nike Посмотреть сообщение
тогда так, без всяких программ Для У2: 1. Выбрать все тексты, содержащие фрагмент "У2" (по маске): Сервис/Быстрый выбор (_qselect) - Применить: ко всему чертежу - Тип объектов: текст - Свойство: Содержимое - Оператор: * Поиск с глобальными символами - Значение: *У2 ОК 2. Поиск и замена "-ММ.2" на "/190-0.75(0.15)-3.0-0.9"; "У2" на "" в выделенных текстах: Правка/Найти (_find) - Найти: "-ММ.2" - Заменить: "/190-0.75(0.15)-3.0-0.9" - Область поиска: Выбранные объекты Заменить все (не закрывая окно поиска) - Найти: "У2" - Заменить: "" - Область поиска: Выбранные объекты Заменить все Повторить п1,2 для У3,У4,У5
Супер. Спасибо.
Как-то не догадался использовать одновременно функцию быстрый выбор и поиск. Возьмём на вооружение. Ещё раз благодарю
TechNick вне форума  
 
Непрочитано 12.11.2009, 23:05
#11
Nike

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


Цитата:
Сообщение от TechNick Посмотреть сообщение
Супер. Спасибо.
Как-то не догадался использовать одновременно функцию быстрый выбор и поиск. Возьмём на вооружение. Ещё раз благодарю
Один инженер - хорошо, а два - лучше!
Nike вне форума  
 
Непрочитано 17.11.2009, 11:13
#12
Миксер


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


Доброго времени суток.
Подскажите ,а можно как нибуть в автокаде найти интервал чисел скажем от 3 до 9 ?
Миксер вне форума  
 
Непрочитано 17.11.2009, 13:05
#13
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Миксер, ИМХО вопрос не очень понятен.
E-degtyarev вне форума  
 
Непрочитано 17.11.2009, 13:37
#14
Миксер


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


Вот у меня в автокаде набор разных чисел....от 1 до 200 и не по одному числу , а мне нужны все от 3до 12 для их редактирования.Можно сделать их быстрый поиск (выделение этого интервала)?
Миксер вне форума  
 
Непрочитано 17.11.2009, 13:42
#15
Кулик Алексей aka kpblc
Moderator

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


А "числа" - это что? Атрибуты? Блоки? Однострочные тексты? Многострочные тексты? Элементы выносок? Значения ячеек таблицы или нескольких таблиц? Многострочные тексты без форматирования? Многострочные тексты с принудительным форматированием?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.11.2009, 14:23
#16
Миксер


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


Каждая цыфра- однострочный текст
Миксер вне форума  
 
Непрочитано 17.11.2009, 14:48
#17
Кулик Алексей aka kpblc
Moderator

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


попробуй так:
Миниатюры
Нажмите на изображение для увеличения
Название: qselect_text.png
Просмотров: 1997
Размер:	8.8 Кб
ID:	29040  
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.11.2009, 15:22
#18
Миксер


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


не получается, если я правильно понял....не выделяет вообще ничего из набора цыфр
Миксер вне форума  
 
Непрочитано 17.11.2009, 15:25
#19
Nike

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
попробуй так:
Миниатюры
По-моему, эта фигня с цифрами не работает, только с буквами
Nike вне форума  
 
Непрочитано 17.11.2009, 15:32
#20
Миксер


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


Работает...спасибо ...а можете объяснить ,что значит написанное в строке value? ...Так как порой мне приходится выделять скажем цыфры от 100 до 150
Миксер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Поиск и замена текста

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск фрагмента текста в текстовых файлах Nike Разное 23 14.05.2019 07:14
Групповой поиск и замена текста Torino Программирование 22 05.03.2016 23:00
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
Поиск и замена текста на чертежах Autodesk Inventor Бриг Прочее ПО от Autodesk 4 21.01.2009 17:05
поиск и замена Dante AutoCAD 1 03.10.2007 18:26