protected void ProcessPendingExtensionImplementation(ImplicitNaryDifference3d processedSide, List <BoundedImplicitFunction3d> pendingTools, AxisAlignedBox3d filterBox, Action <DMesh3> setProcessedMesh)
        {
            var bounds    = processedSide.Bounds();
            var indexList = new List <int>();

            for (int i = 0; i < pendingTools.Count; i++)
            {
                if (bounds.Intersects(pendingTools[i].Bounds()))
                {
                    indexList.Add(i);
                }
            }

            if (indexList.Count > 0)
            {
                foreach (var idx in indexList)
                {
                    processedSide.BSet.Add(pendingTools[idx]);
                }

                DMesh3 mesh = GenerateMeshBase(processedSide, filterBox);

                MeshPlaneCut cut = new MeshPlaneCut(mesh, Center.ToVector3d() + (Vector3d.AxisZ * SizeZ / 2.0), Vector3d.AxisZ);
                bool         bc  = cut.Cut();

                if (!mesh.IsCompact)
                {
                    mesh.CompactInPlace();
                }

                setProcessedMesh(mesh);
            }
        }
        protected override void InitializeProcessedSide()
        {
            GetSidesPositions(out PanelSectionPosition position, out PanelSectionPosition ndPosition);

            ImplicitFace face   = CreateProcessedSide(position);
            ImplicitFace ndFace = CreateProcessedSide(ndPosition);

            _sideFilterBox = face.Bounds();
            _sideFilterBox.Expand(0.0001);
            face.Width  += 2.0;
            face.Height += 2.0;

            _processedSide = new ImplicitNaryDifference3d()
            {
                A    = face,
                BSet = new List <BoundedImplicitFunction3d>()
            };

            _ndSideFilterBox = ndFace.Bounds();
            _ndSideFilterBox.Expand(0.0001);
            ndFace.Width  += 2.0;
            ndFace.Height += 2.0;

            _ndProcessedSide = new ImplicitNaryDifference3d()
            {
                A    = ndFace,
                BSet = new List <BoundedImplicitFunction3d>()
            };
        }
Пример #3
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            DMesh3_goo        gooA = null;
            List <DMesh3_goo> gooB = new List <DMesh3_goo>();
            int numCells           = 64;

            DA.GetData(0, ref gooA);
            DA.GetDataList(1, gooB);
            DA.GetData(2, ref numCells);

            DMesh3        A = new DMesh3(gooA.Value);
            List <DMesh3> B = gooB.Select(x => x.Value).ToList();

            ImplicitNaryDifference3d diff2 = new ImplicitNaryDifference3d();

            diff2.A    = g3ghUtil.MeshToImplicit(A, numCells, 0.2f);
            diff2.BSet = B.Select(x => g3ghUtil.MeshToImplicit(x, numCells, 0.2f)).ToList();

            g3.MarchingCubes c = new g3.MarchingCubes();
            c.Implicit      = diff2;
            c.RootMode      = g3.MarchingCubes.RootfindingModes.Bisection;
            c.RootModeSteps = 5;
            c.Bounds        = diff2.Bounds();
            c.CubeSize      = c.Bounds.MaxDim / numCells;
            c.Bounds.Expand(3 * c.CubeSize);
            c.Generate();

            MeshNormals.QuickCompute(c.Mesh);

            DA.SetData(0, c.Mesh);
        }
Пример #4
0
        internal override DMesh3 GenerateMesh()
        {
            var procFunction = new ImplicitNaryDifference3d()
            {
                A = this, BSet = ToolApplications
            };
            var cubeSize  = RemovalParameters.CubeSize;
            var filterBox = GetDecreaseBound(RemovalParameters.FilterMargin);

            return(MeshProcessHelper.GenerateMeshBase(procFunction, filterBox, cubeSize));
        }
Пример #5
0
        protected virtual void InitializeProcessedSide()
        {
            ImplicitFace face = CreateProcessedSide(Position);

            AdaptFaceDimensions(face);

            _processedSide = new ImplicitNaryDifference3d()
            {
                A    = face,
                BSet = new List <BoundedImplicitFunction3d>()
            };
        }
Пример #6
0
        protected void ResetProcessedSide(ImplicitNaryDifference3d processedSide, PanelSectionPosition position)
        {
            var face = processedSide.A as ImplicitFace;

            face.Origin = Center.ToVector3d() + GetSideCenterOffset(position);
            face.N      = GetSideNormal(position);
            face.U      = GetSideUDirection(position);
            face.V      = Vector3d.AxisZ;
            face.Width  = GetSideWidth(position);
            face.Height = SizeZ;

            processedSide.BSet.Clear();
        }
Пример #7
0
        protected void ProcessPendingRoutImplementation(ImplicitNaryDifference3d processedSide, AxisAlignedBox3d filterBox, Action <DMesh3> setProcessedMesh)
        {
            DMesh3 mesh = GenerateMeshBase(processedSide, filterBox);

            MeshPlaneCut cut = new MeshPlaneCut(mesh, Center.ToVector3d() + (Vector3d.AxisZ * SizeZ / 2.0), Vector3d.AxisZ);
            bool         bc  = cut.Cut();

            if (!mesh.IsCompact)
            {
                mesh.CompactInPlace();
            }

            setProcessedMesh(mesh);
        }
Пример #8
0
        protected void ProcessRemoveByIndexExtensionImplementation(ImplicitNaryDifference3d processedSide, AxisAlignedBox3d filterBox, Action <DMesh3, ManualResetEventSlim> setProcessedMesh, int index)
        {
            var process = processedSide.BSet.RemoveByIndex(index);

            if (process)
            {
                var mres = new ManualResetEventSlim();

                ProcessSideMesh(processedSide, filterBox, (m) => setProcessedMesh(m, mres));

                mres.Wait(2000);
                mres.Reset();
            }
        }
        protected virtual void InitializeProcessedSide()
        {
            ImplicitFace face = CreateProcessedSide(Position);

            _sideFilterBox = face.Bounds();
            _sideFilterBox.Expand(0.0001);
            face.Width  += 2.0;
            face.Height += 2.0;

            _processedSide = new ImplicitNaryDifference3d()
            {
                A    = face,
                BSet = new List <BoundedImplicitFunction3d>()
            };
        }
Пример #10
0
        protected void ProcessPendingExtensionImplementation(ImplicitNaryDifference3d processedSide, List <BoundedImplicitFunction3d> pendingTools, AxisAlignedBox3d filterBox, Action <DMesh3> setProcessedMesh)
        {
            var bounds    = processedSide.Bounds();
            var indexList = new List <int>();

            for (int i = 0; i < pendingTools.Count; i++)
            {
                if (bounds.Intersects(pendingTools[i].Bounds()))
                {
                    indexList.Add(i);
                }
            }

            if (indexList.Count > 0)
            {
                foreach (var idx in indexList)
                {
                    processedSide.BSet.Add(pendingTools[idx]);
                }

                ProcessSideMesh(processedSide, filterBox, setProcessedMesh);
            }
        }
        protected override void InitializeProcessedSide()
        {
            GetSidesPositions(out PanelSectionPosition position, out PanelSectionPosition ndPosition);

            ImplicitFace face   = CreateProcessedSide(position);
            ImplicitFace ndFace = CreateProcessedSide(ndPosition);

            AdaptFaceDimensions(face, ref _sideFilterBox);

            _processedSide = new ImplicitNaryDifference3d()
            {
                A    = face,
                BSet = new List <BoundedImplicitFunction3d>()
            };

            AdaptFaceDimensions(ndFace, ref _ndSideFilterBox);

            _ndProcessedSide = new ImplicitNaryDifference3d()
            {
                A    = ndFace,
                BSet = new List <BoundedImplicitFunction3d>()
            };
        }
Пример #12
0
        public static void test_marching_cubes_implicits()
        {
            DMesh3 mesh = TestUtil.LoadTestInputMesh("bunny_solid.obj");

            MeshTransforms.Translate(mesh, -mesh.CachedBounds.Center);
            double meshCellsize             = mesh.CachedBounds.MaxDim / 32;
            MeshSignedDistanceGrid levelSet = new MeshSignedDistanceGrid(mesh, meshCellsize);

            levelSet.ExactBandWidth = 3;
            levelSet.UseParallel    = true;
            levelSet.ComputeMode    = MeshSignedDistanceGrid.ComputeModes.NarrowBandOnly;
            levelSet.Compute();
            var meshIso = new DenseGridTrilinearImplicit(levelSet.Grid, levelSet.GridOrigin, levelSet.CellSize);


            ImplicitOffset3d offsetMeshIso = new ImplicitOffset3d()
            {
                A = meshIso, Offset = 2.0
            };

            double           r       = 15.0;
            ImplicitSphere3d sphere1 = new ImplicitSphere3d()
            {
                Origin = Vector3d.Zero,
                Radius = r
            };
            ImplicitSphere3d sphere2 = new ImplicitSphere3d()
            {
                Origin = r * Vector3d.AxisX,
                Radius = r
            };
            ImplicitAxisAlignedBox3d aabox1 = new ImplicitAxisAlignedBox3d()
            {
                AABox = new AxisAlignedBox3d(r * 0.5 * Vector3d.One, r, r * 0.75, r * 0.5)
            };
            ImplicitBox3d box1 = new ImplicitBox3d()
            {
                Box = new Box3d(new Frame3f(r * 0.5 * Vector3d.One, Vector3d.One.Normalized),
                                new Vector3d(r, r * 0.75, r * 0.5))
            };
            ImplicitLine3d line1 = new ImplicitLine3d()
            {
                Segment = new Segment3d(Vector3d.Zero, r * Vector3d.One),
                Radius  = 3.0
            };
            ImplicitHalfSpace3d half1 = new ImplicitHalfSpace3d()
            {
                Origin = Vector3d.Zero, Normal = Vector3d.One.Normalized
            };

            ImplicitUnion3d union = new ImplicitUnion3d()
            {
                A = sphere1, B = line1
            };
            ImplicitDifference3d difference = new ImplicitDifference3d()
            {
                A = meshIso, B = aabox1
            };
            ImplicitIntersection3d intersect = new ImplicitIntersection3d()
            {
                A = meshIso, B = half1
            };
            ImplicitNaryUnion3d nunion = new ImplicitNaryUnion3d()
            {
                Children = new List <BoundedImplicitFunction3d>()
                {
                    offsetMeshIso, sphere1, sphere2
                }
            };
            ImplicitNaryDifference3d ndifference = new ImplicitNaryDifference3d()
            {
                A    = offsetMeshIso,
                BSet = new List <BoundedImplicitFunction3d>()
                {
                    sphere1, sphere2
                }
            };
            ImplicitBlend3d blend = new ImplicitBlend3d()
            {
                A = sphere1, B = sphere2
            };

            BoundedImplicitFunction3d root = intersect;

            AxisAlignedBox3d bounds = root.Bounds();
            int           numcells  = 64;
            MarchingCubes c         = new MarchingCubes();

            c.RootMode      = MarchingCubes.RootfindingModes.LerpSteps;
            c.RootModeSteps = 5;
            c.Implicit      = root;
            c.Bounds        = bounds;
            c.CubeSize      = bounds.MaxDim / numcells;
            c.Bounds.Expand(3 * c.CubeSize);

            c.Generate();

            MeshNormals.QuickCompute(c.Mesh);
            TestUtil.WriteTestOutputMesh(c.Mesh, "marching_cubes_implicit.obj");
        }
Пример #13
0
        protected virtual DMesh3 compute_wrap()
        {
            cache_input_sdfs();
            if (is_invalidated())
            {
                return(null);
            }

            BoundedImplicitFunction3d iso = null;

            if (op_type == OpTypes.Union)
            {
                iso = new ImplicitNaryUnion3d()
                {
                    Children = new List <BoundedImplicitFunction3d>(cached_isos)
                };
            }
            else if (op_type == OpTypes.Intersection)
            {
                iso = new ImplicitNaryIntersection3d()
                {
                    Children = new List <BoundedImplicitFunction3d>(cached_isos)
                };
            }
            else if (op_type == OpTypes.Difference)
            {
                iso = new ImplicitNaryDifference3d()
                {
                    A    = cached_isos[0],
                    BSet = new List <BoundedImplicitFunction3d>(cached_isos.Skip(1))
                };
            }

            MarchingCubes c = new MarchingCubes();

            c.Implicit = iso;
            c.IsoValue = 0;
            c.Bounds   = iso.Bounds();
            c.CubeSize = mesh_cell_size;
            c.Bounds.Expand(3 * c.CubeSize);
            c.RootMode      = MarchingCubes.RootfindingModes.Bisection;
            c.RootModeSteps = 5;

            c.CancelF = is_invalidated;
            c.Generate();
            if (is_invalidated())
            {
                return(null);
            }

            Reducer r = new Reducer(c.Mesh);

            r.FastCollapsePass(c.CubeSize / 2, 3, true);
            if (is_invalidated())
            {
                return(null);
            }

            if (min_component_volume > 0)
            {
                MeshEditor.RemoveSmallComponents(c.Mesh, min_component_volume, min_component_volume);
            }
            if (is_invalidated())
            {
                return(null);
            }

            return(c.Mesh);
        }