Code Red > .NET

Create object

<< < (2/4) > >>

gile:
Hi,


--- Code - C#: ---using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.EditorInput;using Autodesk.AutoCAD.Geometry;using Autodesk.AutoCAD.Runtime;using System; namespace Windows{    public class Commands    {        [CommandMethod("Test")]        public void Test()        {            Document doc = Application.DocumentManager.MdiActiveDocument;            Database db = doc.Database;            Editor ed = doc.Editor;             // prompt for the window polyline            var entOpts = new PromptEntityOptions("\nSelect a window: ");            entOpts.SetRejectMessage("\nSelected object must be apolyline.");            entOpts.AddAllowedClass(typeof(Polyline), true);            var entRes = ed.GetEntity(entOpts);            if (entRes.Status != PromptStatus.OK)                return;             using (Transaction tr = db.TransactionManager.StartTransaction())            {                var window = (Polyline)tr.GetObject(entRes.ObjectId, OpenMode.ForRead);                 // get the window center                Extents3d extents = window.GeometricExtents;                Point3d center = extents.MinPoint + (extents.MaxPoint - extents.MinPoint) / 2.0;                 // get the normal of the window plane                Point2d pt = new Point2d(center.X, center.Y);                Vector3d normal = window.Normal;                 // check if the window is vertical                if (!normal.IsPerpendicularTo(Vector3d.ZAxis))                {                    ed.WriteMessage("\nThe window is not vertical.");                    return;                }                 // get the nnormal angle about XY plane                var angle0 = normal.AngleOnPlane(new Plane());                 // prompt for the first angle                var angRes = ed.GetAngle("\nAngle 1: ");                if (angRes.Status != PromptStatus.OK)                    return;                var angle1 = angRes.Value;                 // prompt for the second angle                angRes = ed.GetAngle("\nAngle 2: ");                if (angRes.Status != PromptStatus.OK)                    return;                var angle2 = angRes.Value;                 var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);                 // create the polyline                using (var pline = new Polyline(3))                {                    // add vertices                    pline.AddVertexAt(0, pt, 0.0, 0.0, 0.0);                    pline.AddVertexAt(1, Polar(pt, angle0 - angle1, 5000.0), 0.0, 0.0, 0.0);                    pline.AddVertexAt(2, Polar(pt, angle0 + angle1, 5000.0), 0.0, 0.0, 0.0);                    pline.Closed = true;                     // transform the polyline                    pline.Elevation = center.Z;                    pline.TransformBy(Matrix3d.Rotation(angle2, normal.CrossProduct(Vector3d.ZAxis), center));                     // add the polyline to current space block table record                    curSpace.AppendEntity(pline);                    tr.AddNewlyCreatedDBObject(pline, true);                }                tr.Commit();            }        }         [CommandMethod("CMD")]        public void Cmd()        {            Document doc = Application.DocumentManager.MdiActiveDocument;            Database db = doc.Database;            Editor ed = doc.Editor;             // prompt for the window polyline            var entOpts = new PromptEntityOptions("\nSelect a window: ");            entOpts.SetRejectMessage("\nSelected object must be apolyline.");            entOpts.AddAllowedClass(typeof(Polyline), true);            var entRes = ed.GetEntity(entOpts);            if (entRes.Status != PromptStatus.OK)                return;             using (Transaction tr = db.TransactionManager.StartTransaction())            {                var window = (Polyline)tr.GetObject(entRes.ObjectId, OpenMode.ForRead);                 // get the window center                Extents3d extents = window.GeometricExtents;                Point3d center = extents.MinPoint + (extents.MaxPoint - extents.MinPoint) / 2.0;                 // get the normal of the window plane                Point2d pt = new Point2d(center.X, center.Y);                Vector3d normal = window.Normal;                 // check if the window is vertical                if (!normal.IsPerpendicularTo(Vector3d.ZAxis))                {                    ed.WriteMessage("\nThe window is not vertical.");                    return;                }                 // get the nnormal angle about XY plane                var angle0 = normal.AngleOnPlane(new Plane());                 // prompt for the first angle                var angRes = ed.GetAngle("\nAngle 1: ");                if (angRes.Status != PromptStatus.OK)                    return;                var angle1 = angRes.Value;                 // prompt for the second angle                angRes = ed.GetAngle("\nAngle 2: ");                if (angRes.Status != PromptStatus.OK)                    return;                var angle2 = angRes.Value;                 var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);                 // create the polyline                using (var pline = new Polyline(3))                {                    // add vertices                    pline.AddVertexAt(0, pt, 0.0, 0.0, 0.0);                    pline.AddVertexAt(1, Polar(pt, angle0 - angle1, 5000.0), 0.0, 0.0, 0.0);                    pline.AddVertexAt(2, Polar(pt, angle0 + angle1, 5000.0), 0.0, 0.0, 0.0);                    pline.Closed = true;                     // transform the polyline                    pline.Elevation = center.Z;                    pline.TransformBy(Matrix3d.Rotation(angle2, normal.CrossProduct(Vector3d.ZAxis), center));                     // project the polyline to XY plane                    var plane = new Plane();                    using (var flattenPline = new Polyline(3))                    {                        flattenPline.AddVertexAt(0, pline.GetPoint3dAt(0).Convert2d(plane), 0.0, 0.0, 0.0);                        flattenPline.AddVertexAt(1, pline.GetPoint3dAt(1).Convert2d(plane), 0.0, 0.0, 0.0);                        flattenPline.AddVertexAt(2, pline.GetPoint3dAt(2).Convert2d(plane), 0.0, 0.0, 0.0);                        flattenPline.Closed = true;                        flattenPline.Elevation = center.Z;                        var curves = new DBObjectCollection();                         // create a region form the pojected polyline                        curves.Add(flattenPline);                        using (var regions = Region.CreateFromCurves(curves))                        {                            var region = (Region)regions[0];                             // create and extruded solid from region                            using (var solid = new Solid3d())                            {                                solid.Extrude(region, 5000.0, 0.0);                                // slice the solid with the polyline plane                                solid.Slice(pline.GetPlane());                                // add the solid to current space block table record                                curSpace.AppendEntity(solid);                                tr.AddNewlyCreatedDBObject(solid, true);                            }                        }                    }                     // add the polyline to current space block table record                    curSpace.AppendEntity(pline);                    tr.AddNewlyCreatedDBObject(pline, true);                }                tr.Commit();            }        }         public Point2d Polar(Point2d basePoint, double angle, double distance)        {            return new Point2d(                basePoint.X + distance * Math.Cos(angle),                basePoint.Y + distance * Math.Sin(angle));        }    }} 

feesa:
it works..
Highly thankful for your Help..

feesa:
Hi,

I have tried the above,
but some time I got the result reverse.
I have attached the dwg.

can you tell pls.

gile:
Just revere the polyline ("window")
Right click > Polyline > Reverse

feesa:
Yes, many thanks
But in coding how could I know that I need to reverse this window?
When user selects the window at that time itself, coding should check weather the window needs to be Reverse.
Thanks & Regards

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version