public void PythonTraverseFeatures_for_collshapes(Component2 swComp, long nLevel, ref string asciitext, int nbody, ref MathTransform chbodytransform, ref bool found_collisionshapes, Component2 swCompBase)
{
CultureInfo bz = new CultureInfo("en-BZ");
Feature swFeat;
swFeat = (Feature)swComp.FirstFeature();
String bodyname = "body_" + nbody;
MathTransform subcomp_transform = swComp.GetTotalTransform(true);
MathTransform invchbody_trasform = (MathTransform)chbodytransform.Inverse();
MathTransform collshape_subcomp_transform = subcomp_transform.IMultiply(invchbody_trasform); // row-ordered transf. -> reverse mult.order!
// Export collision shapes
if (this.checkBox_collshapes.Checked)
{
object[] bodies;
object bodyInfo;
bodies = (object[])swComp.GetBodies3((int)swBodyType_e.swAllBodies, out bodyInfo);
if (bodies != null)
{
// see if it contains some collision shape
bool build_collision_model = false;
for (int ib = 0; ib < bodies.Length; ib++)
{
Body2 swBody = (Body2)bodies[ib];
if (swBody.Name.StartsWith("COLL."))
build_collision_model = true;
}
if (build_collision_model)
{
if (!found_collisionshapes)
{
found_collisionshapes = true;
// fetch SW attribute with Chrono parameters
SolidWorks.Interop.sldworks.Attribute myattr = (SolidWorks.Interop.sldworks.Attribute)swCompBase.FindAttribute(this.mSWintegration.defattr_chbody, 0);
if (myattr != null)
{
asciitext += "\n# Collision parameters \n";
double param_friction = ((Parameter)myattr.GetParameter("friction")).GetDoubleValue();
double param_restitution = ((Parameter)myattr.GetParameter("restitution")).GetDoubleValue();
double param_rolling_friction = ((Parameter)myattr.GetParameter("rolling_friction")).GetDoubleValue();
double param_spinning_friction = ((Parameter)myattr.GetParameter("spinning_friction")).GetDoubleValue();
double param_collision_envelope = ((Parameter)myattr.GetParameter("collision_envelope")).GetDoubleValue();
double param_collision_margin = ((Parameter)myattr.GetParameter("collision_margin")).GetDoubleValue();
int param_collision_family = (int)((Parameter)myattr.GetParameter("collision_family")).GetDoubleValue();
asciitext += String.Format(bz, "{0}.SetFriction({1:g});\n", bodyname, param_friction);
if (param_restitution != 0)
asciitext += String.Format(bz, "{0}.SetImpactC({1:g});\n", bodyname, param_restitution);
if (param_rolling_friction != 0)
asciitext += String.Format(bz, "{0}.SetRollingFriction({1:g});\n", bodyname, param_rolling_friction);
if (param_spinning_friction != 0)
asciitext += String.Format(bz, "{0}.SetSpinningFriction({1:g});\n", bodyname, param_spinning_friction);
//if (param_collision_envelope != 0.03)
asciitext += String.Format(bz, "{0}.GetCollisionModel().SetEnvelope({1:g});\n", bodyname, param_collision_envelope * ChScale.L);
//if (param_collision_margin != 0.01)
asciitext += String.Format(bz, "{0}.GetCollisionModel().SetSafeMargin({1:g});\n", bodyname, param_collision_margin * ChScale.L);
if (param_collision_family != 0)
asciitext += String.Format(bz, "{0}.GetCollisionModel().SetFamily({1});\n", bodyname, param_collision_family);
}
// clear model only at 1st subcomponent where coll shapes are found in features:
asciitext += "\n# Collision shapes \n";
asciitext += String.Format(bz, "{0}.GetCollisionModel().ClearModel()\n", bodyname);
}
for (int ib = 0; ib < bodies.Length; ib++)
{
Body2 swBody = (Body2)bodies[ib];
if (swBody.Name.StartsWith("COLL."))
{
bool rbody_converted = false;
if (ConvertToCollisionShapes.SWbodyToSphere(swBody))
{
Point3D center_l = new Point3D(); // in local subcomponent
double rad = 0;
ConvertToCollisionShapes.SWbodyToSphere(swBody, ref rad, ref center_l);
Point3D center = SWTaskpaneHost.PointTransform(center_l, ref collshape_subcomp_transform);
asciitext += String.Format(bz, "{0}.GetCollisionModel().AddSphere({1}, chrono.ChVectorD({2},{3},{4}))\n", bodyname,
rad * ChScale.L,
center.X * ChScale.L,
center.Y * ChScale.L,
center.Z * ChScale.L);
rbody_converted = true;
}
if (ConvertToCollisionShapes.SWbodyToBox(swBody))
{
Point3D vC_l = new Point3D();
Vector3D eX_l = new Vector3D(); Vector3D eY_l = new Vector3D(); Vector3D eZ_l = new Vector3D();
ConvertToCollisionShapes.SWbodyToBox(swBody, ref vC_l, ref eX_l, ref eY_l, ref eZ_l);
Point3D vC = SWTaskpaneHost.PointTransform(vC_l, ref collshape_subcomp_transform);
Vector3D eX = SWTaskpaneHost.DirTransform(eX_l, ref collshape_subcomp_transform);
Vector3D eY = SWTaskpaneHost.DirTransform(eY_l, ref collshape_subcomp_transform);
Vector3D eZ = SWTaskpaneHost.DirTransform(eZ_l, ref collshape_subcomp_transform);
double hsX = eX.Length * 0.5;
double hsY = eY.Length * 0.5;
double hsZ = eZ.Length * 0.5;
Point3D vO = vC + 0.5 * eX + 0.5 * eY + 0.5 * eZ;
Vector3D Dx = eX; Dx.Normalize();
Vector3D Dy = eY; Dy.Normalize();
Vector3D Dz = Vector3D.CrossProduct(Dx, Dy);
asciitext += String.Format(bz, "mr = chrono.ChMatrix33D()\n");
asciitext += String.Format(bz, "mr[0,0]={0}; mr[1,0]={1}; mr[2,0]={2} \n", Dx.X, Dx.Y, Dx.Z);
asciitext += String.Format(bz, "mr[0,1]={0}; mr[1,1]={1}; mr[2,1]={2} \n", Dy.X, Dy.Y, Dy.Z);
asciitext += String.Format(bz, "mr[0,2]={0}; mr[1,2]={1}; mr[2,2]={2} \n", Dz.X, Dz.Y, Dz.Z);
asciitext += String.Format(bz, "{0}.GetCollisionModel().AddBox({1},{2},{3},chrono.ChVectorD({4},{5},{6}),mr)\n", bodyname,
hsX * ChScale.L,
hsY * ChScale.L,
hsZ * ChScale.L,
vO.X * ChScale.L,
vO.Y * ChScale.L,
vO.Z * ChScale.L);
rbody_converted = true;
}
if (ConvertToCollisionShapes.SWbodyToCylinder(swBody))
{
Point3D p1_l = new Point3D();
Point3D p2_l = new Point3D();
double rad = 0;
ConvertToCollisionShapes.SWbodyToCylinder(swBody, ref p1_l, ref p2_l, ref rad);
Point3D p1 = SWTaskpaneHost.PointTransform(p1_l, ref collshape_subcomp_transform);
Point3D p2 = SWTaskpaneHost.PointTransform(p2_l, ref collshape_subcomp_transform);
Vector3D Dy = p1 - p2; Dy.Normalize();
double hsY = (p1 - p2).Length * 0.5;
double hsZ = rad;
double hsX = rad;
Point3D vO = p1 + 0.5 * (p2 - p1);
Vector3D Dx = new Vector3D();
if (Dy.X < 0.9)
{
Vector3D Dtst = new Vector3D(1, 0, 0);
Dx = Vector3D.CrossProduct(Dtst, Dy);
}
else
{
Vector3D Dtst = new Vector3D(0, 1, 0);
Dx = Vector3D.CrossProduct(Dtst, Dy);
}
Vector3D Dz = Vector3D.CrossProduct(Dx, Dy);
asciitext += String.Format(bz, "mr = chrono.ChMatrix33D()\n");
asciitext += String.Format(bz, "mr[0,0]={0}; mr[1,0]={1}; mr[2,0]={2} \n", Dx.X, Dx.Y, Dx.Z);
asciitext += String.Format(bz, "mr[0,1]={0}; mr[1,1]={1}; mr[2,1]={2} \n", Dy.X, Dy.Y, Dy.Z);
asciitext += String.Format(bz, "mr[0,2]={0}; mr[1,2]={1}; mr[2,2]={2} \n", Dz.X, Dz.Y, Dz.Z);
asciitext += String.Format(bz, "{0}.GetCollisionModel().AddCylinder({1},{2},{3},chrono.ChVectorD({4},{5},{6}),mr)\n", bodyname,
hsX * ChScale.L,
hsZ * ChScale.L,
hsY * ChScale.L,
vO.X * ChScale.L,
vO.Y * ChScale.L,
vO.Z * ChScale.L); // note order hsX-Z-Y
rbody_converted = true;
}
if (ConvertToCollisionShapes.SWbodyToConvexHull(swBody, 30) && !rbody_converted)
{
Point3D[] vertexes = new Point3D[1]; // will be resized by SWbodyToConvexHull
ConvertToCollisionShapes.SWbodyToConvexHull(swBody, ref vertexes, 30);
if (vertexes.Length > 0)
{
asciitext += String.Format(bz, "pt_vect = chrono.vector_ChVectorD()\n");
for (int iv = 0; iv < vertexes.Length; iv++)
{
Point3D vert_l = vertexes[iv];
Point3D vert = SWTaskpaneHost.PointTransform(vert_l, ref collshape_subcomp_transform);
asciitext += String.Format(bz, "pt_vect.push_back(chrono.ChVectorD({0},{1},{2}))\n",
vert.X * ChScale.L,
vert.Y * ChScale.L,
vert.Z * ChScale.L);
}
asciitext += String.Format(bz, "{0}.GetCollisionModel().AddConvexHull(pt_vect)\n", bodyname);
}
}
} // end dealing with a collision shape
} // end solid bodies traversal for converting to coll.shapes
} // end if build_collision_model
}
} // end collision shapes export
}