Introduction
This a simple application showing how can we use the power of C# to generate AutoCAD drawings in the fly. This code may or may not be of any use to you, but for me its an adventure. I am using AutoCAD 2004 and C#2005.
In my project i have provided a class named PF (PublicFunctions). It contains many useful functions to create your drawing, like "CreateAutoCADObject()" to create an instance of AutoCAD and open a document. The other functions are used to draw different objects, like "Line", "Text","Circle","Arc",Donuts" etc.
Dont forget to read some important notes given at the end of this article.
The class looks like this: (Source code is provided)
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Windows.Forms;
using AutoCAD;
namespace CADAutomation
{
public static class PF
{
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;
public static AcadLayer SwitchLayer;
public static AcadLayer TerminationPoints;
#region PublicFunctions
public static void CloseAllInstance()
{
Process[] aCAD =
Process.GetProcessesByName("acad");
foreach (Process aCADPro in aCAD)
{
aCADPro.CloseMainWindow();
}
}
public static void CreateAutoCADObject()
{
try
{
CloseAllInstance();
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");
SwitchLayer = PF.gbl_doc.Layers.Add("Switch110Layer");
SwitchLayer.color = AutoCAD.AcColor.acGreen;
PF.gbl_doc.ActiveLayer = SwitchLayer;
TerminalsLayer = PF.gbl_doc.Layers.Add("TerminalsLayer");
TerminalsLayer.color = AutoCAD.AcColor.acRed;
TerminationPoints =
PF.gbl_doc.Layers.Add("TerminationPoints");
TerminationPoints.color = AutoCAD.AcColor.acWhite;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
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;
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);
}
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
{
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);
gbl_doc.ActiveLayer = SwitchLayer;
return pl;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
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];
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);
}
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);
}
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);
}
public static void DrawArc(double StartingXPoint,
double StartingYPoint,
double Radius)
{
AcadArc arcObj;
AcadCircle circleObj;
double[] centerPoint = new double[3];
double startAngleInDegree;
double endAngleInDegree;
double startAngleInRadian;
double endAngleInRadian;
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);
}
public static void DrawTerminationPoint(double StartingXPoint,
double StartingYPoint)
{
gbl_doc.ActiveLayer = TerminationPoints;
DrawCircle(StartingXPoint, StartingYPoint, 1.8);
DrawLine(StartingXPoint - 2.5, StartingYPoint - 4.0,
(StartingXPoint - 2.5) + 4.0,
(StartingYPoint - 4.0) + 7.0);
gbl_doc.ActiveLayer = SwitchLayer;
}
#endregion
}
}
Sorry i dont used much comments, please adjust with that.The sample drawing that i created is a Switch used in electrical drawings. Please, dont forget to give your valuable feedbacks.
Right now i am fighting for a good job in C#. It will be a great help for me if you give me any suggestions.
My email ID: sheelgohe@gmail.com
Mobile no: +919425104898
Plz Note: Add a reference to AutoCAD dll before running this project and AutoCAD 2004 must be installed in your computer.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.