Запрос объектов через функционал Map3D

Автор Тема: Запрос объектов через функционал Map3D  (Прочитано 7173 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Здравствуйте.
Подскажите пожалуйста, есть такой интересный метод запроса объектов из чертежей с помощью функционала 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
« Последнее редактирование: 26-03-2018, 14:41:10 от Александр Ривилис »

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
и не получается
А что именно не получается?

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
По идее в внутри полилинии должны быть объекты того чертежа который указан по ссылке (строка 17). Но область пустая. Код до конца исполняется ошибок нет, но и результат нулевой.



Сам запрос не создается. Форма пустая.

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Может из-за этого:
Код - vb.net [Выбрать]
  1. Dim pline3d As Point3d = Pline.GetPoint3dAt(0)
(индекс всегда 0)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Может. Щас проверю

Отмечено как Решение Захаров Максим 26-03-2018, 16:08:34

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Может. Просто надо заполнить коллекцию 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 добавлять в чертеж.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Спасибо Александр. Да досадно, глупая ошибка. Все получилось.

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Да досадно, глупая ошибка
Ну иногда нужен взгляд со стороны. Хотя для меня смотреть на VB(A)(.NET)-код - это ещё то "удовольствие". ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение