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

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 15-01-2015, 01:09:18

Название: Не возвращается набор примитивов для слоя
Отправлено: Алексей (IdeaSoft) от 15-01-2015, 01:09:18
Доброго всем времени суток. Всех с прошедшими праздниками!

Сделал маленький тестовый проект из 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.  
Название: Re: Не возвращается набор примитивов для слоя
Отправлено: Александр Ривилис от 15-01-2015, 01:14:53
Вызываю свой тест (команда TEST_SEL) и не возвращается набор элементов для слоя "output[1]_3_2629-14tp_Level 38"
И не должен. При выборке имени слоя используется тот же алгоритм, что и у lisp-функции (wcmatch) (http://help.autodesk.com/view/ACD/2015/ENU/?guid=GUID-EC257AF7-72D4-4B38-99B6-9B09952A53AD)
Обрати внимание на то, что квадратные скобки являются символами шаблона и их следует "экранировать", т.е. строка должна быть приблизительно такой "output`[1`]_3_2629-14tp_Level 38"
Название: Re: Не возвращается набор примитивов для слоя
Отправлено: Александр Ривилис от 15-01-2015, 01:22:21
Результаты _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
Но проверяло несколько минут. Почему - не знаю.
Название: Re: Не возвращается набор примитивов для слоя
Отправлено: Алексей (IdeaSoft) от 15-01-2015, 01:46:14
У меня команды _audit терпения ждать не хватило.
Но я в acad 2012 _audit запукал.
Сейчас попробую в 2014 проверить, а после прогоню свой тест еще.

Изначально файл со всеми объектами вообще был монстр 74М.
Я сделал сохранить как и он сразу стал 12,5М.
Удалил все кроме 291 текста и файл весить 10М.
Название: Re: Не возвращается набор примитивов для слоя
Отправлено: Александр Ривилис от 15-01-2015, 02:02:56
А теперь сделай _-WBLOCK * и получишь 45Кбайт как и я.
Название: Re: Не возвращается набор примитивов для слоя
Отправлено: Алексей (IdeaSoft) от 15-01-2015, 02:52:39
Делаю _-WBLOCK * с командной строки появляется диалог сохраняю файл, но почему-то 10 М
Что не так делаю?
Название: Re: Не возвращается набор примитивов для слоя
Отправлено: Александр Ривилис от 15-01-2015, 02:58:26
Я это делал в чистом Autocad 2014 SP1
Название: Re: Не возвращается набор примитивов для слоя
Отправлено: Алексей (IdeaSoft) от 15-01-2015, 03:04:36
А тогда понятно сейчас в 2014 попробую а то в 2012 получается 10М
Название: Re: Не возвращается набор примитивов для слоя
Отправлено: Алексей Кулик от 15-01-2015, 10:38:06
Я, конечно, прошу прощения, а 261 324 объекта типа AcDgnLS - это нормально? :)
P.S. Ну а потом уже чистка, проверка и т.п. ;)