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>() }; }
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); }
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)); }
protected virtual void InitializeProcessedSide() { ImplicitFace face = CreateProcessedSide(Position); AdaptFaceDimensions(face); _processedSide = new ImplicitNaryDifference3d() { A = face, BSet = new List <BoundedImplicitFunction3d>() }; }
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(); }
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); }
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>() }; }
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>() }; }
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"); }
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); }