Sink

Use the following code to model an object like the one in the picture: 

// The geometry is symmetric, so we create only half of it and then we apply a mirror transformation.

// Creation of the curves
List<ICurve> lstFirst = new List<ICurve>();
lstFirst.Add(new Line(new Point3D(0, 400), new Point3D(700, 400)));
lstFirst.Add(new Arc(new Point3D(700, 300), lstFirst.Last().EndPoint, new Point3D(800, 300)));
lstFirst.Add(new Line(lstFirst.Last().EndPoint, new Point3D(800, -300)));
lstFirst.Add(new Arc(new Point3D(700, -300), lstFirst.Last().EndPoint, new Point3D(700, -400)));
lstFirst.Add(new Line(lstFirst.Last().EndPoint, new Point3D(0, -400)));
CompositeCurve cpsFirst = new CompositeCurve(lstFirst);

List<ICurve> lstSecond = new List<ICurve>();
lstSecond.Add(new Arc(Plane.YX, new Point2D(50, 50), 50, Math.PI / 4, Math.PI / 2));
lstSecond.Add(new Line(lstSecond.Last().EndPoint, new Point3D(100, -50)));
lstSecond.Add(new Arc(new Point3D(50, -50), lstSecond.Last().EndPoint, new Point3D(50, -100)));
lstSecond.Add(new Line(lstSecond.Last().EndPoint, new Point3D(-50, -100)));
lstSecond.Add(new Arc(Plane.YX, new Point2D(-50, -50), 50, Math.PI, Math.PI + Math.PI / 4));
CompositeCurve cpsSecond = new CompositeCurve(lstSecond);
cpsSecond.Rotate(3.141592 / 4, new Vector3D(0, 0, 1));
cpsSecond.Translate(new Vector3D(0, -130, 0));

Point3D[] pts1 = cpsFirst.GetPointsByLengthPerSegment(6);
Point3D[] pts2 = cpsSecond.GetPointsByLengthPerSegment(5);
Curve cv1 = Curve.LocalApproximation(pts1, 0.01, out Vector3D[] tangents1);
Curve cv2 = Curve.LocalApproximation(pts2, 0.01, out Vector3D[] tangents2);

// Creation of the surfaces starting from the curves
double h1 = 100;
double h2 = 200;
double r1 = 20;
double r2 = 15;

List<Surface> result = new List<Surface>();
List<Surface> surf1 = new List<Surface>();
List<Surface> surf2 = new List<Surface>();

foreach (ICurve curve in cpsFirst.CurveList)
{
    surf1.AddRange(curve.ExtrudeAsSurface(new Vector3D(0, 0, h1 + 100)));
}
cv1.Translate(new Vector3D(0, 0, h1));
cv1 = (Curve)cv1.Offset(-1, new Vector3D(0, 0, 1), 0.1, false);
cv2.Translate(new Vector3D(0, 0, h2));
surf2.Add(Surface.Loft(new ICurve[] { cv1, cv2 })[0]);

Surface surfTop = Region.CreateRectangle(10000, 10000, true).ConvertToSurface();

Surface[] fillet1;
Surface.Fillet(new Surface[] { surfTop }, surf1, r1, 0.1, false, true, true, true, false, false, out fillet1);

Surface[] fillet2;
Surface.Fillet(surf1, surf2, r2, 0.1, false, true, true, true, true, false, out fillet2);

result.AddRange(fillet1);
result.AddRange(surf1);
result.AddRange(fillet2);
result.AddRange(surf2);

// mirror transformation
int halfCount = result.Count;
Transformation mirror = new Mirror(Plane.YZ);
for (int i = 0; i < halfCount; i++)
{
    Surface clone = (Surface)result[i].Clone();
    clone.TransformBy(mirror);
    result.Add(clone);
}

model.Entities.AddRange(result, Color.Red);
Was this article helpful?
0 out of 0 found this helpful
Have more questions? Submit a request

Comments

0 comments

Please sign in to leave a comment.