Пересечение полилиний

Автор Тема: Пересечение полилиний  (Прочитано 2047 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Пересечение полилиний
« : 25-09-2024, 13:06:56 »
Добрый день. Подскажите пожалуйста, возможно ли получить область пересечения (желательно в виде полилинии) двух замкнутых полилиний?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Пересечение полилиний
« Ответ #1 : 25-09-2024, 17:01:02 »
Добрый день. Подскажите пожалуйста, возможно ли получить область пересечения (желательно в виде полилинии) двух замкнутых полилиний?
В API готовых средств нет, но можно преобразовать замкнутые полилинии в Region'ы, получить их пересечение и затем из итогового Region при помощи Brep API получить контур пересечения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Пересечение полилиний
« Ответ #2 : 26-09-2024, 11:21:24 »
Спасибо Александр. Все получилось, как то так
Код - vb.net [Выбрать]
  1. <CommandMethod("convReg")>
  2.     Public Sub convReg()
  3.         Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument ' открываем базу данных чертежа
  4.         Dim ed As Editor = acDoc.Editor
  5.         Dim db As Database = acDoc.Database
  6.         Dim tr As Transaction = db.TransactionManager.StartTransaction()
  7.         Dim acBlkTbl As BlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
  8.         Dim acBlkTblRec As BlockTableRecord = tr.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  9.         Using tr
  10.             Try
  11.                 '=============================================================
  12.                 'выбираем трассу
  13.                 Dim pEntRes As PromptEntityResult = ed.GetEntity("Выберите полосу отвода: ")
  14.                 Dim parentEnt As Autodesk.AutoCAD.DatabaseServices.Entity = tr.GetObject(pEntRes.ObjectId, OpenMode.ForRead)
  15.                 If TypeOf parentEnt Is Autodesk.AutoCAD.DatabaseServices.Polyline Then
  16.                     Dim parentPline As Autodesk.AutoCAD.DatabaseServices.Polyline = parentEnt
  17.                     Dim tempCollection As DBObjectCollection = New DBObjectCollection()
  18.                     tempCollection.Add(parentPline)
  19.                     Dim parentRegionCollection As DBObjectCollection = New DBObjectCollection()
  20.                     parentRegionCollection = Region.CreateFromCurves(tempCollection)
  21.                     If parentRegionCollection.Count > 0 Then
  22.                         Dim parentRegion As Region = parentRegionCollection.Item(0)
  23.                         If parentRegion.Area > 0 Then
  24.                             'выбираем участки
  25.                             Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection()
  26.                             If acSSPrompt.Status = PromptStatus.OK Then
  27.                                 Dim acSSet As SelectionSet = acSSPrompt.Value
  28.                                 For Each acSSObj As SelectedObject In acSSet
  29.                                     If Not IsDBNull(acSSObj) Then
  30.                                         Dim childEnt As Autodesk.AutoCAD.DatabaseServices.Entity = tr.GetObject(acSSObj.ObjectId, OpenMode.ForRead)
  31.                                         If Not IsDBNull(childEnt) Then
  32.                                             If TypeOf childEnt Is Autodesk.AutoCAD.DatabaseServices.Polyline Then
  33.                                                 If parentRegion.Area = 0 Then
  34.                                                     tempCollection = New DBObjectCollection()
  35.                                                     tempCollection.Add(parentPline)
  36.                                                     parentRegionCollection = New DBObjectCollection()
  37.                                                     parentRegionCollection = Region.CreateFromCurves(tempCollection)
  38.                                                     If parentRegionCollection.Count > 0 Then
  39.                                                         parentRegion = parentRegionCollection.Item(0)
  40.                                                     End If
  41.                                                 End If
  42.                                                 Dim tempChildCollection As DBObjectCollection = New DBObjectCollection()
  43.                                                 tempChildCollection.Add(childEnt)
  44.                                                 Dim childCollection As DBObjectCollection = New DBObjectCollection()
  45.                                                 childCollection = Region.CreateFromCurves(tempChildCollection)
  46.                                                 If childCollection.Count > 0 Then
  47.                                                     Dim childRegion As Region = childCollection.Item(0)
  48.                                                     If childRegion.Area > 0 Then
  49.                                                         childRegion.BooleanOperation(BooleanOperationType.BoolIntersect, parentRegion)
  50.                                                         Dim points As Point2d() = Nothing
  51.                                                         Using brep = New Autodesk.AutoCAD.BoundaryRepresentation.Brep(childRegion)
  52.                                                             points = brep.Edges.[Select](Function(e) e.Vertex1.Point.Convert2d(New Plane)).ToArray()
  53.                                                         End Using
  54.                                                         Dim normal = childRegion.Normal
  55.                                                         Using pline = New Polyline(points.Length)
  56.                                                             For i As Integer = 0 To points.Length - 1
  57.                                                                 pline.AddVertexAt(i, points(i), 0.0, 0.0, 0.0)
  58.                                                             Next
  59.                                                             pline.Closed = True
  60.                                                             pline.Normal = normal
  61.                                                             Dim curSpace = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
  62.                                                             curSpace.AppendEntity(pline)
  63.                                                             tr.AddNewlyCreatedDBObject(pline, True)
  64.                                                         End Using
  65.                                                     End If
  66.                                                 End If
  67.                                             End If
  68.                                         End If
  69.                                     End If
  70.                                 Next
  71.                             End If
  72.                         End If
  73.                     End If
  74.                 End If
  75.             Catch ex As System.Exception
  76.             End Try
  77.             tr.Commit()
  78.         End Using
  79.     End Sub