示例#1
0
        //--------------------------------------------------------------------------------------------------

        public static Dictionary <TopoDS_Face, TopoDS_Edge> FindConnectedFaces(TopoDS_Shape shape, TopoDS_Face face)
        {
            var list = new Dictionary <TopoDS_Face, TopoDS_Edge>();

            // Get map of all faces with their ancestors
            var faceMap = new TopTools_IndexedDataMapOfShapeListOfShape(50);

            TopExp.MapShapesAndAncestors(shape, TopAbs_ShapeEnum.TopAbs_EDGE, TopAbs_ShapeEnum.TopAbs_FACE, faceMap);

            foreach (var edge in face.Edges())
            {
                var faceList = faceMap.FindFromKey(edge).ToList();
                foreach (var connectedFace in faceList)
                {
                    if (connectedFace.IsSame(face))
                    {
                        continue;
                    }

                    if (list.Keys.Any(f => connectedFace.IsSame(f)))
                    {
                        continue;
                    }

                    list.Add(connectedFace.ToFace(), edge);
                }
            }

            return(list);
        }
示例#2
0
        //--------------------------------------------------------------------------------------------------

        public static TopoDS_Face FindConnectedFace(TopoDS_Shape shape, TopoDS_Face face, TopoDS_Edge sharedEdge)
        {
            // Get map of all faces with their ancestors
            var faceMap = new TopTools_IndexedDataMapOfShapeListOfShape(50);

            TopExp.MapShapesAndAncestors(shape, TopAbs_ShapeEnum.TopAbs_EDGE, TopAbs_ShapeEnum.TopAbs_FACE, faceMap);

            foreach (var edge in face.Edges())
            {
                if (edge.IsSame(sharedEdge))
                {
                    var faceList = faceMap.FindFromKey(edge).ToList();
                    foreach (var connectedFace in faceList)
                    {
                        if (connectedFace.IsSame(face))
                        {
                            continue;
                        }

                        return(connectedFace.ToFace());
                    }
                }
            }
            return(null);
        }
示例#3
0
        //--------------------------------------------------------------------------------------------------

        protected TopoDS_Edge GetOperandEdge(int operandIndex, SubshapeReference edgeRef, TopoDS_Face forFace = null)
        {
            var operand = GetOperand(operandIndex);

            if (operand == null)
            {
                return(null);
            }

            // Find target edge
            var edges = operand.FindSubshape(edgeRef, GetCoordinateSystem());

            if (edges == null || edges.Count == 0)
            {
                Messages.Error("The edge index is invalid and must be re-selected.");
                return(null);
            }

            if (forFace == null)
            {
                return(edges[0].ToEdge());
            }

            // Find the proper oriented for the given face
            return(forFace.Edges().Find(e => e.IsSame(edges[0])));
        }
        //--------------------------------------------------------------------------------------------------

        bool _IsFaceOfBendSection(TopoDS_Face face, BendParameter bendParams)
        {
            if (bendParams == null)
            {
                bendParams = new BendParameter(); // Temporary usage
            }
            // Each face of a bend section has two circular edges
            var edges = face.Edges();
            var foundCircularEdges = 0;

            foreach (var edge in edges)
            {
                var edgeAdaptor = new BRepAdaptor_Curve(edge);
                if (edgeAdaptor.GetGeomType() == GeomAbs_CurveType.GeomAbs_Circle)
                {
                    foundCircularEdges++;

                    if (bendParams.Edges[0] == null)
                    {
                        bendParams.Edges[0] = edge;
                        bendParams.Axes[0]  = edgeAdaptor.Circle().Position();
                        bendParams.Radii[0] = edgeAdaptor.Circle().Radius();
                        bendParams.AngleRad = edgeAdaptor.LastParameter() - edgeAdaptor.FirstParameter();
                    }
                    else
                    {
                        if (!bendParams.Axes[0].Axis.IsCoaxial(edgeAdaptor.Circle().Axis(), 0.01f, 0.001f) ||
                            !bendParams.AngleRad.IsEqual(edgeAdaptor.LastParameter() - edgeAdaptor.FirstParameter(), 0.01))
                        {
                            return(false); // Circular edge with unproper parameters detected
                        }

                        if (bendParams.Edges[1] == null)
                        {
                            // Second edge of bend surface
                            bendParams.Edges[1] = edge;
                            bendParams.Axes[1]  = edgeAdaptor.Circle().Position();
                            break;
                        }

                        // Additional edges, find free place
                        for (int edgeIndex = 0; edgeIndex < bendParams.Edges.Length; edgeIndex++)
                        {
                            if (bendParams.Edges[edgeIndex] == null)
                            {
                                bendParams.Edges[edgeIndex] = edge;
                                break;
                            }
                            if (bendParams.Edges[edgeIndex].IsSame(edge))
                            {
                                break;
                            }
                        }

                        if (!edgeAdaptor.Circle().Radius().IsEqual(bendParams.Radii[0], 0.000001))
                        {
                            bendParams.Radii[1] = edgeAdaptor.Circle().Radius();
                        }
                    }
                }
            }

            // Coaxial circle edges not found, this is not a bend section
            if (foundCircularEdges != 2)
            {
                return(false);
            }

            return(true);
        }
示例#5
0
        //--------------------------------------------------------------------------------------------------

        public static bool ComputeAxisFromVertex(TopoDS_Face face, TopoDS_Vertex vertex, out Ax1 axis)
        {
            // Get normal at point of vertex
            var uv          = BRep_Tool.Parameters(vertex, face);
            Pnt centerPoint = Pnt.Origin;
            Vec faceNormal  = Vec.Zero;

            new BRepGProp_Face(face).Normal(uv.X, uv.Y, ref centerPoint, ref faceNormal);

            // Find edges
            var edges = face.Edges(false).Where(edge => edge.Vertices().ContainsSame(vertex)).ToList();

            if (edges.Count != 2)
            {
                axis = new Ax1();
                return(false);
            }

            // Calc direction
            bool order    = false; // is false if face is on the left of edge1
            var  tangents = new Vec[2];

            for (var edgeIndex = 0; edgeIndex < edges.Count; edgeIndex++)
            {
                var edge = edges[edgeIndex];

                var edgeAdaptor = edge.Adaptor();
                var parameter   = BRep_Tool.Parameter(vertex, edge);

                Pnt unusedPoint = Pnt.Origin;
                Vec edgeTangent = Vec.Zero;
                edgeAdaptor.D1(parameter, ref unusedPoint, ref edgeTangent);

                var parameterReversed = parameter > (edgeAdaptor.FirstParameter() + edgeAdaptor.LastParameter()) * 0.5;
                if (parameterReversed)
                {
                    edgeTangent.Reverse();
                }

                if (edgeIndex == 0 && parameterReversed != (edge.Orientation() == TopAbs_Orientation.TopAbs_REVERSED))
                {
                    order = true; // face is on the right of edge1
                }
                tangents[edgeIndex] = edgeTangent.Normalized();
            }

            var direction = tangents[0].Added(tangents[1]);

            var angleBetweenTangents = tangents[0].AngleWithRef(tangents[1], faceNormal);

            if (order)
            {
                angleBetweenTangents *= -1.0;
            }
            if (angleBetweenTangents < 0)
            {
                // Concave vertex
                direction.Reverse();
            }

            axis = new Ax1(centerPoint, direction.ToDir());
            return(true);
        }