Пример #1
0
        /// <summary>
        /// Add the oriented edge to the current loop
        /// </summary>
        /// <param name="id">the id of the edge, corresponding to the StepID of the IfcOrientedEdge</param>
        /// <param name="curve">the curve, which represents the geometry of the edge</param>
        /// <param name="startPoint">the start point of the curve</param>
        /// <param name="endPoint">the end point of the curve</param>
        /// <param name="orientation">the orientation of the edge</param>
        /// <returns>true if the edge is successfully added to the boundary</returns>
        public bool AddOrientedEdgeToTheBoundary(int id, Curve curve, XYZ startPoint, XYZ endPoint, bool orientation)
        {
            if (m_CurrentBrepBuilderLoop == null)
            {
                throw new InvalidOperationException("StartCollectingLoopForBrepBuilder hasn't been called");
            }

            BRepBuilderGeometryId edgeId = null;

            if (m_EdgeIdToBrepId.ContainsKey(id) && m_EdgeIdToBrepId[id] != null)
            {
                edgeId = m_EdgeIdToBrepId[id];
            }
            else
            {
                //TODO: create an utility function MakeBound(Curve, XYZ, XYZ) and factor out this code
                BRepBuilderEdgeGeometry edge = null;
                if (curve is Line)
                {
                    edge = BRepBuilderEdgeGeometry.Create(startPoint, endPoint);
                }
                else if (curve is Arc)
                {
                    Arc arc = curve as Arc;

                    // The curve we receive is an unbound arc, so we have to bound it by the startPoint and the endPoint
                    IntersectionResult start = arc.Project(startPoint);
                    IntersectionResult end   = arc.Project(endPoint);

                    double startParameter = start.Parameter;
                    double endParameter   = end.Parameter;

                    if (endParameter < startParameter)
                    {
                        endParameter += Math.PI * 2;
                    }

                    arc.MakeBound(startParameter, endParameter);

                    edge = BRepBuilderEdgeGeometry.Create(arc);
                }
                else if (curve is Ellipse)
                {
                    Ellipse ellipse = curve as Ellipse;

                    IntersectionResult start = ellipse.Project(startPoint);
                    IntersectionResult end   = ellipse.Project(endPoint);

                    double startParameter = start.Parameter;
                    double endParameter   = end.Parameter;

                    if (endParameter < startParameter)
                    {
                        endParameter += Math.PI * 2;
                    }

                    ellipse.MakeBound(startParameter, endParameter);
                    edge = BRepBuilderEdgeGeometry.Create(ellipse);
                }
                else if (curve is NurbSpline)
                {
                    NurbSpline nurbs = curve as NurbSpline;

                    // Bound the NurbSpline based on the start and end points.
                    // As mentioned above, there should be a function to bound
                    // a curve based on two 3D points and it should be used here
                    // instead of duplicating manual code.
                    IntersectionResult start          = nurbs.Project(startPoint);
                    IntersectionResult end            = nurbs.Project(endPoint);
                    double             startParameter = start.Parameter;
                    double             endParameter   = end.Parameter;
                    if (endParameter < startParameter)
                    {
                        Importer.TheLog.LogError(id, "Inverted start/end parameters for NurbSpline.", false /*throwError*/);
                        return(false);
                    }
                    else
                    {
                        nurbs.MakeBound(startParameter, endParameter);
                    }

                    edge = BRepBuilderEdgeGeometry.Create(nurbs);
                }
                else
                {
                    Importer.TheLog.LogError(id, "Unsupported edge curve type: " + curve.GetType().ToString(), false);
                    return(false);
                }

                edgeId = m_BrepBuilder.AddEdge(edge);
                m_EdgeIdToBrepId.Add(id, edgeId);
            }
            try
            {
                m_BrepBuilder.AddCoEdge(m_CurrentBrepBuilderLoop, edgeId, !orientation);
            }
            catch
            {
                return(false);
            }
            return(true);
        }