public static TriangleMesh Process(TopoDSShape shapeFused) { var result = new TriangleMesh(); var builder = new BRepBuilder(); var comp = new TopoDSCompound(); builder.MakeCompound(comp); BRepMesh.Mesh(shapeFused, 1); var ex = new TopExpExplorer(shapeFused, TopAbsShapeEnum.TopAbs_FACE, TopAbsShapeEnum.TopAbs_SHAPE); while (ex.More) { var shapeResult = new TriangleMesh(); var face = TopoDS.Face(ex.Current); var location = new TopLocLocation(); var facing = BRepTool.Triangulation(face, location); var tab = new TColgpArray1OfPnt(1, facing.NbNodes); // facing.Nodes(tab); var tri = new PolyArray1OfTriangle(1, facing.NbTriangles); // facing.Triangles(tri); var triCount = facing.NbTriangles; var listPoints = new List <Point3D>(); for (var i = 1; i <= triCount; i++) { var trian = tri.Value(i); int index1 = 0, index2 = 0, index3 = 0; trian.Get(ref index1, ref index2, ref index3); var firstPoint = new Point3D(tab.Value(index1)); var secondPoint = new Point3D(tab.Value(index2)); var thirdPoint = new Point3D(tab.Value(index3)); listPoints.Add(firstPoint); listPoints.Add(secondPoint); listPoints.Add(thirdPoint); } shapeResult.Points.Clear(); foreach (var point in listPoints) { shapeResult.Points.Add(point); } shapeResult.Points = GeomUtils.SortAndCompactListPoints(shapeResult.Points); var triangleIndex = 0; var triangleArray = new int[3]; foreach (var point in listPoints) { triangleArray[triangleIndex] = shapeResult.ComputePointId(point); triangleIndex = (triangleIndex + 1) % 3; if (triangleIndex == 0) { shapeResult.AddTriangle(triangleArray); } } ex.Next(); result = result.Combine(shapeResult); } return(result); }
public static gpPln ExtractPlaneFromFaceShape(TopoDSShape targetFace) { var face = TopoDS.Face(targetFace); var surf = BRepTool.Surface(face); var pl = new GeomPlane(new gpAx3()); pl = surf.Convert <GeomPlane>(); //surf.DownCast(ref pl); var faceElementAdaptor = new BRepAdaptorSurface(face, true); //TO DO: Investigate why this is not working Ensure.AreEqual(faceElementAdaptor.GetType, GeomAbsSurfaceType.GeomAbs_Plane); return(pl.Pln); }
public static void DumpShapeInfo(ILog log, TopoDSShape shape) { log.Info("--- Shape Info ---"); var vertexes = GeomUtils.ExtractVertexes(shape); log.InfoFormat("Extracted {0} vertexes", vertexes.Count); foreach (var vertex in vertexes) { var pnt = BRepTool.Pnt(vertex); log.InfoFormat("vertex: {0},{1},{2}", pnt.X, pnt.Y, pnt.Z); } var edges = GeomUtils.ExtractEdges(shape); log.InfoFormat("Extracted {0} edges", edges.Count); var wires = GeomUtils.ExtractWires(shape); log.InfoFormat("Extracted {0} wires", wires.Count); var faces = GeomUtils.ExtractFaces(shape); log.InfoFormat("Extracted {0} faces", faces.Count); log.Info("-------------------"); }
private static void BuildFaceList(TopoDSShape solidShape, SolverGeometricObject solverObject) { var listOfFaces = GeomUtils.ExtractFaces(solidShape); if (listOfFaces.Count <= 0) { return; } foreach (var face in listOfFaces) { var surf = BRepTool.Surface(face); solverObject.Surfaces.Add(new SolverSurface(surf, GeometryType.Face)); // Check if surface is planar var aFaceElementAdaptor = new BRepAdaptorSurface(face, true); var surfaceType = aFaceElementAdaptor.GetType; if (surfaceType != GeomAbsSurfaceType.GeomAbs_Plane) { continue; } GeomPlane pl = surf.Convert <GeomPlane>(); solverObject.Planes.Add(new SolverPlane(pl.Pln, GeometryType.Plane, solverObject.Parent)); } }
private static bool EdgesAreIdentical(TopoDSEdge edge1, TopoDSEdge edge2) { var pointsEdge1 = GeomUtils.ExtractVertexes(edge1); var pointsEdge2 = GeomUtils.ExtractVertexes(edge2); if (pointsEdge1.Count != 2 || pointsEdge2.Count != 2) { return(false); } var p11 = new Point3D(BRepTool.Pnt(pointsEdge1[0])); var p12 = new Point3D(BRepTool.Pnt(pointsEdge1[1])); var p21 = new Point3D(BRepTool.Pnt(pointsEdge2[0])); var p22 = new Point3D(BRepTool.Pnt(pointsEdge2[1])); if (p11.IsEqual(p21) && p12.IsEqual(p22)) { return(true); } if (p12.IsEqual(p21) && p11.IsEqual(p22)) { return(true); } return(false); }
public override List <SolverPreviewObject> InterestingShapeAroundPoint(gpPln planeOfTheView, Point3D point) { var qosLock = QosFactory.Instance.Get(QosNames.EdgeMatchLock); qosLock.Begin(); foreach (var edge in Geometry.SelectMany(geometricObject => geometricObject.Edges)) { // Calculate the distance from the point to the curve GeomCurve curve; var first = 0.0; var last = 0.0; unsafe { curve = BRepTool.Curve(edge.Edge, ref first, ref last); } if (curve == null) { continue; } // Add a curve domain protection if (first > last) { continue; } ExtremaExtPC extrema = null; try { var adaptor = new GeomAdaptorCurve(curve, first, last); extrema = new ExtremaExtPC(point.GpPnt, adaptor, Precision.Confusion); } catch { Log.Debug("Exception on generate extrema points"); } if (extrema == null) { continue; } if (!extrema.IsDone) { continue; } if (extrema.NbExt < 1) { continue; } // The point is on edge if (extrema.SquareDistance(1) >= CoreGlobalPreferencesSingleton.Instance.ZoomLevel * _precision) { continue; } // Generate a point on the edge by projecting var projectionPoint = new GeomAPIProjectPointOnCurve(point.GpPnt, curve); if (projectionPoint.NbPoints <= 0) { continue; } List <SolverGeometricObject> selectedEdge = Geometry.Where(geomObj => geomObj.Edges.Contains(edge)).ToList(); //LastGeometry.Clear(); //LastGeometry.AddRange(selectedEdge); var originPoint = new SolverGeometricObject(null); originPoint.AddPoint(new SolverDataPoint(new Point3D())); var result = GeomUtils.ProjectPointOnPlane(new Point3D().GpPnt, planeOfTheView, Precision.Confusion); //if(result == new gpPnt(0,0,0)) //{ // LastGeometry.Add(originPoint); //} if (selectedEdge.Count > 0 && selectedEdge.First().Edges.Count > 0) { return new List <SolverPreviewObject>() { new SolverPointResult(new Point3D(projectionPoint.NearestPoint), selectedEdge.First().Edges.First().ParentIndex) } } ; // {Text = "On Edge"}; else { return new List <SolverPreviewObject>() { new SolverPointResult(new Point3D(projectionPoint.NearestPoint)) } }; } qosLock.End(); return(new List <SolverPreviewObject>()); } }
/// <summary> /// Detects if the point is on the curve that describes the edge. /// </summary> /// <param name = "planeOfTheView"></param> /// <param name = "point"></param> /// <returns></returns> public override List <SolverPreviewObject> InterestingShapeAroundPoint(gpPln planeOfTheView, Point3D point) { var qosLock = QosFactory.Instance.Get(QosNames.EdgeContinuationMatchLock); qosLock.Begin(); foreach (var edge in LastGeometry.SelectMany(geometricObject => geometricObject.Edges)) { // Calculate the distance from the point to the curve GeomCurve curve; double first = 0; double last = 0; // unsafe { curve = BRepTool.Curve(edge.Edge, ref first, ref last); } if (curve == null) { continue; } ExtremaExtPC extrema = null; try { var adaptor = new GeomAdaptorCurve(curve); extrema = new ExtremaExtPC(point.GpPnt, adaptor, Precision.Confusion); } catch (Exception) { Log.Debug("Exception on extract paralel axis"); } if (extrema == null) { continue; } if (!extrema.IsDone) { continue; } if (extrema.NbExt < 1) { continue; } // The point is on edge if (extrema.SquareDistance(1) >= _precision) { continue; } // Generate a point on the edge by projecting var projectionPoint = new GeomAPIProjectPointOnCurve(point.GpPnt, curve); if (projectionPoint.NbPoints <= 0) { continue; } var lastPoint = curve.Value(last); return(new List <SolverPreviewObject>() { new SolverEdgeTwoPointsResult(new Point3D(projectionPoint.NearestPoint), new Point3D(lastPoint)) { Type = "Line Continuation" } }); } qosLock.End(); return(new List <SolverPreviewObject>()); }
public static gpPnt ConvertShapeToPoint(TopoDSShape shape) { return(shape == null ? null : BRepTool.Pnt(TopoDS.Vertex(shape))); }