Sapientino

Use the code below to model a plastic shell like the one in the picture:

int backLayer = model.Layers.Add("Back", Color.DeepPink);
int frontLayer = model.Layers.Add("Front", Color.LightPink);
int screenLayer = model.Layers.Add("Screen", Color.White);


// Creates the back surfaces

double taperAngle = Utility.DegToRad(2);
const double halfPI = Math.PI / 2;

List<Entity> backList = new List<Entity>();

CompositeCurve lateral1SweepRail = new CompositeCurve(new Line(0, -4, 120, -4), new Arc(120, -20, 0, 16, halfPI, 0), 
new Line(136, -20, 136, -180), new Arc(120, -180, 0, 16, 0, -halfPI), new Line(120, -196, 0, -196)); CompositeCurve lateral2SweepRail = new CompositeCurve(new Line(0, -12, 120, -12), new Arc(120, -20, 0, 8, halfPI, 0),
new Line(128, -20, 128, -180), new Arc(120, -180, 0, 8, 0, -halfPI), new Line(120, -188, 0, -188)); Arc a1 = new Arc(Plane.YZ, new Point2D(-4, -4), 4, taperAngle, halfPI); Arc a2 = new Arc(Plane.YZ, new Point2D(-12, -4), 4, halfPI, Math.PI - taperAngle); Line l1 = new Line(0, +5, 0, -196); Surface s1 = l1.ExtrudeAsSurface(150, 0, 0)[0]; s1.TrimBy(lateral2SweepRail, true); s1.TrimBy(lateral1SweepRail, false); s1.Translate(0, 0, 30); backList.Add(s1); Vector3D v1 = new Vector3D(0, taperAngle, -32); Line lvert1 = new Line(a1.StartPoint, a1.StartPoint + v1); Vector3D v2 = new Vector3D(0, -taperAngle, -32); Line lvert2 = new Line(a2.EndPoint, a2.EndPoint + v2); CompositeCurve lateral1Section = new CompositeCurve(a1, lvert1); CompositeCurve lateral2Section = new CompositeCurve(a2, lvert2); Surface[] lateral1 = lateral1Section.SweepAsSurface(lateral1SweepRail, 0.1); Surface[] lateral2 = lateral2Section.SweepAsSurface(lateral2SweepRail, 0.1); foreach (Surface surf in lateral1) surf.Translate(0, 0, 30); foreach (Surface surf in lateral2) surf.Translate(0, 0, 30); backList.AddRange(lateral1); backList.AddRange(lateral2);
// Creates the composite curve for the Sweep of the base Point3D center1 = new Point3D(126, -20, 0); double radius1 = 36; Vector3D v = new Vector3D(0, -160, 0); Point3D center2 = center1 + v; double radius = 240; Arc arc1 = new Arc(center1, radius1 + radius, -halfPI, halfPI); Arc arc2 = new Arc(center2, radius1 + radius, -halfPI, Utility.DegToRad(80)); Point3D[] center3 = Curve.Intersection(arc1, arc2, 0.1); Point2D center1_proj = Plane.XY.Project(center1); Point2D center2_proj = Plane.XY.Project(center2); Point2D center3_proj = Plane.XY.Project(center3[0]); Vector2D vt = Vector2D.Subtract(center3_proj, center1_proj); Vector2D vt3 = Vector2D.Subtract(center3_proj, center2_proj); double startangle1 = vt.Angle; double startangle2 = vt3.Angle; double myDelta = 460; Point3D center = new Point3D(0, -300 - myDelta, 0); Vector3D centerDifferenceVect = Vector3D.Subtract(center1, center); double bigArcRadius = centerDifferenceVect.Length + radius1; centerDifferenceVect.Normalize(); double bigArcAngle = Vector3D.AngleBetween(centerDifferenceVect, Vector3D.AxisY); Arc bigArc1 = new Arc(Plane.XY, center, bigArcRadius, halfPI - bigArcAngle, halfPI); arc1 = new Arc(Plane.XY, center1, radius1, startangle1, halfPI - bigArcAngle); center = new Point3D(0, -350 - myDelta, 0); centerDifferenceVect = Vector3D.Subtract(center2, center); bigArcRadius = centerDifferenceVect.Length - radius1; centerDifferenceVect.Normalize(); bigArcAngle = Vector3D.AngleBetween(centerDifferenceVect, Vector3D.AxisX); Arc bigArc2 = new Arc(Plane.XY, center, bigArcRadius, bigArcAngle, halfPI); arc2 = new Arc(center2, radius1, -Math.PI + bigArcAngle, startangle2); Point2D arc1Start_proj = Plane.XY.Project(arc1.StartPoint); Point2D arc2End_proj = Plane.XY.Project(arc2.EndPoint); Vector2D diff1 = Vector2D.Subtract(arc1Start_proj, center3_proj); double startangle = diff1.Angle; Vector2D diff2 = Vector2D.Subtract(arc2End_proj, center3_proj); double angle = Vector2D.SignedAngleBetween(diff1, diff2); Arc arc3 = new Arc(center3[0], radius, startangle, startangle + angle); CompositeCurve lowerBaseSweepRail = new CompositeCurve(bigArc2, bigArc1, arc1, arc3, arc2);
// Creates the lower surfaces Arc section = new Arc(Plane.YZ, new Point2D(0, -10), 10, 0, halfPI); // to get outwards pointing normals section.Reverse(); section.Translate(0, bigArc1.Radius + bigArc1.Center.Y, 0); Surface[] lowerBase = section.SweepAsSurface(lowerBaseSweepRail, 0.1); foreach (Surface item in lowerBase) { item.Rotate(-Utility.DegToRad(5), Vector3D.AxisX, new Point3D(0, 0, 0)); item.ReverseU(); } Line ln = new Line(new Point3D(0, 40, 0), new Point3D(0, -250, 0)); Surface baseplane = ln.ExtrudeAsSurface(200, 0, 0)[0]; baseplane.TrimBy(lowerBaseSweepRail, false); baseplane.Rotate(-Utility.DegToRad(5), Vector3D.AxisX, new Point3D(0, 0, 0)); Surface baseplaneClone = (Surface)baseplane.Clone(); Surface.Trim(lateral2, new Surface[] { baseplane }, 0.01, true, false); Surface.Trim(lateral1, new Surface[] { baseplaneClone }, 0.01, true, false); backList.AddRange(lowerBase); backList.Add(baseplane); backList.Add(baseplaneClone); // Creates the front surfaces List<Entity> frontList = new List<Entity>(); section.TransformBy(new Mirror(Plane.XY)); frontList.AddRange(section.SweepAsSurface(lowerBaseSweepRail, 0.1)); Surface upperPlane = ln.ExtrudeAsSurface(200, 0, 0)[0]; upperPlane.ReverseU(); upperPlane.TrimBy(lowerBaseSweepRail, false); frontList.Add(upperPlane); LinearPath upperHoleProfile = new LinearPath(); upperHoleProfile.Vertices = new Point3D[] { new Point3D(0, -4, 0), new Point3D(136, -4, 0), new Point3D(136, -196, 0), new Point3D(0, -196, 0) }; upperPlane.TrimBy(upperHoleProfile, true); frontList.AddRange(upperHoleProfile.ExtrudeAsSurface(0, 0, 5)); // Adjusts front surface positions foreach (Entity e in frontList) { e.Translate(0, 0, -20); e.Rotate(-Utility.DegToRad(5), Vector3D.AxisX, new Point3D(0, 0, 0)); } // Flips the entire model upside-down and adds a mirrored copy of each one to the entities collection Transformation rotation = new Transformation(); rotation.Rotation(Math.PI, Vector3D.AxisY); Mirror mirror = new Mirror(Plane.YZ); int count = backList.Count; for (int i = 0; i < count; i++) { backList[i].TransformBy(rotation); Entity e = (Entity)backList[i].Clone(); e.TransformBy(mirror); backList.Add(e); } count = frontList.Count; for (int i = 0; i < count; i++) { frontList[i].TransformBy(rotation); Entity e = (Entity)frontList[i].Clone(); e.TransformBy(mirror); frontList.Add(e); } // Adds the entities to the model foreach (Entity entity in backList) { entity.Translate(0, 0, 30); model.Entities.Add(entity, backLayer); } foreach (Entity entity in frontList) { entity.Translate(0, 0, 30); model.Entities.Add(entity, frontLayer); }
// Adds the white screen planar surface Surface screenSurf = Surface.CreatePlanar(Plane.XY, new Point3D(-136, -196, 0), new Point3D(136, -4, 0)); screenSurf.Translate(0, 0, 15); screenSurf.Rotate(Utility.DegToRad(5), Vector3D.AxisX, new Point3D(0, 0, 0)); screenSurf.Translate(0, 0, 30); model.Entities.Add(screenSurf, screenLayer);
Was this article helpful?
0 out of 0 found this helpful

Comments

0 comments

Please sign in to leave a comment.

Articles in this section