Как перебирать только блоки?

Автор Тема: Как перебирать только блоки?  (Прочитано 36767 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #15 : 31-08-2015, 15:59:37 »
так что быстрее не будет

А давайте попробуем обойти это ограничение.


Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #17 : 31-08-2015, 16:03:24 »
Попробуй оба варианта, сравни и выбери нужный.

Оба, в смысле перебор и выбор с фильтром.

Очень близко тому, что я хочу! Спасибо, попробую! Только уже завтра.

Аллилуйя, то, что и искал!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как перебирать только блоки?
« Ответ #18 : 31-08-2015, 16:03:45 »
Типа *U80, *U81 и т.д?
Да.
Александр, не поймите меня неправильно, но в этом коде я вижу как перебираются все объекты (допустим, что их 25 006 объектов), у меня даже 10324 объекта долго перебираются (и этот чертеж всего 650 килобайт), а что если мне принесут на тест чертеж 13 Мб (я уже боюсь представить, что такой модуль просто где-нибудь встанет)
Код - vb.net: [Выделить]

    For Each acObjId As ObjectId In acBlkTblRec ' Здесь перебираются все объекты
      If acObjId.ObjectClass().DxfName = "INSERT" Then
      ' здесь обработка только блоков
      End If
    Next


Я уже это делать умею, но время на перебор затрачивается достаточно большое. А я хочу обойти это с другой стороны.
Это очень быстрая операция. Просто возьми и проверь. Не нужно теоретизировать. У меня есть программы, которые перебирают все объекты в чертеже (не только в пространстве модели), да еще и модифицируют его (REMOVEALLPROXY). И работает это единицы секунд на чертежах размером в десятки мегабайт. Быстрее можно только если все нужные тебе блоки видны на экране. И тогда можно их отфильтровать (но не по имени).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как перебирать только блоки?
« Ответ #19 : 31-08-2015, 16:11:15 »
А давайте попробуем обойти это ограничение.
Ну-ну. Хочу посмотреть как это тебе удастся сделать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #20 : 31-08-2015, 16:13:29 »
Это очень быстрая операция. Просто возьми и проверь. Не нужно теоретизировать. Быстрее можно только если все нужные тебе блоки видны на экране. И тогда можно их отфильтровать (но не по имени).

Я это уже сделал на VBA, но нужно на VB.NET

Около минуты просто перебираются объекты и спрашивается у них, а вы "AcDbBlockReference"? И я еще даже с ними ничего не делал.
Дело в том, что вывожу в командную строку информацию об объекте. Может это мешает. Но всё становится еще хуже, когда, я использую форму и отображаю процесс выполнения задачи. Поэтому лишнее нужно железно убирать из перебора заранее.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #21 : 31-08-2015, 16:14:37 »
Ну-ну. Хочу посмотреть как это тебе удастся сделать

Надеюсь, что завтра все получится.

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Как перебирать только блоки?
« Ответ #22 : 31-08-2015, 16:16:56 »
Судя по вот этому AcDbBlockReference, хочется задать вопрос, а Вы на .NET пишите?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как перебирать только блоки?
« Ответ #23 : 31-08-2015, 16:21:29 »
Дело в том, что вывожу в командную строку информацию об объекте. Может это мешает.
Именно это и мешает.
Но всё становится еще хуже, когда, я использую форму и отображаю процесс выполнения задачи.
Попробуй ProgressMeter. Пример использования: http://adndevblog.typepad.com/autocad/2013/02/return-to-command-prompt-when-escape-is-pressed-using-net.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как перебирать только блоки?
« Ответ #24 : 31-08-2015, 16:23:35 »
Судя по вот этому AcDbBlockReference, хочется задать вопрос, а Вы на .NET пишите?
Ну точно не на C++ с использованием ObjectARX. :) Это он имя класса получает при помощи COM/ActiveX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Как перебирать только блоки?
« Ответ #25 : 31-08-2015, 16:25:42 »
Это он имя класса получает при помощи COM/ActiveX.
Так я вот именно про это, что он не методы .net api использует...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как перебирать только блоки?
« Ответ #26 : 31-08-2015, 16:35:35 »
Надеюсь, что завтра все получится.
Я проверил скорость обработки твоего чертежа-примера. Только при помощи команды _ARRAY увеличил количество рамок в сто раз (объектов в чертеже стало около 500000). REMOVEALLPROXY отработала менее чем за секунду. Делай выводы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Как перебирать только блоки?
« Ответ #27 : 31-08-2015, 16:51:04 »
но в этом коде я вижу как перебираются все объекты (допустим, что их 25 006 объектов), у меня даже 10324 объекта долго перебираются (и этот чертеж всего 650 килобайт), а что если мне принесут на тест чертеж 13 Мб (я уже боюсь представить, что такой модуль просто где-нибудь встанет)
Долго получать объект и проверять его, а проверить его указатель (ObjectId) - это очень быстрая опреация и не забывайте, что через COM - вы не только получаете объект, но и пересылаете его целиком на каждой операции получения - .Net же работает "изнутри" автокада.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #28 : 01-09-2015, 07:02:48 »
Я проверил скорость обработки твоего чертежа-примера. Только при помощи команды _ARRAY увеличил количество рамок в сто раз (объектов в чертеже стало около 500000). REMOVEALLPROXY отработала менее чем за секунду. Делай выводы.

Сделал. Но Вы прекрасно знаете, что я пока не готов к этому. Мне Ваш пример с C# на VB.NET перевести еще нужно (из темы Как указать рамку видовому экрану на листе область объекта). Я про нее не забыл. Буду Ваши примеры на VB.NET переводить. Это единственное, что я сейчас могу сделать по факту.

Долго получать объект и проверять его, а проверить его указатель (ObjectId) - это очень быстрая опреация и не забывайте, что через COM - вы не только получаете объект, но и пересылаете его целиком на каждой операции получения - .Net же работает "изнутри" автокада.

 Спасибо, я пониманию почему теряю время. Главное, что теперь решение есть. Готовое решение выложу в двух вариантах (COM и VB.NET).

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #29 : 01-09-2015, 07:58:56 »
Первый вариант AutoCAD NET Interop COM / ActiveX:

Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.Interop.Common
  3. Imports Autodesk.AutoCAD.Interop
  4.  
  5. Public Class Gal_Search_Blocks_In_Model
  6.     Public Class SearchBlock
  7.  
  8.         <CommandMethod("GALSEARCHBLOCKONLY")> _
  9.         Public Sub Search_Block()
  10.             Dim acApp As AcadApplication
  11.             Dim acDoc As AcadDocument
  12.  
  13.             acApp = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication
  14.             acDoc = acApp.ActiveDocument
  15.  
  16.             Dim i As Long
  17.  
  18.             ' Проверяем наличие ненужных выборок
  19.             For i = 0 To acDoc.SelectionSets.Count - 1
  20.                 acDoc.SelectionSets.Item(0).Delete()
  21.             Next i
  22.  
  23.             ' Создаем выборку
  24.             Dim sset As AcadSelectionSet
  25.             sset = acDoc.SelectionSets.Add("MySelSet")
  26.  
  27.             ' Определяем фильтр, по которому будет проводить отбор
  28.             Dim FT(0) As Short ' Здесь была запарка (в документации здесь стоял Integer)
  29.             Dim FD(0) As Object
  30.             FT(0) = 0
  31.             FD(0) = "INSERT"
  32.  
  33.             ' Проводим выборку всех объектов, но в выборке должны остаться только блоки
  34.             sset.Select(AcSelect.acSelectionSetAll, , , FT, FD)
  35.  
  36.             ' Покажем в сообщении сколько объектов попало в выборку
  37.             MsgBox("Количество выделенных объектов: " & sset.Count)
  38.  
  39.             ' В конце очищаем выборку
  40.             sset.Delete()
  41.  
  42.  
  43.         End Sub
  44.     End Class
  45. End Class

Работает невероятно шустро!

Со вторым вариантом придется поупираться, но выложу!
« Последнее редактирование: 01-09-2015, 09:39:20 от Пашин Евгений »