def add_tube(prev, x, y): cylA = create_cylinder(r=3.155, h=8.6) cube = vtk.vtkCubeSource() cube.SetXLength(.75) cube.SetYLength(6.6) cube.SetZLength(13.6) cube.SetCenter(0, 1, 0) bA = vtkboolPython.vtkPolyDataBooleanFilter() bA.SetInputConnection(cylA.GetOutputPort()) bA.SetInputConnection(1, cube.GetOutputPort()) bA.SetOperModeToUnion() cylB = create_cylinder(r=2.405, h=8.6) bB = vtkboolPython.vtkPolyDataBooleanFilter() bB.SetInputConnection(bA.GetOutputPort()) bB.SetInputConnection(1, cylB.GetOutputPort()) bB.SetOperModeToDifference() tr = vtk.vtkTransform() tr.Translate(x, y, 4.3) tr.RotateX(90) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputConnection(bB.GetOutputPort()) bC = vtkboolPython.vtkPolyDataBooleanFilter() bC.SetInputConnection(prev.GetOutputPort()) bC.SetInputConnection(1, tf.GetOutputPort()) bC.SetOperModeToUnion() return bC
def add_stud(prev, x, y): cylA = create_cylinder(r=2.5, h=2.) trA = vtk.vtkTransform() trA.Translate(x, y, 10.6) trA.RotateX(90) tfA = vtk.vtkTransformPolyDataFilter() tfA.SetTransform(trA) tfA.SetInputConnection(cylA.GetOutputPort()) bA = vtkboolPython.vtkPolyDataBooleanFilter() bA.SetInputConnection(prev.GetOutputPort()) bA.SetInputConnection(1, tfA.GetOutputPort()) bA.SetOperModeToUnion() cylB = create_cylinder(r=1.5, h=1.) trB = vtk.vtkTransform() trB.Translate(x, y, 9.1) trB.RotateX(90) tfB = vtk.vtkTransformPolyDataFilter() tfB.SetTransform(trB) tfB.SetInputConnection(cylB.GetOutputPort()) bB = vtkboolPython.vtkPolyDataBooleanFilter() bB.SetInputConnection(bA.GetOutputPort()) bB.SetInputConnection(1, tfB.GetOutputPort()) bB.SetOperModeToDifference() return bB
def add_stud(prev, x, y): cylA = create_cylinder(r=2.5, h=2.) trA = vtk.vtkTransform() trA.Translate(x, y, 10.6) trA.RotateX(90) tfA = vtk.vtkTransformPolyDataFilter() tfA.SetTransform(trA) tfA.SetInputConnection(cylA.GetOutputPort()) bA = vtkboolPython.vtkPolyDataBooleanFilter() bA.SetInputConnection(prev.GetOutputPort()) bA.SetInputConnection(1, tfA.GetOutputPort()) bA.SetOperModeToUnion() bA.DecPolysOff() cylB = create_cylinder(r=1.5, h=1.) trB = vtk.vtkTransform() trB.Translate(x, y, 9.1) trB.RotateX(90) tfB = vtk.vtkTransformPolyDataFilter() tfB.SetTransform(trB) tfB.SetInputConnection(cylB.GetOutputPort()) bB = vtkboolPython.vtkPolyDataBooleanFilter() bB.SetInputConnection(bA.GetOutputPort()) bB.SetInputConnection(1, tfB.GetOutputPort()) bB.SetOperModeToDifference() bB.DecPolysOff() return bB
def create_sill3(): pr1 = [(0, 0), (1.75, 0), (1.75, 5. / 6 * 1.875), (0, 1.0833)] pr2 = [(.75, 0), (1.75, 0), (1.75, 5. / 6 * 1.875), (.75, 5. / 6 * 1.875)] extr = extrude(pr1, 22.7325 + 2 * .54125) extr2 = extrude(pr2, .54125) extr3 = extrude(pr2, .54125, 22.7325 + .54125) bf1 = vtkboolPython.vtkPolyDataBooleanFilter() bf1.SetInputConnection(extr.GetOutputPort()) bf1.SetInputConnection(1, extr2.GetOutputPort()) bf2 = vtkboolPython.vtkPolyDataBooleanFilter() bf2.SetInputConnection(bf1.GetOutputPort()) bf2.SetInputConnection(1, extr3.GetOutputPort()) clean = vtk.vtkCleanPolyData() clean.SetInputConnection(bf2.GetOutputPort()) pn = vtk.vtkPolyDataNormals() pn.SetInputConnection(clean.GetOutputPort()) pn.AutoOrientNormalsOn() tr = vtk.vtkTransform() tr.Translate(1.75, 0, 0) tr.RotateZ(180) tr.RotateX(90) tp = vtk.vtkTransformPolyDataFilter() tp.SetTransform(tr) tp.SetInputConnection(pn.GetOutputPort()) return tp
def create_sill(l): pr1 = [(0, 0), (1.6666, 0), (1.6666, 1.875), (0, .91666)] pr2 = [(.6666, 0), (1.6666, 0), (1.6666, 1.875), (.6666, 1.875)] extr = extrude(pr1, l + 2 * .8333) extr2 = extrude(pr2, .8333) extr3 = extrude(pr2, .8333, l + .8333) bf1 = vtkboolPython.vtkPolyDataBooleanFilter() bf1.SetInputConnection(extr.GetOutputPort()) bf1.SetInputConnection(1, extr2.GetOutputPort()) bf2 = vtkboolPython.vtkPolyDataBooleanFilter() bf2.SetInputConnection(bf1.GetOutputPort()) bf2.SetInputConnection(1, extr3.GetOutputPort()) clean = vtk.vtkCleanPolyData() clean.SetInputConnection(bf2.GetOutputPort()) pn = vtk.vtkPolyDataNormals() pn.SetInputConnection(clean.GetOutputPort()) pn.AutoOrientNormalsOn() tr = vtk.vtkTransform() tr.Translate(1.6666, 0, 0) tr.RotateZ(180) tr.RotateX(90) tp = vtk.vtkTransformPolyDataFilter() tp.SetTransform(tr) tp.SetInputConnection(pn.GetOutputPort()) return tp
def add_tube(prev, x, y): cylA = create_cylinder(r=3.155, h=8.6) cube = vtk.vtkCubeSource() cube.SetXLength(.75) cube.SetYLength(6.6) cube.SetZLength(13.6) cube.SetCenter(0, 1, 0) bA = vtkboolPython.vtkPolyDataBooleanFilter() bA.SetInputConnection(cylA.GetOutputPort()) bA.SetInputConnection(1, cube.GetOutputPort()) bA.SetOperModeToUnion() bA.DecPolysOff() cylB = create_cylinder(r=2.405, h=8.6) bB = vtkboolPython.vtkPolyDataBooleanFilter() bB.SetInputConnection(bA.GetOutputPort()) bB.SetInputConnection(1, cylB.GetOutputPort()) bB.SetOperModeToDifference() bB.DecPolysOff() tr = vtk.vtkTransform() tr.Translate(x, y, 4.30001) tr.RotateX(90) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputConnection(bB.GetOutputPort()) bC = vtkboolPython.vtkPolyDataBooleanFilter() bC.SetInputConnection(prev.GetOutputPort()) bC.SetInputConnection(1, tf.GetOutputPort()) bC.SetOperModeToUnion() bC.DecPolysOff() return bC
def split4(_=False): r = vtk.vtkSTLReader() r.SetFileName('Schuerze4.stl') r.Update() bnds = Bnds(*r.GetOutput().GetBounds()) y = bnds.y1 / 2 pts = [[bnds.x1 - 1, y, bnds.z1 - 1], [bnds.x2 + 1, y, bnds.z1 - 1], [bnds.x2 + 1, y, bnds.z2 + 1], [bnds.x1 - 1, y, bnds.z2 + 1]] if _: pts.reverse() cell = vtk.vtkIdList() vtk_pts = vtk.vtkPoints() vtk_pts.SetDataTypeToDouble() [(vtk_pts.InsertNextPoint(pt), cell.InsertNextId(i)) for i, pt in enumerate(pts)] pd = vtk.vtkPolyData() pd.Allocate(1, 1) pd.SetPoints(vtk_pts) pd.InsertNextCell(vtk.VTK_POLYGON, cell) prod = vtk.vtkTrivialProducer() prod.SetOutput(pd) bf = vtkboolPython.vtkPolyDataBooleanFilter() bf.SetInputConnection(r.GetOutputPort()) bf.SetInputConnection(1, prod.GetOutputPort()) bf.SetOperModeToDifference() clean = vtk.vtkCleanPolyData() clean.SetInputConnection(bf.GetOutputPort()) pn = vtk.vtkPolyDataNormals() pn.SetInputConnection(clean.GetOutputPort()) pn.AutoOrientNormalsOn() return pn
def add_bound(prev, x, y, phi): cube = vtk.vtkCubeSource() cube.SetXLength(.75) cube.SetYLength(.3) cube.SetZLength(8.6) tr = vtk.vtkTransform() tr.Translate(x, y, 4.3) tr.Push() tr.RotateZ(phi) tr.Translate(0, 2.65, 0) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputConnection(cube.GetOutputPort()) b = vtkboolPython.vtkPolyDataBooleanFilter() b.SetInputConnection(prev.GetOutputPort()) b.SetInputConnection(1, tf.GetOutputPort()) b.SetOperModeToUnion() return b
def write(self, *names): flts = [self.aligned[0]] for i, f in enumerate(self.aligned[1:]): bf = vtkboolPython.vtkPolyDataBooleanFilter() bf.SetInputConnection(flts[-1].GetOutputPort()) bf.SetInputConnection(1, f.GetOutputPort()) flts.append(bf) clean = vtk.vtkCleanPolyData() clean.SetInputConnection(flts[-1].GetOutputPort()) for name in names: if name.endswith('stl'): w = vtk.vtkSTLWriter() else: w = vtk.vtkPolyDataWriter() w.SetInputConnection(clean.GetOutputPort()) w.SetFileName(name) w.Update()
def merge4(): r = vtk.vtkPolyDataReader() r.SetFileName('einzeln/test6.vtk') r2 = vtk.vtkPolyDataReader() r2.SetFileName('einzeln/test7.vtk') tr = vtk.vtkTransform() tr.RotateZ(270) tp = vtk.vtkTransformPolyDataFilter() tp.SetTransform(tr) tp.SetInputConnection(r2.GetOutputPort()) bf = vtkboolPython.vtkPolyDataBooleanFilter() bf.SetInputConnection(r.GetOutputPort()) bf.SetInputConnection(1, tp.GetOutputPort()) bf.DecPolysOff() fr = add_frame(bf, [(10.8333, 2.5, 'top'), (32.5, 2.5, 'top')]) return fr
def add_bound(prev, x, y, phi): cube = vtk.vtkCubeSource() cube.SetXLength(.75) cube.SetYLength(.3) cube.SetZLength(8.6) tr = vtk.vtkTransform() tr.Translate(x, y, 4.3) tr.Push() tr.RotateZ(phi) tr.Translate(0, 2.65, 0) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputConnection(cube.GetOutputPort()) b = vtkboolPython.vtkPolyDataBooleanFilter() b.SetInputConnection(prev.GetOutputPort()) b.SetInputConnection(1, tf.GetOutputPort()) b.SetOperModeToUnion() b.DecPolysOff() return b
def create_sill4(l): pr1 = [(0, 0), (1.75, 0), (1.75, 5. / 6 * 1.875), (0, 1.0833)] pr2 = [(.75, 0), (1.75, 0), (1.75, 5. / 6 * 1.875), (.75, 5. / 6 * 1.875)] extr1 = extrude(pr1, l + .75 + .54125) extr2 = extrude(pr2, .54125) bf = vtkboolPython.vtkPolyDataBooleanFilter() bf.SetInputConnection(extr1.GetOutputPort()) bf.SetInputConnection(1, extr2.GetOutputPort()) bf.Update() bnds = Bnds(*bf.GetOutput().GetBounds()) pts = [(bnds.x1 - 2, bnds.y1 - 2, 0), (bnds.x2 + 2, bnds.y1 - 2, 0), (bnds.x2 + 2, bnds.y2 + 2, 0), (bnds.x1 - 2, bnds.y2 + 2, 0)] cell = vtk.vtkIdList() _pts = vtk.vtkPoints() _pts.SetDataTypeToDouble() [(_pts.InsertNextPoint(pt), cell.InsertNextId(i)) for i, pt in enumerate(pts[::-1])] pd = vtk.vtkPolyData() pd.Allocate(1, 1) pd.SetPoints(_pts) pd.InsertNextCell(vtk.VTK_POLYGON, cell) prod = vtk.vtkTrivialProducer() prod.SetOutput(pd) tr = vtk.vtkTransform() tr.Translate(0, 0, bnds.z2) tr.RotateY(45) tp = vtk.vtkTransformPolyDataFilter() tp.SetTransform(tr) tp.SetInputConnection(prod.GetOutputPort()) bf2 = vtkboolPython.vtkPolyDataBooleanFilter() bf2.SetInputConnection(bf.GetOutputPort()) bf2.SetInputConnection(1, tp.GetOutputPort()) bf2.SetOperModeToDifference() clean = vtk.vtkCleanPolyData() clean.SetInputConnection(bf2.GetOutputPort()) pn = vtk.vtkPolyDataNormals() pn.SetInputConnection(clean.GetOutputPort()) pn.AutoOrientNormalsOn() tr2 = vtk.vtkTransform() tr2.Translate(1.75, 0, 0) tr2.RotateZ(180) tr2.RotateX(90) tp2 = vtk.vtkTransformPolyDataFilter() tp2.SetTransform(tr2) tp2.SetInputConnection(pn.GetOutputPort()) return tp2
def add_frame(flt, holds=[]): flt.Update() bnds = Bnds(*flt.GetOutput().GetBounds()) pts1 = [(bnds.x1 - 2, bnds.y1 - 2, 0), (bnds.x2 + 2, bnds.y1 - 2, 0), (bnds.x2 + 2, bnds.y2 + 2, 0), (bnds.x1 - 2, bnds.y2 + 2, 0)] pts2 = [(bnds.x1 - 1, bnds.y1 - 1, 0), (bnds.x2 + 1, bnds.y1 - 1, 0), (bnds.x2 + 1, bnds.y2 + 1, 0), (bnds.x1 - 1, bnds.y2 + 1, 0)] extr1 = extrude(pts1, 1) extr2 = extrude(pts2, 1) bf = vtkboolPython.vtkPolyDataBooleanFilter() bf.SetInputConnection(extr1.GetOutputPort()) bf.SetInputConnection(1, extr2.GetOutputPort()) bf.SetOperModeToDifference() app = vtk.vtkAppendPolyData() app.AddInputConnection(flt.GetOutputPort()) app.AddInputConnection(bf.GetOutputPort()) conf = { 'left': ((.5, 0), (0, -90), lambda x, y: abs(bnds.x1 - x)), 'right': ((-.5, 0), (0, 90), lambda x, y: abs(bnds.x2 - x)), 'top': ((0, -.5), (-90, 0), lambda x, y: abs(bnds.y2 - y)), 'bottom': ((0, .5), (90, 0), lambda x, y: abs(bnds.y1 - y)) } if len(holds) > 0: app2 = vtk.vtkAppendPolyData() for x, y, dir_ in holds: mv, rot, fct = conf[dir_] pts = [(.5 + mv[0], -.5 + mv[1], 0), (.5 + mv[0], .5 + mv[1], 0), (-.5 + mv[0], .5 + mv[1], 0), (-.5 + mv[0], -.5 + mv[1], 0)] extr = extrude(pts, fct(x, y) + 1) tr = vtk.vtkTransform() tr.Translate(x, y, 0) tr.RotateX(rot[0]) tr.RotateY(rot[1]) tp = vtk.vtkTransformPolyDataFilter() tp.SetTransform(tr) tp.SetInputConnection(extr.GetOutputPort()) app2.AddInputConnection(tp.GetOutputPort()) bf2 = vtkboolPython.vtkPolyDataBooleanFilter() bf2.SetInputConnection(app.GetOutputPort()) bf2.SetInputConnection(1, app2.GetOutputPort()) clean = vtk.vtkCleanPolyData() clean.SetInputConnection(bf2.GetOutputPort()) return clean # app2.AddInputConnection(app.GetOutputPort()) # return app2 return app
subA = vtk.vtkLinearSubdivisionFilter() subA.SetInputConnection(triA.GetOutputPort()) subA.SetNumberOfSubdivisions(4) cubeB = vtk.vtkCubeSource() cubeB.SetBounds(-14.8, 14.8, -6.8, 6.8, 0, 8.6) triB = vtk.vtkTriangleFilter() triB.SetInputConnection(cubeB.GetOutputPort()) subB = vtk.vtkLinearSubdivisionFilter() subB.SetInputConnection(triB.GetOutputPort()) subB.SetNumberOfSubdivisions(4) boolA = vtkboolPython.vtkPolyDataBooleanFilter() boolA.SetInputConnection(subA.GetOutputPort()) boolA.SetInputConnection(1, subB.GetOutputPort()) boolA.SetOperModeToDifference() boolA.DecPolysOff() tubeA = add_tube(boolA, 0, 0) tubeB = add_tube(tubeA, -8, 0) tubeC = add_tube(tubeB, 8, 0) studA = add_stud(tubeC, -12, -4) studB = add_stud(studA, -12, 4) studC = add_stud(studB, -4, -4) studD = add_stud(studC, -4, 4) studE = add_stud(studD, 4, -4) studF = add_stud(studE, 4, 4)
def export (self, name): extr = extrude(self.draw_bricks(self.cfg['seqs'][0], self.cfg['end_seqs'][0]), self.cfg['q']/2, self.cfg['r']) extr1 = extrude(self.draw_spacer(), self.cfg['q']/2+self.cfg['r'], 2*self.cfg['e']) extr2 = extrude(self.draw_bricks(self.cfg['seqs'][1], self.cfg['end_seqs'][1]), -self.cfg['q']/2, -self.cfg['r']) extr3 = extrude(self.draw_spacer(), -self.cfg['q']/2-self.cfg['r'], -2*self.cfg['e']) extr4 = extrude(self.draw_zz_bricks(), -self.cfg['q']/2, self.cfg['q']) # extr + extr1 bf = vtkboolPython.vtkPolyDataBooleanFilter() bf.SetInputConnection(extr.GetOutputPort()) bf.SetInputConnection(1, extr1.GetOutputPort()) bf.DecPolysOff() # extr2 + extr3 bf1 = vtkboolPython.vtkPolyDataBooleanFilter() bf1.SetInputConnection(extr2.GetOutputPort()) bf1.SetInputConnection(1, extr3.GetOutputPort()) bf1.DecPolysOff() app = vtk.vtkAppendPolyData() app.AddInputConnection(bf.GetOutputPort()) app.AddInputConnection(bf1.GetOutputPort()) bf2 = vtkboolPython.vtkPolyDataBooleanFilter() bf2.SetInputConnection(app.GetOutputPort()) bf2.SetInputConnection(1, extr4.GetOutputPort()) bf2.DecPolysOff() ang = self.cfg['ang']*math.pi/180 v = [0, 5] _v = [math.cos(ang)*v[0]-math.sin(ang)*v[1], math.sin(ang)*v[0]+math.cos(ang)*v[1]] plane = vtk.vtkPlaneSource() plane.SetOrigin(0, 0, 0) plane.SetPoint1(0, 0, 5) plane.SetPoint2(_v[0], _v[1], 0) plane.SetCenter(0, 0 , 0) bf3 = vtkboolPython.vtkPolyDataBooleanFilter() bf3.SetInputConnection(bf2.GetOutputPort()) bf3.SetInputConnection(1, plane.GetOutputPort()) bf3.SetOperModeToDifference() bf3.DecPolysOff() result = bf3 if self.cfg['end'] == 'D': _v = [math.cos(-ang)*v[0]-math.sin(-ang)*v[1], math.sin(-ang)*v[0]+math.cos(-ang)*v[1]] plane1 = vtk.vtkPlaneSource() plane1.SetOrigin(0, 0, 0) plane1.SetPoint2(0, 0, 5) plane1.SetPoint1(_v[0], _v[1], 0) plane1.SetCenter(-self.cfg['w'], 0 , 0) bf4 = vtkboolPython.vtkPolyDataBooleanFilter() bf4.SetInputConnection(result.GetOutputPort()) bf4.SetInputConnection(1, plane1.GetOutputPort()) bf4.SetOperModeToDifference() bf4.DecPolysOff() result = bf4 if 'clip' in self.cfg: plane2 = vtk.vtkPlaneSource() plane2.SetOrigin(0, 0, 0) plane2.SetPoint1(0, 0, 5) plane2.SetPoint2(v[0], v[1], 0) plane2.SetCenter(-self.cfg['clip'], 0 , 0) bf5 = vtkboolPython.vtkPolyDataBooleanFilter() bf5.SetInputConnection(result.GetOutputPort()) bf5.SetInputConnection(1, plane2.GetOutputPort()) bf5.SetOperModeToDifference() bf5.DecPolysOff() result = bf5 if 'pins' in self.cfg: app1 = vtk.vtkAppendPolyData() t = self.cfg.get('clip', 0) fake_w = self.cfg.get('fake_w', self.cfg['w']) u = (fake_w-t)/self.cfg['pins']/2 for i in range(self.cfg['pins']): mid = t+u*(1+i*2) pin = extrude([ [-mid-2.5, self.cfg['b']], [-mid-2.5, self.cfg['b']+1.5], [-mid+2.5, self.cfg['b']+1.5], [-mid+2.5, self.cfg['b']] ], -.75, 1.5) app1.AddInputConnection(pin.GetOutputPort()) bf6 = vtkboolPython.vtkPolyDataBooleanFilter() bf6.SetInputConnection(result.GetOutputPort()) bf6.SetInputConnection(1, app1.GetOutputPort()) bf6.DecPolysOff() result = bf6 tra = vtk.vtkTransform() tra.Scale(-1, 1, 1) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputConnection(result.GetOutputPort()) tf.SetTransform(tra) if self.cfg['flip']: tf.Update() pd = tf.GetOutput() for i in range(pd.GetNumberOfCells()): pd.ReverseCell(i) result = tf clean = vtk.vtkCleanPolyData() clean.SetInputConnection(result.GetOutputPort()) writer = vtk.vtkPolyDataWriter() writer.SetInputConnection(clean.GetOutputPort()) writer.WriteToOutputStringOn() writer.Update() dat = writer.GetOutputString() pd = clean.GetOutput() num = pd.GetNumberOfPoints() pts = [ [ '%.8f' % x for x in pd.GetPoint(i) ] for i in range(num) ] m = re.search('POINTS.*?\n(.*?)\nP', dat, re.S) with open(name, 'w') as f: f.write(dat[:m.start(1)] + ' '.join(sum(pts, [])) + dat[m.end(1):]) if os.path.exists('stl'): tri = vtk.vtkTriangleFilter() tri.SetInputConnection(clean.GetOutputPort()) writer1 = vtk.vtkSTLWriter() writer1.SetFileName('stl/{0}.stl'.format(name[:-4])) writer1.SetInputConnection(tri.GetOutputPort()) writer1.Update()
def export(self, name): extr = extrude( self.draw_bricks(self.cfg['seqs'][0], self.cfg['end_seqs'][0]), self.cfg['q'] / 2, self.cfg['r']) extr1 = extrude(self.draw_spacer(), self.cfg['q'] / 2 + self.cfg['r'], 2 * self.cfg['e']) extr2 = extrude( self.draw_bricks(self.cfg['seqs'][1], self.cfg['end_seqs'][1]), -self.cfg['q'] / 2, -self.cfg['r']) extr3 = extrude(self.draw_spacer(), -self.cfg['q'] / 2 - self.cfg['r'], -2 * self.cfg['e']) extr4 = extrude(self.draw_zz_bricks(), -self.cfg['q'] / 2, self.cfg['q']) # extr + extr1 bf = vtkboolPython.vtkPolyDataBooleanFilter() bf.SetInputConnection(extr.GetOutputPort()) bf.SetInputConnection(1, extr1.GetOutputPort()) bf.DecPolysOff() # extr2 + extr3 bf1 = vtkboolPython.vtkPolyDataBooleanFilter() bf1.SetInputConnection(extr2.GetOutputPort()) bf1.SetInputConnection(1, extr3.GetOutputPort()) bf1.DecPolysOff() app = vtk.vtkAppendPolyData() app.AddInputConnection(bf.GetOutputPort()) app.AddInputConnection(bf1.GetOutputPort()) bf2 = vtkboolPython.vtkPolyDataBooleanFilter() bf2.SetInputConnection(app.GetOutputPort()) bf2.SetInputConnection(1, extr4.GetOutputPort()) bf2.DecPolysOff() ang = self.cfg['ang'] * math.pi / 180 v = [0, 5] _v = [ math.cos(ang) * v[0] - math.sin(ang) * v[1], math.sin(ang) * v[0] + math.cos(ang) * v[1] ] plane = vtk.vtkPlaneSource() plane.SetOrigin(0, 0, 0) plane.SetPoint1(0, 0, 5) plane.SetPoint2(_v[0], _v[1], 0) plane.SetCenter(0, 0, 0) bf3 = vtkboolPython.vtkPolyDataBooleanFilter() bf3.SetInputConnection(bf2.GetOutputPort()) bf3.SetInputConnection(1, plane.GetOutputPort()) bf3.SetOperModeToDifference() bf3.DecPolysOff() result = bf3 if self.cfg['end'] == 'D': _v = [ math.cos(-ang) * v[0] - math.sin(-ang) * v[1], math.sin(-ang) * v[0] + math.cos(-ang) * v[1] ] plane1 = vtk.vtkPlaneSource() plane1.SetOrigin(0, 0, 0) plane1.SetPoint2(0, 0, 5) plane1.SetPoint1(_v[0], _v[1], 0) plane1.SetCenter(-self.cfg['w'], 0, 0) bf4 = vtkboolPython.vtkPolyDataBooleanFilter() bf4.SetInputConnection(result.GetOutputPort()) bf4.SetInputConnection(1, plane1.GetOutputPort()) bf4.SetOperModeToDifference() bf4.DecPolysOff() result = bf4 if 'clip' in self.cfg: plane2 = vtk.vtkPlaneSource() plane2.SetOrigin(0, 0, 0) plane2.SetPoint1(0, 0, 5) plane2.SetPoint2(v[0], v[1], 0) plane2.SetCenter(-self.cfg['clip'], 0, 0) bf5 = vtkboolPython.vtkPolyDataBooleanFilter() bf5.SetInputConnection(result.GetOutputPort()) bf5.SetInputConnection(1, plane2.GetOutputPort()) bf5.SetOperModeToDifference() bf5.DecPolysOff() result = bf5 if 'pins' in self.cfg: app1 = vtk.vtkAppendPolyData() t = self.cfg.get('clip', 0) fake_w = self.cfg.get('fake_w', self.cfg['w']) u = (fake_w - t) / self.cfg['pins'] / 2 for i in range(self.cfg['pins']): mid = t + u * (1 + i * 2) pin = extrude([[-mid - 2.5, self.cfg['b']], [-mid - 2.5, self.cfg['b'] + 1.5], [-mid + 2.5, self.cfg['b'] + 1.5], [-mid + 2.5, self.cfg['b']]], -.75, 1.5) app1.AddInputConnection(pin.GetOutputPort()) bf6 = vtkboolPython.vtkPolyDataBooleanFilter() bf6.SetInputConnection(result.GetOutputPort()) bf6.SetInputConnection(1, app1.GetOutputPort()) bf6.DecPolysOff() result = bf6 tra = vtk.vtkTransform() tra.Scale(-1, 1, 1) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputConnection(result.GetOutputPort()) tf.SetTransform(tra) if self.cfg['flip']: tf.Update() pd = tf.GetOutput() for i in range(pd.GetNumberOfCells()): pd.ReverseCell(i) result = tf clean = vtk.vtkCleanPolyData() clean.SetInputConnection(result.GetOutputPort()) writer = vtk.vtkPolyDataWriter() writer.SetInputConnection(clean.GetOutputPort()) writer.WriteToOutputStringOn() writer.Update() dat = writer.GetOutputString() pd = clean.GetOutput() num = pd.GetNumberOfPoints() pts = [['%.8f' % x for x in pd.GetPoint(i)] for i in range(num)] m = re.search('POINTS.*?\n(.*?)\nP', dat, re.S) with open(name, 'w') as f: f.write(dat[:m.start(1)] + ' '.join(sum(pts, [])) + dat[m.end(1):]) if os.path.exists('stl'): tri = vtk.vtkTriangleFilter() tri.SetInputConnection(clean.GetOutputPort()) writer1 = vtk.vtkSTLWriter() writer1.SetFileName('stl/{0}.stl'.format(name[:-4])) writer1.SetInputConnection(tri.GetOutputPort()) writer1.Update()
#!/usr/bin/env python # *-* coding: UTF-8 *-* # Copyright 2012-2018 Ronald Römer # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys if sys.platform.startswith('linux'): sys.path.extend(sys.argv[1:]) elif sys.platform.startswith('win'): sys.path.extend([sys.argv[1], '/'.join(sys.argv[2:])]) import vtkboolPython vtkboolPython.vtkPolyDataBooleanFilter() #import vtk
def export (self, name): extr = extrude(self.draw_bricks(self.cfg['seqs'][0], self.cfg['end_seqs'][0]), self.cfg['r'], self.cfg['q']/2) extr1 = extrude(self.draw_spacer(), 2*self.cfg['e'], self.cfg['q']/2+self.cfg['r']) extr2 = extrude(self.draw_bricks(self.cfg['seqs'][1], self.cfg['end_seqs'][1]), -self.cfg['r'], -self.cfg['q']/2) extr3 = extrude(self.draw_spacer(), -2*self.cfg['e'], -self.cfg['q']/2-self.cfg['r']) extr4 = extrude(self.draw_zz_bricks(), self.cfg['q'], -self.cfg['q']/2) # extr + extr1 bf = vtkboolPython.vtkPolyDataBooleanFilter() bf.SetInputConnection(extr.GetOutputPort()) bf.SetInputConnection(1, extr1.GetOutputPort()) bf.DecPolysOff() # extr2 + extr3 bf1 = vtkboolPython.vtkPolyDataBooleanFilter() bf1.SetInputConnection(extr2.GetOutputPort()) bf1.SetInputConnection(1, extr3.GetOutputPort()) bf1.DecPolysOff() app = vtk.vtkAppendPolyData() app.AddInputConnection(bf.GetOutputPort()) app.AddInputConnection(bf1.GetOutputPort()) bf2 = vtkboolPython.vtkPolyDataBooleanFilter() bf2.SetInputConnection(app.GetOutputPort()) bf2.SetInputConnection(1, extr4.GetOutputPort()) bf2.DecPolysOff() ang = self.cfg['ang']*math.pi/180 v = [0, 5] _v = [math.cos(ang)*v[0]-math.sin(ang)*v[1], math.sin(ang)*v[0]+math.cos(ang)*v[1]] plane = vtk.vtkPlaneSource() plane.SetOrigin(0, 0, 0) plane.SetPoint1(0, 0, 5) plane.SetPoint2(_v[0], _v[1], 0) plane.SetCenter(0, 0 , 0) bf3 = vtkboolPython.vtkPolyDataBooleanFilter() bf3.SetInputConnection(bf2.GetOutputPort()) bf3.SetInputConnection(1, plane.GetOutputPort()) bf3.SetOperModeToDifference() bf3.DecPolysOff() result = bf3 if self.cfg['end'] == 'D': _v = [math.cos(-ang)*v[0]-math.sin(-ang)*v[1], math.sin(-ang)*v[0]+math.cos(-ang)*v[1]] plane1 = vtk.vtkPlaneSource() plane1.SetOrigin(0, 0, 0) plane1.SetPoint2(0, 0, 5) plane1.SetPoint1(_v[0], _v[1], 0) plane1.SetCenter(-self.cfg['w'], 0 , 0) bf4 = vtkboolPython.vtkPolyDataBooleanFilter() bf4.SetInputConnection(result.GetOutputPort()) bf4.SetInputConnection(1, plane1.GetOutputPort()) bf4.SetOperModeToDifference() bf4.DecPolysOff() result = bf4 if 'clip' in self.cfg: plane2 = vtk.vtkPlaneSource() plane2.SetOrigin(0, 0, 0) plane2.SetPoint1(0, 0, 5) plane2.SetPoint2(v[0], v[1], 0) plane2.SetCenter(-self.cfg['clip'], 0 , 0) bf5 = vtkboolPython.vtkPolyDataBooleanFilter() bf5.SetInputConnection(result.GetOutputPort()) bf5.SetInputConnection(1, plane2.GetOutputPort()) bf5.SetOperModeToDifference() bf5.DecPolysOff() result = bf5 if 'pins' in self.cfg: app1 = vtk.vtkAppendPolyData() t = self.cfg.get('clip', 0) fake_w = self.cfg.get('fake_w', self.cfg['w']) u = (fake_w-t)/self.cfg['pins']/2 h = self.cfg['q']+2*(self.cfg['r']+2*self.cfg['e']) mids = [] for i in range(self.cfg['pins']): mid = t+u*(1+i*2) pin = extrude([ [-mid-2.5, self.cfg['b']], [-mid-2.5, self.cfg['b']+1.5], [-mid+2.5, self.cfg['b']+1.5], [-mid+2.5, self.cfg['b']] ], h, -h/2) app1.AddInputConnection(pin.GetOutputPort()) mids.append(mid) _f = 1 if self.cfg['flip'] else -1 print('holds', [ (_f*mid, 2.5, 'top') for mid in mids ]) bf6 = vtkboolPython.vtkPolyDataBooleanFilter() bf6.SetInputConnection(result.GetOutputPort()) bf6.SetInputConnection(1, app1.GetOutputPort()) bf6.DecPolysOff() result = bf6 tra = vtk.vtkTransform() tra.Scale(-1, 1, 1) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputConnection(result.GetOutputPort()) tf.SetTransform(tra) if self.cfg['flip']: rs = vtk.vtkReverseSense() rs.SetInputConnection(tf.GetOutputPort()) result = rs result.Update() bnds = Bnds(*result.GetOutput().GetBounds()) tra2 = vtk.vtkTransform() tra2.Translate(0, 0, -bnds.z1) tf2 = vtk.vtkTransformPolyDataFilter() tf2.SetInputConnection(result.GetOutputPort()) tf2.SetTransform(tra2) clean = vtk.vtkCleanPolyData() clean.SetInputConnection(tf2.GetOutputPort()) writer = vtk.vtkPolyDataWriter() writer.SetInputConnection(clean.GetOutputPort()) writer.WriteToOutputStringOn() writer.Update() dat = writer.GetOutputString() pd = clean.GetOutput() num = pd.GetNumberOfPoints() pts = [ [ f'{x:.8f}' for x in pd.GetPoint(i) ] for i in range(num) ] m = re.search('POINTS.*?\n(.*?)\nP', dat, re.S) with open(name, 'w') as f: f.write(dat[:m.start(1)] + ' '.join(sum(pts, [])) + dat[m.end(1):])