- Reply to comment.( perforated )
Clear["Global`*"];
plot = ParametricPlot3D[{Cos[u] Cosh[v], Sin[u] Cosh[v], v}, {u, 0,
2 Pi}, {v, -Pi/2, Pi/2}, BoxRatios -> {1, 1, 0.6}];
reg = DiscretizeGraphics[plot];
bd = RegionBounds[reg];
diagonalpts = Transpose@bd;
n = 10;
delta = EuclideanDistance @@ diagonalpts/n;
gridpoints = CoordinateBoundingBoxArray[diagonalpts, delta];
dist = RegionDistance@reg;
cubes = Cube[#, delta] & /@
Flatten[Map[Select[#, dist@# < delta &] &, gridpoints, {2}], 2];
(* Graphics3D[cubes]; *)
(* https://mathematica.stackexchange.com/questions/293884/\
replicating-sol-lewitts-skeletal-geometries *)
Perforate[width_ : .3, thickness_ : .05][bmesh_] :=
MeshPrimitives[bmesh, 2] /.
Polygon[x_] :>
Module[{c = Mean@x, p1 = Partition[x, 2, 1, {1, 1}], p2},
p2 = Map[Reverse]@
Partition[Map[(c + (1 - width) (# - c)) &, x], 2, 1, {1, 1}];
ReplaceAll[
Polygon[y_] :> ConvexHullMesh[Join[y, (1 + thickness) y]]]@
MapThread[Polygon@*Join]@{p1, p2}]
Graphics3D[{MaterialShading[<|"BaseColor" -> White,
"MetallicCoefficient" -> 1, "RoughnessCoefficient" -> 0.5|>],
Perforate[.2] /@ cubes}, Background -> GrayLevel[0.4],
Lighting -> {"Standard", GrayLevel[0.9]}, Boxed -> False]

- Since
RegionPlot3D is too slow, here we use VertexColor for BoundaryMeshRegion ( $Version >=13.2 ) or Graphics3D.
Clear["Global`*"];
im = ImageMesh@
RegionImage[
DiscretizeGraphics@
PolyhedronData["GreatRhombicosidodecahedron", "Lines"],
Method -> {"Thickness" -> 4}];
v = MeshCoordinates[im];
i = MeshCells[im, 2];
Graphics3D[{EdgeForm[],
GraphicsComplex[v, i,
VertexColors ->
ColorData["BrightBands"] /@ Subdivide[2 Length@i]]},
Boxed -> False]
(*$Version>=13.2*)
Clear["Global`*"];
im = ImageMesh@
RegionImage[
DiscretizeGraphics@
PolyhedronData["GreatRhombicosidodecahedron", "Lines"],
RasterSize -> 150, Method -> {"Thickness" -> 8}];
v = MeshCoordinates[im];
i = MeshCells[im, 2];
BoundaryMeshRegion[v, i,
VertexColors -> ColorData["BrightBands"] /@ Subdivide[2 Length@i]]

Clear["Global`*"]; reg =
ParametricPlot3D[{Cos[u] Cosh[v], Sin[u] Cosh[v], v}, {u, 0,
2 Pi}, {v, -Pi/2, Pi/2}, BoxRatios -> {1, 1, 0.6},
Method -> {"Extrusion" -> .2}] // DiscretizeGraphics;
im = ImageMesh[RegionImage[reg, RasterSize -> 100]];
v = MeshCoordinates[im];
i = MeshCells[im, 2];
BoundaryMeshRegion[v, i,
VertexColors -> ColorData["BrightBands"] /@ Subdivide[2 Length@i]]

Original
reg = ParametricPlot3D[{Cos[u] Cosh[v], Sin[u] Cosh[v], v}, {u, 0,
2 Pi}, {v, -Pi/2, Pi/2}, BoxRatios -> {1, 1, 0.6},
Method -> {"Extrusion" -> .2}] // DiscretizeGraphics;
im = ImageMesh[RegionImage[reg, RasterSize -> 30]];
RegionPlot3D[im, ColorFunction -> (Hue[#1 + #2 + #3] &),
MaxRecursion -> 0]

reg = ParametricPlot3D[{Cos[u] Sqrt[1 - v] v,
Sin[u] Sqrt[1 - v] v, v}, {u, 0, 2 Pi}, {v, -1, 1},
Method -> {"Extrusion" -> .2}] // DiscretizeGraphics;
im = ImageMesh[RegionImage[reg, RasterSize -> 20]];
RegionPlot3D[im, ColorFunction -> (Hue[#1 + #2 + #3] &),
MaxRecursion -> 0, Boxed -> False]

- Make a hold in a region is more complex since
RegionDifference not work for many complex region. We use OpenCascade for region difference instead.
Clear["Global`*"];
Needs["NDSolve`FEM`"];
Needs["OpenCascadeLink`"];
reg = ResourceData["Stanford Bunny"];
reg = RepairMesh[reg];
bmesh = ToBoundaryMesh[reg];
meshregion = BoundaryMeshRegion[bmesh];
ireg = ImageMesh@RegionImage[meshregion, RasterSize -> 20];
{{x1, x2}, {y1, y2}, {z1, z2}} = RegionBounds[ireg];
cylinder =
Cylinder[{{Mean[{x1, x2}], y1 - 1.2 (y2 - y1),
Mean[{z1, z2}]}, {Mean[{x1, x2}], y1 + 1.2 (y2 - y1),
Mean[{z1, z2}]}}, 1/4 Min[x2 - x1, y2 - y1, z2 - z1]];
shape1 = OpenCascadeShape[ToBoundaryMesh[ireg]];
shape2 = OpenCascadeShape[cylinder];
bmesh = OpenCascadeShapeSurfaceMeshToBoundaryMesh[
OpenCascadeShapeDifference[shape1, shape2]];
mg = MeshRegion[bmesh];
ireg2 = ImageMesh@RegionImage[mg, RasterSize -> 20];
RegionPlot3D[ireg2, ColorFunction -> Hue, MaxRecursion -> 0,
Boxed -> False]
