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

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

Как сделать поиск и выделение текста в чертеже из списка

Ответ
Поиск в этой теме
Непрочитано 19.11.2020, 22:22 #1
Как сделать поиск и выделение текста в чертеже из списка
Zets
 
Инженер-проектировщик электроснабжения
 
Краснодар
Регистрация: 04.09.2009
Сообщений: 249

Всем привет!
Нужна программа чтобы в чертеже искать и выделять "слова" из списка в файле.
Выделять можно как угодно (добавление теста в специальный слой, пометка кружочком и т.д.).
База слов не обязательно из файла, но наверно наиболее удобно (чтобы отказаться от графического интерфейса).
Буду благодарен за код или наводку на готовое решение.
Попытался начать сам (дальше открытия файла дело не пошло ), но слишком уж специфический язык.
Код:
[Выделить все]
 
(defun c:tta( / namefile nmfile runline)

(setq namefile (getfiled "Select file" "c:\\" "txt" 4))
(setq nmfile (open namefile "r"))
(while  (and (/= runline nil) (/= runline ""))
(setq runline (read-line nmfile))
(princ runline)
) ;while
(close nmfile)
(setq nmfile nil)
) ;defun
__________________
_____
If you're 555, then I'm 666 If you're 555, I'm 666 (What's it like to be a heretic?)
Просмотров: 823
 
Непрочитано 19.11.2020, 22:49
#2
Кулик Алексей aka kpblc
Moderator

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


Чтение файла /= сохранение прочитанного файла в список. Попробуй не просто прочитать, а запомнить что прочитал.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.11.2020, 22:56
#3
Zets

Инженер-проектировщик электроснабжения
 
Регистрация: 04.09.2009
Краснодар
Сообщений: 249


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Чтение файла /= сохранение прочитанного файла в список. Попробуй не просто прочитать, а запомнить что прочитал.
Так у меня проблема со всем остальным.. Как выделить тексты, как в них искать, как выделять)
__________________
_____
If you're 555, then I'm 666 If you're 555, I'm 666 (What's it like to be a heretic?)
Zets вне форума  
 
Непрочитано 19.11.2020, 23:21
#4
Кулик Алексей aka kpblc
Moderator

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


В какой переменной у тебя хранится то, что было в файле?

----- добавлено через ~3 мин. -----
Есть идея - пойти по другому пути. Давай распишем алгоритм?
Offtop: AU2020 выбил из колеи, работа все равно не клеится....
Задачу можно "разбить":
  1. Проверить, существует ли файл, откуда будут читаться данные (фактически не сделано)
  2. Прочитать весь файл (почти сделано), запомнив что в нем было (не сделано)
  3. Выбрать примитивы текстов (кстати, каких текстов? Однострочных? Многострочных? Внутрь блоков заходим? Учитываем размеры / таблицы / атрибуты / ...?) - до этого надо решить предыдущие задачи
  4. Выделить их каким-то макаром - сначала надо решить п.3.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.11.2020, 11:02
#5
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,531


Но вот что действительно вызывает трепет, так это вопрос: как выделить кружочком искомое слово в мультитексте достаточно большого объема? Нет, я понимаю, что можно его (это слово) перекрасить в другой цвет символами форматирования, но ведь смысл в кружочках такой, что их можно сделать непечатаемыми, чего не скажешь о, например, красном фрагменте текста.

----- добавлено через ~2 мин. -----
Может, и вправду стоит делать копии текстов на непечатном слое и в них уже выделять цветом нужные слова, не забывая следить за их порядком прорисовки.
skkkk на форуме  
 
Непрочитано 20.11.2020, 11:28
#6
Сергей812


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Но вот что действительно вызывает трепет, так это вопрос: как выделить кружочком искомое слово в мультитексте достаточно большого объема? Нет, я понимаю, что можно его (это слово) перекрасить в другой цвет символами форматирования, но ведь смысл в кружочках такой, что их можно сделать непечатаемыми, чего не скажешь о, например, красном фрагменте текста.
для начала бы определиться - зачем это вообще нужно ТС. Наличие множества отмеченных маркерами/выделениями и т.п. примитивов на чертеже будет заметно только в случае ч/б чертежа, да и то визуально можно пропустить все равно. Может, поисковая палитра с механизмом позиционирования на нужном примитиве по двойному клику будет более предпочтительнее. Заодно можно сгруппировать примитивы по словам или, наоборот, слова по примитивам. Хотя ТС вообще хочет от интерфейса избавиться
Цитата:
Сообщение от Zets Посмотреть сообщение
чтобы отказаться от графического интерфейса
Сергей812 вне форума  
 
Автор темы   Непрочитано 20.11.2020, 21:21
#7
Zets

Инженер-проектировщик электроснабжения
 
Регистрация: 04.09.2009
Краснодар
Сообщений: 249


Суть такая:
Огромный объем чертежей будет переделываться с одного объекта в другой.
Оборудование и прочее имеет специфическую кодировку. Т.е. просто автозаменой не сделать.
Количество оборудования и т.д. ограничено но все равно несколько десятков.
Исходное наименование записывается в текстовый файл построчно.
После того как чертеж переделан нужно проверить что ничего не пропущено. Т.е. ищутся старые наименования из текстового файла.
При проверке достаточно чтобы однострочный или мультитекст попал в другой отдельный слой, который потом изолируем и видим попало ли туда что то или нет.. то есть есть косяки или нет и дальше уже заморачиваться

----- добавлено через ~16 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В какой переменной у тебя хранится то, что было в файле?

----- добавлено через ~3 мин. -----
Есть идея - пойти по другому пути. Давай распишем алгоритм?
Offtop: AU2020 выбил из колеи, работа все равно не клеится....
Задачу можно "разбить":
  1. Проверить, существует ли файл, откуда будут читаться данные (фактически не сделано)
  2. Прочитать весь файл (почти сделано), запомнив что в нем было (не сделано)
  3. Выбрать примитивы текстов (кстати, каких текстов? Однострочных? Многострочных? Внутрь блоков заходим? Учитываем размеры / таблицы / атрибуты / ...?) - до этого надо решить предыдущие задачи
  4. Выделить их каким-то макаром - сначала надо решить п.3.
Алгоритм я себе представляю, проблема с реализацией (какие функции и объекты использовать).
1. Отрыть файл.
2. Считать построчно и записать в лист
3. Создать слой со специальным названием
4. Выделить все
5. Из выделенного отобрать текст и мультитекст. (либо п.4 и п.5 должны быть в одном с помощью выделения именно текста и мультитекста)
6. В оставшемся почленно выполнять поиск каждой строки и листа.
7. При совпадении менять слой члена.

Я правда не уверен насколько быстро такое будет работать. Если в чертеже несколько сотен объектов и в каждом будет поиск сотни строк, то процесс наверно может затянуться.
Возможно придется лепить какой нибудь вариант, типа все объекты соединить в один большой текст и в нем уже поиск всех строк делать. И если хоть одно совпадение будет найдено, то выкидывать уведомление с найденным наименование, а дальше уже руками искать.. Надеюсь не дойдет до такого.
__________________
_____
If you're 555, then I'm 666 If you're 555, I'm 666 (What's it like to be a heretic?)

Последний раз редактировалось Zets, 20.11.2020 в 21:38.
Zets вне форума  
 
Непрочитано 20.11.2020, 22:30
#8
Сергей812


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


Цитата:
Сообщение от Zets Посмотреть сообщение
4. Выделить все
5. Из выделенного отобрать текст и мультитекст. (либо п.4 и п.5 должны быть в одном с помощью выделения именно текста и мультитекста)
вообще то зачем выделять все, когда
Код:
[Выделить все]
 (setq %набор% (ssget "_X" '((0 . "*TEXT"))))
в переменной %набор% получите искомые текст и мультитекст.

Цитата:
Сообщение от Zets Посмотреть сообщение
6. В оставшемся почленно выполнять поиск каждой строки и листа.
строки - это из файла, наверно. А лист откуда нарисовался? И оставшемся - в чем ищете то, может все-таки в отобранных текстовых примитивах?

Цитата:
Сообщение от Zets Посмотреть сообщение
7. При совпадении менять слой члена.
под членом подразумевается примитив текста/мультитекста?
Сергей812 вне форума  
 
Автор темы   Непрочитано 20.11.2020, 22:53
#9
Zets

Инженер-проектировщик электроснабжения
 
Регистрация: 04.09.2009
Краснодар
Сообщений: 249


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
в переменной %набор% получите искомые текст и мультитекст.
Ок.


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
строки - это из файла, наверно. А лист откуда нарисовался? И оставшемся - в чем ищете то, может все-таки в отобранных текстовых примитивах?
Строки - да искомые слова из текстового файла, подготовленного заранее. Оставшееся - да, примитивы автокада. Лист наверное действительно не нужен.


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
под членом подразумевается примитив текста/мультитекста?
Да, верно
__________________
_____
If you're 555, then I'm 666 If you're 555, I'm 666 (What's it like to be a heretic?)
Zets вне форума  
 
Непрочитано 21.11.2020, 00:43
#10
Сергей812


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


тогда не бьется с
Цитата:
Сообщение от Zets Посмотреть сообщение
Если в чертеже несколько сотен объектов и в каждом будет поиск сотни строк
каждый примитив Text/MText - это одна строка (еще не забываем про символы форматирования), а объекты с сотнями строк - это уже те же вставки блоков с атрибутами.
Сергей812 вне форума  
 
Автор темы   Непрочитано 21.11.2020, 17:55
#11
Zets

Инженер-проектировщик электроснабжения
 
Регистрация: 04.09.2009
Краснодар
Сообщений: 249


Не знаю честно говоря как подробнее объяснить..
Нарисовал пример.
Миниатюры
Нажмите на изображение для увеличения
Название: 2020-11-21_17-46-09.jpg
Просмотров: 23
Размер:	117.1 Кб
ID:	232082  
__________________
_____
If you're 555, then I'm 666 If you're 555, I'm 666 (What's it like to be a heretic?)
Zets вне форума  
 
Автор темы   Непрочитано 22.11.2020, 21:40
#12
Zets

Инженер-проектировщик электроснабжения
 
Регистрация: 04.09.2009
Краснодар
Сообщений: 249


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
в переменной %набор% получите искомые текст и мультитекст.
В полученном результате надо foreach сравнить со строками из файла. Как это записать? Не могу никак разобраться.
__________________
_____
If you're 555, then I'm 666 If you're 555, I'm 666 (What's it like to be a heretic?)
Zets вне форума  
 
Непрочитано 22.11.2020, 21:47
#13
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun file->list (file / handle str lst)
  (if (findfile file)
    (progn (setq handle (open file "r"))
           (while (setq str (read-line handle))
             (if (/= (vl-string-trim str " ") "")
               (setq lst (cons str lst))
             ) ;_ end of if
           ) ;_ end of while
           (close handle)
           (reverse lst)
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun
----- добавлено через 56 сек. -----
ПП1, 2 из #4
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.11.2020, 22:42
#14
Сергей812


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


а откуда строки появляются в текстовом файле? Извлечением данных или ручками переносятся?
Сергей812 вне форума  
 
Автор темы   Непрочитано 22.11.2020, 22:48
#15
Zets

Инженер-проектировщик электроснабжения
 
Регистрация: 04.09.2009
Краснодар
Сообщений: 249


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ПП1, 2 из #4
Спасибо


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
а откуда строки появляются в текстовом файле? Извлечением данных или ручками переносятся?
Руками будут внесены и дополняться при необходимости
__________________
_____
If you're 555, then I'm 666 If you're 555, I'm 666 (What's it like to be a heretic?)
Zets вне форума  
 
Непрочитано 23.11.2020, 13:01
#16
Сергей812


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


Цитата:
Сообщение от Zets Посмотреть сообщение
Руками будут внесены и дополняться при необходимости
имхо, это узкое место - поддерживать базу данных многих сотен строк в отдельном текстовом файле. На лиспе это трудновато сделать, но если не зацикливаться именно на лиспе - то можно сделать простой интерфейс в палитре (см. вложение), и в верхнее поле ввода выводить значение из текущего выделенного примитива (если он текстовой). Там же можно подкорректировать значение и занести в список нажатием "Доб.". Ну а по событию изменения поля ввода можно искать в списке уже существующие значения - т.е. и как поиск поле ввода работает. А лисп не такой уж и сложный, просто на нем надо практиковаться усиленно - поэтому на него подзабил в свое время, уйдя в .Net. По количеству строк кода - где то лисп выигрывает, где то .Net. Например, код от Алексея в п.13 на .Net будет выглядеть
Код:
[Выделить все]
 string[] lWords = File.ReadAllLines (%Имя файла%);
а перебор строк из полученного массива считанных строк
foreach(string lWord in lWords)
{
... Сравниваем что нужно с текущим значением lWord из считанного массива строк
}

так что если лисп не пойдет как ЯП для автоматизации - есть альтернативы) Да и .Net побыстрее все-таки работает
Цитата:
Сообщение от Zets Посмотреть сообщение
Я правда не уверен насколько быстро такое будет работать.
а здесь получается, минимум, три вложенных цикла:
1. Цикл по отобранным текстовым примитивам.
2. Цикл по массиву строк над каждым примитивом.
3. Скрытый цикл сравнения символов в строках.
Миниатюры
Нажмите на изображение для увеличения
Название: Интерфейс01.JPG
Просмотров: 11
Размер:	24.8 Кб
ID:	232104  
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как сделать поиск и выделение текста в чертеже из списка

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить высоту всего многострочного текста на чертеже zenija2007 AutoCAD 20 15.10.2020 17:41
как сделать ссылку текста на текст? pacific60x AutoCAD 10 07.09.2017 12:25
рекурсия при выделение аннотативного текста dead_lyric AutoCAD 7 15.12.2016 14:33
Как сделать заливку текста прозрачной и без пробелов вокруг него? nail058 AutoCAD 3 22.06.2016 10:52
Как изменить стиль текста во всем чертеже? Albino AutoCAD 34 17.12.2009 10:55