Curve Manipulations
This example provides information on joining curves, projecting a line on a surface, splitting wires, and intersect and trimming curves.
Run the Add-In and go to the Modeling browser tab. The easiest way to see the different bodies is to make them visible one at a time.
Solution
Create a Part object to contain the bodies and add it to the station
Part p = new Part(); p.Name = "My_Curve_Manipulations"; station.GraphicComponents.Add(p);Join the curves
Create two lines (wires)
Body wire1 = Body.CreateLine(new Vector3(0.0, 0.0, 0.0), new Vector3(0.5, 0.5, 0.5)); wire1.Name = "Wire1"; p.Bodies.Add(wire1); Body wire2 = Body.CreateLine(new Vector3(0.0, 0.0, 0.0), new Vector3(-0.5, 0.5, 0.5)); wire2.Name = "Wire2"; p.Bodies.Add(wire2);Create a Wire array with the wires that should be joined
Wire[] wires = new Wire[2] { wire1.Shells[0].Wires[0], wire2.Shells[0].Wires[0] }; Body[] wireUnion = Body.JoinCurves(wires); foreach (Body b in wireUnion) { b.Name = "Wire Array"; p.Bodies.Add(b); }
Project wire on the surface of the cylinder along the X-axis
Use CreateSolidCylinder(Matrix4, double, double)
Matrix4 origin = new Matrix4(new Vector3(Axis.X), 0.0); Body cylinder = Body.CreateSolidCylinder(origin, 0.2, 1); cylinder.Name = "Cylinder"; p.Bodies.Add(cylinder);Create a wire array containing the first wire, and a body array containing the cylinder.
Wire[] wires2 = new Wire[1] { wire1.Shells[0].Wires[0] }; Body[] bodies = new Body[1] { cylinder };Project curve along X-axis
Body[] projection = Body.ProjectCurve(wires2, bodies, Vector3.XVector); foreach (Body b in projection) { b.Name = "Wire1 projected on the cylinders surface along x-axis"; p.Bodies.Add(b); }
Create a semicircle shaped wire
Create a circle
Body circle = Body.CreateCircle(new Matrix4(Vector3.XVector, 0.0), 0.5); circle.Name = "Circle"; p.Bodies.Add(circle);Create a line to intersect the circle with.
Body line = Body.CreateLine(new Vector3(0.5, 0.0, 0.0), new Vector3(-0.5, 0.0, 0.0)); line.Name = "Line"; p.Bodies.Add(line);Join the circle and the line
Wire[] ws = new Wire[2] { circle.Shells[0].Wires[0], line.Shells[0].Wires[0] }; Body[] union = Body.JoinCurves(ws);Get the wire of the union
Wire unionWire = union[0].Shells[0].Wires[0];Get the section to trim
Vector3 sectionSelectionPoint = new Vector3(0.0, -0.5, 0.0); Vector3 firstTrimPoint = new Vector3(-0.5, 0.0, 0.0); Vector3 secondTrimPoint = new Vector3(0.5, 0.0, 0.0);Trim points to array
Vector3[] testPoints = new Vector3[2] { firstTrimPoint, secondTrimPoint }; CurveSection trimSection = unionWire.GetSection(sectionSelectionPoint, testPoints); Body[] trimmedCircle = Body.TrimCurve(unionWire, trimSection); foreach (Body b in trimmedCircle) { b.Name = "Semicircle from cirle and line"; p.Bodies.Add(b); }
Example
This example provides information on joining curves, projecting a line on a surface, splitting wires, and intersect and trimming curves.
Project.UndoContext.BeginUndoStep("BodyCurveManipulations");
try
{
Station station = Station.ActiveStation;
// Create a part to contain the bodies.
Part p = new Part();
p.Name = "My_Curve_Manipulations";
station.GraphicComponents.Add(p);
// Joined curves.
// Create two lines (wires).
Body wire1 = Body.CreateLine(new Vector3(0.0, 0.0, 0.0), new Vector3(0.5, 0.5, 0.5));
wire1.Name = "Wire1";
p.Bodies.Add(wire1);
Body wire2 = Body.CreateLine(new Vector3(0.0, 0.0, 0.0), new Vector3(-0.5, 0.5, 0.5));
wire2.Name = "Wire2";
p.Bodies.Add(wire2);
// Create a wire array with the wires that should be joined.
Wire[] wires = new Wire[2] { wire1.Shells[0].Wires[0], wire2.Shells[0].Wires[0] };
Body[] wireUnion = Body.JoinCurves(wires);
foreach (Body b in wireUnion)
{
b.Name = "Wire Array";
p.Bodies.Add(b);
}
// Create solid cylinder.
Matrix4 origin = new Matrix4(new Vector3(Axis.X), 0.0);
Body cylinder = Body.CreateSolidCylinder(origin, 0.2, 1);
cylinder.Name = "Cylinder";
p.Bodies.Add(cylinder);
// Create a wire array containing the first wire,
// and a body array containing the cylinder.
Wire[] wires2 = new Wire[1] { wire1.Shells[0].Wires[0] };
Body[] bodies = new Body[1] { cylinder };
// Project wire1 on the surface of the cylinder along the X-axis.
Body[] projection = Body.ProjectCurve(wires2, bodies, Vector3.XVector);
foreach (Body b in projection)
{
b.Name = "Wire1 projected on the cylinders surface along x-axis";
p.Bodies.Add(b);
}
// Split wire1 in half.
Body[] splitCurves = Body.SplitCurve(wire1.Shells[0].Wires[0], new Vector3(0.25, 0.25, 0.25));
foreach (Body b in splitCurves)
{
b.Name = "Wire1 split in half";
p.Bodies.Add(b);
}
// Create a semicircle shaped wire.
// Create a circle.
Body circle = Body.CreateCircle(new Matrix4(Vector3.XVector, 0.0), 0.5);
circle.Name = "Circle";
p.Bodies.Add(circle);
// Create a line to intersect the circle with.
Body line = Body.CreateLine(new Vector3(0.5, 0.0, 0.0), new Vector3(-0.5, 0.0, 0.0));
line.Name = "Line";
p.Bodies.Add(line);
// Join the circle and the line.
Wire[] ws = new Wire[2] { circle.Shells[0].Wires[0], line.Shells[0].Wires[0] };
Body[] union = Body.JoinCurves(ws);
// Get the wire of the union.
Wire unionWire = union[0].Shells[0].Wires[0];
// Define points to select the section of the wire for trimming.
Vector3 sectionSelectionPoint = new Vector3(0.0, -0.5, 0.0);
Vector3 firstTrimPoint = new Vector3(-0.5, 0.0, 0.0);
Vector3 secondTrimPoint = new Vector3(0.5, 0.0, 0.0);
// Trim points to array.
Vector3[] testPoints = new Vector3[2] { firstTrimPoint, secondTrimPoint };
CurveSection trimSection = unionWire.GetSection(sectionSelectionPoint, testPoints);
Body[] trimmedCircle = Body.TrimCurve(unionWire, trimSection);
foreach (Body b in trimmedCircle)
{
b.Name = "Semicircle from cirle and line";
p.Bodies.Add(b);
}
}
catch
{
Project.UndoContext.CancelUndoStep(CancelUndoStepType.Rollback);
throw;
}
finally
{
Project.UndoContext.EndUndoStep();
}
Required Namespaces
ABB.Robotics.RobotStudio.Stations