public static bool ConvertMateToPython( ref Feature swMateFeature, ref string asciitext, ref ISldWorks mSWApplication, ref Hashtable saved_parts, ref int num_link, ref MathTransform roottrasf, ref Component2 assemblyofmates ) { if (swMateFeature == null) { return(false); } Mate2 swMate = (Mate2)swMateFeature.GetSpecificFeature2(); if (swMate == null) { return(false); } object foo = null; bool[] suppressedflags; suppressedflags = (bool[])swMateFeature.IsSuppressed2((int)swInConfigurationOpts_e.swThisConfiguration, foo); if (suppressedflags[0] == true) { return(false); } if (swMate.GetMateEntityCount() >= 2) { // Get the mated parts MateEntity2 swEntityA = swMate.MateEntity(0); MateEntity2 swEntityB = swMate.MateEntity(1); Component2 swCompA = swEntityA.ReferenceComponent; Component2 swCompB = swEntityB.ReferenceComponent; double[] paramsA = (double[])swEntityA.EntityParams; double[] paramsB = (double[])swEntityB.EntityParams; // this is needed because parts might reside in subassemblies, and mate params are expressed in parent subassembly MathTransform invroottrasf = (MathTransform)roottrasf.Inverse(); MathTransform trA = roottrasf; MathTransform trB = roottrasf; if (assemblyofmates != null) { MathTransform partrasfA = assemblyofmates.GetTotalTransform(true); if (partrasfA != null) { trA = partrasfA.IMultiply(invroottrasf); // row-ordered transf. -> reverse mult.order! } MathTransform partrasfB = assemblyofmates.GetTotalTransform(true); if (partrasfB != null) { trB = partrasfB.IMultiply(invroottrasf); // row-ordered transf. -> reverse mult.order! } } // Fetch the python names using hash map (python names added when scanning parts) ModelDocExtension swModelDocExt = default(ModelDocExtension); ModelDoc2 swModel = (ModelDoc2)mSWApplication.ActiveDoc; swModelDocExt = swModel.Extension; String name1 = (String)saved_parts[swModelDocExt.GetPersistReference3(swCompA)]; String name2 = (String)saved_parts[swModelDocExt.GetPersistReference3(swCompB)]; // Only constraints between two parts or part & layout can be created if (((name1 != null) || (name2 != null)) && (name1 != name2)) { CultureInfo bz = new CultureInfo("en-BZ"); if (name1 == null) { name1 = "body_0"; } if (name2 == null) { name2 = "body_0"; } // Add some comment in Python, to list the referenced SW items asciitext += "\n# Mate constraint: " + swMateFeature.Name + " [" + swMateFeature.GetTypeName2() + "]" + " type:" + swMate.Type + " align:" + swMate.Alignment + " flip:" + swMate.Flipped + "\n"; for (int e = 0; e < swMate.GetMateEntityCount(); e++) { MateEntity2 swEntityN = swMate.MateEntity(e); Component2 swCompN = swEntityN.ReferenceComponent; String ce_nameN = (String)saved_parts[swModelDocExt.GetPersistReference3(swCompN)]; if (ce_nameN == "") { ce_nameN = "body_0"; // reference assembly } asciitext += "# Entity " + e + ": C::E name: " + ce_nameN + " , SW name: " + swCompN.Name2 + " , SW ref.type:" + swEntityN.Reference.GetType() + " (" + swEntityN.ReferenceType2 + ")\n"; } asciitext += "\n"; // // For each type of SW mate, see which C::E mate constraint(s) // must be created. Some SW mates correspond to more than one C::E constraints. // bool swapAB_1 = false; bool do_CHmate_Xdistance = false; double do_distance_val = 0.0; bool do_CHmate_parallel = false; bool do_parallel_flip = false; bool do_CHmate_orthogonal = false; bool do_CHmate_spherical = false; bool do_CHmate_pointline = false; // to simplify things later... // NOTE: swMate.MateEntity(0).Reference.GetType() seems equivalent to swMate.MateEntity(0).ReferenceType2 // but in some cases the latter fails. /* * bool entity_0_as_FACE = (swMate.MateEntity(0).Reference.GetType() == (int)swSelectType_e.swSelFACES); * bool entity_0_as_EDGE = (swMate.MateEntity(0).Reference.GetType() == (int)swSelectType_e.swSelEDGES) || * (swMate.MateEntity(0).Reference.GetType() == (int)swSelectType_e.swSelSKETCHSEGS) || * (swMate.MateEntity(0).Reference.GetType() == (int)swSelectType_e.swSelDATUMAXES); * bool entity_0_as_VERTEX = (swMate.MateEntity(0).Reference.GetType() == (int)swSelectType_e.swSelVERTICES) || * (swMate.MateEntity(0).Reference.GetType() == (int)swSelectType_e.swSelSKETCHPOINTS) || * (swMate.MateEntity(0).Reference.GetType() == (int)swSelectType_e.swSelDATUMPOINTS); * * bool entity_1_as_FACE = (swMate.MateEntity(1).Reference.GetType() == (int)swSelectType_e.swSelFACES); * bool entity_1_as_EDGE = (swMate.MateEntity(1).Reference.GetType() == (int)swSelectType_e.swSelEDGES) || * (swMate.MateEntity(1).Reference.GetType() == (int)swSelectType_e.swSelSKETCHSEGS) || * (swMate.MateEntity(1).Reference.GetType() == (int)swSelectType_e.swSelDATUMAXES); * bool entity_1_as_VERTEX = (swMate.MateEntity(1).Reference.GetType() == (int)swSelectType_e.swSelVERTICES) || * (swMate.MateEntity(1).Reference.GetType() == (int)swSelectType_e.swSelSKETCHPOINTS) || * (swMate.MateEntity(1).Reference.GetType() == (int)swSelectType_e.swSelDATUMPOINTS); */ // NOTE: swMate.MateEntity(0).Reference.GetType() seems equivalent to swMate.MateEntity(0).ReferenceType2 // but in some cases the latter fails. However, sometimes swMate.MateEntity(0).Reference.GetType() is null ReferenceType2 is ok, // so do the following trick: int entity0_ref = swMate.MateEntity(0).Reference.GetType(); if (entity0_ref == (int)swSelectType_e.swSelNOTHING) { entity0_ref = swMate.MateEntity(0).ReferenceType2; } int entity1_ref = swMate.MateEntity(1).Reference.GetType(); if (entity1_ref == (int)swSelectType_e.swSelNOTHING) { entity1_ref = swMate.MateEntity(1).ReferenceType2; } bool entity_0_as_FACE = (entity0_ref == (int)swSelectType_e.swSelFACES) || (entity0_ref == (int)swSelectType_e.swSelDATUMPLANES); bool entity_0_as_EDGE = (entity0_ref == (int)swSelectType_e.swSelEDGES) || (entity0_ref == (int)swSelectType_e.swSelSKETCHSEGS) || (entity0_ref == (int)swSelectType_e.swSelDATUMAXES); bool entity_0_as_VERTEX = (entity0_ref == (int)swSelectType_e.swSelVERTICES) || (entity0_ref == (int)swSelectType_e.swSelSKETCHPOINTS) || (entity0_ref == (int)swSelectType_e.swSelDATUMPOINTS); bool entity_1_as_FACE = (entity1_ref == (int)swSelectType_e.swSelFACES) || (entity1_ref == (int)swSelectType_e.swSelDATUMPLANES); bool entity_1_as_EDGE = (entity1_ref == (int)swSelectType_e.swSelEDGES) || (entity1_ref == (int)swSelectType_e.swSelSKETCHSEGS) || (entity1_ref == (int)swSelectType_e.swSelDATUMAXES); bool entity_1_as_VERTEX = (entity1_ref == (int)swSelectType_e.swSelVERTICES) || (entity1_ref == (int)swSelectType_e.swSelSKETCHPOINTS) || (entity1_ref == (int)swSelectType_e.swSelDATUMPOINTS); Point3D cA = new Point3D(0, 0, 0); Point3D cB = new Point3D(0, 0, 0); Vector3D dA = new Vector3D(1, 0, 0); Vector3D dB = new Vector3D(1, 0, 0); Point3D cAloc = new Point3D(paramsA[0], paramsA[1], paramsA[2]); cA = SWTaskpaneHost.PointTransform(cAloc, ref trA); Point3D cBloc = new Point3D(paramsB[0], paramsB[1], paramsB[2]); cB = SWTaskpaneHost.PointTransform(cBloc, ref trB); if (!entity_0_as_VERTEX) { Vector3D dAloc = new Vector3D(paramsA[3], paramsA[4], paramsA[5]); dA = SWTaskpaneHost.DirTransform(dAloc, ref trA); } if (!entity_1_as_VERTEX) { Vector3D dBloc = new Vector3D(paramsB[3], paramsB[4], paramsB[5]); dB = SWTaskpaneHost.DirTransform(dBloc, ref trB); } if (swMateFeature.GetTypeName2() == "MateCoincident") { if ((entity_0_as_FACE) && (entity_1_as_FACE)) { do_CHmate_Xdistance = true; do_CHmate_parallel = true; } if ((entity_0_as_EDGE) && (entity_1_as_EDGE)) { do_CHmate_pointline = true; do_CHmate_parallel = true; } if ((entity_0_as_VERTEX) && (entity_1_as_VERTEX)) { do_CHmate_spherical = true; } if ((entity_0_as_VERTEX) && (entity_1_as_EDGE)) { do_CHmate_pointline = true; } if ((entity_0_as_EDGE) && (entity_1_as_VERTEX)) { do_CHmate_pointline = true; swapAB_1 = true; } if ((entity_0_as_VERTEX) && (entity_1_as_FACE)) { do_CHmate_Xdistance = true; } if ((entity_0_as_FACE) && (entity_1_as_VERTEX)) { do_CHmate_Xdistance = true; swapAB_1 = true; } if ((entity_0_as_EDGE) && (entity_1_as_FACE)) { do_CHmate_Xdistance = true; do_CHmate_orthogonal = true; } if ((entity_0_as_FACE) && (entity_1_as_EDGE)) { do_CHmate_Xdistance = true; do_CHmate_orthogonal = true; swapAB_1 = true; } if (swMate.Alignment == (int)swMateAlign_e.swMateAlignANTI_ALIGNED) { do_parallel_flip = true; } } if (swMateFeature.GetTypeName2() == "MateConcentric") { if ((entity_0_as_FACE) && (entity_1_as_FACE)) { do_CHmate_pointline = true; do_CHmate_parallel = true; } if ((entity_0_as_EDGE) && (entity_1_as_EDGE)) { do_CHmate_pointline = true; do_CHmate_parallel = true; } if ((entity_0_as_VERTEX) && (entity_1_as_FACE)) { do_CHmate_pointline = true; } if ((entity_0_as_FACE) && (entity_1_as_VERTEX)) { do_CHmate_pointline = true; swapAB_1 = true; } if ((entity_0_as_EDGE) && (entity_1_as_FACE)) { do_CHmate_pointline = true; do_CHmate_parallel = true; } if ((entity_0_as_FACE) && (entity_1_as_EDGE)) { do_CHmate_pointline = true; do_CHmate_parallel = true; swapAB_1 = true; } if (swMate.Alignment == (int)swMateAlign_e.swMateAlignANTI_ALIGNED) { do_parallel_flip = true; } } if (swMateFeature.GetTypeName2() == "MateParallel") { if ((entity_0_as_FACE) && (entity_1_as_FACE)) { do_CHmate_parallel = true; } if ((entity_0_as_EDGE) && (entity_1_as_EDGE)) { do_CHmate_parallel = true; } if ((entity_0_as_EDGE) && (entity_1_as_FACE)) { do_CHmate_orthogonal = true; } if ((entity_0_as_FACE) && (entity_1_as_EDGE)) { do_CHmate_orthogonal = true; swapAB_1 = true; } if (swMate.Alignment == (int)swMateAlign_e.swMateAlignANTI_ALIGNED) { do_parallel_flip = true; } } if (swMateFeature.GetTypeName2() == "MatePerpendicular") { if ((entity_0_as_FACE) && (entity_1_as_FACE)) { do_CHmate_orthogonal = true; } if ((entity_0_as_EDGE) && (entity_1_as_EDGE)) { do_CHmate_orthogonal = true; } if ((entity_0_as_EDGE) && (entity_1_as_FACE)) { do_CHmate_parallel = true; } if ((entity_0_as_FACE) && (entity_1_as_EDGE)) { do_CHmate_parallel = true; swapAB_1 = true; } if (swMate.Alignment == (int)swMateAlign_e.swMateAlignANTI_ALIGNED) { do_parallel_flip = true; } } if (swMateFeature.GetTypeName2() == "MateDistanceDim") { if ((entity_0_as_FACE) && (entity_1_as_FACE)) { do_CHmate_Xdistance = true; do_CHmate_parallel = true; } if ((entity_0_as_VERTEX) && (entity_1_as_FACE)) { do_CHmate_Xdistance = true; } if ((entity_0_as_FACE) && (entity_1_as_VERTEX)) { do_CHmate_Xdistance = true; swapAB_1 = true; } //***TO DO*** cases of distance line-vs-line and line-vs-vertex and vert-vert. // Those will require another .cpp ChLinkMate specialized class(es). if (swMate.Alignment == (int)swMateAlign_e.swMateAlignANTI_ALIGNED) { do_parallel_flip = true; } // Get the imposed distance value, in SI units string confnames = ""; do_distance_val = swMate.DisplayDimension.GetDimension2(0).IGetSystemValue3((int)swInConfigurationOpts_e.swThisConfiguration, 0, ref confnames); if (swMate.Flipped) { do_distance_val = -do_distance_val; } } //// //// WRITE PYHTON CODE CORRESPONDING TO CONSTRAINTS //// if (do_CHmate_Xdistance) { num_link++; String linkname = "link_" + num_link; asciitext += String.Format(bz, "{0} = chrono.ChLinkMateXdistance()\n", linkname); asciitext += String.Format(bz, "cA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cA.X * ChScale.L, cA.Y * ChScale.L, cA.Z * ChScale.L); asciitext += String.Format(bz, "cB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cB.X * ChScale.L, cB.Y * ChScale.L, cB.Z * ChScale.L); if (!entity_0_as_VERTEX) { asciitext += String.Format(bz, "dA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dA.X, dA.Y, dA.Z); } if (!entity_1_as_VERTEX) { asciitext += String.Format(bz, "dB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dB.X, dB.Y, dB.Z); } // Initialize link, by setting the two csys, in absolute space, if (!swapAB_1) { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cA,cB,dB)\n", linkname, name1, name2); } else { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cB,cA,dA)\n", linkname, name2, name1); } //if (do_distance_val!=0) asciitext += String.Format(bz, "{0}.SetDistance({1})\n", linkname, do_distance_val * ChScale.L * -1); asciitext += String.Format(bz, "{0}.SetName(\"{1}\")\n", linkname, swMateFeature.Name); // Insert to a list of exported items asciitext += String.Format(bz, "exported_items.append({0})\n\n", linkname); } if (do_CHmate_parallel) { if (Math.Abs(Vector3D.DotProduct(dA, dB)) > 0.98) { num_link++; String linkname = "link_" + num_link; asciitext += String.Format(bz, "{0} = chrono.ChLinkMateParallel()\n", linkname); asciitext += String.Format(bz, "cA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cA.X * ChScale.L, cA.Y * ChScale.L, cA.Z * ChScale.L); asciitext += String.Format(bz, "dA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dA.X, dA.Y, dA.Z); asciitext += String.Format(bz, "cB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cB.X * ChScale.L, cB.Y * ChScale.L, cB.Z * ChScale.L); asciitext += String.Format(bz, "dB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dB.X, dB.Y, dB.Z); if (do_parallel_flip) { asciitext += String.Format(bz, "{0}.SetFlipped(True)\n", linkname); } // Initialize link, by setting the two csys, in absolute space, if (!swapAB_1) { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cA,cB,dA,dB)\n", linkname, name1, name2); } else { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cB,cA,dB,dA)\n", linkname, name2, name1); } asciitext += String.Format(bz, "{0}.SetName(\"{1}\")\n", linkname, swMateFeature.Name); // Insert to a list of exported items asciitext += String.Format(bz, "exported_items.append({0})\n\n", linkname); } else { asciitext += "\n# ChLinkMateParallel skipped because directions not parallel! \n"; } } if (do_CHmate_orthogonal) { if (Math.Abs(Vector3D.DotProduct(dA, dB)) < 0.02) { num_link++; String linkname = "link_" + num_link; asciitext += String.Format(bz, "{0} = chrono.ChLinkMateOrthogonal()\n", linkname); asciitext += String.Format(bz, "cA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cA.X * ChScale.L, cA.Y * ChScale.L, cA.Z * ChScale.L); asciitext += String.Format(bz, "dA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dA.X, dA.Y, dA.Z); asciitext += String.Format(bz, "cB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cB.X * ChScale.L, cB.Y * ChScale.L, cB.Z * ChScale.L); asciitext += String.Format(bz, "dB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dB.X, dB.Y, dB.Z); // Initialize link, by setting the two csys, in absolute space, if (!swapAB_1) { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cA,cB,dA,dB)\n", linkname, name1, name2); } else { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cB,cA,dB,dA)\n", linkname, name2, name1); } asciitext += String.Format(bz, "{0}.SetName(\"{1}\")\n", linkname, swMateFeature.Name); // Insert to a list of exported items asciitext += String.Format(bz, "exported_items.append({0})\n\n", linkname); } else { asciitext += "\n# ChLinkMateOrthogonal skipped because directions not orthogonal! \n"; } } if (do_CHmate_spherical) { num_link++; String linkname = "link_" + num_link; asciitext += String.Format(bz, "{0} = chrono.ChLinkMateSpherical()\n", linkname); asciitext += String.Format(bz, "cA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cA.X * ChScale.L, cA.Y * ChScale.L, cA.Z * ChScale.L); asciitext += String.Format(bz, "cB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cB.X * ChScale.L, cB.Y * ChScale.L, cB.Z * ChScale.L); // Initialize link, by setting the two csys, in absolute space, if (!swapAB_1) { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cA,cB)\n", linkname, name1, name2); } else { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cB,cA)\n", linkname, name2, name1); } asciitext += String.Format(bz, "{0}.SetName(\"{1}\")\n", linkname, swMateFeature.Name); // Insert to a list of exported items asciitext += String.Format(bz, "exported_items.append({0})\n\n", linkname); } if (do_CHmate_pointline) { num_link++; String linkname = "link_" + num_link; asciitext += String.Format(bz, "{0} = chrono.ChLinkMateGeneric()\n", linkname); asciitext += String.Format(bz, "{0}.SetConstrainedCoords(False, True, True, False, False, False)\n", linkname); asciitext += String.Format(bz, "cA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cA.X * ChScale.L, cA.Y * ChScale.L, cA.Z * ChScale.L); asciitext += String.Format(bz, "cB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cB.X * ChScale.L, cB.Y * ChScale.L, cB.Z * ChScale.L); if (!entity_0_as_VERTEX) { asciitext += String.Format(bz, "dA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dA.X, dA.Y, dA.Z); } else { asciitext += String.Format(bz, "dA = chrono.VNULL\n"); } if (!entity_1_as_VERTEX) { asciitext += String.Format(bz, "dB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dB.X, dB.Y, dB.Z); } else { asciitext += String.Format(bz, "dB = chrono.VNULL\n"); } // Initialize link, by setting the two csys, in absolute space, if (!swapAB_1) { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cA,cB,dA,dB)\n", linkname, name1, name2); } else { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cB,cA,dB,dA)\n", linkname, name2, name1); } asciitext += String.Format(bz, "{0}.SetName(\"{1}\")\n", linkname, swMateFeature.Name); // Insert to a list of exported items asciitext += String.Format(bz, "exported_items.append({0})\n\n", linkname); } // Now, do some other special mate type that did not fall in combinations // of do_CHmate_pointline, do_CHmate_spherical, etc etc if (swMateFeature.GetTypeName2() == "MateHinge") { // auto flip direction if anti aligned (seems that this is assumed automatically in MateHinge in SW) if (Vector3D.DotProduct(dA, dB) < 0) { dB.Negate(); } // Hinge constraint must be splitted in two C::E constraints: a coaxial and a point-vs-plane num_link++; String linkname = "link_" + num_link; asciitext += String.Format(bz, "{0} = chrono.ChLinkMateCoaxial()\n", linkname); asciitext += String.Format(bz, "cA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cA.X * ChScale.L, cA.Y * ChScale.L, cA.Z * ChScale.L); asciitext += String.Format(bz, "dA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dA.X, dA.Y, dA.Z); asciitext += String.Format(bz, "cB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cB.X * ChScale.L, cB.Y * ChScale.L, cB.Z * ChScale.L); asciitext += String.Format(bz, "dB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dB.X, dB.Y, dB.Z); asciitext += String.Format(bz, "{0}.SetName(\"{1}\")\n", linkname, swMateFeature.Name); // Initialize link, by setting the two csys, in absolute space, asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cA,cB,dA,dB)\n", linkname, name1, name2); // Insert to a list of exported items asciitext += String.Format(bz, "exported_items.append({0})\n", linkname); // NOTE!!! The 'hinge' mate uses 4 references: fetch the two others remaining // and build another C::E link, for point-vs-face mating MateEntity2 swEntityC = swMate.MateEntity(2); MateEntity2 swEntityD = swMate.MateEntity(3); Component2 swCompC = swEntityC.ReferenceComponent; Component2 swCompD = swEntityD.ReferenceComponent; double[] paramsC = (double[])swEntityC.EntityParams; double[] paramsD = (double[])swEntityD.EntityParams; String name3 = (String)saved_parts[swModelDocExt.GetPersistReference3(swCompC)]; String name4 = (String)saved_parts[swModelDocExt.GetPersistReference3(swCompD)]; MathTransform trC = roottrasf; MathTransform trD = roottrasf; if (assemblyofmates != null) { MathTransform partrasfC = assemblyofmates.GetTotalTransform(true); if (partrasfC != null) { trC = partrasfC.IMultiply(invroottrasf); } MathTransform partrasfD = assemblyofmates.GetTotalTransform(true); if (partrasfD != null) { trD = partrasfD.IMultiply(invroottrasf); } } // NOTE: swMate.MateEntity(0).Reference.GetType() seems equivalent to swMate.MateEntity(0).ReferenceType2 // but in some cases the latter fails. However, sometimes swMate.MateEntity(0).Reference.GetType() is null ReferenceType2 is ok, // so do the following trick: int entity2_ref = swMate.MateEntity(2).Reference.GetType(); if (entity2_ref == (int)swSelectType_e.swSelNOTHING) { entity2_ref = swMate.MateEntity(2).ReferenceType2; } int entity3_ref = swMate.MateEntity(3).Reference.GetType(); if (entity3_ref == (int)swSelectType_e.swSelNOTHING) { entity3_ref = swMate.MateEntity(3).ReferenceType2; } bool entity_2_as_VERTEX = (entity2_ref == (int)swSelectType_e.swSelVERTICES) || (entity2_ref == (int)swSelectType_e.swSelSKETCHPOINTS) || (entity2_ref == (int)swSelectType_e.swSelDATUMPOINTS); bool entity_3_as_VERTEX = (entity3_ref == (int)swSelectType_e.swSelVERTICES) || (entity3_ref == (int)swSelectType_e.swSelSKETCHPOINTS) || (entity3_ref == (int)swSelectType_e.swSelDATUMPOINTS); Point3D cC = new Point3D(0, 0, 0); Point3D cD = new Point3D(0, 0, 0); Vector3D dC = new Vector3D(1, 0, 0); Vector3D dD = new Vector3D(1, 0, 0); Point3D cCloc = new Point3D(paramsC[0], paramsC[1], paramsC[2]); cC = SWTaskpaneHost.PointTransform(cCloc, ref trC); Point3D cDloc = new Point3D(paramsD[0], paramsD[1], paramsD[2]); cD = SWTaskpaneHost.PointTransform(cDloc, ref trD); if (!entity_2_as_VERTEX) { Vector3D dCloc = new Vector3D(paramsC[3], paramsC[4], paramsC[5]); dC = SWTaskpaneHost.DirTransform(dCloc, ref trC); } if (!entity_3_as_VERTEX) { Vector3D dDloc = new Vector3D(paramsD[3], paramsD[4], paramsD[5]); dD = SWTaskpaneHost.DirTransform(dDloc, ref trD); } num_link++; linkname = "link_" + num_link; asciitext += String.Format(bz, "{0} = chrono.ChLinkMateXdistance()\n", linkname); asciitext += String.Format(bz, "cA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cC.X * ChScale.L, cC.Y * ChScale.L, cC.Z * ChScale.L); asciitext += String.Format(bz, "dA = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dC.X, dC.Y, dC.Z); asciitext += String.Format(bz, "cB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", cD.X * ChScale.L, cD.Y * ChScale.L, cD.Z * ChScale.L); asciitext += String.Format(bz, "dB = chrono.ChVectorD({0:g},{1:g},{2:g})\n", dD.X, dD.Y, dD.Z); asciitext += String.Format(bz, "{0}.SetName(\"{1}\")\n", linkname, swMateFeature.Name); // Initialize link, by setting the two csys, in absolute space, if (entity_2_as_VERTEX) { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cA,cB,dA)\n", linkname, name3, name4); } else { asciitext += String.Format(bz, "{0}.Initialize({1},{2},False,cA,cB,dB)\n", linkname, name3, name4); } // Insert to a list of exported items asciitext += String.Format(bz, "exported_items.append({0})\n", linkname); return(true); } } } return(false); }