コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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("-------------------");
        }
コード例 #4
0
        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));
            }
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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>());
        }
    }
コード例 #7
0
        /// <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>());
        }
コード例 #8
0
 public static gpPnt ConvertShapeToPoint(TopoDSShape shape)
 {
     return(shape == null ? null : BRepTool.Pnt(TopoDS.Vertex(shape)));
 }