def DrawLine(obj, width, DrawCallback, projObjs, tileCode, tileZoom, projInfo, dash_length = 1., dash_offset = 0.): xyPairs = [] projCode = projInfo[0] if projCode == "wgs84": for node in obj[0]: if nodePos is None: continue #Missing node x, y = Proj(nodePos[0], nodePos[1], projObjs) #print nodePos, x, y xyPairs.append(x) xyPairs.append(y) if projCode == "tile": tileSize = projObjs['tile_size'] dataResolutionWidth = projInfo[1] dataResolutionHeight = projInfo[2] xyPairs = obj[0] li = Line(points=xyPairs, width=width) if dash_length != 1. or dash_offset != 0.: li.width = 1.0 #Kivy only supports dashes with width of 1 li.dash_length = 10. li.dash_offset = 10. DrawCallback(li)
def on_touch_down(self, touch): with self.canvas: touch.ud["line"] = Line(points=[touch.x, touch.y])
def preview(self, interval): if (self.running == False and self.paused == False): if (self.menu.current_tab.text == 'Particles'): if (self.partmenu.current_tab.text == 'Single'): w = self.plotbox.size[0] h = self.plotbox.size[1] b = min(w, h) scalew = b / 200. scaleh = b / 200. self.plotbox.canvas.clear() vx = self.vsslider.value * np.cos(self.thetasslider.value * (np.pi / 180.)) vy = self.vsslider.value * np.sin(self.thetasslider.value * (np.pi / 180.)) with self.plotbox.canvas: Color(1.0, 0.5, 0.0) Ellipse(pos=(self.x0slider.value * scalew + w / 2. - self.R * scalew / 2., self.y0slider.value * scaleh + h / 2. - self.R * scalew / 2.), size=(self.R * scalew, self.R * scaleh)) Line(points=[ self.x0slider.value * scalew + w / 2., self.y0slider.value * scaleh + h / 2., vx * scalew + w / 2. + self.x0slider.value * scalew, vy * scalew + w / 2. + self.y0slider.value * scalew ]) elif (self.partmenu.current_tab.text == 'Dispersion'): w = self.plotbox.size[0] h = self.plotbox.size[1] b = min(w, h) scalew = b / 200. scaleh = b / 200. vx1 = self.vslider.value * np.cos( (self.thetaslider.value - self.alphaslider.value / 2.) * (np.pi / 180.)) vy1 = self.vslider.value * np.sin( (self.thetaslider.value - self.alphaslider.value / 2.) * (np.pi / 180.)) vx2 = self.vslider.value * np.cos( (self.thetaslider.value + self.alphaslider.value / 2.) * (np.pi / 180.)) vy2 = self.vslider.value * np.sin( (self.thetaslider.value + self.alphaslider.value / 2.) * (np.pi / 180.)) self.plotbox.canvas.clear() with self.plotbox.canvas: Color(1.0, 0.5, 0.0) Line(points=[ self.x0slider.value * scalew + w / 2., self.y0slider.value * scaleh + h / 2., vx1 * scalew + w / 2. + self.x0slider.value * scalew, vy1 * scalew + w / 2. + self.y0slider.value * scalew ]) Line(points=[ self.x0slider.value * scalew + w / 2., self.y0slider.value * scaleh + h / 2., vx2 * scalew + w / 2. + self.x0slider.value * scalew, vy2 * scalew + w / 2. + self.y0slider.value * scalew ]) elif (self.partmenu.current_tab.text == 'Line'): w = self.plotbox.size[0] h = self.plotbox.size[1] b = min(w, h) scalew = b / 200. scaleh = b / 200. r1 = np.array([self.x0slider.value, self.y0slider.value ]) - self.lslider.value * 0.5 * np.array([ -np.sin(self.thetalslider.value * (np.pi / 180.)), np.cos(self.thetalslider.value * (np.pi / 180.)) ]) r2 = np.array([self.x0slider.value, self.y0slider.value ]) + self.lslider.value * 0.5 * np.array([ -np.sin(self.thetalslider.value * (np.pi / 180.)), np.cos(self.thetalslider.value * (np.pi / 180.)) ]) r = r1 delta = self.lslider.value / (self.nlslider.value - 1) vx = self.vlslider.value * np.cos(self.thetalslider.value * (np.pi / 180.)) vy = self.vlslider.value * np.sin(self.thetalslider.value * (np.pi / 180.)) self.plotbox.canvas.clear() with self.plotbox.canvas: Color(1.0, 0.5, 0.0) Line(points=[ r1[0] * scalew + w / 2., r1[1] * scaleh + h / 2., r2[0] * scalew + w / 2., r2[1] * scaleh + h / 2. ]) for k in range(0, int(self.nlslider.value)): Line(points=[ r[0] * scalew + w / 2., r[1] * scaleh + h / 2., r[0] * scalew + w / 2. + vx * scalew, r[1] * scaleh + h / 2. + vy * scalew ]) r = r + delta * np.array([ -np.sin(self.thetalslider.value * (np.pi / 180.)), np.cos(self.thetalslider.value * (np.pi / 180.)) ]) elif (self.partmenu.current_tab.text == 'Free Part.'): w = self.plotbox.size[0] h = self.plotbox.size[1] b = min(w, h) scalew = b / 200. scaleh = b / 200. self.plotbox.canvas.clear() with self.plotbox.canvas: Color(1.0, 0.5, 0.0) Line(circle=(self.x0slider.value * scalew + w / 2., self.y0slider.value * scaleh + h / 2., self.sigfslider.value * scalew)) Line(points=[ self.x0slider.value * scalew + w / 2., self.y0slider.value * scaleh + h / 2., self.vxfslider.value * scalew + w / 2. + self.x0slider.value * scalew, self.vyfslider.value * scalew + w / 2. + self.y0slider.value * scalew ]) else: self.plotbox.canvas.clear() else: self.plotbox.canvas.clear() with self.plotbox.canvas: for i in range(0, len(self.previewlist), 2): if (self.previewlist[i] == 'Single'): x0 = self.previewlist[i + 1][0] y0 = self.previewlist[i + 1][1] vx0 = self.previewlist[i + 1][2] vy0 = self.previewlist[i + 1][3] w = self.plotbox.size[0] h = self.plotbox.size[1] b = min(w, h) scalew = b / 200. scaleh = b / 200. Color(0.0, 0.0, 1.0) Ellipse( pos=(x0 * scalew + w / 2. - self.R * scalew / 2., y0 * scaleh + h / 2. - self.R * scalew / 2.), size=(self.R * scalew, self.R * scaleh)) Line(points=[ x0 * scalew + w / 2., y0 * scaleh + h / 2., vx0 * scalew + w / 2. + x0 * scalew, vy0 * scalew + w / 2. + y0 * scalew ]) if (self.previewlist[i] == 'Dispersion'): x0 = self.previewlist[i + 1][0] y0 = self.previewlist[i + 1][1] v = self.previewlist[i + 1][2] theta = self.previewlist[i + 1][3] alpha = self.previewlist[i + 1][4] w = self.plotbox.size[0] h = self.plotbox.size[1] b = min(w, h) scalew = b / 200. scaleh = b / 200. vx1 = v * np.cos((theta - alpha / 2.) * (np.pi / 180.)) vy1 = v * np.sin((theta - alpha / 2.) * (np.pi / 180.)) vx2 = v * np.cos((theta + alpha / 2.) * (np.pi / 180.)) vy2 = v * np.sin((theta + alpha / 2.) * (np.pi / 180.)) with self.plotbox.canvas: Color(0.0, 0.0, 1.0) Line(points=[ x0 * scalew + w / 2., y0 * scaleh + h / 2., vx1 * scalew + w / 2. + x0 * scalew, vy1 * scalew + w / 2. + y0 * scalew ]) Line(points=[ x0 * scalew + w / 2., y0 * scaleh + h / 2., vx2 * scalew + w / 2. + x0 * scalew, vy2 * scalew + w / 2. + y0 * scalew ]) if (self.previewlist[i] == 'Line'): x0 = self.previewlist[i + 1][0] y0 = self.previewlist[i + 1][1] n = self.previewlist[i + 1][2] v = self.previewlist[i + 1][3] theta = self.previewlist[i + 1][4] l = self.previewlist[i + 1][5] w = self.plotbox.size[0] h = self.plotbox.size[1] b = min(w, h) scalew = b / 200. scaleh = b / 200. r1 = np.array([x0, y0]) - l * 0.5 * np.array([ -np.sin(theta * (np.pi / 180.)), np.cos(theta * (np.pi / 180.)) ]) r2 = np.array([x0, y0]) + l * 0.5 * np.array([ -np.sin(theta * (np.pi / 180.)), np.cos(theta * (np.pi / 180.)) ]) r = r1 delta = l / (n - 1) vx = v * np.cos(theta * (np.pi / 180.)) vy = v * np.sin(theta * (np.pi / 180.)) with self.plotbox.canvas: Color(0.0, 0.0, 1.0) Line(points=[ r1[0] * scalew + w / 2., r1[1] * scaleh + h / 2., r2[0] * scalew + w / 2., r2[1] * scaleh + h / 2. ]) for k in range(0, int(self.nlslider.value)): Line(points=[ r[0] * scalew + w / 2., r[1] * scaleh + h / 2., r[0] * scalew + w / 2. + vx * scalew, r[1] * scaleh + h / 2. + vy * scalew ]) r = r + delta * np.array([ -np.sin(theta * (np.pi / 180.)), np.cos(theta * (np.pi / 180.)) ]) if (self.previewlist[i] == 'Free Part.'): x0 = self.previewlist[i + 1][0] y0 = self.previewlist[i + 1][1] vx = self.previewlist[i + 1][2] vy = self.previewlist[i + 1][3] sig = self.previewlist[i + 1][4] w = self.plotbox.size[0] h = self.plotbox.size[1] b = min(w, h) scalew = b / 200. scaleh = b / 200. with self.plotbox.canvas: Color(0.0, 0.0, 1.0) Line(circle=(x0 * scalew + w / 2., y0 * scaleh + h / 2., sig * scalew)) Line(points=[ x0 * scalew + w / 2., y0 * scaleh + h / 2., vx * scalew + w / 2. + x0 * scalew, vy * scalew + w / 2. + y0 * scalew ])
def update(self, dt): super().update() with self.canvas: Color([1, 1, 1]) Line(points=[0, 0, 1000, 1000], width=2, cap='none') Line(ellipse=[0, 0, 400, 200], width=2, cap='none')
def draw_meterbars(self, midi=None): """ draw meterbars """ # pass on conditions if len(self.notemap) == 0: return elif not midi: if self.midi: midi = self.midi else: return # update self.midi if midi: self.midi = midi # clear meterbars self.meterbars['bar'].clear() # get total length of the song totalticks = self.midi.get_totalticks() # pixel per tick ppt = self.width / totalticks # pixel per quarter note pipqn = midi.ppqn * ppt # store pips self.pips = self.abs_width / self.midi.get_length() # color pick self.meterbars['bar'].add(Color(0.3, 0.3, 0.3, 1)) # meter info if not self.meters: tick = 0 self.meters = [] for msg in midi.midi_file.tracks[0]: tick += msg.time if msg.is_meta and msg.type == 'time_signature': self.meters.append({ 'tick': tick, 'pixel': tick * ppt, 'msg': msg }) # variables for drawing meter_iter = iter(self.meters) x = .0 num, denom = (4, 4) pibar = pipqn * num * (4 / denom) # load the first meter if it exists try: next_meter = next(meter_iter) except StopIteration: next_meter = None # main iteration while x <= self.width: # draw rectangle self.meterbars['bar'].add( Line(points=[x, 0, x, self.height], group='bar')) # if next meter exists if next_meter: # if it's the right time to swith to the new meter if x >= next_meter['pixel']: msg = next_meter['msg'] num, denom = (msg.numerator, msg.denominator) pibar = pipqn * num * (4 / denom) try: next_meter = next(meter_iter) except StopIteration: next_meter = None x += pibar
def draw_timebar(self): # draw line self._timebar = Line(points=[0, 0, 0, self.height]) # add timebar self.timebar.add(self._timebar)