示例#1
0
文件: graphics.py 项目: TimSC/kivmap
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)
示例#2
0
    def on_touch_down(self, touch):

        with self.canvas:
            touch.ud["line"] = Line(points=[touch.x, touch.y])
示例#3
0
    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
                            ])
示例#4
0
 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')
示例#5
0
    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
示例#6
0
    def draw_timebar(self):
        # draw line
        self._timebar = Line(points=[0, 0, 0, self.height])

        # add timebar
        self.timebar.add(self._timebar)