예제 #1
0
        public void Test_ParallelIntersectMass_28Breps()
        {
            TestContext.WriteLine($"Testing: {nameof(Test_ParallelIntersectMass_28Breps)}");

            string file  = @"D:\Dev\honeybee-rhino-plugin\src\HoneybeeRhino.Test\TestModels\28Breps.json";
            var    breps = LoadBrepsFromJson(file);
            var    rooms = breps.Select(_ => InitRoomBrepObject(_).Brep());

            var dupBreps  = rooms.Select(_ => _.DuplicateBrep());
            var adjSolver = new AdjacencySolver(dupBreps);

            sw.Restart();
            var intersectedBreps = adjSolver.Execute(_tol, true);

            sw.Stop();
            var ms = sw.Elapsed.TotalSeconds;

            TestContext.WriteLine($"Runtime: {ms} ms");

            //check if there is a new face created
            Assert.IsTrue(intersectedBreps.All(_ => _.IsSolid));
            Assert.IsTrue(intersectedBreps.All(_ => _.IsRoom()));


            ////Check if all face names are identical
            var names = intersectedBreps.Select(b => b.Surfaces.Select(_ => _.TryGetFaceEntity().HBObject.Name));

            Assert.IsTrue(names.Sum(_ => _.Count()) == intersectedBreps.Sum(_ => _.Faces.Count()));
        }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            using (var go = new GetObject())
            {
                go.SetCommandPrompt("Please select closed objects for converting to Honeybee Room");

                go.GeometryFilter = ObjectType.Brep;
                go.GetMultiple(2, 0);
                if (go.CommandResult() != Result.Success)
                {
                    return(go.CommandResult());
                }

                if (go.ObjectCount <= 1)
                {
                    return(go.CommandResult());
                }


                //Must be all room objects.
                var rooms = go.Objects().Select(_ => _.Brep()).Where(_ => _ != null).Where(_ => _.IsSolid);
                //if (rooms.Any(_ => !_.IsRoom()))
                //{
                //    RhinoApp.WriteLine("Not all selected objects are Honeybee room, please double check, and convert it to room first.");
                //    return go.CommandResult();
                //}

                var ids = go.Objects().Select(_ => _.ObjectId).ToList();

                var tol      = RhinoDoc.ActiveDoc.ModelAbsoluteTolerance / 10;
                var dupRooms = rooms.Select(_ => _.DuplicateBrep());

                var adjSolver = new AdjacencySolver(dupRooms);

                var checkedObjs = adjSolver.Execute(tol, true);

                var counts = rooms.Count();


                var objs = checkedObjs.ToList();

                for (int i = 0; i < counts; i++)
                {
                    doc.Objects.Replace(ids[i], objs[i]);
                    //doc.Objects.Add(objs[i]);
                }

                doc.Views.Redraw();
                return(Result.Success);
            }
        }
예제 #3
0
        public void Test_IntersectMass_MoreBreps()
        {
            string file  = @"D:\Dev\honeybee-rhino-plugin\src\HoneybeeRhino.Test\TestModels\RingFiveBreps.json";
            var    breps = LoadBrepsFromJson(file);
            var    rooms = breps.Select(_ => InitRoomBrepObject(_).Brep());

            var dupBreps  = rooms.Select(_ => _.DuplicateBrep());
            var adjSolver = new AdjacencySolver(dupBreps);

            var intersectedBreps = adjSolver.Execute(_tol);

            //check if there is a new face created
            Assert.IsTrue(intersectedBreps.All(_ => _.IsSolid));
            Assert.IsTrue(intersectedBreps.All(_ => _.Faces.Count == 8));
            Assert.IsTrue(intersectedBreps.All(_ => _.IsRoom()));


            ////Check if all face names are identical
            var names     = intersectedBreps.Select(b => b.Surfaces.Select(_ => _.TryGetFaceEntity().HBObject.Name));
            var diffNames = names.Distinct();

            Assert.IsTrue(names.Sum(_ => _.Count()) == diffNames.Sum(_ => _.Count()));

            //var hbObjs_second = secondB.Surfaces.Select(_ => _.TryGetFaceEntity().HBObject);

            //var faceNames_first = hbObjs_first.Select(_ => _.Name).Distinct();
            //var faceNames_second = hbObjs_second.Select(_ => _.Name).Distinct();

            //Assert.IsTrue(faceNames_first.Count() == 7);
            //Assert.IsTrue(faceNames_second.Count() == 7);

            ////check adjacent face property: match center point
            //var indoorFace_first = firstB.Faces.First(_ => Math.Abs(AreaMassProperties.Compute(_).Area - 12) < _tol);
            //var indoorFace_second = secondB.Faces.First(_ => Math.Abs(AreaMassProperties.Compute(_).Area - 12) < _tol);

            //var center_first = AreaMassProperties.Compute(indoorFace_first).Centroid;
            //var center_second = AreaMassProperties.Compute(indoorFace_second).Centroid;
            //Assert.IsTrue(center_first.DistanceToSquared(center_second) < Math.Pow(_tol, 2));
            //throw new Exception("dddd");
        }
예제 #4
0
        public void Test_IntersectMass_TwoSimpleBreps()
        {
            string file  = @"D:\Dev\honeybee-rhino-plugin\src\HoneybeeRhino.Test\TestModels\TwoSimpleBreps.json";
            var    breps = LoadBrepsFromJson(file);

            var rooms  = breps.Select(_ => InitRoomBrepObject(_).Brep());
            var solver = new AdjacencySolver(rooms);

            var intersectedBreps = solver.ExecuteIntersectMasses(rooms, _tol).ToList();

            var firstB  = intersectedBreps[0];
            var secondB = intersectedBreps[1];

            //check if there is a new face created
            Assert.IsTrue(firstB.IsSolid);
            Assert.AreEqual(firstB.Faces.Count, 7);
            Assert.IsTrue(secondB.IsSolid);
            Assert.AreEqual(secondB.Faces.Count, 7);


            //Check if all face names are identical
            var hbObjs_first  = firstB.Surfaces.Select(_ => _.TryGetFaceEntity().HBObject);
            var hbObjs_second = secondB.Surfaces.Select(_ => _.TryGetFaceEntity().HBObject);

            var faceNames_first  = hbObjs_first.Select(_ => _.Name);
            var faceNames_second = hbObjs_second.Select(_ => _.Name);

            Assert.IsTrue(faceNames_first.Count() - faceNames_first.Distinct().Count() == 1);
            Assert.IsTrue(faceNames_second.Count() - faceNames_second.Distinct().Count() == 1);


            //check adjacent face property: match center point
            var indoorFace_first  = firstB.Faces.First(_ => Math.Abs(AreaMassProperties.Compute(_).Area - 12) < _tol);
            var indoorFace_second = secondB.Faces.First(_ => Math.Abs(AreaMassProperties.Compute(_).Area - 12) < _tol);

            var center_first  = AreaMassProperties.Compute(indoorFace_first).Centroid;
            var center_second = AreaMassProperties.Compute(indoorFace_second).Centroid;

            Assert.IsTrue(center_first.DistanceToSquared(center_second) < Math.Pow(_tol, 2));
        }
예제 #5
0
        public void Test_SolveAdjacency_TwoSimpleBrepsWithTol()
        {
            var rhinoObjs = InitTwoBoxes();
            var breps     = rhinoObjs.Select(_ => _.Brep());

            var solver = new AdjacencySolver(breps);

            var intersectedBreps = solver.ExecuteIntersectMasses(breps, _tol).ToList();

            intersectedBreps = solver.ExecuteMatchInteriorFaces(intersectedBreps, _tol).ToList();

            var firstB  = intersectedBreps[0];
            var secondB = intersectedBreps[1];

            //check if there is a new face created
            Assert.IsTrue(firstB.IsSolid);
            Assert.AreEqual(firstB.Faces.Count, 7);
            Assert.IsTrue(secondB.IsSolid);
            Assert.AreEqual(secondB.Faces.Count, 7);


            //Check if all face names are identical
            var hbObjs_first  = firstB.Surfaces.Select(_ => _.TryGetFaceEntity().HBObject);
            var hbObjs_second = secondB.Surfaces.Select(_ => _.TryGetFaceEntity().HBObject);

            var faceNames_first  = hbObjs_first.Select(_ => _.Name);
            var faceNames_second = hbObjs_second.Select(_ => _.Name);

            Assert.IsTrue(faceNames_first.Distinct().Count() == 7);
            Assert.IsTrue(faceNames_second.Distinct().Count() == 7);


            var faceBC_first  = hbObjs_first.Select(_ => _.BoundaryCondition);
            var faceBC_second = hbObjs_second.Select(_ => _.BoundaryCondition);

            Assert.IsTrue(faceBC_first.Where(_ => _.Obj is HB.Surface).Count() == 1);
            Assert.IsTrue(faceBC_second.Where(_ => _.Obj is HB.Surface).Count() == 1);
        }