C# with AutoCAD


Hi all C# lovers,
Recently, I did a project for Govt. PSU which involved using AutoCAD with C# and I found it very interesting. 
I am very eager to share it with you.

This article shows how to use AutoCAD objects in a .NET application using C#.

Introduction:

AutoCAD 2004 software, is the industry-standard design tool for 2D drafting and detailing, and for 3D work. It provides native DWG compatibility, plus the ability to personalize the software or add third-party applications for your specific design requirements. It features new and enhanced productivity tools, presentation graphics, CAD standards, and more for faster, easier data creation and sharing.

For many CAD designer, drawing the design from scratch is very tedious. Like every time they have to draw some lines, circles, donuts, text etc... for every new project. To eliminate this repetitive work AutoCAD has provided its managed dlls to access its functionality. We can use VBA, VB.NET or C# to draw AutoCAD objects and access AutoCAD functions.

As I am a C# programmer, I will show how can we write C# code to access AutoCAD and draw some objects: -

Let's Code:

First of all add AutoCAD's reference to your project (I have attached a demo project with this article), because with out this reference you can access AutoCAD's functionality.

Now we will create an instance of AutoCAD application & open a document, then we will create some layers and load some types that will be used later in the project.

using System; 

using System.Collections.Generic; 

using System.Text; 

using System.Diagnostics; 

using System.Windows.Forms; 

using AutoCAD;

 

        public static AcadApplication gbl_app; 

        public static AcadDocument gbl_doc; 

        public static AcadModelSpaceClass gbl_modSpace; 

        public static AcadAcCmColor gbl_color; 

        public static double gbl_pi = 3.14159; 

        public static AcadLayer TerminalsLayer; //Layer For Donuts 

        public static AcadLayer SwitchLayer; 

        public static AcadLayer TerminationPoints; //Layer Termination Points 

public static void CreateAutoCADObject() 

        { 

            try 

            { 

                CloseAllInstance(); // this method is used to close any opened instance of autocad, if you dont require it then comment it 

                gbl_app = new AcadApplication(); 

                gbl_doc = gbl_app.ActiveDocument; 

                gbl_app.Application.Visible = true; 

                gbl_modSpace = (AcadModelSpaceClass)gbl_doc.ModelSpace; 

                gbl_doc.Linetypes.Load("HIDDEN", "acad.lin"); 

                gbl_doc.Linetypes.Load("CENTER", "acad.lin"); 

                //Other Objects Layer 

                SwitchLayer = PF.gbl_doc.Layers.Add("Switch110Layer"); 

                SwitchLayer.color = AutoCAD.AcColor.acGreen; 

                PF.gbl_doc.ActiveLayer = SwitchLayer; 

                //Layer For Donuts 

                TerminalsLayer = PF.gbl_doc.Layers.Add("TerminalsLayer"); 

                TerminalsLayer.color = AutoCAD.AcColor.acRed; 

                //Layer Termination Points 

                TerminationPoints = PF.gbl_doc.Layers.Add("TerminationPoints"); 

                TerminationPoints.color = AutoCAD.AcColor.acWhite; 

            } 

            catch (Exception ex) 

            { 

                MessageBox.Show(ex.Message); 

            } 

        }

        public static void CloseAllInstance() 

        { 

            Process[] aCAD =Process.GetProcessesByName("acad"); 

            foreach (Process aCADPro in aCAD)

            { 

                aCADPro.CloseMainWindow(); 

            } 

        }

Now we will write some methods to create AutoCAD objects:

 

To Draw Line:

 

        public static void DrawLine(double StartX1, 

                                    double StartY1, 

                                    double EndX2, 

                                    double EndY2, 

                                    string LineType, 

                                    bool DrawDonutsOnLineStart, 

                                    bool DrawDonutsOnLineEnds) 

        { 

            AcadLine lineObj; 

            double[] startPoint = new double[3]; 

            double[] endPoint = new double[3]; 

            startPoint[0] = StartX1; 

            startPoint[1] = StartY1; 

            startPoint[2] = 0.0; 

            endPoint[0] = EndX2; 

            endPoint[1] = EndY2; 

            endPoint[2] = 0.01; 

            lineObj = gbl_doc.ModelSpace.AddLine(startPoint, endPoint); 

            if (LineType.Length > 0) 

            { 

                lineObj.Linetype = LineType; //'"HIDDEN" 

                lineObj.LinetypeScale = 10; 

                lineObj.Update(); 

            } 

            if (DrawDonutsOnLineStart == true) 

            { 

                DrawDonut((AcadBlock)gbl_doc.ModelSpace, 0, 3.0, StartX1, StartY1); 

            } 

            if (DrawDonutsOnLineEnds == true) 

            { 

                DrawDonut((AcadBlock)gbl_doc.ModelSpace, 0, 3.0, EndX2, EndY2); 

            } 

            gbl_app.ZoomAll(); 

        } 

         public static void DrawLine(double StartX1, 

                                    double StartY1, 

                                    double EndX2, 

                                    double EndY2) 

        { 

            DrawLine(StartX1, StartY1, EndX2, EndY2, "", false, false); 

        } 

        public static void DrawLine(double StartX1, 

                                    double StartY1, 

                                    double EndX2, 

                                    double EndY2, 

                                    string LineType) 

        { 

            DrawLine(StartX1, StartY1, EndX2, EndY2, LineType, false, false); 

        } 

        public static void DrawLine(double StartX1, 

                                    double StartY1, 

                                    double EndX2, 

                                    double EndY2, 

                                    string LineType, 

                                    bool DrawDonutsOnLineStart) 

        { 

            DrawLine(StartX1, StartY1, EndX2, EndY2, LineType, DrawDonutsOnLineStart, false); 

        }

 

To Draw Solid:

 

        public static void DrawSolid(double StartingXPoint, 

                                        double StartingYPoint, 

                                        double Length, 

                                        double Width) 

        { 

            AcadSolid solidObj; 

            double[] point1 = new double[3]; 

            double[] point2 = new double[3]; 

            double[] point3 = new double[3]; 

            double[] point4 = new double[3]; 

            //Solid Starts 

            point1[0] = StartingXPoint; 

            point1[1] = StartingYPoint; 

            point1[2] = 0.0; 

            point2[0] = StartingXPoint;

            point2[1] = (StartingYPoint) - Width; 

            point2[2] = 0.0; 

            point3[0] = StartingXPoint + Length; 

            point3[1] = StartingYPoint; 

            point3[2] = 0.0; 

            point4[0] = StartingXPoint + Length; 

            point4[1] = (StartingYPoint) - Width; 

            point4[2] = 0.0; 

            solidObj = gbl_doc.ModelSpace.AddSolid(point1, point2, point3, point4); 

            //Solid ENDS 

        }

 

To Draw Text:

 

        public static void DrawText(double StartingXPoint, 

                                    double StartingYPoint, 

                                    string textString, 

                                    double Height, 

                                    double Rotation) 

        { 

            AcadText textObj; 

            double[] insertionPoint = new double[3]; 

            insertionPoint[0] = StartingXPoint; 

            insertionPoint[1] = StartingYPoint; 

            insertionPoint[2] = 0.0; 

            textObj = gbl_doc.ModelSpace.AddText(textString, insertionPoint, Height); 

            textObj.Alignment = AcAlignment.acAlignmentLeft; 

            textObj.Backward = false; 

            textObj.Rotation = Rotation; 

        } 

        public static void DrawText(double StartingXPoint, 

                            double StartingYPoint, 

                            string textString) 

        { 

            DrawText(StartingXPoint, StartingYPoint, textString, 3, 0); 

        } 

        public static void AddText(double StartingXPoint, 

                                    double StartingYPoint, 

                                    string textString, 

                                    double Height) 

        { 

            DrawText(StartingXPoint, StartingYPoint, textString, Height, 0); 

        }

 

To Draw Circle:

 

        public static void DrawCircle(double StartingXPoint, 

                                    double StartingYPoint, 

                                    double Radius) 

        { 

            AcadCircle circleObj; 

            double[] centerPoint = new double[3]; 

            centerPoint[0] = StartingXPoint; 

            centerPoint[1] = StartingYPoint; 

            centerPoint[2] = 0.0; 

            circleObj = gbl_doc.ModelSpace.AddCircle(centerPoint, Radius); 

        }

 

To Draw Arc:

 

        public static void DrawArc(double StartingXPoint, 

                                    double StartingYPoint, 

                                    double Radius) 

        { 

            //For Drawing Arc 

            AcadArc arcObj; 

            AcadCircle circleObj; 

            double[] centerPoint = new double[3]; 

            double startAngleInDegree; 

            double endAngleInDegree; 

            double startAngleInRadian; 

            double endAngleInRadian; 

            //Draw Arc 

            centerPoint[0] = StartingXPoint; 

            centerPoint[1] = StartingYPoint; 

            startAngleInDegree = 175.0; 

            endAngleInDegree = 5.0; 

            startAngleInRadian = startAngleInDegree * 3.141592 / 180.0; 

            endAngleInRadian = endAngleInDegree * 3.141592 / 180.0; 

            arcObj = gbl_doc.ModelSpace.AddArc(centerPoint, Radius, 

            startAngleInRadian, endAngleInRadian); 

        }

 

To Draw Donuts:

 

        public static AcadLWPolyline DrawDonut(AcadBlock space, 

                                                double inRad, 

                                                double outRad, 

                                                double cenPt1, 

                                                double cenPt2) 

        { 

            double width, radius, PI; 

            double[] tmp = new double[2]; 

            double[] v = new double[4]; 

            AcadLWPolyline pl; 

            double[] basePnt = new double[3]; 

            try 

            {

                //Switch to terminals layer 

                gbl_doc.ActiveLayer = TerminalsLayer; 

                basePnt[0] = cenPt1; 

                basePnt[1] = cenPt2; 

                basePnt[2] = 0.0; 

                PI = Math.Atan(1) * 4; 

                width = (outRad - inRad) / 2; 

                radius = (inRad + width) / 2; 

                tmp = (double[])gbl_doc.Utility.PolarPoint(basePnt, PI, radius); 

                v[0] = tmp[0]; 

                v[1] = tmp[1]; 

                tmp = (double[])gbl_doc.Utility.PolarPoint(basePnt, 0, radius); 

                v[2] = tmp[0]; 

                v[3] = tmp[1]; 

                pl = space.AddLightWeightPolyline(v); 

                pl.Closed = true; 

                pl.SetWidth(0, width, width); 

                pl.SetBulge(0, -1); 

                pl.SetWidth(1, width, width); 

                pl.SetBulge(1, -1); 

                //Switch to other layer 

                gbl_doc.ActiveLayer = SwitchLayer;

                return pl; 

            } 

            catch (Exception ex) 

            { 

                MessageBox.Show(ex.Message); 

                return null; 

            } 

        }

 

I have provided a demo application with this article which uses these public static functions to draw a device(I will not reveal the name because of our agreement) with minimal of code.

 

This is my first article in this site so your valuable suggestions are welcome.