Доброго всем времени суток. Всех с прошедшими праздниками!
Сделал маленький тестовый проект из 3 функций, чтобы проверить выборку элементов.
Для конкретного файла отметки.dwg (я его прикрепляю к этой теме если архив в 3M прикрепится?)
Вызываю свой тест (команда TEST_SEL) и не возвращается набор элементов для слоя «output[1]_3_2629-14tp_Level 38»
Команда _AUDIT виснет. Не могу понять в чем дело почему набора элементов нет?
Стоит мне поместить объекты в какой-то другой слой и программе соотв. присвоить его - выборка работает!.
Но в реальной работе я не могу объяснить юзерам почему не делается выборка и переименовывать слои их тоже заставить не могу
На практике эта ситуация не раз уже встречалась.
Заметил следующее. Как так, в файле отметки.dwg всего 291 примитив, а он весит 10 Mбайт
(внешних ссылок нет, _PURGE делал, сохранить как делал, выделить все и вставить в пустой чертеж тоже делал).
Вот код класса тестового проекта test_sel.dll:
Imports CAD_RTM = Autodesk.AutoCAD.Runtime
Imports CAD_APS = Autodesk.autoCAD.ApplicationServices
Imports CAD_EDI = Autodesk.autoCAD.EditorInput
Imports CAD_DBS = Autodesk.autoCAD.DatabaseServices
Imports CAD_GEO = Autodesk.autoCAD.Geometry
<Assembly: CAD_RTM.CommandClass(GetType(PanelCommands.Commander))>
Namespace PanelCommands
Public Class Commander
' ТЕСТОВАЯ КОМАНДА
<CAD_RTM.CommandMethod("TEST_SEL")> _
Public Sub test_select()
Dim NameSloy As String = "output[1]_3_2629-14tp_Level 38"
Dim TypeObj As String = "TEXT"
Dim NameBlock = ""
Dim ss As CAD_EDI.SelectionSet = acadnet_primitive_Select(NameSloy, TypeObj, NameBlock)
If ss Is Nothing Then
MsgBox("AutoCAD не смог предоставить набор элементов по критериям отбора:" & vbCrLf & _
"- слой " & NameSloy & vbCrLf & _
"- тип элемента " & TypeObj & vbCrLf & _
"- имя блока " & NameBlock)
Else
MsgBox("В наборе " & ss.Count & " элементов.")
End If
End Sub
' ВЫБОРКА ЭЛЕМЕНТОВ ЧЕРТЕЖА
Public Shared Function acadnet_primitive_Select(ByVal LayerName As String, _
ByVal TypesObj As String, _
ByVal BlockName As String, _
Optional ByVal AcDoc As CAD_APS.Document = Nothing) _
As CAD_EDI.SelectionSet
Try
Dim filter As CAD_EDI.SelectionFilter = New CAD_EDI.SelectionFilter(acadnet_filter_SetVals(LayerName, TypesObj, BlockName))
Dim sel As CAD_EDI.PromptSelectionResult = Nothing
If AcDoc Is Nothing Then
sel = CAD_APS.Application.DocumentManager.MdiActiveDocument.Editor.SelectAll(filter)
Else
sel = AcDoc.Editor.SelectAll(filter)
End If
Return sel.Value
Catch ex As System.Exception
Return Nothing
End Try
End Function
Public Shared Function acadnet_filter_SetVals(ByVal LayerName As String, _
ByVal TypesObj As String, _
ByVal BlockName As String) As CAD_DBS.TypedValue()
Dim list = New List(Of CAD_DBS.TypedValue)
If TypesObj <> "" Then list.Add(New CAD_DBS.TypedValue(CAD_DBS.DxfCode.Start, TypesObj))
If LayerName <> "" Then list.Add(New CAD_DBS.TypedValue(CAD_DBS.DxfCode.LayerName, LayerName))
If BlockName <> "" Then list.Add(New CAD_DBS.TypedValue(CAD_DBS.DxfCode.BlockName, BlockName))
Dim values() As CAD_DBS.TypedValue = Nothing
For i As Integer = 0 To list.Count - 1
ReDim Preserve values(i)
values(i) = list.Item(i)
Next
Return values
End Function
End Class
End Namespace