Quellcode durchsuchen

GridViewer class created

olinox vor 9 Jahren
Ursprung
Commit
a4551cf491

+ 0 - 0
core/graphic/__init__.py


+ 34 - 0
core/graphic/cells.py

@@ -0,0 +1,34 @@
+'''
+Created on 26 nov. 2016
+
+@author: olinox
+'''
+from core import geometry
+
+
+def polygon(shape, x, y, scale = 120):
+    if shape == geometry.HEX:
+        
+        if 1 == (x % 2): 
+            y += 0.5
+            
+        return [
+                   ( ((x*0.866)+0.2886) * scale ,   y * scale), \
+                   ( ((x*0.866)+0.866) * scale  ,   y * scale), \
+                   ( ((x*0.866)+1.1547) * scale ,   (y+0.5) * scale), \
+                   ( ((x*0.866)+0.866) * scale  ,   (y+1) * scale), \
+                   ( ((x*0.866)+0.2886) * scale ,   (y+1) * scale),  \
+                   ( (x*0.866) * scale          ,   (y+0.5) * scale) 
+                ]
+        
+    elif shape == geometry.SQUARE :
+        
+        return  [ 
+                    (x * scale,      y * scale), \
+                    ((x+1) * scale,  y * scale), \
+                    ((x+1) * scale,  (y+1) * scale), \
+                    (x * scale,       (y+1) * scale) 
+                ]   
+        
+    else:
+        raise ValueError("'shape' has to be a value from GEOMETRIES")

+ 80 - 0
tests/gridviewer/GridViewer.py

@@ -0,0 +1,80 @@
+'''
+Created on 26 nov. 2016
+
+@author: olinox
+'''
+
+if __name__ == "__main__":
+    import os, sys
+    pypog_path = (os.path.abspath("..\\..\\"))
+    sys.path.append(pypog_path)
+
+from PyQt5.QtCore import QPointF
+from PyQt5.QtGui import QPolygonF
+from PyQt5.QtWidgets import QMainWindow, QGraphicsPolygonItem, QGraphicsItem, \
+    QApplication, QGraphicsScene
+
+from core import geometry
+from core.graphic.cells import polygon
+from tests.gridviewer.main import Ui_window
+
+
+# from PyQt5.Qt import QMainWindow, QApplication, QPolygonF, QGraphicsPolygonItem, \
+#     QGraphicsItem, QPointF
+class GridViewer(QMainWindow):
+
+    def __init__(self):
+        super (GridViewer, self).__init__()
+        
+        self._polygons = {}
+        self.createWidgets()
+        
+    def createWidgets(self):
+        self.ui = Ui_window()
+        self.ui.setupUi(self)                      
+        
+        self._scene = QGraphicsScene()
+        self.ui.view.setScene(self._scene)
+        self.ui.view.scale(0.25, 0.25)
+        self.ui.view.centerOn(QPointF(0,0))
+        self.ui.view.setDragMode(1)
+        
+        self.ui.btn_make.clicked.connect(self.make_grid)
+
+        
+    def make_grid(self):
+        shape = geometry.HEX if self.ui.opt_hex.isChecked() else geometry.SQUARE
+        width = self.ui.spb_width.value()
+        height = self.ui.spb_height.value()
+        
+        kx = 1 if shape == geometry.SQUARE else 0.866
+        
+        margin = 240 
+        cell_height = 120
+        
+        self._scene.clear()
+        
+        self._scene.setSceneRect(0 - margin, 0 - margin, (kx * cell_height * (width + 2)) + margin, (cell_height * (height + 2)) + margin)
+        
+        for x in range(width):
+            for y in range(height):
+                points = [QPointF(xp, yp) for xp, yp in polygon(shape, x, y)]
+                
+                qpolygon = QPolygonF( points )
+                
+                graphic_polygon = QGraphicsPolygonItem(qpolygon)
+                
+                self._scene.addItem(graphic_polygon)
+                
+                graphic_polygon.setFlag(QGraphicsItem.ItemIsFocusable)
+                
+                self._polygons[(x, y)] = graphic_polygon
+
+
+if __name__ == "__main__":
+    
+    app = QApplication(sys.argv)
+    gv = GridViewer()
+    gv.show()
+    r = app.exec_()
+    exit(r)

+ 100 - 0
tests/gridviewer/main.py

@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'main.ui'
+#
+# Created by: PyQt5 UI code generator 5.5.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_window(object):
+    def setupUi(self, window):
+        window.setObjectName("window")
+        window.resize(791, 669)
+        font = QtGui.QFont()
+        font.setFamily("Verdana")
+        font.setPointSize(8)
+        window.setFont(font)
+        self.centralwidget = QtWidgets.QWidget(window)
+        self.centralwidget.setObjectName("centralwidget")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setSpacing(3)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.view = QtWidgets.QGraphicsView(self.centralwidget)
+        self.view.setObjectName("view")
+        self.verticalLayout.addWidget(self.view)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setContentsMargins(10, 0, 10, -1)
+        self.horizontalLayout_2.setSpacing(10)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.label = QtWidgets.QLabel(self.centralwidget)
+        self.label.setObjectName("label")
+        self.horizontalLayout_2.addWidget(self.label)
+        self.opt_hex = QtWidgets.QRadioButton(self.centralwidget)
+        self.opt_hex.setMinimumSize(QtCore.QSize(0, 28))
+        self.opt_hex.setMaximumSize(QtCore.QSize(140, 28))
+        self.opt_hex.setChecked(True)
+        self.opt_hex.setObjectName("opt_hex")
+        self.horizontalLayout_2.addWidget(self.opt_hex)
+        self.opt_square = QtWidgets.QRadioButton(self.centralwidget)
+        self.opt_square.setMinimumSize(QtCore.QSize(0, 28))
+        self.opt_square.setMaximumSize(QtCore.QSize(140, 28))
+        self.opt_square.setObjectName("opt_square")
+        self.horizontalLayout_2.addWidget(self.opt_square)
+        self.spb_width = QtWidgets.QSpinBox(self.centralwidget)
+        self.spb_width.setMinimumSize(QtCore.QSize(20, 28))
+        self.spb_width.setMaximumSize(QtCore.QSize(80, 28))
+        self.spb_width.setMinimum(1)
+        self.spb_width.setMaximum(9999)
+        self.spb_width.setObjectName("spb_width")
+        self.horizontalLayout_2.addWidget(self.spb_width)
+        self.label_2 = QtWidgets.QLabel(self.centralwidget)
+        self.label_2.setMinimumSize(QtCore.QSize(10, 0))
+        self.label_2.setMaximumSize(QtCore.QSize(10, 16777215))
+        self.label_2.setObjectName("label_2")
+        self.horizontalLayout_2.addWidget(self.label_2)
+        self.spb_height = QtWidgets.QSpinBox(self.centralwidget)
+        self.spb_height.setMinimumSize(QtCore.QSize(20, 28))
+        self.spb_height.setMaximumSize(QtCore.QSize(80, 28))
+        self.spb_height.setMinimum(1)
+        self.spb_height.setMaximum(9999)
+        self.spb_height.setObjectName("spb_height")
+        self.horizontalLayout_2.addWidget(self.spb_height)
+        self.btn_make = QtWidgets.QToolButton(self.centralwidget)
+        self.btn_make.setMinimumSize(QtCore.QSize(35, 35))
+        self.btn_make.setObjectName("btn_make")
+        self.horizontalLayout_2.addWidget(self.btn_make)
+        self.verticalLayout.addLayout(self.horizontalLayout_2)
+        self.verticalLayout_2.addLayout(self.verticalLayout)
+        window.setCentralWidget(self.centralwidget)
+        self.menubar = QtWidgets.QMenuBar(window)
+        self.menubar.setGeometry(QtCore.QRect(0, 0, 791, 19))
+        self.menubar.setObjectName("menubar")
+        self.menuFichier = QtWidgets.QMenu(self.menubar)
+        self.menuFichier.setObjectName("menuFichier")
+        window.setMenuBar(self.menubar)
+        self.statusbar = QtWidgets.QStatusBar(window)
+        self.statusbar.setObjectName("statusbar")
+        window.setStatusBar(self.statusbar)
+        self.actionQuitter = QtWidgets.QAction(window)
+        self.actionQuitter.setObjectName("actionQuitter")
+        self.menuFichier.addAction(self.actionQuitter)
+        self.menubar.addAction(self.menuFichier.menuAction())
+
+        self.retranslateUi(window)
+        QtCore.QMetaObject.connectSlotsByName(window)
+
+    def retranslateUi(self, window):
+        _translate = QtCore.QCoreApplication.translate
+        window.setWindowTitle(_translate("window", "MainWindow"))
+        self.label.setText(_translate("window", "Grid Viewer"))
+        self.opt_hex.setText(_translate("window", "Hexagonal grid"))
+        self.opt_square.setText(_translate("window", "Square grid"))
+        self.label_2.setText(_translate("window", "X"))
+        self.btn_make.setText(_translate("window", ">>"))
+        self.menuFichier.setTitle(_translate("window", "Fichier"))
+        self.actionQuitter.setText(_translate("window", "Quitter"))
+

+ 202 - 0
tests/gridviewer/main.ui

@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>window</class>
+ <widget class="QMainWindow" name="window">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>791</width>
+    <height>669</height>
+   </rect>
+  </property>
+  <property name="font">
+   <font>
+    <family>Verdana</family>
+    <pointsize>8</pointsize>
+   </font>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QVBoxLayout" name="verticalLayout_2">
+    <item>
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <property name="spacing">
+       <number>3</number>
+      </property>
+      <item>
+       <widget class="QGraphicsView" name="view"/>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_2">
+        <property name="spacing">
+         <number>10</number>
+        </property>
+        <property name="leftMargin">
+         <number>10</number>
+        </property>
+        <property name="topMargin">
+         <number>0</number>
+        </property>
+        <property name="rightMargin">
+         <number>10</number>
+        </property>
+        <item>
+         <widget class="QLabel" name="label">
+          <property name="text">
+           <string>Grid Viewer</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QRadioButton" name="opt_hex">
+          <property name="minimumSize">
+           <size>
+            <width>0</width>
+            <height>28</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>140</width>
+            <height>28</height>
+           </size>
+          </property>
+          <property name="text">
+           <string>Hexagonal grid</string>
+          </property>
+          <property name="checked">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QRadioButton" name="opt_square">
+          <property name="minimumSize">
+           <size>
+            <width>0</width>
+            <height>28</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>140</width>
+            <height>28</height>
+           </size>
+          </property>
+          <property name="text">
+           <string>Square grid</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QSpinBox" name="spb_width">
+          <property name="minimumSize">
+           <size>
+            <width>20</width>
+            <height>28</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>80</width>
+            <height>28</height>
+           </size>
+          </property>
+          <property name="minimum">
+           <number>1</number>
+          </property>
+          <property name="maximum">
+           <number>999</number>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLabel" name="label_2">
+          <property name="minimumSize">
+           <size>
+            <width>10</width>
+            <height>0</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>10</width>
+            <height>16777215</height>
+           </size>
+          </property>
+          <property name="text">
+           <string>X</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QSpinBox" name="spb_height">
+          <property name="minimumSize">
+           <size>
+            <width>20</width>
+            <height>28</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>80</width>
+            <height>28</height>
+           </size>
+          </property>
+          <property name="minimum">
+           <number>1</number>
+          </property>
+          <property name="maximum">
+           <number>999</number>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QToolButton" name="btn_make">
+          <property name="minimumSize">
+           <size>
+            <width>35</width>
+            <height>35</height>
+           </size>
+          </property>
+          <property name="text">
+           <string>&gt;&gt;</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>791</width>
+     <height>19</height>
+    </rect>
+   </property>
+   <widget class="QMenu" name="menuFichier">
+    <property name="title">
+     <string>Fichier</string>
+    </property>
+    <addaction name="actionQuitter"/>
+   </widget>
+   <addaction name="menuFichier"/>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+  <action name="actionQuitter">
+   <property name="text">
+    <string>Quitter</string>
+   </property>
+  </action>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 0 - 0
tests/gridviewer/readme.md