コード例 #1
0
ファイル: Convert.cs プロジェクト: ming91915/rhino.inside
        static private Rhino.Geometry.Brep SplitClosedFaces(Rhino.Geometry.Brep brep, double tolerance)
        {
            Brep brepToSplit = null;

            while (brepToSplit != brep && brep != null)
            {
                brep.Standardize();
                brepToSplit = brep;
                foreach (var face in brepToSplit.Faces)
                {
                    face.ShrinkFace(BrepFace.ShrinkDisableSide.ShrinkAllSides);

                    var splittersU = face.IsClosed(0) ? face.TrimAwareIsoCurve(1, face.Domain(0).Mid) : null;
                    var splittersV = face.IsClosed(1) ? face.TrimAwareIsoCurve(0, face.Domain(1).Mid) : null;

                    var splittersULength = (splittersU?.Length).GetValueOrDefault();
                    var splittersVLength = (splittersV?.Length).GetValueOrDefault();
                    var splittersLength  = splittersULength + splittersVLength;
                    if (splittersLength > 0)
                    {
                        var splitters = new Rhino.Geometry.Curve[splittersLength];
                        splittersU?.CopyTo(splitters, 0);
                        splittersV?.CopyTo(splitters, splittersULength);
                        brep = face.Split(splitters, tolerance);

                        if (brep == null || brep.Faces.Count == brepToSplit.Faces.Count)
                        {
                            return(null);
                        }
                    }
                }
            }

            return(brep);
        }
コード例 #2
0
        static private Rhino.Geometry.Brep SplitClosedFaces(Rhino.Geometry.Brep brep)
        {
            Brep brepToSplit = null;

            while (brepToSplit != brep && brep != null)
            {
                brep.Standardize();
                brepToSplit = brep;
                foreach (var face in brepToSplit.Faces)
                {
                    face.ShrinkFace(BrepFace.ShrinkDisableSide.ShrinkAllSides);

                    var face_IsClosed = new bool[2];

                    var splitters = new List <Rhino.Geometry.Curve>();

                    // Compute splitters at C2
                    for (int d = 0; d < 2; d++)
                    {
                        face_IsClosed[d] = face.IsClosed(d);
                        var domain = face.Domain(d);
                        var t      = domain.Min;
                        while (face.GetNextDiscontinuity(d, Continuity.C2_continuous, t, domain.Max, out t))
                        {
                            splitters.AddRange(face.TrimAwareIsoCurve((d == 0) ? 1 : 0, t));
                            face_IsClosed[d] = false;
                        }
                    }

                    if (face_IsClosed[0])
                    {
                        splitters.AddRange(face.TrimAwareIsoCurve(1, face.Domain(0).Mid));
                    }

                    if (face_IsClosed[1])
                    {
                        splitters.AddRange(face.TrimAwareIsoCurve(0, face.Domain(1).Mid));
                    }

                    if (splitters.Count > 0)
                    {
                        brep = face.Split(splitters, Revit.ShortCurveTolerance);

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

                        if (brep.Faces.Count != brepToSplit.Faces.Count)
                        {
                            break; // try again until no face is splitted
                        }
                        // Split was ok but no new faces were created for tolerance reasons
                        // Too near from the limits.
                        brep = brepToSplit;
                    }
                }
            }

            return(brep);
        }