Through the Interface: Tracing a boundary defined by AutoCAD geometry using .NET

Kean Walmsley

May 2015

Sun Mon Tue Wed Thu Fri Sat
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30


« Changing the case of an MText object using AutoCAD’s in-place editor from .NET | Main | Creating transparent hatches in AutoCAD using .NET »

June 21, 2010

Tracing a boundary defined by AutoCAD geometry using .NET

As alluded to in this previous post, today we’re going to see some code that makes use of a very cool new API feature in AutoCAD 2011: the Editor.TraceBoundary() function. This little gem performs something developers have struggled with – and have asked us for – for many years. Previously you had to jump through significant hoops (or should that be loops? <groan>) to get this to work: one common approach would be to drive the BOUNDARY command programmatically and check the results appended to the database. All very messy.

Anyway, we got there eventually. This function takes a “seed” point and returns a collection of newly-created entities that define our boundary. We can then either pump these through the transient graphics sub-system or – and this is the approach we’re going to take – add them to the drawing to make them persistent.

You need to bear in mind that this function ultimately has similar constraints to the BOUNDARY and BHATCH commands: it also works off AutoCAD’s display list and so the user will need to be appropriately ZOOMed into the geometry that is to be used for boundary detection.

Here’s some C# code to create boundaries – with a lineweight applied and of an automatically incremented colour index – for points the user selects:

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Runtime;


namespace TraceBoundary


  public class Commands


    static int _index = 1;



    public void TraceBoundary()


      Document doc =


      Database db = doc.Database;

      Editor ed = doc.Editor;


      // Select a seed point for our boundary


      PromptPointResult ppr =

        ed.GetPoint("\nSelect internal point: ");


      if (ppr.Status != PromptStatus.OK)



      // Get the objects making up our boundary


      DBObjectCollection objs =

        ed.TraceBoundary(ppr.Value, true);


      if (objs.Count > 0)


        Transaction tr =


        using (tr)


          // We'll add the objects to the model space


          BlockTable bt =






          BlockTableRecord btr =






          // Add our boundary objects to the drawing and

          // collect their ObjectIds for later use


          ObjectIdCollection ids = new ObjectIdCollection();

          foreach (DBObject obj in objs)


            Entity ent = obj as Entity;

            if (ent != null)


              // Set our boundary objects to be of

              // our auto-incremented colour index


              ent.ColorIndex = _index;


              // Set the lineweight of our object


              ent.LineWeight = LineWeight.LineWeight050;


              // Add each boundary object to the modelspace

              // and add its ID to a collection



              tr.AddNewlyCreatedDBObject(ent, true);




          // Increment our colour index




          // Commit the transaction








Here’s our TB command in action.


Our boundaries


Our traced boundaries

In the next post we’re going to modify the code to create transparent hatch objects inside these individual boundaries.

blog comments powered by Disqus


10 Random Posts