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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13067
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как перебирать только блоки?
« Ответ #30 : 01-09-2015, 08:32:57 »
Dim FT(0) As Short ' Здесь была запарка (в документации здесь стоял Integer)
Документация написана для VBA. А Integer в VBA - это Short в VB.NET (и в C#).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #31 : 01-09-2015, 09:09:29 »
Документация написана для VBA. А Integer в VBA - это Short в VB.NET (и в C#).

Шаг за шагом и чистый VB.NET освою.

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

  • Administrator
  • *****
  • Сообщений: 13067
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как перебирать только блоки?
« Ответ #32 : 01-09-2015, 12:18:14 »
Весь оффтопик перебросил сюда: http://adn-cis.org/forum/index.php?topic=2956.0
Прошу в дальнейшем придерживаться темы!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #33 : 01-09-2015, 12:22:11 »
Второй вариант решения (на чистом NET):

Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5.  
  6. Public Class Gal_Search_Blocks_In_Model
  7.     Public Class SearchBlockNET
  8.  
  9.         <CommandMethod("GALSEARCHBLOCKONLYNET")> _
  10.         Public Sub Search_Block_NET()
  11.  
  12.             ' Получение редактора текущего документа (напрашивается вопрос: что под редактором текущего документа подразумевается)
  13.             Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  14.  
  15.             ' Создание массива acFilter для определение параметров фильтра
  16.             Dim acFilter(0) As TypedValue ' Класс Автокада для определения параметров фильтра
  17.             acFilter.SetValue(New TypedValue(DxfCode.Start, "INSERT"), 0)
  18.  
  19.             ' Создание нового класса SelectionFilter и присвоение ему значений параметрво фильтра
  20.             Dim acSelectionFilter As SelectionFilter = New SelectionFilter(acFilter)
  21.  
  22.             ' Создание класса выборки
  23.             Dim acSelSet As PromptSelectionResult
  24.             acSelSet = acDocEd.SelectAll(acSelectionFilter)
  25.  
  26.             ' Если всё OK, тогда объекты выбраны
  27.             If acSelSet.Status = PromptStatus.OK Then
  28.                 Dim acSSet As SelectionSet = acSelSet.Value
  29.                 Application.ShowAlertDialog("Количество выбранных объектов: " & acSSet.Count.ToString())
  30.             Else
  31.                 Application.ShowAlertDialog("Количество выбранных объектов: 0")
  32.             End If
  33.         End Sub
  34.     End Class

Работает также как и первый вариант: быстро!

Это здесь кажется должно быть.

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

  • Administrator
  • *****
  • Сообщений: 13067
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как перебирать только блоки?
« Ответ #34 : 01-09-2015, 13:58:19 »
Только сейчас обратил внимание на то, что у тебя вложенные классы. Это что такое и зачем?

Вот тебе и третий вариант. Сравни его по скорости:
Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5. Namespace RAN
  6. Public Class SearchBlockNET
  7.         <CommandMethod("CountInserts")> _
  8.         Public Sub CountInserts()
  9.             Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  10.             Dim acCurDb As Database = acDoc.Database
  11.             Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  12.                 Dim acBlkTbl As BlockTable
  13.                 acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  14.                 Dim acBlkTblRec As BlockTableRecord
  15.                 acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  16.                                                 OpenMode.ForRead)
  17.                 Dim nInserts as Integer
  18.                 nInserts = 0
  19.                 For Each acObjId As ObjectId In acBlkTblRec ' Здесь перебираются все объекты
  20.                    If (acObjId.ObjectClass().DxfName = "INSERT") Then ' Отбираем только вставки блоков  
  21.                       nInserts = nInserts + 1
  22.                    End If
  23.                 Next
  24.                 acTrans.Commit() ' Так будет быстрее работать
  25.             End Using
  26.             Application.ShowAlertDialog("Количество найденых блоков: " & nInserts.ToString())  
  27.         End Sub
  28.     End Class
  29. End Namespace
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #35 : 01-09-2015, 14:23:40 »
Работает  :)

Тоже быстро! Этот модуль действительно перебирает все объекты? Или у меня глюки?

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

  • ADN Club
  • *****
  • Сообщений: 575
  • Карма: 136
    • ПГСу Бложик
Re: Как перебирать только блоки?
« Ответ #36 : 01-09-2015, 15:27:32 »
в 26 строке nInserts вне зоны видимости, или я что то опять перепутал.
На всякий случай, операторы += и -= в VB.net вполне себе работают и уже довольно давно(
Извините, вам запрещён просмотр содержимого спойлеров.
)
Извините, вам запрещён просмотр содержимого спойлеров.


Отмечено как Решение Александр Ривилис 02-09-2015, 01:46:21

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #37 : 01-09-2015, 15:29:17 »
Я забыл, что Dim nInserts As Integer двигал повыше )))

Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5.  
  6.  
  7. Namespace RAN
  8.     Public Class SearchBlockNET
  9.         <CommandMethod("CountInserts")> _
  10.         Public Sub CountInserts()
  11.             Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  12.             Dim acCurDb As Database = acDoc.Database
  13.  
  14.             Dim nInserts As Integer
  15.  
  16.             Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  17.                 Dim acBlkTbl As BlockTable
  18.                 acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  19.                 Dim acBlkTblRec As BlockTableRecord
  20.                 acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  21.                                                 OpenMode.ForRead)
  22.  
  23.                 nInserts = 0
  24.                 For Each acObjId As ObjectId In acBlkTblRec ' Здесь перебираются все объекты
  25.                     If (acObjId.ObjectClass().DxfName = "INSERT") Then ' Отбираем только вставки блоков  
  26.                         nInserts = nInserts + 1
  27.                     End If
  28.                 Next
  29.                 acTrans.Commit() ' Так будет быстрее работать
  30.             End Using
  31.             Application.ShowAlertDialog("Количество найденых блоков: " & nInserts.ToString())
  32.         End Sub
  33.     End Class
  34. End Namespace

Все правильно, просто забыл Александру об этом сказать. Главное работает.

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

  • Administrator
  • *****
  • Сообщений: 13067
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как перебирать только блоки?
« Ответ #38 : 01-09-2015, 15:42:39 »
в 26 строке nInserts вне зоны видимости, или я что то опять перепутал.
Ничего не перепутал. Это я в FAR'е правил текст и само-собой его не проверял. Ну бывает и на старуху проруха...
Тоже быстро! Этот модуль действительно перебирает все объекты? Или у меня глюки?
Перебирает все, но считает только вставки блоков. А ты думаешь что Editor.SelectAll() с фильтром работает иначе? Нет конечно. Проход по всем и сравнение с фильтром.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Как перебирать только блоки?
« Ответ #39 : 01-09-2015, 15:45:15 »
Проход по всем и сравнение с фильтром.

Хорошая штука!