Создание кнопки с логикой стандартных кнопок отрисовки геометрии
Создание кнопки с логикой стандартных кнопок отрисовки геометрии
Добрый день! Не подскажите как создать свои кнопки отрисовки геометрии с логикой отрисовки стандартных инструментов (точки, полилинии и полигона)? Т.е. создаем свою кнопку, допустим на основе стандартной кнопки создания полилинии, а уже после создания полилинии, получаем возможность что-то с ней делать дальше. Или делается только через Tool со "своей" отрисовкой и сохранением геометрии
Re: Создание кнопки с логикой стандартных кнопок отрисовки геометрии
Здравствуйте!
Если я Вас правильно понял, подойдет StyledButton.
Небольшой пример.
Если я Вас правильно понял, подойдет StyledButton.
Небольшой пример.
Код: Выделить всё
import axioma
from axioma.render import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from axioma.mapinfo import *
from axioma.gui import *
style = MapBasicStyle().styleFromString("Pen (2,2,0) Brush (2,16711680)")
class MyDialog(QDialog):
def __init__(self, parent):
QDialog.__init__(self, parent)
self.pb = StyledButton(PolygonalGeometryClass(), style, self)
#self.pb.setEnabled(False)
self.setGeometry(400, 200, 600, 400)
self.pb.setGeometry(100, 100, 100, 50)
dlg = MyDialog(axioma.app.mainWindow)
dlg.exec()
Re: Создание кнопки с логикой стандартных кнопок отрисовки геометрии
Спасибо, но немного не то.. Я иммел в виду отрисовку самой геометрии, а не выбор стиля.. Есть три кнопки которые рисуют геометрию: точку, полилинию и полигон.. Нажимается кнопка - отрисовываем геометрию, затем создается объект в таблице и вызывается его карточка, потом заполняются поля и на их основе присваивается условное обозначение (в общем - справочник). Можно ли использовать стандартные инструменты отрисовки - унаследоваться от них? Или доступна только ручная отрисовка по координатам наследуясь от Tool?
Re: Создание кнопки с логикой стандартных кнопок отрисовки геометрии
Здравствуйте.
Такого готового решения у нас нет. Геометрию в Вашем случае надо будет отрисовывать в растр, а его уже использовать в качестве иконки. Вот небольшой пример:
Такого готового решения у нас нет. Геометрию в Вашем случае надо будет отрисовывать в растр, а его уже использовать в качестве иконки. Вот небольшой пример:
Код: Выделить всё
import axioma
from axioma.render import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from axioma.mapinfo import *
from axioma.gui import *
from PyQt5.QtGui import QImage, QPainter
from axioma.core.geometry import *
# Создание полигона
def createPolygon():
poly = QPolygonF();
poly << QPointF(10,310) << QPointF(10,400) << QPointF(50,350) << QPointF(100,400) << QPointF(100,310) << QPointF(10,310)
polygon = Polygon(None, poly)
return polygon
# Рисуем геометрию в растр
def getImageForGeometry( size):
image = QImage(size.toSize(), QImage.Format_ARGB32_Premultiplied) # Сам растр, куда будем рисовать
image.fill(Qt.white)
painter = QPainter(image)
polygon = createPolygon()
viewport = Viewport (QRectF(QPointF(0, 0), size), polygon.boundingRect()) # viewport
context = Context(painter, viewport) # контекст
style = MapBasicStyle().styleFromString(' Pen (1,2,0) Brush (2,255,16777215)') # Cтиль
polygon_device = polygon.transformed(context.sceneToDeviceTransform()) # Преобразуем в координаты выходного растра
style.draw(polygon_device, context) # Отрисовка
return image
class MyDialog(QDialog):
def __init__(self, parent):
QDialog.__init__(self, parent)
size = QSizeF(100, 100)
self.pb = QToolButton(self)
self.pb.setIconSize(size.toSize())
image = getImageForGeometry(size)
self.pb.setIcon(QIcon(QPixmap.fromImage(image)))
self.setGeometry(400, 200, 600, 400)
self.pb.setGeometry(100, 100, 100, 50)
self.pb.clicked.connect(lambda: print("Нажали"))
dlg = MyDialog(axioma.app.mainWindow)
dlg.exec()
Re: Создание кнопки с логикой стандартных кнопок отрисовки геометрии
Спасибо, но опять мимо))
Возможно так будет понятнее:
Вроде разобрался..
Возможно так будет понятнее:
Код: Выделить всё
class SpravForCreatedPolygonTool(Tool):
def __init__(self, widget):
super().__init__(widget)
self.__points = []
def paintEvent(self, event, painter):
points = self.getDevicePoints()
painter.setPen(QPen(Qt.red, 5, Qt.SolidLine))
for point in points:
painter.drawPoint(point)
painter.setPen(QPen(Qt.red, 2, Qt.SolidLine))
painter.drawPolygon(QPolygonF(points))
def mouseDoubleClickEvent(self, event):
# собственно здесь уже отрисовываем геометрию в таблице
Utils.Card('Polygon', self.__points)
self.__points.clear()
self.widget().update()
return Tool.PassEvent
def mousePressEvent(self, event):
if event.button() != Qt.LeftButton:
return
self.addPoint(event.pos())
self.widget().update()
return Tool.PassEvent
def keyPressEvent(self, event):
if event.key() == Qt.Key_Escape:
self.__points.clear()
self.widget().update()
return Tool.PassEvent
def addPoint(self, point):
scene_point = self.widget().viewport().mapToScene(point)
self.__points.append(scene_point)
def getDevicePoints(self):
return [self.widget().viewport().mapToDevice(point) for point in self.__points]