Не возвращается набор примитивов для слоя

Автор Тема: Не возвращается набор примитивов для слоя  (Прочитано 7321 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Доброго всем времени суток. Всех с прошедшими праздниками!

Сделал маленький тестовый проект из 3 функций, чтобы проверить выборку элементов.
Для конкретного файла отметки.dwg  (я его прикрепляю к этой теме если архив в 3M прикрепится?)
Вызываю свой тест (команда TEST_SEL) и не возвращается набор элементов для слоя «output[1]_3_2629-14tp_Level 38»
Команда _AUDIT виснет. Не могу понять в чем дело почему набора элементов нет?

Стоит мне поместить объекты в какой-то другой слой и программе соотв. присвоить его - выборка работает!.
Но в реальной работе я не могу объяснить юзерам почему не делается выборка и переименовывать слои их тоже заставить не могу
На практике эта ситуация не раз уже встречалась. 

Заметил следующее. Как так, в файле отметки.dwg всего 291 примитив, а он весит 10 Mбайт
(внешних ссылок нет, _PURGE делал, сохранить как делал, выделить все и вставить в пустой чертеж тоже делал).

Вот код класса тестового проекта test_sel.dll:

Код - vb.net [Выбрать]
  1.  
  2. Imports CAD_RTM = Autodesk.AutoCAD.Runtime
  3. Imports CAD_APS = Autodesk.autoCAD.ApplicationServices
  4. Imports CAD_EDI = Autodesk.autoCAD.EditorInput
  5. Imports CAD_DBS = Autodesk.autoCAD.DatabaseServices
  6. Imports CAD_GEO = Autodesk.autoCAD.Geometry
  7.  
  8. <Assembly: CAD_RTM.CommandClass(GetType(PanelCommands.Commander))>
  9. Namespace PanelCommands
  10.  
  11.     Public Class Commander
  12.  
  13.         ' ТЕСТОВАЯ КОМАНДА
  14.         <CAD_RTM.CommandMethod("TEST_SEL")> _
  15.         Public Sub test_select()
  16.             Dim NameSloy As String = "output[1]_3_2629-14tp_Level 38"
  17.             Dim TypeObj As String = "TEXT"
  18.             Dim NameBlock = ""
  19.             Dim ss As CAD_EDI.SelectionSet = acadnet_primitive_Select(NameSloy, TypeObj, NameBlock)
  20.             If ss Is Nothing Then
  21.                 MsgBox("AutoCAD не смог предоставить набор элементов по критериям отбора:" & vbCrLf & _
  22.                            "- слой         " & NameSloy & vbCrLf & _
  23.                            "- тип элемента      " & TypeObj & vbCrLf & _
  24.                            "- имя блока      " & NameBlock)
  25.             Else
  26.                 MsgBox("В наборе " & ss.Count & " элементов.")
  27.             End If
  28.         End Sub
  29.        ' ВЫБОРКА ЭЛЕМЕНТОВ ЧЕРТЕЖА
  30.         Public Shared Function acadnet_primitive_Select(ByVal LayerName As String, _
  31.                                                         ByVal TypesObj As String, _
  32.                                                         ByVal BlockName As String, _
  33.                                                         Optional ByVal AcDoc As CAD_APS.Document = Nothing) _
  34.                                                                  As CAD_EDI.SelectionSet
  35.             Try
  36.                 Dim filter As CAD_EDI.SelectionFilter = New CAD_EDI.SelectionFilter(acadnet_filter_SetVals(LayerName, TypesObj, BlockName))
  37.                 Dim sel As CAD_EDI.PromptSelectionResult = Nothing
  38.                 If AcDoc Is Nothing Then
  39.                     sel = CAD_APS.Application.DocumentManager.MdiActiveDocument.Editor.SelectAll(filter)
  40.                 Else
  41.                     sel = AcDoc.Editor.SelectAll(filter)
  42.                 End If
  43.                 Return sel.Value
  44.             Catch ex As System.Exception
  45.                 Return Nothing
  46.             End Try
  47.         End Function
  48.  
  49.         Public Shared Function acadnet_filter_SetVals(ByVal LayerName As String, _
  50.                                               ByVal TypesObj As String, _
  51.                                               ByVal BlockName As String) As CAD_DBS.TypedValue()
  52.             Dim list = New List(Of CAD_DBS.TypedValue)
  53.             If TypesObj <> "" Then list.Add(New CAD_DBS.TypedValue(CAD_DBS.DxfCode.Start, TypesObj))
  54.             If LayerName <> "" Then list.Add(New CAD_DBS.TypedValue(CAD_DBS.DxfCode.LayerName, LayerName))
  55.             If BlockName <> "" Then list.Add(New CAD_DBS.TypedValue(CAD_DBS.DxfCode.BlockName, BlockName))
  56.             Dim values() As CAD_DBS.TypedValue = Nothing
  57.             For i As Integer = 0 To list.Count - 1
  58.                 ReDim Preserve values(i)
  59.                 values(i) = list.Item(i)
  60.             Next
  61.             Return values
  62.         End Function
  63.  
  64.     End Class
  65.  
  66. End Namespace
  67.  
  68.  
  69.  
« Последнее редактирование: 15-01-2015, 01:42:32 от Алексей (IdeaSoft) »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вызываю свой тест (команда TEST_SEL) и не возвращается набор элементов для слоя "output[1]_3_2629-14tp_Level 38"
И не должен. При выборке имени слоя используется тот же алгоритм, что и у lisp-функции (wcmatch)
Обрати внимание на то, что квадратные скобки являются символами шаблона и их следует "экранировать", т.е. строка должна быть приблизительно такой "output`[1`]_3_2629-14tp_Level 38"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Результаты _AUDIT в AutoCAD 2014 SP1 x64:
Цитировать
Command: _AUDIT

Fix any errors detected? [Yes/No] <N>: y



Auditing Header


Auditing Tables


Auditing Entities Pass 1

Pass 1 350400  objects audited
Auditing Entities Pass 2

Pass 2 350400  objects audited
Auditing Blocks

 8595    Blocks audited



Auditing AcDsRecords


Total errors found 0 fixed 0

Erased 0 objects
Но проверяло несколько минут. Почему - не знаю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
У меня команды _audit терпения ждать не хватило.
Но я в acad 2012 _audit запукал.
Сейчас попробую в 2014 проверить, а после прогоню свой тест еще.

Изначально файл со всеми объектами вообще был монстр 74М.
Я сделал сохранить как и он сразу стал 12,5М.
Удалил все кроме 291 текста и файл весить 10М.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А теперь сделай _-WBLOCK * и получишь 45Кбайт как и я.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Делаю _-WBLOCK * с командной строки появляется диалог сохраняю файл, но почему-то 10 М
Что не так делаю?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я это делал в чистом Autocad 2014 SP1
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
А тогда понятно сейчас в 2014 попробую а то в 2012 получается 10М

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Я, конечно, прошу прощения, а 261 324 объекта типа AcDgnLS - это нормально? :)
P.S. Ну а потом уже чистка, проверка и т.п. ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!