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

ADN Club => AutoCAD .NET API => Тема начата: Захаров Максим от 26-03-2018, 14:03:57

Название: Запрос объектов через функционал Map3D
Отправлено: Захаров Максим от 26-03-2018, 14:03:57
Здравствуйте.
Подскажите пожалуйста, есть такой интересный метод запроса объектов из чертежей с помощью функционала Map 3D ( http://adndevblog.typepad.com/infrastructure/2012/05/create-a-custom-query-with-boundary-type-as-point-using-map-3d-net-api.html )
У меня этот код сработал нормально. Попытался повторить его, но уже с полилинией и не получается, может поможет кто? Примера я не нашел
Код - vb.net [Выбрать]
  1. <CommandMethod("STPR-SVPlanImport")>
  2.     Public Sub STPR_SVPlanImport()
  3.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  4.         Dim acCurDb As Database = acDoc.Database
  5.         Dim ed As Editor = acDoc.Editor
  6.         Dim CivilDoc As CivilDocument = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument()
  7.         Dim mapApp As MapApplication = HostMapApplicationServices.Application
  8.         Dim activeProject As Project.ProjectModel = mapApp.ActiveProject
  9.         Dim tableList As ObjectData.Tables = activeProject.ODTables
  10.         Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView()
  11.         'Dim docLock As DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument()
  12.         Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  13.             Dim acBlkTbl As BlockTable = acTrans.GetObject(acCurDb.BlockTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead)
  14.             Dim acBlkTblRec As BlockTableRecord = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite)
  15.             '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  16.             Dim aliasList As Aliases = mapApp.Aliases
  17.             Dim PutchDWG As String = "c:\захаров\Civil3D(x64)2015\Civil3D(x64)2015\bin\Debug\Запрос в Map3d\Архангельск_Смольный Буян_07_03_18.dwg"
  18.             If IO.File.Exists(PutchDWG) = True Then
  19.                 Dim AttchDrawing As Project.AttachedDrawing = activeProject.DrawingSet.AttachDrawing(PutchDWG)
  20.                 AttchDrawing.Activate()
  21.                 'AttchDrawing.Preview()
  22.                 Dim qryModel As QueryModel = activeProject.CreateQuery()
  23.                 qryModel.Clear()
  24.                 Dim locationCondition As Query.LocationCondition = New Query.LocationCondition
  25.                 Dim qryCondition As LocationCondition = New LocationCondition()
  26.                 locationCondition.Boundary = PolylineBoundary.Create()
  27.                 Dim pCol As PolylineVertexCollection = New PolylineVertexCollection
  28.                 Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection()
  29.                 If acSSPrompt.Status = PromptStatus.OK Then
  30.                     Dim acSSet As SelectionSet = acSSPrompt.Value
  31.                     For Each acSSObj As SelectedObject In acSSet
  32.                         If Not IsDBNull(acSSObj) Then
  33.                             Dim acEnt As Autodesk.AutoCAD.DatabaseServices.Entity = acTrans.GetObject(acSSObj.ObjectId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite)
  34.                             If Not IsDBNull(acEnt) Then
  35.                                 If TypeOf acEnt Is Polyline Then
  36.                                     Dim Pline As Polyline = acEnt
  37.                                     For i As Integer = 0 To Pline.NumberOfVertices - 1
  38.                                         Dim pline3d As Point3d = Pline.GetPoint3dAt(0)
  39.                                         Dim pvt As PolylineVertex
  40.                                         pvt.Vertex = pline3d
  41.                                         pCol.Add(pvt)
  42.                                     Next i
  43.                                 End If
  44.                             End If
  45.                         End If
  46.                     Next
  47.                 End If
  48.                 Dim PlineBdry As PolylineBoundary = New PolylineBoundary(pCol, Vector3d.ZAxis, True)
  49.                 qryCondition.Boundary = PlineBdry
  50.                 Dim qryBranch As New QueryBranch(JoinOperator.OperatorAnd)
  51.                 qryBranch.AppendOperand(qryCondition)
  52.                 qryModel.Define(qryBranch)
  53.                 qryModel.Mode = QueryType.QueryDraw
  54.                 qryModel.Run()
  55.             End If
  56.             acTrans.Commit()
  57.         End Using
  58.     End Sub
Название: Re: Запрос объектов через функционал Map3D
Отправлено: Дмитрий Загорулькин от 26-03-2018, 14:08:37
и не получается
А что именно не получается?
Название: Re: Запрос объектов через функционал Map3D
Отправлено: Захаров Максим от 26-03-2018, 14:28:11
По идее в внутри полилинии должны быть объекты того чертежа который указан по ссылке (строка 17). Но область пустая. Код до конца исполняется ошибок нет, но и результат нулевой.

(https://s17.postimg.org/oy5jzusbf/MAp3d.jpg) (https://postimg.org/image/oy5jzusbf/)

Сам запрос не создается. Форма пустая.
Название: Re: Запрос объектов через функционал Map3D
Отправлено: Александр Ривилис от 26-03-2018, 14:34:29
Может из-за этого:
Код - vb.net [Выбрать]
  1. Dim pline3d As Point3d = Pline.GetPoint3dAt(0)
(индекс всегда 0)
Название: Re: Запрос объектов через функционал Map3D
Отправлено: Захаров Максим от 26-03-2018, 15:01:08
Может. Щас проверю
Название: Re: Запрос объектов через функционал Map3D
Отправлено: Александр Ривилис от 26-03-2018, 15:06:29
Может. Просто надо заполнить коллекцию PolylineVertexCollection. Я другого метода не придумал. Но коллекция заполняется без проблем, объекты там есть если смотреть в отладчике.
Вместо:
Код - vb.net [Выбрать]
  1. For i As Integer = 0 To Pline.NumberOfVertices - 1
  2.   Dim pline3d As Point3d = Pline.GetPoint3dAt(0)
  3.   Dim pvt As PolylineVertex
  4.   pvt.Vertex = pline3d
  5.   pCol.Add(pvt)
  6. Next i
  7.  
должно быть:
Код - vb.net [Выбрать]
  1. For i As Integer = 0 To Pline.NumberOfVertices - 1
  2.   Dim pline3d As Point3d = Pline.GetPoint3dAt(i)
  3.   Dim pvt As PolylineVertex
  4.   pvt.Vertex = pline3d
  5.   pCol.Add(pvt)
  6. Next i
Остальное не смотрел. Хотя подозреваю, что нужно PlineBdry добавлять в чертеж.
Название: Re: Запрос объектов через функционал Map3D
Отправлено: Захаров Максим от 26-03-2018, 15:08:21
Спасибо Александр. Да досадно, глупая ошибка. Все получилось.
Название: Re: Запрос объектов через функционал Map3D
Отправлено: Александр Ривилис от 26-03-2018, 15:10:23
Да досадно, глупая ошибка
Ну иногда нужен взгляд со стороны. Хотя для меня смотреть на VB(A)(.NET)-код - это ещё то "удовольствие". ;)