def extrude_polygon(polygon, vectors=None, height=None, height_pad=[0, 0]): shell = np.array(polygon.exterior.coords) holes = [np.array(i.coords) for i in polygon.interiors] if vectors is None: pad_signed = np.sign(height) * np.array(height_pad) vectors = np.array([[0.0, 0.0, -pad_signed[0]], [0.0, 0.0, pad_signed[1] + height]]) else: vectors = np.array(vectors) shell_3D = three_dimensionalize(shell, False) shell_3D[:, 2] = vectors[0][2] shell_face = Face().createPolygonal(shell_3D) shell_solid = Solid().extrude(shell_face, *vectors) if holes is None: return shell_solid pad_vector = np.diff(vectors, axis=0)[0] cut_vectors = vectors + [-pad_vector, pad_vector] for hole in holes: cut_face = Face().createPolygonal(three_dimensionalize(hole, False)) cut_solid = Solid().extrude(cut_face, *cut_vectors) shell_solid.cut(cut_solid) return shell_solid
def extrude_polygon(polygon, vectors = None, height = None, height_pad = [0,0]): shell = np.array(polygon.exterior.coords) holes = [np.array(i.coords) for i in polygon.interiors] if vectors is None: pad_signed = np.sign(height) * np.array(height_pad) vectors = np.array([[0.0, 0.0, -pad_signed[0]], [0.0, 0.0, pad_signed[1] + height]]) else: vectors = np.array(vectors) shell_3D = three_dimensionalize(shell, False) shell_3D[:,2] = vectors[0][2] shell_face = Face().createPolygonal(shell_3D) shell_solid = Solid().extrude(shell_face, *vectors) if holes is None: return shell_solid pad_vector = np.diff(vectors, axis=0)[0] cut_vectors = vectors + [-pad_vector, pad_vector] for hole in holes: cut_face = Face().createPolygonal(three_dimensionalize(hole, False)) cut_solid = Solid().extrude(cut_face, *cut_vectors) shell_solid.cut(cut_solid) return shell_solid
def test_centreOfMass(self): eq = self.almostEqual solid = Solid() solid.createSphere((0.0, 0.0, 0.0), 1.0) eq(solid.centreOfMass(), (0.0, 0.0, 0.0))
def test_scale(self): eq = self.assertAlmostEqual scale = 0.5 solid = Solid() solid.createSphere((0.0, 0.0, 0.0), 1.0) solid.scale((0.0, 0.0, 0.0), scale)
def test_centreOfMass(self): eq = self.almostEqual solid = Solid() solid.createSphere((0., 0., 0.), 1.) eq(solid.centreOfMass(), (0., 0., 0.))
def test_createBox(self): eq = self.assertAlmostEqual self.assertRaises(OCCError, Solid().createBox, (-0.5, -0.5, -0.5), (-0.5, -0.5, -0.5)) solid = Solid() solid.createBox((-0.5, -0.5, -0.5), (0.5, 0.5, 0.5)) eq(solid.volume(), 1.0)
def test_createTorus(self): eq = self.assertAlmostEqual self.assertRaises(OCCError, Solid().createCone, (0.0, 0.0, 0.0), (0.0, 0.0, 1.0), 0.0, 0.0) self.assertRaises(OCCError, Solid().createCone, (0.0, 0.0, 0.0), (0.0, 0.0, 1.0), 1.0, 1.0) solid = Solid() solid.createCone((0.0, 0.0, 0.0), (0.0, 0.0, 0.1), 2.0, 1.0) self.assertEqual(solid.volume() > 0.0, True)
def test_createTorus(self): eq = self.assertAlmostEqual self.assertRaises(OCCError, Solid().createTorus, (0.0, 0.0, 0.0), (0.0, 0.0, 0.1), 0.0, 1.0) self.assertRaises(OCCError, Solid().createTorus, (0.0, 0.0, 0.0), (0.0, 0.0, 0.1), 1.0, 0.0) solid = Solid() solid.createTorus((0.0, 0.0, 0.0), (0.0, 0.0, 0.1), 2.0, 1.0) eq(solid.area(), 4.0 * pi ** 2 * 2.0 * 1.0, places=1) eq(solid.volume(), 2.0 * pi ** 2 * 2.0 * 1.0 ** 2, places=3)
def test_createCylinder(self): eq = self.assertAlmostEqual self.assertRaises(OCCError, Solid().createCylinder, (0.0, 0.0, 0.0), (0.0, 0.0, 1.0), 0.0) self.assertRaises(OCCError, Solid().createCylinder, (0.0, 0.0, 0.0), (0.0, 0.0, 1.0), -1.0) solid = Solid() solid.createCylinder((0.0, 0.0, 0.0), (0.0, 0.0, 1.0), 1.0) eq(solid.area(), 4.0 * pi, places=3) eq(solid.volume(), pi, places=3)
def test_rotate(self): eq = self.almostEqual solid = Solid() solid.createSphere((0., 0., 0.), 1.) solid.rotate(-pi / 2., (0., 1., 0.), (1., 1., 0.)) eq(solid.centreOfMass(), (1., 0., -1.))
def test_translate(self): eq = self.almostEqual solid = Solid() solid.createSphere((0., 0., 0.), 1.) solid.translate((1., 2., 3.)) eq(solid.centreOfMass(), (1., 2., 3.))
def test_createSphere(self): eq = self.assertAlmostEqual self.assertRaises(OCCError, Solid().createSphere, (0., 0., 0.), 0.) self.assertRaises(OCCError, Solid().createSphere, (0., 0., 0.), -1.) solid = Solid() solid.createSphere((0., 0., 0.), 1.) eq(solid.area(), 4. * pi, places=3) eq(solid.volume(), 4. / 3. * pi, places=3)
def test_rotate(self): eq = self.almostEqual solid = Solid() solid.createSphere((0.0, 0.0, 0.0), 1.0) solid.rotate(-pi / 2.0, (0.0, 1.0, 0.0), (1.0, 1.0, 0.0)) eq(solid.centreOfMass(), (1.0, 0.0, -1.0))
def test_translate(self): eq = self.almostEqual solid = Solid() solid.createSphere((0.0, 0.0, 0.0), 1.0) solid.translate((1.0, 2.0, 3.0)) eq(solid.centreOfMass(), (1.0, 2.0, 3.0))
def test_scale(self): eq = self.assertAlmostEqual scale = .5 solid = Solid() solid.createSphere((0., 0., 0.), 1.) solid.scale((0., 0., 0.), scale)
def test_createTorus(self): eq = self.assertAlmostEqual self.assertRaises(OCCError, Solid().createTorus, (0., 0., 0.), (0., 0., .1), 0., 1.) self.assertRaises(OCCError, Solid().createTorus, (0., 0., 0.), (0., 0., .1), 1., 0.) solid = Solid() solid.createTorus((0., 0., 0.), (0., 0., .1), 2., 1.) eq(solid.area(), 4. * pi**2 * 2. * 1., places=1) eq(solid.volume(), 2. * pi**2 * 2. * 1.**2, places=3)
def test_createBox(self): eq = self.assertAlmostEqual self.assertRaises(OCCError, Solid().createBox, (-.5, -.5, -.5), (-.5, -.5, -.5)) solid = Solid() solid.createBox((-.5, -.5, -.5), (.5, .5, .5)) eq(solid.volume(), 1.)
def test_createTorus(self): eq = self.assertAlmostEqual self.assertRaises(OCCError, Solid().createCone, (0., 0., 0.), (0., 0., 1.), 0., 0.) self.assertRaises(OCCError, Solid().createCone, (0., 0., 0.), (0., 0., 1.), 1., 1.) solid = Solid() solid.createCone((0., 0., 0.), (0., 0., .1), 2., 1.) self.assertEqual(solid.volume() > 0., True)
def test_addSolids(self): eq = self.assertAlmostEqual s1 = Solid().createSphere((0.0, 0.0, 0.0), 1.0) s2 = Solid().createSphere((2.0, 0.0, 0.0), 1.0) s3 = Solid().addSolids((s1, s2)) self.assertEqual(s3.numSolids(), 2) eq(s3.area(), 2.0 * 4.0 * pi, places=3) eq(s3.volume(), 2.0 * 4.0 / 3.0 * pi, places=3) s1 = Solid().createSphere((0.0, 0.0, 0.0), 0.5) self.assertEqual(s1.numSolids(), 1) s2 = Solid().createSphere((2.0, 0.0, 0.0), 0.5) s1.addSolids(s2) self.assertEqual(s1.numSolids(), 2) s3 = Solid().createSphere((4.0, 0.0, 0.0), 0.5) s1.addSolids(s3) self.assertEqual(s1.numSolids(), 3)
def test_addSolids(self): eq = self.assertAlmostEqual s1 = Solid().createSphere((0., 0., 0.), 1.) s2 = Solid().createSphere((2., 0., 0.), 1.) s3 = Solid().addSolids((s1, s2)) self.assertEqual(s3.numSolids(), 2) eq(s3.area(), 2. * 4. * pi, places=3) eq(s3.volume(), 2. * 4. / 3. * pi, places=3) s1 = Solid().createSphere((0., 0., 0.), .5) self.assertEqual(s1.numSolids(), 1) s2 = Solid().createSphere((2., 0., 0.), .5) s1.addSolids(s2) self.assertEqual(s1.numSolids(), 2) s3 = Solid().createSphere((4., 0., 0.), .5) s1.addSolids(s3) self.assertEqual(s1.numSolids(), 3)