// Define layer names and text size.
const string Dim = "Dimension", DashDot = "DashDot";
const double TextHeight = 8.0;
// Adding different layers
design1.Layers.Add(new Layer(Dim, Color.CornflowerBlue));
design1.Layers[0].LineWeight = 2;
design1.LineTypes.Add(DashDot, new float[] { 10, -2, 2, -2 });
// X and Y axes
Line axisX = new Line(-170, 0, 150, 0);
axisX.LineTypeMethod = colorMethodType.byEntity;
axisX.LineTypeName = DashDot;
design1.Entities.Add(axisX, Dim);
Line axisY = new Line(0, -150, 0, 170);
axisY.LineTypeMethod = colorMethodType.byEntity;
axisY.LineTypeName = DashDot;
design1.Entities.Add(axisY, Dim);
// center circle
Circle centerCircle = new Circle(0, 0, 0, 40);
design1.Entities.Add(centerCircle);
DiametricDim diamDimCC = new DiametricDim(centerCircle, new Point2D(20, 20), TextHeight);
design1.Entities.Add(diamDimCC, Dim);
// screw holes circles
Circle shCircle = new Circle(0, 0, 0, 52);
shCircle.LineTypeMethod = colorMethodType.byEntity;
shCircle.LineTypeName = DashDot;
design1.Entities.Add(shCircle, Dim);
DiametricDim diamDimSC = new DiametricDim(shCircle, new Point2D(-160, -40), TextHeight);
design1.Entities.Add(diamDimSC, Dim);
Circle smallCircle = new Circle(0, 52, 0, 5);
for (int i = 0; i < 6; i++)
{
Circle circle = (Circle)smallCircle.Clone();
circle.Rotate((Math.PI / 3) * i, Vector3D.AxisZ);
design1.Entities.Add(circle);
}
DiametricDim diamDimSmallCircle = new DiametricDim(new Circle(0, -52, 0, 5), new Point2D(-20, 30), TextHeight, Plane.XY);
design1.Entities.Add(diamDimSmallCircle, Dim);
//six composite curve
Arc arc = new Arc(0, 0, 0, 113, (Math.PI / 3), (Math.PI * 2 / 3));
design1.Entities.Add(new Arc(arc.Center, 113, devDept.Geometry.Utility.DegToRad(45), devDept.Geometry.Utility.DegToRad(70)), Dim);
Line line1 = new Line(-45, 113, -45, 0);
Line line2 = new Line(-45, 49, 55, 49);
line2.Rotate(devDept.Geometry.Utility.DegToRad(30), Vector3D.AxisZ, new Point3D(-45, 49));
design1.Entities.Add((Line)line2.Clone(), Dim);
Arc arcFillet1, arcFillet2, arcFillet3;
Curve.Fillet(arc, line1, 9.5, false, false, true, true, out arcFillet1);
Curve.Fillet(arc, line2, 9.5, false, false, true, true, out arcFillet2);
Curve.Fillet(line1, line2, 9.5, false, false, true, true, out arcFillet3);
CompositeCurve compositeCurve = new CompositeCurve(arc, line1, line2, arcFillet1, arcFillet2, arcFillet3);
for (int i = 0; i < 6; i++)
{
CompositeCurve compCurve = (CompositeCurve)compositeCurve.Clone();
compCurve.Rotate((Math.PI / 3) * i, Vector3D.AxisZ);
design1.Entities.Add(compCurve);
}
RadialDim rDim = new RadialDim(arc, new Point2D(65, 145), TextHeight)
{
ArrowsLocation = elementPositionType.Outside,
TrimLeader = true,
CenterMarkSize = 0
};
design1.Entities.Add(rDim, Dim);
Line axisXClone = (Line)axisX.Clone();
AngularDim angDim = new AngularDim(Plane.XY, axisXClone, line2, new Point3D(160, 60, 0), new Point3D(140, 80, 0), TextHeight);
design1.Entities.Add(angDim, Dim);
// arcFillet dimension
Arc copy = (Arc)arcFillet1.Clone();
copy.Rotate(devDept.Geometry.Utility.DegToRad(250), Vector3D.AxisZ, copy.Plane.Origin);
rDim = new RadialDim(copy, new Point2D(-40, 40), TextHeight)
{
ArrowsLocation = elementPositionType.Outside,
TrimLeader = true,
CenterMarkSize = 0
};
design1.Entities.Add(rDim, Dim);
copy = (Arc)arcFillet2.Clone();
copy.Rotate(devDept.Geometry.Utility.DegToRad(280), Vector3D.AxisZ, copy.Plane.Origin);
rDim = new RadialDim(copy, new Point2D(15, 50), TextHeight)
{
ArrowsLocation = elementPositionType.Outside,
TrimLeader = true,
CenterMarkSize = 0
};
design1.Entities.Add(rDim, Dim);
copy = (Arc)arcFillet3.Clone();
copy.Rotate(devDept.Geometry.Utility.DegToRad(180), Vector3D.AxisZ, copy.Plane.Origin);
rDim = new RadialDim(copy, new Point2D(10, 10), TextHeight)
{
ArrowsLocation = elementPositionType.Outside,
TrimLeader = true
};
design1.Entities.Add(rDim, Dim);
design1.Entities.Add(new Arc(copy.Center, 9.5, Math.PI / 2), Dim);
// Draw Teeth
const int teethNumber = 52;
Circle df = new Circle(0, 0, 0, 128);
RadialDim rDim1 = new RadialDim(df, new Point2D(180, -20), TextHeight)
{
ArrowsLocation = elementPositionType.Outside,
TrimLeader = true
};
design1.Entities.Add(rDim1, Dim);
design1.Entities.Add(new Arc(df.Center, 128, -0.15, -0.1), Dim);
Circle d = new Circle(0, 0, 0, 131.5);
rDim1 = new RadialDim(d, new Point2D(145, -100), TextHeight)
{
ArrowsLocation = elementPositionType.Outside,
TrimLeader = true
};
design1.Entities.Add(rDim1, Dim);
design1.Entities.Add(new Arc(d.Center, 131.5, -1, -0.6), Dim);
Circle MR = new Circle(0, 0, 0, 136);
rDim1 = new RadialDim(MR, new Point2D(-160, -70), TextHeight)
{
ArrowsLocation = elementPositionType.Outside,
TrimLeader = true
};
design1.Entities.Add(rDim1, Dim);
design1.Entities.Add(new Arc(MR.Center, 136, -2.75, -0.05), Dim);
// Tooth composed by line1, internalArc, line2, extArc
// calculation of extArc
double rad = devDept.Geometry.Utility.DegToRad(180 - 47.5);
Arc internalArc = new Arc(0, -131.5, 0, 5, devDept.Geometry.Utility.PI_2 - rad / 2, devDept.Geometry.Utility.PI_2 + rad / 2);
rDim1 = new RadialDim(internalArc, new Point2D(60, -40), TextHeight)
{
ArrowsLocation = elementPositionType.Outside,
TrimLeader = true
};
design1.Entities.Add(rDim1, Dim);
design1.Entities.Add(new Arc(internalArc.Center, 5, devDept.Geometry.Utility.DegToRad(-80), devDept.Geometry.Utility.DegToRad(-10)), Dim);
// calculatation of line 1 and 2
Line ln1 = new Line(internalArc.StartPoint, internalArc.StartPoint + internalArc.StartTangent * -20);
Line ln2 = new Line(internalArc.EndPoint, internalArc.EndPoint + internalArc.EndTangent * 20);
AngularDim angDim1 = new AngularDim(Plane.XY,
new Line(internalArc.StartPoint, internalArc.StartPoint + internalArc.StartTangent * -1),
new Line(internalArc.EndPoint, internalArc.EndPoint + internalArc.EndTangent * 1),
new Point3D(0, -180, 0), new Point3D(0, -180, 0), TextHeight);
design1.Entities.Add(angDim1, Dim);
ln1.Reverse();
ln1.TrimBy(MR.IntersectWith(ln1)[0], true);
ln2.TrimBy(MR.IntersectWith(ln2)[0], false);
// calculation of extArc
var nextl1 = (Line)ln1.Clone();
nextl1.Rotate(-devDept.Geometry.Utility.TWO_PI / teethNumber, Vector3D.AxisZ);
var seg = new Segment2D(ln2.EndPoint, nextl1.StartPoint);
var radius = 8;
var h = Math.Sqrt((radius * radius) - ((seg.Length / 2) * (seg.Length / 2)));
var midPoint = seg.MidPoint;
Vector3D vector = Vector3D.Cross(new Vector3D(ln2.EndPoint, nextl1.StartPoint), Vector3D.AxisZ); // vector perpendicular to the segment
vector.Length = h;
var center = midPoint + vector;
Arc extArc = new Arc(Plane.XY, center, nextl1.StartPoint, ln2.EndPoint);
Arc copy1 = (Arc)extArc.Clone();
copy1.Rotate(devDept.Geometry.Utility.TWO_PI / teethNumber * 6, Vector3D.AxisZ);
rDim1 = new RadialDim(copy1, new Point2D(10, -10), TextHeight, Plane.XY)
{
ArrowsLocation = elementPositionType.Outside,
TrimLeader = true
};
design1.Entities.Add(rDim1, Dim);
extArc.Reverse();
CompositeCurve cc = new CompositeCurve(internalArc, ln1, ln2, extArc);
CompositeCurve nextCC = (CompositeCurve)cc.Clone();
nextCC.Rotate((2 * Math.PI / teethNumber), Vector3D.AxisZ);
Arc arcdf = new Arc(new Point3D(0, 0, 0), cc.IntersectWith(df)[1], nextCC.IntersectWith(df)[0]);
for (int i = 0; i < teethNumber; i++)
{
CompositeCurve compCurve = (CompositeCurve)cc.Clone();
Arc arcdfi = (Arc)arcdf.Clone();
compCurve.Rotate((2 * Math.PI / teethNumber) * i, Vector3D.AxisZ);
arcdfi.Rotate((2 * Math.PI / teethNumber) * i, Vector3D.AxisZ);
design1.Entities.Add(compCurve);
design1.Entities.Add(arcdfi);
}
// Linear Dimension
Plane dim1Plane = new Plane(Point3D.Origin, Vector3D.AxisY, -1 * Vector3D.AxisX);//Plane.XY;
design1.Entities.Add(new LinearDim(dim1Plane, new Point2D(0, 160), new Point2D(49, 45), new Point2D(25, 170), TextHeight), Dim);
design1.Entities.Add(new LinearDim(Plane.XY, new Point2D(-45, 49), new Point2D(0, 160), new Point2D(-22, 170), TextHeight), Dim);
// Center figure into frame
const double scale = 0.4;
design1.Entities.Scale(scale);
design1.Entities.Translate(100, 150);
foreach (Entity en in design1.Entities)
{
if (en is Dimension dm)
{
// Restore original measure
dm.LinearScale = 1 / scale;
}
}
design1.Entities.Regen();
DrawFrame();
// Top View
design1.SetView(viewType.Top);
design1.ZoomFit();
Print();
Frame drawing:
void DrawFrame()
{
const double height = 287;
const double width = 200;
const string FrameLayer = "FrameLayer";
design1.Layers.Add(new Layer(FrameLayer));
design1.Layers[FrameLayer].LineWeight = 2;
// Outer box
DrawMainBox(FrameLayer, height, width);
// Boxes with info
DrawInfoBox(FrameLayer, FrameLayer, width);
// Text within info boxes
DrawText("CAD Practice Drawing 132", width);
// Top box with number
DrawNumberBox(132, FrameLayer, FrameLayer, height, width);
}
void DrawMainBox(string frameLayerName, double height, double width)
{
Line line = new(0, height, width, height);
design1.Entities.Add(line, frameLayerName);
line = new Line(0, height, 0, 0);
design1.Entities.Add(line, frameLayerName);
line = new Line(0, 0, width, 0);
design1.Entities.Add(line, frameLayerName);
line = new Line(width, 0, width, height);
design1.Entities.Add(line, frameLayerName);
}
void DrawNumberBox(int number, string frameLayerName, string frameTextLayerName, double height, double width)
{
Line line = new(width - 13, height - 7, width, height - 7);
design1.Entities.Add(line, frameLayerName);
line = new Line(width - 13, height, width - 13, height - 7);
design1.Entities.Add(line, frameLayerName);
Text text = new(width - 6.75, height - 3.5, 0, number.ToString(), 4, devDept.Eyeshot.Entities.Text.alignmentType.MiddleCenter);
design1.Entities.Add(text, frameTextLayerName);
}
private void DrawInfoBox(string frameLayerName, string frameTextLayerName, double width)
{
Line line = new(width - 160, 0, width - 160, 20);
design1.Entities.Add(line, frameLayerName);
line = new Line(width - 160, 20, width, 20);
design1.Entities.Add(line, frameLayerName);
// Using frameTextLayerName to have thinner lines
line = new Line(width - 65, 0, width - 65, 20);
design1.Entities.Add(line, frameTextLayerName);
line = new Line(width - 160, 13, width, 13);
design1.Entities.Add(line, frameTextLayerName);
line = new Line(width - 45, 0, width - 45, 20);
design1.Entities.Add(line, frameTextLayerName);
line = new Line(width - 25, 0, width - 25, 20);
design1.Entities.Add(line, frameTextLayerName);
line = new Line(width - 65, 7, width - 25, 7);
design1.Entities.Add(line, frameTextLayerName);
}
void DrawText(string title, double width)
{
Text text = new(width - 112, 16.5, 0, "Title", 3, devDept.Eyeshot.Entities.Text.alignmentType.MiddleCenter);
design1.Entities.Add(text);
text = new Text(width - 112, 7, 0, title, 4.5, devDept.Eyeshot.Entities.Text.alignmentType.MiddleCenter);
design1.Entities.Add(text);
text = new Text(width - 55, 16.5, 0, "Date", 3, devDept.Eyeshot.Entities.Text.alignmentType.MiddleCenter);
design1.Entities.Add(text);
text = new Text(width - 55, 10, 0, "Design", 3, devDept.Eyeshot.Entities.Text.alignmentType.MiddleCenter);
design1.Entities.Add(text);
text = new Text(width - 55, 3.5, 0, "Check", 3, devDept.Eyeshot.Entities.Text.alignmentType.MiddleCenter);
design1.Entities.Add(text);
text = new Text(width - 12.5, 16.5, 0, "Approve", 3, devDept.Eyeshot.Entities.Text.alignmentType.MiddleCenter);
design1.Entities.Add(text);
}
Printing on A4 paper sheet:
private async void Print()
{
// A4 size in hundredth of inches
PaperSize paperSize = new System.Drawing.Printing.PaperSize("A4", 826, 1169);
design1.PageSetup(true, false, 0, paperSize, false);
// creates printing setting object and customize it
HiddenLinesViewSettingsEx hdlS = new HiddenLinesViewSettingsEx(viewType.Top, design1.Document);
hdlS.KeepEntityLineWeight = true;
// creates paper preview
const double printScaling = 1;
HiddenLinesViewOnPaperPreview hdl = new HiddenLinesViewOnPaperPreview(hdlS, new Size(800, 600), printScaling);
await design1.DoWorkAsync(hdl);
}

Comments
Great article, very useful along with the DraftingDemo sample to get started with 2D drawing. Some features are a bit cumbersome, like linear dimensions. Is there any out-of-the-box function to draw fillings?
What do you mean by "draw fillings"? Hatch patterns?
Fills, not fillings, sorry. Yes, like hatch patterns.
Unfortunately, we don't support them natively, we only manage the import/export in DWG/DXF file formats
Grazie Simone
Is there anyway to change units?
For instance, if we specify dimensions in inch, but want to display in millimeters...
Please sign in to leave a comment.