[[FrontPage/Python/PySide]]
#! coding:utf-8
"""
pyside-painter-skelton.py
pysideでグラフィックを描画するためのスケルトンコード

Created by 0160929 on 2015/11/19 7:28
"""
__version__ = '0.3'
https://gist.github.com/peace098beat/db002e83002cc16c7981

import sys
import os

# PySide系モジュール
from PySide.QtGui import *
from PySide.QtCore import *
# 演算系モジュール
import numpy as np

# logを保存
from datetime import datetime
import csv


def resetlog(file):
    if os.path.exists(file):
        os.remove(file)
#sh(){
        #! coding:utf-8
	}"""
	pyside-painter-skelton.py
	pysideでグラフィックを描画するためのスケルトンコード

# ログファイルを削除
resetlog('log.cav')
	Created by 0160929 on 2015/11/19 7:28
	"""
	__version__ = '0.3'

	import sys
	import os

def debuglog(s=None, data=None):
    d = datetime.now().isoformat()
    with open('log.csv', 'a') as f:
        writer = csv.writer(f, lineterminator='\n')
        if not s is None:
            writer.writerow([d, s])
            print d, s
        if not data is None:
            writer.writerow([d, data])
            print d, data
    return
	# PySide系モジュール
	from PySide.QtGui import *
	from PySide.QtCore import *
	# 演算系モジュール
	import numpy as np

	# logを保存
	from datetime import datetime
	import csv

# 描画用PySideクラス
class GameWindow(QWidget):
    # -- 定数(画面サイズ) -----------------
    SCREEN_HEIGHT = 500
    SCREEN_WIDTH = 700
    MARGIN_HEIGHT = 50
    MARGIN_WIDTH = 50
    STAGE_HEIGHT = SCREEN_HEIGHT - 2 * MARGIN_HEIGHT
    STAGE_WIDTH = SCREEN_WIDTH - 2 * MARGIN_WIDTH
    # -- 定数(タイマー ms) -------------------
    INTERVAL_TIME = 1
    # -- 定数(その他) ---------------------

    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.resize(self.SCREEN_WIDTH, self.SCREEN_HEIGHT)
	def resetlog(file):
	    if os.path.exists(file):
	        os.remove(file)

        # -- 定数 ----------------------------
        self.step = 0
	# ログファイルを削除
	resetlog('log.cav')

        # -- 画面バッファ --------------------
        self.pixmap = QPixmap(self.size())

        # -- 解析用オブジェクト --------------
	def debuglog(s=None, data=None):
	    d = datetime.now().isoformat()
	    with open('log.csv', 'a') as f:
	        writer = csv.writer(f, lineterminator='\n')
	        if not s is None:
	            writer.writerow([d, s])
	            print d, s
	        if not data is None:
	            writer.writerow([d, data])
	            print d, data
	    return

        # -- 操作用変数 ----------------------

        # -- 初期画面の準備 ------------------
        self.refreshPixmap()  # 画面バッファの初期化
        painter = QPainter(self.pixmap)
        self.drawGrid(painter)  # グリッドの表示
        self.update()
	# 描画用PySideクラス
	class GameWindow(QWidget):
	    # -- 定数(画面サイズ) -----------------
	    SCREEN_HEIGHT = 500
	    SCREEN_WIDTH = 700
	    MARGIN_HEIGHT = 50
	    MARGIN_WIDTH = 50
	    STAGE_HEIGHT = SCREEN_HEIGHT - 2 * MARGIN_HEIGHT
	    STAGE_WIDTH = SCREEN_WIDTH - 2 * MARGIN_WIDTH
	    # -- 定数(タイマー ms) -------------------
	    INTERVAL_TIME = 1
	    # -- 定数(その他) ---------------------

        # メインループの準備と開始
        # -------------------------
        if False:
            self.timer = QTimer()
            self.timer.timeout.connect(self.mainloop)
            self.timer.start(self.INTERVAL_TIME)
	    def __init__(self, parent=None):
	        QWidget.__init__(self, parent)
	        self.resize(self.SCREEN_WIDTH, self.SCREEN_HEIGHT)

    # ************************************************************* #
    # メインループ
    # ************************************************************* #
    def mainloop(self):
        """
        アニメーションのメインループ
        アルゴリズムの時間更新等はここで行う
        """
        self.step += 1
        # -- アルゴリズム処理-----------
	        # -- 定数 ----------------------------
	        self.step = 0

        # -- 描画 ----------------------
        painter = QPainter(self.pixmap)
        self.drawGrid(painter)
        self.drawGeoPoints(painter)
	        # -- 画面バッファ --------------------
	        self.pixmap = QPixmap(self.size())

        # -- 画面更新 (AppのタイミングでpaintEventが呼ばれる) ---
        self.update()
	        # -- 解析用オブジェクト --------------

    def paintEvent(self, *args, **kwargs):
	        # -- 操作用変数 ----------------------

        # -- おまじない ---------------------------
        painter = QStylePainter(self)  # QPainterを生成
        painter.setRenderHint(QPainter.Antialiasing, True)  # アンチエイリアス
        painter.drawPixmap(0, 0, self.pixmap)  # QPainterでバッファに準備したデータを描画
	        # -- 初期画面の準備 ------------------
	        self.refreshPixmap()  # 画面バッファの初期化
	        painter = QPainter(self.pixmap)
	        self.drawGrid(painter)  # グリッドの表示
	        self.update()

        # 描画用QPenのデフォルト
        pen_default = QPen()
        pen_default.setColor(Qt.black)
        pen_default.setWidth(2)
        painter.setPen(pen_default)
        brush_default = QBrush(Qt.red, Qt.NoBrush)
        painter.setBrush(brush_default)
	        # メインループの準備と開始
	        # -------------------------
	        if False:
	            self.timer = QTimer()
	            self.timer.timeout.connect(self.mainloop)
	            self.timer.start(self.INTERVAL_TIME)

        # -- アクセス用定数 -----------------------
        x, y = 0, 1
	    # ************************************************************* #
	    # メインループ
	    # ************************************************************* #
	    def mainloop(self):
	        """
	        アニメーションのメインループ
	        アルゴリズムの時間更新等はここで行う
	        """
	        self.step += 1
	        # -- アルゴリズム処理-----------

        # -- 車両の位置情報を取得 -----------------
        pos = self.locateXY([self.STAGE_WIDTH / 2., self.STAGE_HEIGHT / 2.])
	        # -- 描画 ----------------------
	        painter = QPainter(self.pixmap)
	        self.drawGrid(painter)
	        self.drawGeoPoints(painter)

        # -- 車両位置のプロット -------------------
        pen = QPen(Qt.red, 5)
        painter.setPen(pen)
        painter.drawPoint(pos[x], pos[y])
	        # -- 画面更新 (AppのタイミングでpaintEventが呼ばれる) ---
	        self.update()

        # -- 車両位置に 円を描画 -----------------------------
        pen = QPen(Qt.black, 1, Qt.DotLine, Qt.RoundCap, Qt.RoundJoin)
        painter.setPen(pen)
        painter.setBrush(QBrush(QColor(0, 255, 0, 175)))
        circle_size = 50
        painter.drawEllipse(pos[x] - circle_size / 2, pos[y] - circle_size / 2, circle_size, circle_size)
	    def paintEvent(self, *args, **kwargs):

        # -- 車両位置に四角を描画 -----------------------------
        pen = QPen(Qt.black, 1, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)
        painter.setPen(pen)
        painter.setBrush(QBrush(QColor(0, 255, 0, 255), Qt.NoBrush))
        painter.drawRect(pos[x] - circle_size / 2, pos[y] - circle_size / 2, circle_size, circle_size)
	        # -- おまじない ---------------------------
	        painter = QStylePainter(self)  # QPainterを生成
	        painter.setRenderHint(QPainter.Antialiasing, True)  # アンチエイリアス
	        painter.drawPixmap(0, 0, self.pixmap)  # QPainterでバッファに準備したデータを描画

        # qpoints = [QPoint(*lv) for lv in v]
        # polygon = QPolygon(qpoints)
        # painter.drawPolygon(polygon)
	        # 描画用QPenのデフォルト
	        pen_default = QPen()
	        pen_default.setColor(Qt.black)
	        pen_default.setWidth(2)
	        painter.setPen(pen_default)
	        brush_default = QBrush(Qt.red, Qt.NoBrush)
	        painter.setBrush(brush_default)

        # -- 進行方向(速度ベクトル)を描画 ---------
        pen = QPen(Qt.gray, 1, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)
        painter.setPen(pen)
        painter.drawLine(pos[x], pos[y], (pos[x] + 50), (pos[y] + 50))
	        # -- アクセス用定数 -----------------------
	        x, y = 0, 1

        # -- 棒グラフを表示 -------------------------
        r = QRect(0, 0, 20, 30)
        r.setHeight(200)
        p0 = self.locateXY([20, 20], 'qp')
        r.moveBottomLeft(p0)
        painter.setBrush(QBrush(Qt.green, Qt.Dense4Pattern))
        painter.drawRect(r)
	        # -- 車両の位置情報を取得 -----------------
	        pos = self.locateXY([self.STAGE_WIDTH / 2., self.STAGE_HEIGHT / 2.])

        # ************************************************************* #
        # 描画系補助関数
        # ************************************************************* #
	        # -- 車両位置のプロット -------------------
	        pen = QPen(Qt.red, 5)
	        painter.setPen(pen)
	        painter.drawPoint(pos[x], pos[y])

    def drawDebugLog(self, painter):
        pass
	        # -- 車両位置に 円を描画 -----------------------------
	        pen = QPen(Qt.black, 1, Qt.DotLine, Qt.RoundCap, Qt.RoundJoin)
	        painter.setPen(pen)
	        painter.setBrush(QBrush(QColor(0, 255, 0, 175)))
	        circle_size = 50
	        painter.drawEllipse(pos[x] - circle_size / 2, pos[y] - circle_size / 2, circle_size, circle_size)

    def drawGrid(self, painter):
        """ マップを表示する関数
        """
        # -- 定数 ---------------------------------------
        Nx = 10
        Ny = 10
        Lx = self.STAGE_WIDTH
        Ly = self.STAGE_HEIGHT
	        # -- 車両位置に四角を描画 -----------------------------
	        pen = QPen(Qt.black, 1, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)
	        painter.setPen(pen)
	        painter.setBrush(QBrush(QColor(0, 255, 0, 255), Qt.NoBrush))
	        painter.drawRect(pos[x] - circle_size / 2, pos[y] - circle_size / 2, circle_size, circle_size)

        # -- 線の色と種類の選定 --------------------------
        painter.setPen(QPen(Qt.black, 0.5))
        painter.setBrush(QBrush(QColor(200, 200, 200, 150), Qt.Dense1Pattern))
	        # qpoints = [QPoint(*lv) for lv in v]
	        # polygon = QPolygon(qpoints)
	        # painter.drawPolygon(polygon)

        # -- 横線を描画 ----------------------------------
        for xi in range(Nx + 1):
            p1 = self.locateXY([xi * Lx / Nx, 0], 'qp')
            p2 = self.locateXY([xi * Lx / Nx, Ly], 'qp')
            painter.drawLine(p1, p2)
	        # -- 進行方向(速度ベクトル)を描画 ---------
	        pen = QPen(Qt.gray, 1, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)
	        painter.setPen(pen)
	        painter.drawLine(pos[x], pos[y], (pos[x] + 50), (pos[y] + 50))

        # -- 縦線を描画 ----------------------------------
        for yi in range(Ny + 1):
            p1 = self.locateXY([0, yi * Ly / Ny], 'qp')
            p2 = self.locateXY([Lx, yi * Ly / Ny], 'qp')
            painter.drawLine(p1, p2)
	        # -- 棒グラフを表示 -------------------------
	        r = QRect(0, 0, 20, 30)
	        r.setHeight(200)
	        p0 = self.locateXY([20, 20], 'qp')
	        r.moveBottomLeft(p0)
	        painter.setBrush(QBrush(Qt.green, Qt.Dense4Pattern))
	        painter.drawRect(r)

    def locateXY(self, pos, type='np'):
        """
        オブジェクトのローカル座標を、スクリーン上の座標へ変換
        """
        _pos = np.asarray(pos)
        local_x, local_y = _pos.copy()
        srn_x = local_x + self.MARGIN_WIDTH
        srn_y = (self.SCREEN_HEIGHT - local_y - self.MARGIN_HEIGHT)
	        # ************************************************************* #
	        # 描画系補助関数
	        # ************************************************************* #

        if type is 'np':
            return np.asarray([srn_x, srn_y])
        elif type is 'qp':
            return QPoint(srn_x, srn_y)
        elif type is 'qpF':
            return QPointF(srn_x, srn_y)
        elif type is 'list':
            return [srn_x, srn_y]
        return 'ERROR:: check type option'
	    def drawDebugLog(self, painter):
	        pass

    def locateVec(self, vec, type='np'):
        """
        オブジェクトのベクトルを、スクリーン上の座標空間へ変換
        (※yを反転させるだけ)
        """
        srn_vec = [vec[0], -1 * vec[1]]
	    def drawGrid(self, painter):
	        """ マップを表示する関数
	        """
	        # -- 定数 ---------------------------------------
	        Nx = 10
	        Ny = 10
	        Lx = self.STAGE_WIDTH
	        Ly = self.STAGE_HEIGHT

        if type is 'np':
            return np.asarray(srn_vec)
        elif type is 'qp':
            return QPoint(*srn_vec)
        elif type is 'qpF':
            return QPointF(*srn_vec)
        elif type is 'list':
            return srn_vec
        return 'ERROR:: check type option'
	        # -- 線の色と種類の選定 --------------------------
	        painter.setPen(QPen(Qt.black, 0.5))
	        painter.setBrush(QBrush(QColor(200, 200, 200, 150), Qt.Dense1Pattern))

    # ************************************************************* #
    # その他Qt関連補助関数
    # ************************************************************* #
    def refreshPixmap(self):
        """
        画面バッファの初期化関数
        """
        # 画面バッファの初期化
        self.pixmap = QPixmap(self.size())
        # 画面を塗りつぶし (おまじない)
        self.pixmap.fill(self, 0, 0)
        self.pixmap.fill(Qt.white)
        # ぺインターの生成 (おまじない)
        painter = QPainter(self.pixmap)
        # ぺインターによる初期化 (おまじない)
        painter.initFrom(self)
        pass
	        # -- 横線を描画 ----------------------------------
	        for xi in range(Nx + 1):
	            p1 = self.locateXY([xi * Lx / Nx, 0], 'qp')
	            p2 = self.locateXY([xi * Lx / Nx, Ly], 'qp')
	            painter.drawLine(p1, p2)

    def sizeHint(self):
        return QSize(self.SCREEN_WIDTH, self.SCREEN_HEIGHT)
	        # -- 縦線を描画 ----------------------------------
	        for yi in range(Ny + 1):
	            p1 = self.locateXY([0, yi * Ly / Ny], 'qp')
	            p2 = self.locateXY([Lx, yi * Ly / Ny], 'qp')
	            painter.drawLine(p1, p2)

    def keyPressEvent(self, event):
        e = event.key()
	    def locateXY(self, pos, type='np'):
	        """
	        オブジェクトのローカル座標を、スクリーン上の座標へ変換
	        """
	        _pos = np.asarray(pos)
	        local_x, local_y = _pos.copy()
	        srn_x = local_x + self.MARGIN_WIDTH
	        srn_y = (self.SCREEN_HEIGHT - local_y - self.MARGIN_HEIGHT)

        if e == Qt.Key_Up:
            pass
        elif e == Qt.Key_Down:
            pass
        elif e == Qt.Key_Left:
            pass
        elif e == Qt.Key_Right:
            pass
        elif e == Qt.Key_Plus:
            pass
        elif e == Qt.Key_Minus:
            pass
        elif e == Qt.Key_Q:
            self.close()
        else:
            pass
	        if type is 'np':
	            return np.asarray([srn_x, srn_y])
	        elif type is 'qp':
	            return QPoint(srn_x, srn_y)
	        elif type is 'qpF':
	            return QPointF(srn_x, srn_y)
	        elif type is 'list':
	            return [srn_x, srn_y]
	        return 'ERROR:: check type option'

        print 'Presskey', e
	    def locateVec(self, vec, type='np'):
	        """
	        オブジェクトのベクトルを、スクリーン上の座標空間へ変換
	        (※yを反転させるだけ)
	        """
	        srn_vec = [vec[0], -1 * vec[1]]

        self.update()
	        if type is 'np':
	            return np.asarray(srn_vec)
	        elif type is 'qp':
	            return QPoint(*srn_vec)
	        elif type is 'qpF':
	            return QPointF(*srn_vec)
	        elif type is 'list':
	            return srn_vec
	        return 'ERROR:: check type option'

	    # ************************************************************* #
	    # その他Qt関連補助関数
	    # ************************************************************* #
	    def refreshPixmap(self):
	        """
	        画面バッファの初期化関数
	        """
	        # 画面バッファの初期化
	        self.pixmap = QPixmap(self.size())
	        # 画面を塗りつぶし (おまじない)
	        self.pixmap.fill(self, 0, 0)
	        self.pixmap.fill(Qt.white)
	        # ぺインターの生成 (おまじない)
	        painter = QPainter(self.pixmap)
	        # ぺインターによる初期化 (おまじない)
	        painter.initFrom(self)
	        pass

# *******************************************************
# main関数
# *******************************************************
def mainGUI():
    app = QApplication(sys.argv)
    win = GameWindow()
    win.show()
    sys.exit(app.exec_())
	    def sizeHint(self):
	        return QSize(self.SCREEN_WIDTH, self.SCREEN_HEIGHT)

	    def keyPressEvent(self, event):
	        e = event.key()

if __name__ == "__main__":
    mainGUI()
	        if e == Qt.Key_Up:
	            pass
	        elif e == Qt.Key_Down:
	            pass
	        elif e == Qt.Key_Left:
	            pass
	        elif e == Qt.Key_Right:
	            pass
	        elif e == Qt.Key_Plus:
	            pass
	        elif e == Qt.Key_Minus:
	            pass
	        elif e == Qt.Key_Q:
	            self.close()
	        else:
	            pass

	        print 'Presskey', e

	        self.update()


	# *******************************************************
	# main関数
	# *******************************************************
	def mainGUI():
	    app = QApplication(sys.argv)
	    win = GameWindow()
	    win.show()
	    sys.exit(app.exec_())


	if __name__ == "__main__":
	    mainGUI()

#ls()


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS