Создание кнопки с логикой стандартных кнопок отрисовки геометрии

Вопросы связанные с работой ГИС Аксиома
Ответить
Аватара пользователя
pahanbl4
Сообщения: 23
Зарегистрирован: 11 окт 2019, 08:55

Создание кнопки с логикой стандартных кнопок отрисовки геометрии

Сообщение pahanbl4 » 11 окт 2019, 09:47

Добрый день! Не подскажите как создать свои кнопки отрисовки геометрии с логикой отрисовки стандартных инструментов (точки, полилинии и полигона)? Т.е. создаем свою кнопку, допустим на основе стандартной кнопки создания полилинии, а уже после создания полилинии, получаем возможность что-то с ней делать дальше. Или делается только через Tool со "своей" отрисовкой и сохранением геометрии :?:
Аватара пользователя
Дмитрий
Сообщения: 56
Зарегистрирован: 04 июн 2019, 08:33

Re: Создание кнопки с логикой стандартных кнопок отрисовки геометрии

Сообщение Дмитрий » 11 окт 2019, 10:46

Здравствуйте!

Если я Вас правильно понял, подойдет 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()
Аватара пользователя
pahanbl4
Сообщения: 23
Зарегистрирован: 11 окт 2019, 08:55

Re: Создание кнопки с логикой стандартных кнопок отрисовки геометрии

Сообщение pahanbl4 » 12 окт 2019, 09:40

Спасибо, но немного не то.. Я иммел в виду отрисовку самой геометрии, а не выбор стиля.. Есть три кнопки которые рисуют геометрию: точку, полилинию и полигон.. Нажимается кнопка - отрисовываем геометрию, затем создается объект в таблице и вызывается его карточка, потом заполняются поля и на их основе присваивается условное обозначение (в общем - справочник). Можно ли использовать стандартные инструменты отрисовки - унаследоваться от них? Или доступна только ручная отрисовка по координатам наследуясь от Tool?
Аватара пользователя
Дмитрий
Сообщения: 56
Зарегистрирован: 04 июн 2019, 08:33

Re: Создание кнопки с логикой стандартных кнопок отрисовки геометрии

Сообщение Дмитрий » 14 окт 2019, 09:08

Здравствуйте.

Такого готового решения у нас нет. Геометрию в Вашем случае надо будет отрисовывать в растр, а его уже использовать в качестве иконки. Вот небольшой пример:

Код: Выделить всё

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()
Аватара пользователя
pahanbl4
Сообщения: 23
Зарегистрирован: 11 окт 2019, 08:55

Re: Создание кнопки с логикой стандартных кнопок отрисовки геометрии

Сообщение pahanbl4 » 15 окт 2019, 05:18

Спасибо, но опять мимо))
Возможно так будет понятнее:

Код: Выделить всё

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]
Вроде разобрался..
Ответить