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

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 27-09-2016, 19:05:28

Название: Получить количество объектов модели
Отправлено: Алексей (IdeaSoft) от 27-09-2016, 19:05:28
Подскажите, возможно ли с помощью API AutoCAD
сразу получить количество примитивов ModelSpace
Т.е. не проходиться в цикле со счетчиком, а сразу получить количество.

SelectionSet.Count не подходит т.к. набора
как такового нет. есть только объект database

Может ответ на этот вопрос уже есть на форуме?

Название: Re: Получить количество объектов модели
Отправлено: Александр Ривилис от 27-09-2016, 19:51:36
Подскажите, возможно ли с помощью API AutoCAD
сразу получить количество примитивов ModelSpace
Да.
Т.е. не проходиться в цикле со счетчиком, а сразу получить количество.
Нет.
Речь ведь идёт про количество примитивов в Пространстве Модели. Чем тебя итератор не устраивает? Быстрее всё равно не получишь.
Можно так с помощью LINQ:
Код - C# [Выбрать]
  1. using System.Linq;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6.  
  7. #pragma warning disable 0618
  8.  
  9. [assembly: CommandClass(typeof(CountModel.Utils))]
  10.  
  11. namespace CountModel
  12. {
  13.   public class Utils
  14.   {
  15.     [CommandMethod("CountModel")]
  16.     public void MyCommand()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       if (doc == null) return;
  20.       Editor ed = doc.Editor;
  21.       using (BlockTable bt =
  22.         doc.Database.BlockTableId.Open(OpenMode.ForRead) as BlockTable)
  23.       using (BlockTableRecord btr =
  24.         bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForRead) as BlockTableRecord) {
  25.          ed.WriteMessage("\nВсего в Пространстве Модели {0} примитивов.",   btr.Cast<object>().Count());
  26.       }
  27.     }
  28.   }
  29. }

Переписывать на VB.NET не буду. :)
Название: Re: Получить количество объектов модели
Отправлено: Алексей (IdeaSoft) от 27-09-2016, 20:56:06
На VB net не нужно на С все понятно
Название: Re: Получить количество объектов модели
Отправлено: Алексей (IdeaSoft) от 27-09-2016, 21:02:43
Чем тебя итератор не устраивает? Быстрее всё равно не получишь
А что вот эта конструкция "btr.Cast<object>().Count()"
работает точно с такой же скоростью, как если бы я пробежался по циклу таблицы?
Т.е. Count -это не свойство а метод класса? судя по скобкам Count()
Что где-нибудь в заголовке таблицы нет величины счетчика?
Название: Re: Получить количество объектов модели
Отправлено: Александр Ривилис от 27-09-2016, 21:05:01
А что вот эта конструкция "btr.Cast<object>().Count()"
работает точно с такой же скоростью, как если бы я пробежался по циклу таблицы?
Думаю, что медленнее. Во всяком случае не быстрее, так как использует тот же итератор + возможны накладные расходы. Но можешь проверить если интересно.
Название: Re: Получить количество объектов модели
Отправлено: Алексей (IdeaSoft) от 27-09-2016, 21:07:36
Но можешь проверить если интересно
Хотя да нужно проверить к примеру пробежался я по таблице с 50 000 примитивов - порядка 100 мс заняло.
а может и меньше во всяком случае долго ждать не пришлось.
Попробую позднее 500 000 объектов проверить.
Мне нужно знать заранее количество что бы один раз __malloc вызвать
А то выделять динамически память это очень дорогого стоит.
Я тут на днях провел эксперимент.
Вызвал тестовом примере 100 000 раз new для инстансов класса - 3 сек. ушло- Очень медленно.
А когда один раз сделал new <class>[100 000] разом выбрал мгновенно!
 
Название: Re: Получить количество объектов модели
Отправлено: Александр Ривилис от 27-09-2016, 21:16:02
Я тут на днях провел эксперимент.
Вызвал тестовом примере 100 000 раз new для инстансов класса - 3 сек. ушло- Очень медленно.
А когда один раз сделал new <class>[100 000] разом выбрал мгновенно!
Всё правильно. Важно, чтобы потом не нужно было этот массив увеличивать. Иначе накладные расходы на создание нового массива, удаление старого и перенос всех элементов из старого массива в новый.
Название: Re: Получить количество объектов модели
Отправлено: Алексей (IdeaSoft) от 27-09-2016, 22:06:52
Важно, чтобы потом не нужно было этот массив увеличивать
Я тут по этому поводу лекцию на Ютубе смотрел.
В компьютерных играх есть такая практика программирования.
В основном цикле игры, динамически выделяют больше памяти чем требуется.
На сколько больше все зависит от самой игры - решать программисту.
И потом пользуются этим куском памяти.
Получается не совсем экономно с памятью, но зато игра не тормозит.
Название: Re: Получить количество объектов модели
Отправлено: Алексей (IdeaSoft) от 27-09-2016, 23:23:58
btr.Cast<object>().Count()

Выражение перевести на VB NET не проблема

Код - vb.net [Выбрать]
  1. Dim obj As Object = btr.Cast(Of Object).Count

А вот на С++ :(

Код - C++ [Выбрать]
  1. CAD_DBS::BlockTable^ bt = (CAD_DBS::BlockTable^)(db->BlockTableId.Open(CAD_DBS::OpenMode::ForRead));
  2.  CAD_DBS::BlockTableRecord^ btr = (CAD_DBS::BlockTableRecord^)(bt[CAD_DBS::BlockTableRecord::ModelSpace].Open(CAD_DBS::OpenMode::ForRead));
  3. btr->Cast // ??? Пишет член Cast класса не найден.

IntelliSense: class "Autodesk::AutoCAD::DatabaseServices::BlockTableRecord" не содержит члена "Cast"

Я подключал сборки acad 2012 и Net FrameWork 4.5
В проекте поддержка CLR включена.


Название: Re: Получить количество объектов модели
Отправлено: Дмитрий Загорулькин от 27-09-2016, 23:59:47
Это метод из LINQ: https://msdn.microsoft.com/ru-ru/library/bb341406(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1
Название: Re: Получить количество объектов модели
Отправлено: Александр Ривилис от 28-09-2016, 00:23:19
А вот на С++
О Боже!!! Зачем это всё если на чистом ObjectARX это красивее, быстрее, понятнее...
Название: Re: Получить количество объектов модели
Отправлено: Алексей (IdeaSoft) от 28-09-2016, 09:24:09
ObjectARX это красивее
Если это С++, то нужно на ObjectARX сделать.
Название: Re: Получить количество объектов модели
Отправлено: Алексей (IdeaSoft) от 28-09-2016, 16:32:29
Это метод из LINQ
А теперь понятно - LinQ я не подключил.