//experimental public List <DMesh3> SliceMold(DMesh3 mesh_to_slice, int number_of_slices) { var meshes = new List <MeshGeometry3D>(); //convert mesh to DMesh DMesh3 mesh = mesh_to_slice; //create cube for slicing double z_height = mesh.GetBounds().Max.z - mesh.GetBounds().Min.z; double slice_interval = (double)(z_height / number_of_slices); double x_size = mesh.GetBounds().Depth; double y_size = mesh.GetBounds().Width; double low_z = mesh.GetBounds().Min.z; //boolean intersection each mesh var sliced_meshes = new List <DMesh3>(); for (int i = 0; i < number_of_slices; i++) { //create box Vector3d centre = new Vector3d(0, 0, low_z + slice_interval / 2 + i * (slice_interval)); Vector3d extend = new Vector3d( x_size, y_size, slice_interval / 2); ImplicitBox3d box = new ImplicitBox3d() { Box = new Box3d(centre, extend) }; //boolean overlap BoundedImplicitFunction3d meshA = meshToImplicitF(mesh, 64, 0.2f); //take the difference of the bolus mesh minus the tools ImplicitIntersection3d mesh_result = new ImplicitIntersection3d { A = meshA, B = box }; //calculate the boolean mesh MarchingCubes c = new MarchingCubes(); c.Implicit = mesh_result; c.RootMode = MarchingCubes.RootfindingModes.LerpSteps; c.RootModeSteps = 5; c.Bounds = mesh_result.Bounds(); c.CubeSize = c.Bounds.MaxDim / 256; c.Bounds.Expand(3 * c.CubeSize); c.Generate(); MeshNormals.QuickCompute(c.Mesh); int triangleCount = c.Mesh.TriangleCount / 3; Reducer r = new Reducer(c.Mesh); r.ReduceToTriangleCount(triangleCount); sliced_meshes.Add(c.Mesh); } return(sliced_meshes); }
private static DMesh3 BooleanIntersection(DMesh3 mesh1, DMesh3 mesh2) { BoundedImplicitFunction3d meshA = meshToImplicitF(mesh1, 64, 0.2f); BoundedImplicitFunction3d meshB = meshToImplicitF(mesh2, 64, 0.2f); //take the intersection of the meshes minus the tools ImplicitIntersection3d mesh = new ImplicitIntersection3d() { A = meshA, B = meshB }; //calculate the boolean mesh MarchingCubes c = new MarchingCubes(); c.Implicit = mesh; c.RootMode = MarchingCubes.RootfindingModes.LerpSteps; c.RootModeSteps = 5; c.Bounds = mesh.Bounds(); c.CubeSize = c.Bounds.MaxDim / 128; c.Bounds.Expand(3 * c.CubeSize); c.Generate(); MeshNormals.QuickCompute(c.Mesh); int triangleCount = c.Mesh.TriangleCount / 2; Reducer r = new Reducer(c.Mesh); r.ReduceToTriangleCount(triangleCount); return(c.Mesh); }
protected override void SolveInstance(IGH_DataAccess DA) { DMesh3_goo goo = null; double lattice_radius = 0.05; double lattice_spacing = 0.4; double shell_thickness = 0.05; int mesh_resolution = 64; DA.GetData(0, ref goo); DA.GetData(1, ref lattice_radius); DA.GetData(2, ref lattice_spacing); DA.GetData(3, ref shell_thickness); DA.GetData(4, ref mesh_resolution); DMesh3 mesh = new DMesh3(goo.Value); var shellMeshImplicit = g3ghUtil.MeshToImplicit(mesh, 128, shell_thickness); double max_dim = mesh.CachedBounds.MaxDim; AxisAlignedBox3d bounds = new AxisAlignedBox3d(mesh.CachedBounds.Center, max_dim / 2); bounds.Expand(2 * lattice_spacing); AxisAlignedBox2d element = new AxisAlignedBox2d(lattice_spacing); AxisAlignedBox2d bounds_xy = new AxisAlignedBox2d(bounds.Min.xy, bounds.Max.xy); AxisAlignedBox2d bounds_xz = new AxisAlignedBox2d(bounds.Min.xz, bounds.Max.xz); AxisAlignedBox2d bounds_yz = new AxisAlignedBox2d(bounds.Min.yz, bounds.Max.yz); List <BoundedImplicitFunction3d> Tiling = new List <BoundedImplicitFunction3d>(); foreach (g3.Vector2d uv in TilingUtil.BoundedRegularTiling2(element, bounds_xy, 0)) { Segment3d seg = new Segment3d(new g3.Vector3d(uv.x, uv.y, bounds.Min.z), new g3.Vector3d(uv.x, uv.y, bounds.Max.z)); Tiling.Add(new ImplicitLine3d() { Segment = seg, Radius = lattice_radius }); } foreach (g3.Vector2d uv in TilingUtil.BoundedRegularTiling2(element, bounds_xz, 0)) { Segment3d seg = new Segment3d(new g3.Vector3d(uv.x, bounds.Min.y, uv.y), new g3.Vector3d(uv.x, bounds.Max.y, uv.y)); Tiling.Add(new ImplicitLine3d() { Segment = seg, Radius = lattice_radius }); } foreach (g3.Vector2d uv in TilingUtil.BoundedRegularTiling2(element, bounds_yz, 0)) { Segment3d seg = new Segment3d(new g3.Vector3d(bounds.Min.x, uv.x, uv.y), new g3.Vector3d(bounds.Max.x, uv.x, uv.y)); Tiling.Add(new ImplicitLine3d() { Segment = seg, Radius = lattice_radius }); } ImplicitNaryUnion3d lattice = new ImplicitNaryUnion3d() { Children = Tiling }; ImplicitIntersection3d lattice_clipped = new ImplicitIntersection3d() { A = lattice, B = shellMeshImplicit }; g3.MarchingCubes c = new g3.MarchingCubes(); c.Implicit = lattice_clipped; c.RootMode = g3.MarchingCubes.RootfindingModes.LerpSteps; c.RootModeSteps = 5; c.Bounds = lattice_clipped.Bounds(); c.CubeSize = c.Bounds.MaxDim / mesh_resolution; c.Bounds.Expand(3 * c.CubeSize); c.Generate(); MeshNormals.QuickCompute(c.Mesh); DA.SetData(0, c.Mesh); }