class MainWindow(Qt.QMainWindow): def __init__(self, parent=None): Qt.QMainWindow.__init__(self, parent) self.frame = Qt.QFrame() self.layout = Qt.QVBoxLayout() self.vtkWidget = QVTKRenderWindowInteractor(self.frame) # Create vedo renderer and add objects and callbacks self.vp = Plotter(qtWidget=self.vtkWidget) self.cbid = self.vp.addCallback("key press", self.onKeypress) self.imgActor = Picture( "https://icatcare.org/app/uploads/2018/07/Helping-your-new-cat-or-kitten-settle-in-1.png" ) self.text2d = Text2D("Use slider to change contrast") self.slider = Qt.QSlider(1) self.slider.valueChanged.connect(self.onSlider) self.layout.addWidget(self.vtkWidget) self.layout.addWidget(self.slider) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.vp.show(self.imgActor, self.text2d, mode='image') # build the vedo rendering self.show() # show the Qt Window def onSlider(self, value): self.imgActor.window(value * 10) # change image contrast self.text2d.text(f"window level is now: {value*10}") self.vp.render() def onKeypress(self, evt): printc("You have pressed key:", evt.keyPressed, c='b') if evt.keyPressed == 'q': self.vp.close() self.vtkWidget.close() exit() def onClose(self): self.vtkWidget.close()
hanoi = Hanoi(nr_disks) tower_states = list([hanoi.towers]) for _ in hanoi.moves(): tower_states.append(hanoi.towers) disks = { hanoi.nr_disks - i: Cylinder(r=0.2 * (hanoi.nr_disks - i + 1), c=i) for i in range(hanoi.nr_disks) } plt = Plotter(interactive=False, size=(800, 600), bg='wheat', bg2='lb') plt += disks.values() plt += Box(pos=(3, 0, -0.5), size=(12, 4, 0.1)) cam = dict( pos=(14.60, -20.56, 7.680), focalPoint=(3.067, 0.5583, 1.910), viewup=(-0.1043, 0.2088, 0.9724), ) plt.show(camera=cam) pb = ProgressBar(0, len(tower_states), 1, c="y") for t in pb.range(): pb.print() state = tower_states[t] for tower_nr in range(3): for i, disk in enumerate(state[tower_nr]): disks[disk].pos([3 * tower_nr, 0, i + 0.5]) plt.render() plt.interactive().close()
class VirtualKeyboard: def __init__(self, songname=''): self.KB = dict() self.vp = None self.rightHand = None self.leftHand = None self.vpRH = None self.vpLH = None self.playsounds = True self.verbose = True self.songname = songname self.t0 = 0 # keep track of how many seconds to play self.dt = 0.1 self.speedfactor = 1 self.engagedfingersR = [False] * 6 # element 0 is dummy self.engagedfingersL = [False] * 6 self.engagedkeysR = [] self.engagedkeysL = [] self.build_keyboard() ################################################################################ def makeHandActor(self, f=1): a1, a2, a3, c = (10 * f, 0, 0), (0, 7 * f, 0), (0, 0, 3 * f), (.7, 0.3, 0.3) palm = Ellipsoid(pos=(0, -3, 0), axis1=a1, axis2=a2, axis3=a3, alpha=0.6, c=c) wrist = Box(pos=(0, -9, 0), length=6 * f, width=5, height=2, alpha=0.4, c=c) arm = Assembly([palm, wrist]) f1 = Cylinder((-2, 1.5, 0), axis=(0, 1, 0), height=5, r=.8 * f, c=c) f2 = Cylinder((-1, 3, 0), axis=(0, 1, 0), height=6, r=.7 * f, c=c) f3 = Cylinder((0, 4, 0), axis=(0, 1, 0), height=6.2, r=.75 * f, c=c) f4 = Cylinder((1, 3.5, 0), axis=(0, 1, 0), height=6.1, r=.7 * f, c=c) f5 = Cylinder((2, 2, 0), axis=(0, 1, 0), height=5, r=.6 * f, c=c) self.vp += [arm, f1, f2, f3, f4, f5] # add actors to internal list return [arm, f1, f2, f3, f4, f5] def build_RH(self, hand): #########################Build Right Hand self.rightHand = hand f = utils.handSizeFactor(hand.size) self.vpRH = self.makeHandActor(f) for limb in self.vpRH: # initial x positions are superseded later limb.x(limb.x() * 2.5) limb.addPos([16.5 * 5 + 1, -7.5, 3]) def build_LH(self, hand): ########################Build Left Hand self.leftHand = hand f = utils.handSizeFactor(hand.size) self.vpLH = self.makeHandActor(f) for limb in self.vpLH: limb.x(limb.x() * 2.5) limb.addPos([16.5 * 3 + 1, -7.5, 3]) #######################################################Build Keyboard def build_keyboard(self): nts = ("C", "D", "E", "F", "G", "A", "B") tol = 0.12 keybsize = 16.5 # in cm, span of one octave wb = keybsize / 7 nr_octaves = 7 span = nr_octaves * wb * 7 self.vp = Plotter(title='PianoPlayer ' + __version__, axes=0, size=(1400, 700), bg='cornsilk', bg2='lb') #wooden top and base self.vp += Box(pos=(span / 2 + keybsize, 6, 1), length=span + 1, height=3, width=5).texture('wood1') self.vp += Box(pos=(span / 2 + keybsize, 0, -1), length=span + 1, height=1, width=17).texture('wood1') self.vp += Text('PianoPlayer ^' + __version__ + " ", pos=(18, 5., 2.3), depth=.5, c='silver', italic=0.8) leggio = Box(pos=(span / 1.55, 8, 10), length=span / 2, height=span / 8, width=0.08, c=(1, 1, 0.9)).rotateX(-20) self.vp += leggio.texture('paper1') self.vp += Text('Playing:\n' + self.songname[-30:].replace('_', "\\_"), font="Theemim", vspacing=3, depth=0.04, s=1.35, c='k', italic=0.5).rotateX(70).pos([55, 10, 6]) for ioct in range(nr_octaves): for ik in range(7): #white keys x = ik * wb + (ioct + 1) * keybsize + wb / 2 tb = Box(pos=(x, -2, 0), length=wb - tol, height=1, width=12, c='white') self.KB.update({nts[ik] + str(ioct + 1): tb}) self.vp += tb if not nts[ik] in ("E", "B"): #black keys tn = Box(pos=(x + wb / 2, 0, 1), length=wb * .6, height=1, width=8, c='black') self.KB.update({nts[ik] + "#" + str(ioct + 1): tn}) self.vp += tn cam = dict(pos=(110, -51.1, 89.1), focalPoint=(81.5, 0.531, 2.82), viewup=(-0.163, 0.822, 0.546), distance=105, clippingRange=(41.4, 179)) self.vp.show(interactive=0, camera=cam, resetcam=0) ##################################################################### def play(self): printc('Press space to proceed by one note', c=1) printc('Press Esc to exit.', c=1) if self.rightHand: self.engagedkeysR = [False] * len(self.rightHand.noteseq) self.engagedfingersR = [False] * 6 # element 0 is dummy if self.leftHand: self.engagedkeysL = [False] * len(self.leftHand.noteseq) self.engagedfingersL = [False] * 6 t = 0.0 while True: if self.rightHand: self._moveHand(1, t) if self.leftHand: self._moveHand(-1, t) if t > 1000: break t += self.dt # absolute time flows if self.verbose: printc('End of note sequence reached.') self.vp.keyPressFunction = None # disable observer ################################################################### def _moveHand(self, side, t): ############# runs inside play() loop if side == 1: c1, c2 = 'tomato', 'orange' engagedkeys = self.engagedkeysR engagedfingers = self.engagedfingersR H = self.rightHand vpH = self.vpRH else: c1, c2 = 'purple', 'mediumpurple' engagedkeys = self.engagedkeysL engagedfingers = self.engagedfingersL H = self.leftHand vpH = self.vpLH for i, n in enumerate(H.noteseq): ##################### start, stop, f = n.time, n.time + n.duration, n.fingering if isinstance(f, str): continue if f and stop <= t <= stop + self.dt and engagedkeys[ i]: #release key engagedkeys[i] = False engagedfingers[f] = False name = nameof(n) krelease(self.KB[name]) frelease(vpH[f]) if hasattr(self.vp, 'interactor'): self.vp.render() for i, n in enumerate(H.noteseq): ##################### start, stop, f = n.time, n.time + n.duration, n.fingering if isinstance(f, str): print('Warning: cannot understand lyrics:', f, 'skip note', i) continue if f and start <= t < stop and not engagedkeys[ i] and not engagedfingers[f]: # press key if i >= len(H.fingerseq): return engagedkeys[i] = True engagedfingers[f] = True name = nameof(n) if t > self.t0 + self.vp.clock: self.t0 = t self.vp.show(interactive=False, resetcam=False) for g in [1, 2, 3, 4, 5]: vpH[g].x(side * H.fingerseq[i][g]) vpH[0].x(vpH[3].x() ) # index 0 is arm, put it where middle finger is fpress(vpH[f], c1) kpress(self.KB[name], c2) if self.verbose: msg = 'meas.' + str(n.measure) + ' t=' + str(round(t, 2)) if side == 1: printc(msg, '\t\t\t\tRH.finger', f, 'hit', name, c='b') else: printc(msg, '\tLH.finger', f, 'hit', name, c='m') if self.playsounds: self.vp.show(interactive=False, resetcam=False) playSound(n, self.speedfactor, wait=True) if hasattr(self.vp, 'interactor'): self.vp.interactor.Start() else: self.vp.show(interactive=1, resetcam=0)