public static void MainPatternSearch_Part(bool EntirePart, ref List <MyGroupingSurface> listOfMyGroupingSurface, List <MyGroupingSurface> listOfInitialGroupingSurface, ref StringBuilder fileOutput, SldWorks mySwApplication) { var listOfOutputPattern = new List <MyPattern>(); //list of output patterns found var listOfOutputPatternTwo = new List <MyPattern>(); //list of output patterns of length 2 found var toleranceOK = true; //it is TRUE if the tolerance level is OK during the paths searching, FALSE otherwise while (listOfMyGroupingSurface.Count > 0 && toleranceOK == true) { MyGroupingSurface currentGroupingSurface; if (!EntirePart) { currentGroupingSurface = new MyGroupingSurface(listOfMyGroupingSurface[0].groupingSurface, listOfMyGroupingSurface[0].listOfREOfGS); } else { currentGroupingSurface = new MyGroupingSurface(listOfMyGroupingSurface[0].KLplanareSurface, listOfMyGroupingSurface[0].listOfREOfGS); } listOfMyGroupingSurface.RemoveAt(0); fileOutput.AppendLine(" "); fileOutput.AppendLine("(Al momento sono rimaste " + listOfMyGroupingSurface.Count + " superfici, compresa questa.)"); PartUtilities.GeometryAnalysis.FindPatternsInGS(currentGroupingSurface, ref fileOutput, ref listOfOutputPattern, ref listOfMyGroupingSurface, ref listOfOutputPatternTwo, ref toleranceOK, listOfInitialGroupingSurface); } //Assigning of id numbers to the found MyPattern //(the id will be used in composed pattern search phase) //At the same time, we draw the pattern centroids ModelDoc2 SwModel = mySwApplication.ActiveDoc; SwModel.ClearSelection2(true); SwModel.Insert3DSketch(); var i = 0; foreach (var pattern in listOfOutputPattern) { pattern.idMyPattern = i; i++; var listOfCentroidsOfPattern = pattern.listOfMyREOfMyPattern.Select(re => re.centroid).ToList(); var patternCentroid = ExtractInfoFromBRep.computeCentroidsOfVertices(listOfCentroidsOfPattern); pattern.patternCentroid = patternCentroid; //SwModel.CreatePoint2(pattern.patternCentroid.x, pattern.patternCentroid.y, pattern.patternCentroid.z); } foreach (var pattern in listOfOutputPatternTwo) { pattern.idMyPattern = i; i++; var listOfCentroidsOfPattern = pattern.listOfMyREOfMyPattern.Select(re => re.centroid).ToList(); var patternCentroid = ExtractInfoFromBRep.computeCentroidsOfVertices(listOfCentroidsOfPattern); pattern.patternCentroid = patternCentroid; //SwModel.CreatePoint2(pattern.patternCentroid.x, pattern.patternCentroid.y, pattern.patternCentroid.z); } //SwModel.InsertSketch(); //Patterns are subdivided in Line patterns and in Circle patterns: var listOfOutputPatternLine = new List <MyPattern>(); var listOfOutputPatternCircum = new List <MyPattern>(); foreach (var pattern in listOfOutputPattern) { if (pattern.pathOfMyPattern.GetType() == typeof(MyLine)) { listOfOutputPatternLine.Add(pattern); } else { listOfOutputPatternCircum.Add(pattern); } } //The results are shown giving color to the model: ColorFace.MyVisualOutput(listOfOutputPatternLine, mySwApplication); ColorFace.MyVisualOutput(listOfOutputPatternCircum, mySwApplication); //The same for patterns of length 2: ColorFace.MyVisualOutput(listOfOutputPatternTwo, mySwApplication); //Build the list of MyGroupingSurfaceForPatterns: var listOfGroupingSurfaceForPatterns = new List <MyGroupingSurfaceForPatterns>(); if (!EntirePart) { foreach (var gs in listOfInitialGroupingSurface) { var listOfPatternsLineForThisGS = listOfOutputPatternLine.FindAll( pattern => pattern.listOfGroupingSurfaces.FindIndex( surface => ExtractInfoFromBRep.MyEqualsSurface(surface, gs.groupingSurface, mySwApplication)) != -1); var listOfPatternsTwoForThisGS = listOfOutputPatternTwo.FindAll( pattern => pattern.listOfGroupingSurfaces.FindIndex( surface => ExtractInfoFromBRep.MyEqualsSurface(surface, gs.groupingSurface, mySwApplication)) != -1); listOfPatternsLineForThisGS.AddRange(listOfPatternsTwoForThisGS); var listOfPatternsCircumForThisGS = listOfOutputPatternCircum.FindAll( pattern => pattern.listOfGroupingSurfaces.FindIndex( surface => ExtractInfoFromBRep.MyEqualsSurface(surface, gs.groupingSurface, mySwApplication)) != -1); if (listOfPatternsLineForThisGS.Count > 1 || listOfPatternsCircumForThisGS.Count > 1) { var newGSForPatterns = new MyGroupingSurfaceForPatterns(gs.groupingSurface, listOfPatternsLineForThisGS, listOfPatternsCircumForThisGS); listOfGroupingSurfaceForPatterns.Add(newGSForPatterns); } } } //>>>>>>>COMPOSED PATTERN SEARCH: List <MyComposedPattern> listOfOutputComposedPattern; List <MyComposedPattern> listOfOutputComposedPatternTwo; PartUtilities_ComposedPatterns.GeometryAnalysis.FindComposedPatterns(listOfGroupingSurfaceForPatterns, out listOfOutputComposedPattern, out listOfOutputComposedPatternTwo, SwModel, mySwApplication, ref fileOutput); ColorFace.MyVisualOutput_ComposedPatterns(listOfOutputComposedPattern, listOfOutputComposedPatternTwo, mySwApplication, SwModel); }
public static void MyVisualOutput_ComposedPatterns(List <MyComposedPattern> listOfOutputComposedPattern, List <MyComposedPattern> listOfOutputComposedPatternTwo, SldWorks mySwApplication, ModelDoc2 SwModel) { SwModel.ClearSelection2(true); //SwModel.Insert3DSketch(); int nOfPatterns = 0; var tolerance = Math.Pow(10, -4); MyVertex headCentroidPattern; MyVertex backCentroidPattern; foreach (var composedPattern in listOfOutputComposedPattern) { nOfPatterns = composedPattern.listOfMyPattern.Count; headCentroidPattern = composedPattern.listOfMyPattern[0].patternCentroid; backCentroidPattern = composedPattern.listOfMyPattern[nOfPatterns - 1].patternCentroid; if (composedPattern.pathOfMyComposedPattern.GetType() == typeof(MyLine)) { SwModel.GetActiveSketch2(); SwModel.CreateLine2(headCentroidPattern.x, headCentroidPattern.y, headCentroidPattern.z, backCentroidPattern.x, backCentroidPattern.y, backCentroidPattern.z); } else //typeof(MyCircumForPath) { var pathObject = (MyCircumForPath)composedPattern.pathOfMyComposedPattern; var circumCenter = pathObject.circumcenter; //SwModel.CreateArc2(pathObject.circumcenter.x, pathObject.circumcenter.y, pathObject.circumcenter.z, // headCentroidPattern.x, headCentroidPattern.y, headCentroidPattern.z, // backCentroidPattern.x, backCentroidPattern.y, backCentroidPattern.z, -1); //o +1? if ( Math.Abs(headCentroidPattern.Distance(backCentroidPattern) - composedPattern.constStepOfMyComposedPattern) < tolerance) { //SwModel.ClearSelection2(true); SwModel.Insert3DSketch(); SwModel.GetActiveSketch2(); SwModel.CreateCircle2(circumCenter.x, circumCenter.y, circumCenter.z, headCentroidPattern.x, headCentroidPattern.y, headCentroidPattern.z); //SwModel.InsertSketch(); } else { //SwModel.ClearSelection2(true); //SwModel.Insert3DSketch(); SwModel.GetActiveSketch2(); SwModel.Create3PointArc(headCentroidPattern.x, headCentroidPattern.y, headCentroidPattern.z, backCentroidPattern.x, backCentroidPattern.y, backCentroidPattern.z, composedPattern.listOfMyPattern[1].patternCentroid.x, composedPattern.listOfMyPattern[1].patternCentroid.y, composedPattern.listOfMyPattern[1].patternCentroid.z); //SwModel.InsertSketch(); } } } foreach (var composedPattern in listOfOutputComposedPatternTwo) { headCentroidPattern = composedPattern.listOfMyPattern[0].patternCentroid; backCentroidPattern = composedPattern.listOfMyPattern[1].patternCentroid; SwModel.GetActiveSketch2(); SwModel.CreateLine2(headCentroidPattern.x, headCentroidPattern.y, headCentroidPattern.z, backCentroidPattern.x, backCentroidPattern.y, backCentroidPattern.z); } SwModel.InsertSketch(); #region esempio linea funzionante //ModelDoc2 SwModel = mySwApplication.ActiveDoc; //SwModel.ClearSelection2(true); //SwModel.Insert3DSketch(); //SwModel.GetActiveSketch2(); //SwModel.CreateLine2(0, 0, 0, 0, 0.1, 0.1); //SwModel.InsertSketch(); #endregion }
//This function prints the detected COMPOSED patterns of components (lines and circles). public static void ShowAndPrintResults_Assembly_ComposedPatterns( List <MyComposedPatternOfComponents> listOfOutputComposedPattern, List <MyComposedPatternOfComponents> listOfOutputComposedPatternTwo, ModelDoc2 SwModel, SldWorks swApplication) { SwModel.ClearSelection2(true); SwModel.Insert3DSketch(); int nOfPatterns; var tolerance = Math.Pow(10, -4); MyVertex headCentroidPattern; MyVertex backCentroidPattern; foreach (var composedPattern in listOfOutputComposedPattern) { nOfPatterns = composedPattern.ListOfMyPatternOfComponents.Count; headCentroidPattern = composedPattern.ListOfMyPatternOfComponents[0].patternCentroid; backCentroidPattern = composedPattern.ListOfMyPatternOfComponents[nOfPatterns - 1].patternCentroid; if (composedPattern.pathOfMyComposedPatternOfComponents.GetType() == typeof(MyLine)) { SwModel.GetActiveSketch2(); SwModel.CreateLine2(headCentroidPattern.x, headCentroidPattern.y, headCentroidPattern.z, backCentroidPattern.x, backCentroidPattern.y, backCentroidPattern.z); } else //typeof(MyCircumForPath) { var pathObject = (MyCircumForPath)composedPattern.pathOfMyComposedPatternOfComponents; var circumCenter = pathObject.circumcenter; if ( Math.Abs(headCentroidPattern.Distance(backCentroidPattern) - composedPattern.constStepOfMyComposedPatternOfComponents) < tolerance) { //SwModel.ClearSelection2(true); //SwModel.Insert3DSketch(); SwModel.GetActiveSketch2(); SwModel.CreateCircle2(circumCenter.x, circumCenter.y, circumCenter.z, headCentroidPattern.x, headCentroidPattern.y, headCentroidPattern.z); //SwModel.InsertSketch(); } else { //SwModel.ClearSelection2(true); //SwModel.Insert3DSketch(); SwModel.GetActiveSketch2(); SwModel.Create3PointArc(headCentroidPattern.x, headCentroidPattern.y, headCentroidPattern.z, backCentroidPattern.x, backCentroidPattern.y, backCentroidPattern.z, composedPattern.ListOfMyPatternOfComponents[1].patternCentroid.x, composedPattern.ListOfMyPatternOfComponents[1].patternCentroid.y, composedPattern.ListOfMyPatternOfComponents[1].patternCentroid.z); //SwModel.InsertSketch(); } } } foreach (var composedPattern in listOfOutputComposedPatternTwo) { headCentroidPattern = composedPattern.ListOfMyPatternOfComponents[0].patternCentroid; backCentroidPattern = composedPattern.ListOfMyPatternOfComponents[1].patternCentroid; SwModel.CreateLine2(headCentroidPattern.x, headCentroidPattern.y, headCentroidPattern.z, backCentroidPattern.x, backCentroidPattern.y, backCentroidPattern.z); } SwModel.InsertSketch(); }