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.