<?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: How to use one-step to complete a rectangular boundary for MText ? in .NET Forum</title>
    <link>https://forums.autodesk.com/t5/net-forum/how-to-use-one-step-to-complete-a-rectangular-boundary-for-mtext/m-p/5919339#M37873</link>
    <description>&lt;P&gt;Sorry, I had solved it by myself.&lt;/P&gt;</description>
    <pubDate>Sun, 22 Nov 2015 02:15:04 GMT</pubDate>
    <dc:creator>Anonymous</dc:creator>
    <dc:date>2015-11-22T02:15:04Z</dc:date>
    <item>
      <title>How to use one-step to complete a rectangular boundary for MText ?</title>
      <link>https://forums.autodesk.com/t5/net-forum/how-to-use-one-step-to-complete-a-rectangular-boundary-for-mtext/m-p/5919021#M37872</link>
      <description>&lt;P&gt;I currently need&amp;nbsp;do two steps to complete it.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1,&amp;nbsp;To&amp;nbsp;select a new MText location;&lt;/P&gt;&lt;P&gt;2, To select a just created MText;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Can it be created the rectangular boundary automatically after&amp;nbsp;selecting a new MText location&amp;nbsp;?&amp;nbsp; Your suggestion would be greatly appreciated.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;        [CommandMethod("test", CommandFlags.UsePickSet)]
        public void MinimumEnclosingBoundary()
        {
            //create a MText;
            Database dbs = HostApplicationServices.WorkingDatabase;
            using (Transaction trans = dbs.TransactionManager.StartTransaction())
            {
                BlockTable bt = trans.GetObject(dbs.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord acBlkTblRec = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                Point3d pt = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.GetPoint("\nMText location: ").Value;
                MText acMText = new MText();
                acMText.SetDatabaseDefaults();
                acMText.Location = pt;
                acMText.TextHeight = 200;
                acMText.Contents = "{{\\fSimHei;TEST}}";
                acBlkTblRec.AppendEntity(acMText);
                trans.AddNewlyCreatedDBObject(acMText, true);
                trans.Commit();
            }


            //create a rectangular boundary for MText
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            PromptSelectionOptions pso = new PromptSelectionOptions();
            pso.MessageForAdding = "\nSelect objects to enclose: ";
            pso.AllowDuplicates = false;
            pso.AllowSubSelections = true;
            pso.RejectObjectsFromNonCurrentSpace = true;
            pso.RejectObjectsOnLockedLayers = false;
            PromptSelectionResult psr = ed.GetSelection(pso);
            if (psr.Status != PromptStatus.OK)
                return;

            if (psr.Value.Count &amp;gt; 1)
            {
                return;
            }
            double buffer = 0.0;
            try
            {
                object bufvar = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("ENCLOSINGBOUNDARYBUFFER");
                if (bufvar != null)
                {
                    short bufval = (short)bufvar;
                    buffer = bufval / 100.0;
                }
            }
            catch
            {
                object bufvar = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("USERI1");
                if (bufvar != null)
                {
                    short bufval = (short)bufvar;
                    buffer = bufval / 100.0;
                }
            }

            CoordinateSystem3d ucs = ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
            Point3dCollection pts = new Point3dCollection();
            Transaction tr = db.TransactionManager.StartTransaction();
            using (tr)
            {
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                for (int i = 0; i &amp;lt; psr.Value.Count; i++)
                {
                    Entity ent = (Entity)tr.GetObject(psr.Value[i].ObjectId, OpenMode.ForRead);
                    MText txt = (MText)ent;
                    Point3dCollection pts2 = txt.GetBoundingPoints();
                    foreach (Point3d pt in pts2)
                    {
                        pts.Add(pt);
                    }

                    Entity bnd = RectangleFromPoints(pts, ucs, buffer);
                    btr.AppendEntity(bnd);
                    tr.AddNewlyCreatedDBObject(bnd, true);
                    pts.Clear();
                }
                tr.Commit();
            }
        }

        public static Entity RectangleFromPoints(Point3dCollection pts, CoordinateSystem3d ucs, double buffer)
        {
            Plane pl = new Plane(ucs.Origin, ucs.Zaxis);
            List&amp;lt;Point2d&amp;gt; pts2d = new List&amp;lt;Point2d&amp;gt;(pts.Count);
            for (int i = 0; i &amp;lt; pts.Count; i++)
            {
                pts2d.Add(pl.ParameterOf(pts[i]));
            }

            if (pts.Count &amp;gt; 0)
            {
                double minX = pts2d[0].X,
                       maxX = minX,
                       minY = pts2d[0].Y,
                       maxY = minY;

                for (int i = 1; i &amp;lt; pts2d.Count; i++)
                {
                    Point2d pt = pts2d[i];
                    if (pt.X &amp;lt; minX) minX = pt.X;
                    if (pt.X &amp;gt; maxX) maxX = pt.X;
                    if (pt.Y &amp;lt; minY) minY = pt.Y;
                    if (pt.Y &amp;gt; maxY) maxY = pt.Y;
                }

                double buf = Math.Min(maxX - minX, maxY - minY) * buffer;
                minX -= buf;
                minY -= buf;
                maxX += buf;
                maxY += buf;
                Point2d pt0 = new Point2d(minX, minY),
                        pt1 = new Point2d(minX, maxY),
                        pt2 = new Point2d(maxX, maxY),
                        pt3 = new Point2d(maxX, minY);
                var p = new Polyline(4);
                p.Normal = pl.Normal;
                p.AddVertexAt(0, pt0, 0, 0, 0);
                p.AddVertexAt(1, pt1, 0, 0, 0);
                p.AddVertexAt(2, pt2, 0, 0, 0);
                p.AddVertexAt(3, pt3, 0, 0, 0);
                p.Closed = true;
                return p;
            }
            return null;
        }&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 21 Nov 2015 14:33:03 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/how-to-use-one-step-to-complete-a-rectangular-boundary-for-mtext/m-p/5919021#M37872</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2015-11-21T14:33:03Z</dc:date>
    </item>
    <item>
      <title>Re: How to use one-step to complete a rectangular boundary for MText ?</title>
      <link>https://forums.autodesk.com/t5/net-forum/how-to-use-one-step-to-complete-a-rectangular-boundary-for-mtext/m-p/5919339#M37873</link>
      <description>&lt;P&gt;Sorry, I had solved it by myself.&lt;/P&gt;</description>
      <pubDate>Sun, 22 Nov 2015 02:15:04 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/how-to-use-one-step-to-complete-a-rectangular-boundary-for-mtext/m-p/5919339#M37873</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2015-11-22T02:15:04Z</dc:date>
    </item>
  </channel>
</rss>

