<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Create the outermost border for the curves (BOUNDARY) in .NET Forum</title>
    <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165221#M7748</link>
    <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;This code (inspired by &lt;A href="http://www.theswamp.org/index.php?topic=37976.msg429899#msg429899" target="_blank" rel="noopener"&gt;this one&lt;/A&gt;) seems to work as expected (at least with your drawing example).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;using Autodesk.AutoCAD.ApplicationServices.Core;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

using System;
using System.Collections.Generic;
using System.Linq;

namespace MergeCurvesSample
{
    public class Commands
    {
        struct Segment
        {
            public Point2d StartPt { get; set; }
            public Point2d EndPt { get; set; }
            public double Bulge { get; set; }
        }

        private static IEnumerable&amp;lt;Polyline&amp;gt; MergeCurves(IEnumerable&amp;lt;Curve&amp;gt; curves)
        {
            var splitCurves = new List&amp;lt;Curve&amp;gt;();
            var curveSegments = new DBObjectCollection();
            foreach (Curve curve in curves)
            {
                if (curve is Arc || curve is Circle || curve is Line || curve is Polyline)
                {
                    foreach (Curve c in GetSplitSegments(curve, curves))
                    {
                        splitCurves.Add(c);
                        curveSegments.Add(c);
                    }
                }
            }
            var regions = Region.CreateFromCurves(curveSegments);
            foreach (Curve c in splitCurves)
            {
                c.Dispose();
            }

            if (regions.Count == 0) yield break;

            Region reg = (Region)regions[0];
            for (int i = 1; i &amp;lt; regions.Count; i++)
            {
                reg.BooleanOperation(BooleanOperationType.BoolUnite, (Region)regions[i]);
                regions[i].Dispose();
            }

            var segments = new DBObjectCollection();
            reg.Explode(segments);
            reg.Dispose();

            var segs = new List&amp;lt;Segment&amp;gt;();
            var plane = new Plane(Point3d.Origin, Vector3d.ZAxis);
            for (int i = 0; i &amp;lt; segments.Count; i++)
            {
                if (segments[i] is Region r)
                {
                    r.Explode(segments);
                    continue;
                }
                Curve crv = (Curve)segments[i];
                Point3d start = crv.StartPoint;
                Point3d end = crv.EndPoint;
                double bulge = 0.0;
                if (crv is Arc arc)
                {
                    double angle = arc.Center.GetVectorTo(start).GetAngleTo(arc.Center.GetVectorTo(end), arc.Normal);
                    bulge = Math.Tan(angle / 4.0);
                }
                segs.Add(new Segment { StartPt = start.Convert2d(plane), EndPt = end.Convert2d(plane), Bulge = bulge });
            }

            foreach (DBObject o in segments) o.Dispose();

            while (segs.Count &amp;gt; 0)
            {
                var pline = new Polyline();
                pline.AddVertexAt(0, segs[0].StartPt, segs[0].Bulge, 0.0, 0.0);
                Point2d pt = segs[0].EndPt;
                segs.RemoveAt(0);
                int vtx = 1;
                while (true)
                {
                    int i = segs.FindIndex((s) =&amp;gt; s.StartPt.IsEqualTo(pt) || s.EndPt.IsEqualTo(pt));
                    if (i &amp;lt; 0) break;
                    Segment seg = segs[i];
                    if (seg.EndPt.IsEqualTo(pt))
                        seg = new Segment { StartPt = seg.EndPt, EndPt = seg.StartPt, Bulge = -seg.Bulge };
                    pline.AddVertexAt(vtx, seg.StartPt, seg.Bulge, 0.0, 0.0);
                    pt = seg.EndPt;
                    segs.RemoveAt(i);
                    vtx++;
                }
                pline.Closed = true;
                yield return pline;
            }
        }

        private static DBObjectCollection GetSplitSegments(Curve curve, IEnumerable&amp;lt;Curve&amp;gt; curves)
        {
            var points = new Point3dCollection();
            foreach (var c in curves)
            {
                curve.IntersectWith(c, Intersect.OnBothOperands, points, IntPtr.Zero, IntPtr.Zero);
            }

            if (points.Count == 0) return new DBObjectCollection { (Curve)curve.Clone() };

            var parameters = points
                .Cast&amp;lt;Point3d&amp;gt;()
                .Select(p =&amp;gt; curve.GetParameterAtPoint(p))
                .OrderBy(p =&amp;gt; p)
                .ToArray();
            return curve.GetSplitCurves(new DoubleCollection(parameters));
        }

        [CommandMethod("TEST")]
        public static void Test()
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;

            var filter = new SelectionFilter(new[]
            {
                new TypedValue(0, "ARC,CIRCLE,LINE,LWPOLYLINE")
            });
            var selection = ed.GetSelection(filter);
            if (selection.Status != PromptStatus.OK)
                return;

            using (var tr = db.TransactionManager.StartTransaction())
            {
                var curves = selection.Value.GetObjectIds()
                    .Select(id =&amp;gt; (Curve)tr.GetObject(id, OpenMode.ForRead));
                var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                foreach (var pline in MergeCurves(curves))
                {
                    curSpace.AppendEntity(pline);
                    tr.AddNewlyCreatedDBObject(pline, true);
                }
                tr.Commit();
            }
        }
    }
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div class="lia-vid-container video-embed-center"&gt;&lt;div id="lia-vid-6333137092112w792h540r715" class="lia-video-brightcove-player-container"&gt;&lt;video-js data-video-id="6333137092112" data-account="6057940548001" data-player="default" data-embed="default" class="vjs-fluid" controls="" data-application-id="" style="width: 100%; height: 100%;"&gt;&lt;/video-js&gt;&lt;/div&gt;&lt;script src="https://players.brightcove.net/6057940548001/default_default/index.min.js"&gt;&lt;/script&gt;&lt;script&gt;(function() {  var wrapper = document.getElementById('lia-vid-6333137092112w792h540r715');  var videoEl = wrapper ? wrapper.querySelector('video-js') : null;  if (videoEl) {     if (window.videojs) {       window.videojs(videoEl).ready(function() {         this.on('loadedmetadata', function() {           this.el().querySelectorAll('.vjs-load-progress div[data-start]').forEach(function(bar) {             bar.setAttribute('role', 'presentation');             bar.setAttribute('aria-hidden', 'true');           });         });       });     }  }})();&lt;/script&gt;&lt;a class="video-embed-link" href="https://forums.autodesk.com/t5/video/gallerypage/video-id/6333137092112"&gt;(view in My Videos)&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Mon, 14 Aug 2023 05:16:48 GMT</pubDate>
    <dc:creator>_gile</dc:creator>
    <dc:date>2023-08-14T05:16:48Z</dc:date>
    <item>
      <title>Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12164598#M7747</link>
      <description>&lt;P&gt;Hello!&lt;BR /&gt;I want to create an outermost border for curves in a selection, some work well and some polylines don't. I've tried everything but can't fix it, hope you can help me fix it&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="general"&gt;Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.BoundaryRepresentation
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Runtime
Imports CadDb = Autodesk.AutoCAD.DatabaseServices

Public Module M_Boundary
    Public Class OutLiner
        Private _dwg As Document

        Public Sub New(dwg As Document)
            _dwg = dwg
        End Sub

        Public Sub DrawOutline(entIds As IEnumerable(Of ObjectId))
            Using polyline = GetOutline(entIds)
                Using tran = _dwg.TransactionManager.StartTransaction()
                    Dim space = DirectCast(tran.GetObject(_dwg.Database.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
                    space.AppendEntity(TryCast(polyline, Entity))
                    tran.AddNewlyCreatedDBObject(TryCast(polyline, Entity), True)
                    tran.Commit()
                End Using
            End Using
        End Sub

        Public Function GetOutline(entIds As IEnumerable(Of ObjectId)) As Entity
            Dim regions = New List(Of Region)()

            Using tran = _dwg.TransactionManager.StartTransaction()
                For Each entId In entIds
                    Dim entity = TryCast(tran.GetObject(entId, OpenMode.ForRead), Entity)
                    If entity IsNot Nothing Then
                        Dim entityRegion As List(Of Region) = Nothing
                        Select Case entity.GetType()
                            Case GetType(Polyline)
                                entityRegion = GetRegionFromPolyline(TryCast(entity, Polyline))
                            Case GetType(Circle)
                                entityRegion = GetRegionFromCircle(TryCast(entity, Circle))
                            Case GetType(Arc)
                                entityRegion = GetRegionFromArc(TryCast(entity, Arc))
                            Case GetType(Ellipse)
                                entityRegion = GetRegionFromEllipse(TryCast(entity, Ellipse))
                            Case GetType(Line)
                                entityRegion = GetRegionFromLine(TryCast(entity, Line))
                            Case Else
                                ' Unsupported type
                                Continue For
                        End Select
                        If entityRegion IsNot Nothing Then
                            regions.AddRange(entityRegion)
                        End If
                    End If
                Next

                tran.Commit()
            End Using


            Using region = MergeRegions(regions)
                If region IsNot Nothing Then
                    Dim brep = New Brep(region)
                    Dim points = New List(Of Point2d)()
                    Dim faceCount = brep.Faces.Count()
                    Dim face = brep.Faces.First()
                    For Each iloop In face.Loops
                        If iloop.LoopType = LoopType.LoopExterior Then
                            For Each vertex In iloop.Vertices
                                points.Add(New Point2d(vertex.Point.X, vertex.Point.Y))
                            Next
                            Exit For
                        End If
                    Next

                    Return CreatePolyline(points)
                Else
                    Return Nothing
                End If
            End Using
        End Function
        'Private Function GetRegionFromPolyline(poly As CadDb.Polyline) As List(Of Region)
        '    Return GetRegionFromCurve(poly)
        'End Function
        Private Function GetRegionFromPolyline(poly As CadDb.Polyline) As List(Of Region)
            Dim regions = New List(Of Region)()
            Dim sourceCol = New DBObjectCollection()

            ' Create a list of all points in the polyline
            Dim points = New List(Of Point3d)()
            For i = 0 To poly.NumberOfVertices - 1
                points.Add(poly.GetPoint3dAt(i))
            Next

            ' Calculate the centroid of points
            Dim centroid = New Point3d(points.Average(Function(p) p.X), points.Average(Function(p) p.Y), points.Average(Function(p) p.Z))

            ' Sort points by angle
            points.Sort(Function(p1, p2) Math.Atan2(p1.Y - centroid.Y, p1.X - centroid.X).CompareTo(Math.Atan2(p2.Y - centroid.Y, p2.X - centroid.X)))

            ' Create a new closed polyline from the sorted points
            Dim sortedPoly = New CadDb.Polyline()
            For i As Integer = 0 To points.Count - 1
                sortedPoly.AddVertexAt(i, New Point2d(points(i).X, points(i).Y), 0, 0, 0)
            Next
            sortedPoly.Closed = True

            ' Add the polyline to the source collection
            sourceCol.Add(sortedPoly)

            ' Create regions from the source collection
            Dim dbObjs = Region.CreateFromCurves(sourceCol)
            For Each obj In dbObjs
                If TypeOf obj Is Region Then regions.Add(TryCast(obj, Region))
            Next

            Return regions
        End Function


        Public Function GetRegionFromCircle(circle As CadDb.Circle) As List(Of Region)
            Dim regions = New List(Of Region)()
            Dim sourceCol = New DBObjectCollection()
            Dim dbObj = New CadDb.Polyline()
            Dim numPoints As Integer = 100 ' increase this for higher precision
            For i = 0 To numPoints
                Dim param = 2 * Math.PI * i / numPoints
                Dim point = New Point2d(circle.Center.X + circle.Radius * Math.Cos(param), circle.Center.Y + circle.Radius * Math.Sin(param))
                dbObj.AddVertexAt(i, point, 0.0, 0.3, 0.3)
            Next
            dbObj.Closed = True
            sourceCol.Add(dbObj)
            Dim dbObjs = Region.CreateFromCurves(sourceCol)
            For Each obj In dbObjs
                If TypeOf obj Is Region Then regions.Add(TryCast(obj, Region))
            Next

            Return regions
        End Function
        Public Function GetRegionFromLine(line As CadDb.Line) As List(Of Region)
            Dim regions = New List(Of Region)()
            Dim sourceCol = New DBObjectCollection()

            ' Create a parallel line
            Dim offsetVector = (line.EndPoint - line.StartPoint).RotateBy(Math.PI / 2, New Vector3d(0, 0, 1)) * 0.1

            Dim parallelLine = DirectCast(line.GetOffsetCurves(offsetVector.Length)(0), CadDb.Line)


            ' Create a polyline from the two lines
            Dim poly = New CadDb.Polyline()
            poly.AddVertexAt(0, New Point2d(line.StartPoint.X, line.StartPoint.Y), 0.0, 0.3, 0.3)
            poly.AddVertexAt(1, New Point2d(line.EndPoint.X, line.EndPoint.Y), 0.0, 0.3, 0.3)
            poly.AddVertexAt(2, New Point2d(parallelLine.EndPoint.X, parallelLine.EndPoint.Y), 0.0, 0.3, 0.3)
            poly.AddVertexAt(3, New Point2d(parallelLine.StartPoint.X, parallelLine.StartPoint.Y), 0.0, 0.3, 0.3)

            poly.Closed = True
            sourceCol.Add(poly)

            Dim dbObjs = Region.CreateFromCurves(sourceCol)
            For Each obj In dbObjs
                If TypeOf obj Is Region Then regions.Add(TryCast(obj, Region))
            Next

            Return regions
        End Function
        Private Function GetRegionFromEllipse(ellipse As CadDb.Ellipse) As List(Of Region)
            Dim regions = New List(Of Region)()

            Using tran = _dwg.TransactionManager.StartTransaction()
                Dim tempEllipse = ellipse.Clone()
                tempEllipse.TransformBy(Matrix3d.Displacement(ellipse.Center.GetVectorTo(Point3d.Origin)))
                tran.AddNewlyCreatedDBObject(tempEllipse, True)
                Dim outlineId = tempEllipse.GetOffsetCurves(0.001)(0)
                Dim outline = tran.GetObject(outlineId, OpenMode.ForWrite)
                tran.AddNewlyCreatedDBObject(outline, True)

                If TypeOf outline Is CadDb.Polyline Then
                    regions.AddRange(GetRegionFromPolyline(TryCast(outline, CadDb.Polyline)))
                ElseIf TypeOf outline Is CadDb.Arc Then
                    regions.AddRange(GetRegionFromArc(TryCast(outline, CadDb.Arc)))
                End If

                outline.Erase()
                tempEllipse.Erase()
                tran.Commit()
            End Using

            Return regions
        End Function



        Public Function GetRegionFromArc(arc As CadDb.Arc) As List(Of Region)
            Dim regions = New List(Of Region)()
            Dim sourceCol = New DBObjectCollection()
            Dim dbObj = New CadDb.Polyline()
            Dim numPoints As Integer = 100 ' increase this for higher precision
            For i = 0 To numPoints
                Dim param = arc.StartAngle + (arc.EndAngle - arc.StartAngle) * i / numPoints
                Dim point = New Point2d(arc.Center.X + arc.Radius * Math.Cos(param), arc.Center.Y + arc.Radius * Math.Sin(param))
                dbObj.AddVertexAt(i, point, 0.0, 0.3, 0.3)
            Next
            dbObj.AddVertexAt(numPoints + 1, New Point2d(arc.Center.X, arc.Center.Y), 0.0, 0.3, 0.3) ' add center point
            dbObj.Closed = True
            sourceCol.Add(dbObj)
            Dim dbObjs = Region.CreateFromCurves(sourceCol)
            For Each obj In dbObjs
                If TypeOf obj Is Region Then regions.Add(TryCast(obj, Region))
            Next

            Return regions
        End Function

        Private Function GetRegionFromCurve(curve As CadDb.Curve) As List(Of Region)
            Dim regions = New List(Of Region)()
            Dim sourceCol = New DBObjectCollection()
            Dim dbObj = DirectCast(curve.Clone(), CadDb.Curve)
            sourceCol.Add(dbObj)
            Dim dbObjs = Region.CreateFromCurves(sourceCol)
            For Each obj In dbObjs
                If TypeOf obj Is Region Then regions.Add(TryCast(obj, Region))
            Next

            Return regions
        End Function

        Private Function MergeRegions(regions As List(Of Region)) As Region
            If regions.Count = 0 Then Return Nothing
            If regions.Count = 1 Then Return regions(0)
            Dim region = regions(0)
            For i = 1 To regions.Count - 1
                Dim rg = regions(i)
                region.BooleanOperation(BooleanOperationType.BoolUnite, rg)
                rg.Dispose()
            Next

            Return region
        End Function

        Private Function CreatePolyline(points As List(Of Point2d)) As CadDb.Polyline
            Dim poly = New CadDb.Polyline(points.Count())
            For i = 0 To points.Count - 1
                poly.AddVertexAt(i, points(i), 0.0, 0.1, 0.1)
            Next
            poly.SetDatabaseDefaults(_dwg.Database)
            poly.ColorIndex = 1
            poly.Closed = True
            Return poly
        End Function
    End Class

    &amp;lt;CommandMethod("Outline")&amp;gt;
    Public Sub RunMyCommand()
        Dim dwg = Application.DocumentManager.MdiActiveDocument
        Dim ed = dwg.Editor

        Try
            Dim ids = SelectEntities(ed)
            If ids IsNot Nothing Then
                Dim liner = New OutLiner(dwg)
                liner.DrawOutline(ids)
            Else
                ed.WriteMessage(vbLf &amp;amp; "*Cancel*")
            End If
        Catch ex As System.Exception
            ed.WriteMessage(vbLf &amp;amp; "Command failed:" &amp;amp; vbLf &amp;amp; "{0}", ex.Message)
            ed.WriteMessage(vbLf &amp;amp; "*Cancel*")
        End Try
    End Sub

    Private Function SelectEntities(ed As Editor) As ObjectId()
        ' Allow selection of all types of entities.
        Dim res = ed.GetSelection()
        If res.Status = PromptStatus.OK Then
            Return res.Value.GetObjectIds()
        Else
            Return Nothing
        End If
    End Function
End Module&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="quyenpv1_0-1691756419626.png" style="width: 600px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/1252110iC79827BAB04F78DC/image-size/medium?v=v2&amp;amp;px=400" role="button" title="quyenpv1_0-1691756419626.png" alt="quyenpv1_0-1691756419626.png" /&gt;&lt;/span&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="quyenpv1_1-1691756443145.png" style="width: 600px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/1252111i6B558A06F0CAAE05/image-size/medium?v=v2&amp;amp;px=400" role="button" title="quyenpv1_1-1691756443145.png" alt="quyenpv1_1-1691756443145.png" /&gt;&lt;/span&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="quyenpv1_2-1691756646564.png" style="width: 600px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/1252113i9CC9E52D5AD9A095/image-size/medium?v=v2&amp;amp;px=400" role="button" title="quyenpv1_2-1691756646564.png" alt="quyenpv1_2-1691756646564.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 11 Aug 2023 13:05:49 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12164598#M7747</guid>
      <dc:creator>quyenpv</dc:creator>
      <dc:date>2023-08-11T13:05:49Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165221#M7748</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;This code (inspired by &lt;A href="http://www.theswamp.org/index.php?topic=37976.msg429899#msg429899" target="_blank" rel="noopener"&gt;this one&lt;/A&gt;) seems to work as expected (at least with your drawing example).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;using Autodesk.AutoCAD.ApplicationServices.Core;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

using System;
using System.Collections.Generic;
using System.Linq;

namespace MergeCurvesSample
{
    public class Commands
    {
        struct Segment
        {
            public Point2d StartPt { get; set; }
            public Point2d EndPt { get; set; }
            public double Bulge { get; set; }
        }

        private static IEnumerable&amp;lt;Polyline&amp;gt; MergeCurves(IEnumerable&amp;lt;Curve&amp;gt; curves)
        {
            var splitCurves = new List&amp;lt;Curve&amp;gt;();
            var curveSegments = new DBObjectCollection();
            foreach (Curve curve in curves)
            {
                if (curve is Arc || curve is Circle || curve is Line || curve is Polyline)
                {
                    foreach (Curve c in GetSplitSegments(curve, curves))
                    {
                        splitCurves.Add(c);
                        curveSegments.Add(c);
                    }
                }
            }
            var regions = Region.CreateFromCurves(curveSegments);
            foreach (Curve c in splitCurves)
            {
                c.Dispose();
            }

            if (regions.Count == 0) yield break;

            Region reg = (Region)regions[0];
            for (int i = 1; i &amp;lt; regions.Count; i++)
            {
                reg.BooleanOperation(BooleanOperationType.BoolUnite, (Region)regions[i]);
                regions[i].Dispose();
            }

            var segments = new DBObjectCollection();
            reg.Explode(segments);
            reg.Dispose();

            var segs = new List&amp;lt;Segment&amp;gt;();
            var plane = new Plane(Point3d.Origin, Vector3d.ZAxis);
            for (int i = 0; i &amp;lt; segments.Count; i++)
            {
                if (segments[i] is Region r)
                {
                    r.Explode(segments);
                    continue;
                }
                Curve crv = (Curve)segments[i];
                Point3d start = crv.StartPoint;
                Point3d end = crv.EndPoint;
                double bulge = 0.0;
                if (crv is Arc arc)
                {
                    double angle = arc.Center.GetVectorTo(start).GetAngleTo(arc.Center.GetVectorTo(end), arc.Normal);
                    bulge = Math.Tan(angle / 4.0);
                }
                segs.Add(new Segment { StartPt = start.Convert2d(plane), EndPt = end.Convert2d(plane), Bulge = bulge });
            }

            foreach (DBObject o in segments) o.Dispose();

            while (segs.Count &amp;gt; 0)
            {
                var pline = new Polyline();
                pline.AddVertexAt(0, segs[0].StartPt, segs[0].Bulge, 0.0, 0.0);
                Point2d pt = segs[0].EndPt;
                segs.RemoveAt(0);
                int vtx = 1;
                while (true)
                {
                    int i = segs.FindIndex((s) =&amp;gt; s.StartPt.IsEqualTo(pt) || s.EndPt.IsEqualTo(pt));
                    if (i &amp;lt; 0) break;
                    Segment seg = segs[i];
                    if (seg.EndPt.IsEqualTo(pt))
                        seg = new Segment { StartPt = seg.EndPt, EndPt = seg.StartPt, Bulge = -seg.Bulge };
                    pline.AddVertexAt(vtx, seg.StartPt, seg.Bulge, 0.0, 0.0);
                    pt = seg.EndPt;
                    segs.RemoveAt(i);
                    vtx++;
                }
                pline.Closed = true;
                yield return pline;
            }
        }

        private static DBObjectCollection GetSplitSegments(Curve curve, IEnumerable&amp;lt;Curve&amp;gt; curves)
        {
            var points = new Point3dCollection();
            foreach (var c in curves)
            {
                curve.IntersectWith(c, Intersect.OnBothOperands, points, IntPtr.Zero, IntPtr.Zero);
            }

            if (points.Count == 0) return new DBObjectCollection { (Curve)curve.Clone() };

            var parameters = points
                .Cast&amp;lt;Point3d&amp;gt;()
                .Select(p =&amp;gt; curve.GetParameterAtPoint(p))
                .OrderBy(p =&amp;gt; p)
                .ToArray();
            return curve.GetSplitCurves(new DoubleCollection(parameters));
        }

        [CommandMethod("TEST")]
        public static void Test()
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;

            var filter = new SelectionFilter(new[]
            {
                new TypedValue(0, "ARC,CIRCLE,LINE,LWPOLYLINE")
            });
            var selection = ed.GetSelection(filter);
            if (selection.Status != PromptStatus.OK)
                return;

            using (var tr = db.TransactionManager.StartTransaction())
            {
                var curves = selection.Value.GetObjectIds()
                    .Select(id =&amp;gt; (Curve)tr.GetObject(id, OpenMode.ForRead));
                var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                foreach (var pline in MergeCurves(curves))
                {
                    curSpace.AppendEntity(pline);
                    tr.AddNewlyCreatedDBObject(pline, true);
                }
                tr.Commit();
            }
        }
    }
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div class="lia-vid-container video-embed-center"&gt;&lt;div id="lia-vid-6333137092112w792h540r915" class="lia-video-brightcove-player-container"&gt;&lt;video-js data-video-id="6333137092112" data-account="6057940548001" data-player="default" data-embed="default" class="vjs-fluid" controls="" data-application-id="" style="width: 100%; height: 100%;"&gt;&lt;/video-js&gt;&lt;/div&gt;&lt;script src="https://players.brightcove.net/6057940548001/default_default/index.min.js"&gt;&lt;/script&gt;&lt;script&gt;(function() {  var wrapper = document.getElementById('lia-vid-6333137092112w792h540r915');  var videoEl = wrapper ? wrapper.querySelector('video-js') : null;  if (videoEl) {     if (window.videojs) {       window.videojs(videoEl).ready(function() {         this.on('loadedmetadata', function() {           this.el().querySelectorAll('.vjs-load-progress div[data-start]').forEach(function(bar) {             bar.setAttribute('role', 'presentation');             bar.setAttribute('aria-hidden', 'true');           });         });       });     }  }})();&lt;/script&gt;&lt;a class="video-embed-link" href="https://forums.autodesk.com/t5/video/gallerypage/video-id/6333137092112"&gt;(view in My Videos)&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 14 Aug 2023 05:16:48 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165221#M7748</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2023-08-14T05:16:48Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165283#M7749</link>
      <description>&lt;P&gt;Great, excellent, wonderfull! Thank you very much&lt;BR /&gt;1. Can you add more ellipse objects if you want?&lt;BR /&gt;2. If you want to create internal boundary&amp;nbsp;&lt;A href="https://blog.csdn.net/qq_31512121/article/details/122684947" target="_blank" rel="noopener"&gt;Boundary of qq307501169&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 11 Aug 2023 17:24:15 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165283#M7749</guid>
      <dc:creator>quyenpv</dc:creator>
      <dc:date>2023-08-11T17:24:15Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165341#M7750</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/14093621"&gt;@quyenpv&lt;/a&gt;&amp;nbsp; a écrit&amp;nbsp;:&lt;BR /&gt;
&lt;P&gt;1. Can you add more ellipse objects if you want?&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Polyline can only contain linear and circular arc segments. If you want to convert true ellipses to polyline approximations, you can use the Ellipse.ToPolyline method from the &lt;A href="https://github.com/gileCAD/GeometryExtensions/" target="_blank" rel="noopener"&gt;GeometryExtensions library&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/14093621"&gt;@quyenpv&lt;/a&gt;&amp;nbsp; a écrit&amp;nbsp;:&lt;BR /&gt;
&lt;P&gt;2. If you want to create internal boundary&amp;nbsp;&lt;A href="https://blog.csdn.net/qq_31512121/article/details/122684947" target="_blank" rel="noopener"&gt;Boundary of qq307501169&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I thaught you wanted &lt;STRONG&gt;to learn&lt;/STRONG&gt; .NET programmation. I won't do your work for you.&lt;/P&gt;</description>
      <pubDate>Fri, 11 Aug 2023 17:45:46 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165341#M7750</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2023-08-11T17:45:46Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165377#M7751</link>
      <description>&lt;P&gt;Thank you!&lt;BR /&gt;Based on your suggestion, I did it&lt;BR /&gt;I'm learning VB.Net for real, but it's not to ask him to do the work that should be mine, but I really can't find a solution, so I need help.&lt;BR /&gt;Based on the above suggestion, I understood that I had to transform ellipse and arc into polyline to create boundary&lt;BR /&gt;Once again thank you very much! I wish you good health&lt;/P&gt;</description>
      <pubDate>Fri, 11 Aug 2023 18:01:50 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165377#M7751</guid>
      <dc:creator>quyenpv</dc:creator>
      <dc:date>2023-08-11T18:01:50Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165487#M7752</link>
      <description>&lt;P&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/109424"&gt;@_gile&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Right now I can only process the ellipse and the arc still can't. Can you help me with suggestions?&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="quyenpv1_0-1691779475827.png" style="width: 600px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/1252288i30793EBCC4E15A1B/image-size/medium?v=v2&amp;amp;px=400" role="button" title="quyenpv1_0-1691779475827.png" alt="quyenpv1_0-1691779475827.png" /&gt;&lt;/span&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="quyenpv1_1-1691779491210.png" style="width: 600px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/1252289i0F5EFDC422FA547C/image-size/medium?v=v2&amp;amp;px=400" role="button" title="quyenpv1_1-1691779491210.png" alt="quyenpv1_1-1691779491210.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 11 Aug 2023 18:44:53 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165487#M7752</guid>
      <dc:creator>quyenpv</dc:creator>
      <dc:date>2023-08-11T18:44:53Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165718#M7753</link>
      <description>&lt;P&gt;I edited the upper code so that all selected curves are splited at intersections.&lt;/P&gt;
&lt;P&gt;&lt;div class="lia-vid-container video-embed-center"&gt;&lt;div id="lia-vid-6333151578112w778h540r6" class="lia-video-brightcove-player-container"&gt;&lt;video-js data-video-id="6333151578112" data-account="6057940548001" data-player="default" data-embed="default" class="vjs-fluid" controls="" data-application-id="" style="width: 100%; height: 100%;"&gt;&lt;/video-js&gt;&lt;/div&gt;&lt;script src="https://players.brightcove.net/6057940548001/default_default/index.min.js"&gt;&lt;/script&gt;&lt;script&gt;(function() {  var wrapper = document.getElementById('lia-vid-6333151578112w778h540r6');  var videoEl = wrapper ? wrapper.querySelector('video-js') : null;  if (videoEl) {     if (window.videojs) {       window.videojs(videoEl).ready(function() {         this.on('loadedmetadata', function() {           this.el().querySelectorAll('.vjs-load-progress div[data-start]').forEach(function(bar) {             bar.setAttribute('role', 'presentation');             bar.setAttribute('aria-hidden', 'true');           });         });       });     }  }})();&lt;/script&gt;&lt;a class="video-embed-link" href="https://forums.autodesk.com/t5/video/gallerypage/video-id/6333151578112"&gt;(view in My Videos)&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 11 Aug 2023 20:38:33 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12165718#M7753</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2023-08-11T20:38:33Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12166057#M7754</link>
      <description>&lt;P&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/109424"&gt;@_gile&lt;/a&gt;&amp;nbsp;With your newly updated code can handle the case&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="quyenpv1_0-1691804982208.png" style="width: 600px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/1252383iDD4D212CE49FAB69/image-size/medium?v=v2&amp;amp;px=400" role="button" title="quyenpv1_0-1691804982208.png" alt="quyenpv1_0-1691804982208.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;But when arc intersects with ellipse and circle, it doesn't work&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="quyenpv1_1-1691805029094.png" style="width: 600px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/1252384i048AC11E14084239/image-size/medium?v=v2&amp;amp;px=400" role="button" title="quyenpv1_1-1691805029094.png" alt="quyenpv1_1-1691805029094.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 12 Aug 2023 01:50:43 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12166057#M7754</guid>
      <dc:creator>quyenpv</dc:creator>
      <dc:date>2023-08-12T01:50:43Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12166058#M7755</link>
      <description>&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/109424"&gt;@_gile&lt;/a&gt; With your newly updated code can handle the case, But when arc intersects with ellipse and circle, it doesn't work</description>
      <pubDate>Sat, 12 Aug 2023 01:52:16 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12166058#M7755</guid>
      <dc:creator>quyenpv</dc:creator>
      <dc:date>2023-08-12T01:52:16Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12166256#M7756</link>
      <description>&lt;P&gt;It works for me.&lt;/P&gt;
&lt;P&gt;&lt;div class="lia-vid-container video-embed-center"&gt;&lt;div id="lia-vid-6333201741112w718h540r316" class="lia-video-brightcove-player-container"&gt;&lt;video-js data-video-id="6333201741112" data-account="6057940548001" data-player="default" data-embed="default" class="vjs-fluid" controls="" data-application-id="" style="width: 100%; height: 100%;"&gt;&lt;/video-js&gt;&lt;/div&gt;&lt;script src="https://players.brightcove.net/6057940548001/default_default/index.min.js"&gt;&lt;/script&gt;&lt;script&gt;(function() {  var wrapper = document.getElementById('lia-vid-6333201741112w718h540r316');  var videoEl = wrapper ? wrapper.querySelector('video-js') : null;  if (videoEl) {     if (window.videojs) {       window.videojs(videoEl).ready(function() {         this.on('loadedmetadata', function() {           this.el().querySelectorAll('.vjs-load-progress div[data-start]').forEach(function(bar) {             bar.setAttribute('role', 'presentation');             bar.setAttribute('aria-hidden', 'true');           });         });       });     }  }})();&lt;/script&gt;&lt;a class="video-embed-link" href="https://forums.autodesk.com/t5/video/gallerypage/video-id/6333201741112"&gt;(view in My Videos)&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 12 Aug 2023 05:25:36 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12166256#M7756</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2023-08-12T05:25:36Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12166369#M7757</link>
      <description>&lt;P&gt;Can you update the new processing code as shown in the video?&lt;/P&gt;</description>
      <pubDate>Sat, 12 Aug 2023 08:05:33 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12166369#M7757</guid>
      <dc:creator>quyenpv</dc:creator>
      <dc:date>2023-08-12T08:05:33Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12166475#M7758</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/14093621"&gt;@quyenpv&lt;/a&gt;&amp;nbsp; a écrit&amp;nbsp;:&lt;BR /&gt;
&lt;P&gt;Can you update the new processing code as shown in the video?&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I ran the code as it was yesterday (reply #7).&lt;/P&gt;</description>
      <pubDate>Sat, 12 Aug 2023 09:55:24 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12166475#M7758</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2023-08-12T09:55:24Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167174#M7759</link>
      <description>&lt;P&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/14093621"&gt;@quyenpv&lt;/a&gt;,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Is it possible that your translation to VB.NET is faulty ??&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 12 Aug 2023 21:04:38 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167174#M7759</guid>
      <dc:creator>kerry_w_brown</dc:creator>
      <dc:date>2023-08-12T21:04:38Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167338#M7760</link>
      <description>Yes I'm thinking so</description>
      <pubDate>Sun, 13 Aug 2023 01:04:55 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167338#M7760</guid>
      <dc:creator>quyenpv</dc:creator>
      <dc:date>2023-08-13T01:04:55Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167354#M7761</link>
      <description>&lt;P&gt;That, I believe, is one of the hugest cause of errors in .NET programming&lt;BR /&gt;. . .&amp;nbsp; people making incorrect translations from C# to VB.net.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;. . . but people generally don't want to listen when the suggestion is made to learn C# properly to save the hassle &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 13 Aug 2023 01:21:34 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167354#M7761</guid>
      <dc:creator>kerry_w_brown</dc:creator>
      <dc:date>2023-08-13T01:21:34Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167376#M7762</link>
      <description>Yes you are!&lt;BR /&gt;I see a very large C# community and a lot of documentation, I will learn and gradually switch to</description>
      <pubDate>Sun, 13 Aug 2023 01:52:23 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167376#M7762</guid>
      <dc:creator>quyenpv</dc:creator>
      <dc:date>2023-08-13T01:52:23Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167410#M7763</link>
      <description>&lt;P&gt;Yes, that (reply 7#) didn't include any code.&lt;BR /&gt;And the origin (2#) only accepts Arc, Circle, Line, and Polyline objects.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;            foreach (Curve curve in curves)
            {
                if (curve is Arc || curve is Circle || curve is Line || curve is Polyline)&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 13 Aug 2023 02:30:27 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167410#M7763</guid>
      <dc:creator>GiaBach</dc:creator>
      <dc:date>2023-08-13T02:30:27Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167552#M7764</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/1260455"&gt;@GiaBach&lt;/a&gt;&amp;nbsp; a écrit&amp;nbsp;:&lt;BR /&gt;
&lt;P&gt;Yes, that (reply 7#) didn't include any code.&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;In reply #7 I announced the "upper code" (reply #2) had been edited.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/1260455"&gt;@GiaBach&lt;/a&gt;&amp;nbsp; a écrit&amp;nbsp;:&lt;BR /&gt;
&lt;P&gt;And the origin (2#) only accepts Arc, Circle, Line, and Polyline objects.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;            foreach (Curve curve in curves)
            {
                if (curve is Arc || curve is Circle || curve is Line || curve is Polyline)&lt;/PRE&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The code still accepts only arcs, circles, lines and polylines because polylines "can only contain linear and circular arc segments" as said in reply #4.&lt;/P&gt;</description>
      <pubDate>Sun, 13 Aug 2023 05:51:48 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167552#M7764</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2023-08-13T05:51:48Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167684#M7765</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/529262"&gt;@kerry_w_brown&lt;/a&gt;&amp;nbsp; a écrit&amp;nbsp;:&lt;BR /&gt;
&lt;P&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/14093621"&gt;@quyenpv&lt;/a&gt;,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Is it possible that your translation to VB.NET is faulty ??&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This may be due to the for statement:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;            for (int i = 0; i &amp;lt; segments.Count; i++)
            {
                if (segments[i] is Region r)
                {
                    r.Explode(segments);
                    continue;
                }
                Curve crv = (Curve)segments[i];
                Point3d start = crv.StartPoint;
                Point3d end = crv.EndPoint;
                double bulge = 0.0;
                if (crv is Arc arc)
                {
                    double angle = arc.Center.GetVectorTo(start).GetAngleTo(arc.Center.GetVectorTo(end), arc.Normal);
                    bulge = Math.Tan(angle / 4.0);
                }
                segs.Add(new Segment { StartPt = start.Convert2d(plane), EndPt = end.Convert2d(plane), Bulge = bulge });
            }&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Because in C#, the loop condition is evaluated on each iteration, and in VB.NET, it is only evaluated on entry to the loop. In this loop if the entity is a region it is explode and the resulting entities are added to the segments collection.&lt;/P&gt;
&lt;P&gt;In VB, this for statement have to be replaced by a while statement.&lt;/P&gt;</description>
      <pubDate>Sun, 13 Aug 2023 08:59:46 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167684#M7765</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2023-08-13T08:59:46Z</dc:date>
    </item>
    <item>
      <title>Re: Create the outermost border for the curves (BOUNDARY)</title>
      <link>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167690#M7766</link>
      <description>&lt;P&gt;This version references the &lt;A href="https://github.com/gileCAD/GeometryExtensions" target="_blank" rel="noopener"&gt;GeometryExtensions library&lt;/A&gt; to be able to directly work with Ellipses and Splines.&lt;/P&gt;
&lt;P&gt;Due to the conversion of Ellipses and Splines into polyline approximations it needs a Tolerance.&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

using Gile.AutoCAD.Geometry;

using System;
using System.Collections.Generic;
using System.Linq;

namespace MergeCurvesUsingGeometryExtensions
{
    public class Commands
    {
        private static IEnumerable&amp;lt;Polyline&amp;gt; MergeCurves(IEnumerable&amp;lt;Curve&amp;gt; curves, Tolerance tolerance)
        {
            var curveSegments = new DBObjectCollection();
            foreach (Curve curve in curves)
            {
                foreach (Curve c in GetSplitSegments(curve, curves))
                {
                    curveSegments.Add(c);
                }
            }
            var regions = Region.CreateFromCurves(curveSegments);
            foreach (Curve c in curveSegments)
            {
                c.Dispose();
            }

            if (regions.Count == 0) yield break;

            Region reg = (Region)regions[0];
            for (int i = 1; i &amp;lt; regions.Count; i++)
            {
                reg.BooleanOperation(BooleanOperationType.BoolUnite, (Region)regions[i]);
                regions[i].Dispose();
            }

            var segments = new DBObjectCollection();
            reg.Explode(segments);
            reg.Dispose();

            var plane = new Plane(Point3d.Origin, Vector3d.ZAxis);
            var polylineSegments = new PolylineSegmentCollection();
            for (int i = 0; i &amp;lt; segments.Count; i++)
            {
                var entity = (Entity)segments[i];
                switch (entity)
                {
                    case Region region:
                        region.Explode(segments);
                        break;
                    case Ellipse ellipse:
                        polylineSegments.AddRange(ellipse.ToPolyline());
                        break;
                    case Spline spline:
                        polylineSegments.AddRange((Polyline)spline.ToPolyline());
                        break;
                    case Line line:
                        polylineSegments.Add(new PolylineSegment(new LineSegment2d(
                            line.StartPoint.Convert2d(plane),
                            line.EndPoint.Convert2d(plane))));
                        break;
                    case Arc arc:
                        polylineSegments.Add(new PolylineSegment(new CircularArc2d(
                            arc.StartPoint.Convert2d(plane),
                            arc.GetPointAtParameter((arc.StartParam + arc.EndParam) * 0.5).Convert2d(plane),
                            arc.EndPoint.Convert2d(plane))));
                        break;
                    default:
                        break; ;
                }
            }
            foreach (var segmentCollection in polylineSegments.Join(tolerance))
            {
                yield return segmentCollection.ToPolyline();
            }
        }

        private static DBObjectCollection GetSplitSegments(Curve curve, IEnumerable&amp;lt;Curve&amp;gt; curves)
        {
            var points = new Point3dCollection();
            foreach (var c in curves)
            {
                curve.IntersectWith(c, Intersect.OnBothOperands, points, IntPtr.Zero, IntPtr.Zero);
            }

            if (points.Count == 0) return new DBObjectCollection { (Curve)curve.Clone() };

            var parameters = points
                .Cast&amp;lt;Point3d&amp;gt;()
                .Select(p =&amp;gt; curve.GetParameterAtPoint(p))
                .OrderBy(p =&amp;gt; p)
                .ToArray();
            return curve.GetSplitCurves(new DoubleCollection(parameters));
        }

        [CommandMethod("TEST")]
        public static void Test()
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;

            var filter = new SelectionFilter(new[]
            {
                new TypedValue(-4, "&amp;lt;OR"),
                new TypedValue(0, "ARC,CIRCLE,ELLIPSE,LINE,LWPOLYLINE"),
                new TypedValue(-4, "&amp;lt;AND"),
                new TypedValue(0, "SPLINE"),
                new TypedValue(-4, "&amp;amp;"),
                new TypedValue(70, 8),
                new TypedValue(-4, "AND&amp;gt;"),
                new TypedValue(-4, "OR&amp;gt;")
            });
            var selection = ed.GetSelection(filter);
            if (selection.Status != PromptStatus.OK)
                return;

            using (var tr = db.TransactionManager.StartTransaction())
            {
                var curves = selection.Value.GetObjectIds()
                    .Select(id =&amp;gt; (Curve)tr.GetObject(id, OpenMode.ForRead));
                var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                var tolerance = curves.Any(c =&amp;gt; c is Ellipse || c is Spline) ?
                    new Tolerance(0.1, 0.5) :
                    Tolerance.Global;
                foreach (var pline in MergeCurves(curves, tolerance))
                {
                    curSpace.AppendEntity(pline);
                    tr.AddNewlyCreatedDBObject(pline, true);
                }
                tr.Commit();
            }
        }
    }
}
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 13 Aug 2023 08:55:40 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/create-the-outermost-border-for-the-curves-boundary/m-p/12167690#M7766</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2023-08-13T08:55:40Z</dc:date>
    </item>
  </channel>
</rss>

