SaveToStl Namespace Reference

Functions

def MakeSphere (pos, R, edges_phi, edges_theta)
 
def SavePebblesStl (filename, pebbles, N_phi, N_theta)
 
def SaveVoxelGridStl (filename, vox, bbox, span)
 
def SaveStlSnap (input_mesh, pos, v1, v2, v3, filename)
 
def SaveStlSequence (OPT, DATA)
 

Function Documentation

◆ MakeSphere()

def SaveToStl.MakeSphere (   pos,
  R,
  edges_phi,
  edges_theta 
)
13 def MakeSphere(pos, R, edges_phi, edges_theta):
14  from stl import mesh
15  # This function creates an stl model of a sphere
16  data = np.zeros((edges_theta - 1) * edges_phi * 2, dtype=mesh.Mesh.dtype) # Create the data structure for triangles
17 
18  x = pos[0]
19  y = pos[1]
20  z = pos[2]
21 
22  k = 0
23 
24  for j in range(edges_phi):
25  for i in range(edges_theta):
26  # v1...v4 - vertices of triangles
27  # Triangle 1: v1, v2, v3
28  # Triangle 2: v3, v2, v4
29 
30  v1 = np.array([x + R * np.sin(np.pi * (i / edges_theta)) * np.cos(2 * np.pi * (j / edges_phi)),
31  y + R * np.sin(np.pi * (i / edges_theta)) * np.sin(2 * np.pi * (j / edges_phi)),
32  z + R * np.cos(np.pi * (i / edges_theta))])
33  v2 = np.array([x + R * np.sin(np.pi * ((i + 1) / edges_theta)) * np.cos(2 * np.pi * (j / edges_phi)),
34  y + R * np.sin(np.pi * ((i + 1) / edges_theta)) * np.sin(2 * np.pi * (j / edges_phi)),
35  z + R * np.cos(np.pi * ((i + 1) / edges_theta))])
36  v3 = np.array([x + R * np.sin(np.pi * (i / edges_theta)) * np.cos(2 * np.pi * ((j + 1) / edges_phi)),
37  y + R * np.sin(np.pi * (i / edges_theta)) * np.sin(2 * np.pi * ((j + 1) / edges_phi)),
38  z + R * np.cos(np.pi * (i / edges_theta))])
39  v4 = np.array([x + R * np.sin(np.pi * ((i + 1) / edges_theta)) * np.cos(2 * np.pi * ((j + 1) / edges_phi)),
40  y + R * np.sin(np.pi * ((i + 1) / edges_theta)) * np.sin(2 * np.pi * ((j + 1) / edges_phi)),
41  z + R * np.cos(np.pi * ((i + 1) / edges_theta))])
42 
43  if (not (np.allclose(v1, v3))):
44  data['vectors'][k] = np.array([v1, v2, v3])
45  k += 1
46 
47  if (not (np.allclose(v2, v4))):
48  data['vectors'][k] = np.array([v3, v2, v4])
49  k += 1
50 
51  return data
52 
def MakeSphere(pos, R, edges_phi, edges_theta)
Definition: SaveToStl.py:13

Referenced by SavePebblesStl().

◆ SavePebblesStl()

def SaveToStl.SavePebblesStl (   filename,
  pebbles,
  N_phi,
  N_theta 
)
53 def SavePebblesStl(filename, pebbles, N_phi, N_theta):
54  from stl import mesh
55  data = MakeSphere(pebbles[0][:3], pebbles[0][3], N_phi, N_theta)
56  for pebble in range(1, len(pebbles)):
57  data = np.hstack((data, MakeSphere(pebbles[pebble][:3], pebbles[pebble][3], N_phi, N_theta)))
58  your_mesh = mesh.Mesh(data, remove_empty_areas=True)
59  your_mesh.save(filename)
60  print("stl model saved: " + filename)
61  return
62 
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet print(const Packet &a)
Definition: GenericPacketMath.h:1166
def SavePebblesStl(filename, pebbles, N_phi, N_theta)
Definition: SaveToStl.py:53

References MakeSphere(), and Eigen::internal.print().

Referenced by OutputData.OutputClumpData().

◆ SaveStlSequence()

def SaveToStl.SaveStlSequence (   OPT,
  DATA 
)
157 def SaveStlSequence(OPT, DATA):
158  # Load clump sequence
159  filename = OPT['clumpSeqDir'] + 'ClumpSeq.txt'
160  textfile = open(filename, "r")
161  content_list = textfile.readlines()
162 
163  sequence = np.zeros([len(content_list), 13])
164  for i in range(len(content_list)):
165  content_list[i] = content_list[i].replace("\n", "")
166  word_list = content_list[i].split(' ')
167  for j in range (13):
168  sequence[i][j] = float(word_list[j])
169  DATA['clumpSequence'] = sequence
170 
171  # Save stl sequence
172  for i in range(len(sequence)):
173  pos = sequence[i][1:4]
174  v1 = sequence[i][4:7]
175  v2 = sequence[i][7:10]
176  v3 = sequence[i][10:13]
177  print("pos:", pos, "v1:", v1, "v2:", v2, "v3:", v3)
178  SaveStlSnap(DATA['stlMesh'], pos, v1, v2, v3, './Blender/StlSeq/' + 's_' + str(i) + '.stl')
179 
180 
181  return OPT, DATA
def SaveStlSequence(OPT, DATA)
Definition: SaveToStl.py:157
def SaveStlSnap(input_mesh, pos, v1, v2, v3, filename)
Definition: SaveToStl.py:129
str
Definition: compute_granudrum_aor.py:141
void split(const DoubleVector &in_vector, Vector< DoubleVector * > &out_vector_pt)
Definition: double_vector.cc:1413

References Eigen::internal.print(), SaveStlSnap(), oomph::DoubleVectorHelpers.split(), and compute_granudrum_aor.str.

Referenced by MClump.main().

◆ SaveStlSnap()

def SaveToStl.SaveStlSnap (   input_mesh,
  pos,
  v1,
  v2,
  v3,
  filename 
)
129 def SaveStlSnap(input_mesh, pos, v1, v2, v3, filename):
130  print("pos", pos)
131  import copy
132  ms = copy.deepcopy(input_mesh)
133  # Rotate mesh to pd
134  e1 = np.array([1,0,0])
135  e2 = np.array([0,1,0])
136  e3 = np.array([0,0,1])
137  Q = np.array([
138  [e1@v1, e2@v1, e3@v1],
139  [e1@v2, e2@v2, e3@v2],
140  [e1@v3, e2@v3, e3@v3]])
141 
142  for j in range(len(ms.normals)):
143  ms.v0[j] = Q @ ms.v0[j]
144  ms.v1[j] = Q @ ms.v1[j]
145  ms.v2[j] = Q @ ms.v2[j]
146  ms.normals[j] = Q @ ms.normals[j]
147 
148  # Shift Mesh's center of gravity to a specified location
149  for j in range(len(ms.normals)):
150  ms.v0[j] += pos
151  ms.v1[j] += pos
152  ms.v2[j] += pos
153 
154  ms.save(filename)
155  return
156 

References Eigen::internal.print().

Referenced by SaveStlSequence().

◆ SaveVoxelGridStl()

def SaveToStl.SaveVoxelGridStl (   filename,
  vox,
  bbox,
  span 
)
63 def SaveVoxelGridStl(filename, vox, bbox, span):
64  # A function that saves voxels as an stl
65  # Numbering of vertices v1-v8:
66  # z
67  # |
68  # 1----4
69  # |\ |\
70  # | 2----3
71  # 5----8 __ y
72  # \ \
73  # 6----7
74  # \
75  # x
76  N = vox.shape[0]
77  from stl import mesh
78  data = np.zeros(12 * N ** 3, dtype=mesh.Mesh.dtype) # Create the data structure for triangles
79  l = span / N
80  p = 0
81  for i in range(N):
82  for j in range(N):
83  for k in range(N):
84  vox_center = np.array([bbox[0] + l * (1 + 2 * i), bbox[2] + l * (1 + 2 * j), bbox[4] + l * (1 + 2 * k)])
85  v1 = vox_center + l * np.array([-1, -1, 1])
86  v2 = vox_center + l * np.array([1, -1, 1])
87  v3 = vox_center + l * np.array([1, 1, 1])
88  v4 = vox_center + l * np.array([-1, 1, 1])
89  v5 = vox_center + l * np.array([-1, -1, -1])
90  v6 = vox_center + l * np.array([1, -1, -1])
91  v7 = vox_center + l * np.array([1, 1, -1])
92  v8 = vox_center + l * np.array([-1, 1, -1])
93 
94  # Create cube sides
95  if (i == 0 and vox[i, j, k]) or (i > 0 and (vox[i, j, k] and not vox[i - 1, j, k])):
96  data['vectors'][p] = np.array([v1, v4, v5])
97  data['vectors'][p + 1] = np.array([v5, v4, v8])
98  p += 2
99 
100  if (j == 0 and vox[i, j, k]) or (j > 0 and (vox[i, j, k] and not vox[i, j - 1, k])):
101  data['vectors'][p] = np.array([v6, v2, v1])
102  data['vectors'][p + 1] = np.array([v6, v1, v5])
103  p += 2
104 
105  if (k == 0 and vox[i, j, k]) or (k > 0 and (vox[i, j, k] and not vox[i, j, k - 1])):
106  data['vectors'][p] = np.array([v7, v8, v5])
107  data['vectors'][p + 1] = np.array([v7, v5, v6])
108  p += 2
109 
110  if (i == N - 1 and vox[i, j, k]) or (i < N - 1 and (vox[i, j, k] and not vox[i + 1, j, k])):
111  data['vectors'][p] = np.array([v3, v6, v2])
112  data['vectors'][p + 1] = np.array([v3, v7, v6])
113  p += 2
114 
115  if (j == N - 1 and vox[i, j, k]) or (j < N - 1 and (vox[i, j, k] and not vox[i, j + 1, k])):
116  data['vectors'][p] = np.array([v7, v3, v4])
117  data['vectors'][p + 1] = np.array([v7, v4, v8])
118  p += 2
119 
120  if (k == N - 1 and vox[i, j, k]) or (k < N - 1 and (vox[i, j, k] and not vox[i, j, k + 1])):
121  data['vectors'][p] = np.array([v4, v1, v2])
122  data['vectors'][p + 1] = np.array([v4, v2, v3])
123  p += 2
124 
125  mesh = mesh.Mesh(data, remove_empty_areas=True)
126  mesh.save(filename)
127  return
128 
def SaveVoxelGridStl(filename, vox, bbox, span)
Definition: SaveToStl.py:63

Referenced by OutputData.OutputClumpData().