Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: zmk.autocad от 02-05-2015, 19:54:45

Название: Поиск и выбор объекта.
Отправлено: zmk.autocad от 02-05-2015, 19:54:45
Здравствуйте! Это опять я, с глупыми вопросами. Пишу свою вторую программу для автокада для своего рода деятельности.
Точнее если быть то уже написал, но сегодня решил добавить новый метод поиска и выделения нужного текстового объекта.
Имеется чертеж с 3000 текстовыми данными  и пойнтами. Нужно запросить у пользователя строку поиска. допустим он вводит 1234! после этого найти текстовый файл с текстом "SE1234" выделить его!
что то не понимаю как его осуществить. думаю в этом направлении:
Код - C# [Выбрать]
  1.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  2.             Database acDocBase = acDoc.Database;
  3. using (DocumentLock acDocLock = acDoc.LockDocument())
  4.             {
  5.                 using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  6.                 {
  7.                     DBObjectCollection ob_all = acDoc.TransactionManager.GetAllObjects();
  8.  
  9.                 }
  10.             }
и дальше не понимаю что нужно, как работать с DBObjectCollection? это как бы массив объектов получается? тоесть его можно перебрать при помощи foreach?
Название: Re: Поиск и выбор объекта.
Отправлено: Андрей Бушман от 02-05-2015, 20:01:25
Тебе уже давалась ссылка (https://sites.google.com/site/bushmansnetlaboratory/sendbox/stati/database).
Название: Re: Поиск и выбор объекта.
Отправлено: Александр Ривилис от 02-05-2015, 20:19:13
Начни с того, что разберись что возвращает TransactionManager.GetAllObjects().
Название: Re: Поиск и выбор объекта.
Отправлено: Андрей Бушман от 02-05-2015, 20:22:21
Кроме того, прежде чем опубликовывать текст - читай, что ты написал. Что за мешанина из "чертёжа с текстовыми данными" и из "текстовых файлов"? Работа с текстовыми файлами не требует наличия AutoCAD .NET API.
Название: Re: Поиск и выбор объекта.
Отправлено: zmk.autocad от 02-05-2015, 20:46:10
Андрей, я это уже читал. Но не догнал -( вот хоть осуждайте хоть нет. таковы мои мозги в данной области.
Александр, TransaktionManager.GetAllObjects() возвращает все объекты всех транзакции в форме DBObjectCollection. Хотя да ты прав. мне не нужны объекты транзакций, мне нужны все однострочные объекты из базы чертежа.
Название: Re: Поиск и выбор объекта.
Отправлено: Андрей Бушман от 02-05-2015, 20:54:03
Похоже тебе нужно для начала разобраться со структурой базы данных чертежа (https://sites.google.com/site/bushmansnetlaboratory/translate-manual/osnovy-autocad-net-api/ponimanie-ierarhii-obektov-autocad). Тогда ты сможешь более чётко сформировать для самого себя задачу. Почитай так же о том, что из себя представляют пространство модели, листа и определений блоков (экземплярами какого класса они представлены и где хранятся в БД). Почитай и о том, как вхождения блоков связаны с их определениями. Затем подумай ещё раз о том, какой текст ты хочешь обрабатывать: вообще весь в базе данных, или же весь в модели, или же весь в модели и на листах и т.п. (вариантов море). Если ты не хочешь обрабатывать текст атрибутах вхождений блоков или обычный текст в их определениях, то имеет смысл исключить их из обработки.

Цитата: zmk.autocad
Андрей, я это уже читал. Но не догнал -(
Что конкретно не понятно?

Не пропускай #2.
Название: Re: Поиск и выбор объекта.
Отправлено: zmk.autocad от 02-05-2015, 21:08:21
Андрей, там ты создаешь интерфейс потом вызываешь методы интерфейса, а разве нельзя обойтись без интерфейсов а сделать это в обычном методе класса?
Название: Re: Поиск и выбор объекта.
Отправлено: Андрей Бушман от 02-05-2015, 21:11:45
Ты сейчас не на то внимание обращаешь. Там присутствует код различных вариантов выборки нужных объектов. А через интерфейс это будет делаться или нет - это уже другой вопрос. Ты спрашивал "как" - я показал примеры конкретного кода.
Название: Re: Поиск и выбор объекта.
Отправлено: zmk.autocad от 02-05-2015, 21:13:41
я не понимаю первую строку кода уже:
ObjectId[] GetAllObjects(DBObjectStatus status);
Что это?
Название: Re: Поиск и выбор объекта.
Отправлено: Андрей Бушман от 02-05-2015, 21:18:04
Получение идентификаторов всех объектов. Код обозначенного метода так же присутствует. Внимательней код смотри - там всё что нужно представлено.

Так же я бы рекомендовал глянуть здесь (http://bushman-andrey.blogspot.ru/2014/12/explodeallproxy-removeallproxy.html) код метода
Код - C# [Выбрать]
  1. public static Db.ObjectId[] GetDBObjectIds(this Db.Database db,
  2.             Func<Db.ObjectId, Boolean> filter) {
это более корректный вариант, т.к. выполняет дополнительную проверку:
Код - C# [Выбрать]
  1. approxNum > 0
Название: Re: Поиск и выбор объекта.
Отправлено: Александр Ривилис от 02-05-2015, 22:51:19
Думаю что эта задача решается проще при помощи Editor.SelectAll с фильтром. В качестве примера:

Editor.SelectAll с фильтром выбора примитивов и слоёв (http://adn-cis.org/editor.selectall-s-filtrom-vyibora-primitivov-i-sloyov.html)
Название: Re: Поиск и выбор объекта.
Отправлено: zmk.autocad от 02-05-2015, 23:59:14
Александр, спасибо тебе за постоянную помощь моих глупых вопросов. Но мне нужно выбрать имменно однострочный текст  в содержании которой имееться конкретная подстрока!
Название: Re: Поиск и выбор объекта.
Отправлено: Александр Ривилис от 03-05-2015, 00:05:17
Но мне нужно выбрать имменно однострочный текст  в содержании которой имееться конкретная подстрока!
Ну и что? Хочешь чтобы я "разжевал и положил в рот"? ;) Ладно. В указанном примере фильтр будет выглядеть так:
Код - C# [Выбрать]
  1. string str = "строка поиска"; // Здесь искомая строка
  2. filterlist[0] = new TypedValue(0, "TEXT");
  3. filterlist[1] = new TypedValue(1, "*"+str+"*");
Фильтр может быть более сложным в зависимости от того, что тебе нужно.
Название: Re: Поиск и выбор объекта.
Отправлено: zmk.autocad от 03-05-2015, 00:12:59
Александр. Ну просто я не представлял себе что так можно :(! прям спасибо большое! сейчас буду пробывать!
Название: Re: Поиск и выбор объекта.
Отправлено: zmk.autocad от 03-05-2015, 00:23:43
Да, Александр этого вполне хватает спасибо большое! теперь буду пытаться выделять объекты
Название: Re: Поиск и выбор объекта.
Отправлено: Александр Ривилис от 03-05-2015, 00:30:34
теперь буду пытаться выделять объекты
В каком смысле? После завершения команды они должны остаться выделенными?
Если да, то читай:
Установка набора предварительного выбора в .NET API (http://adn-cis.org/ustanovka-nabora-predvaritelnogo-vyibora-v-net-api.html)
Название: Re: Поиск и выбор объекта.
Отправлено: zmk.autocad от 03-05-2015, 00:40:42
СПАСИБО ВАМ БОЛЬШОЕ!!! Офигенный форум!
Название: Re: Поиск и выбор объекта.
Отправлено: Александр Ривилис от 03-05-2015, 02:07:13
СПАСИБО ВАМ БОЛЬШОЕ!!! Офигенный форум!
Проблема решена? Если да, то отметь сообщение, которое приблизило тебя к решению как написано у меня в подписи.
Название: Re: Поиск и выбор объекта.
Отправлено: zmk.autocad от 03-05-2015, 06:48:35
Да! Спасибо большое!