Style

class axioma.render.Style

Базовый класс стиля оформления векторных объектов. Позволяет нарисовать геометрический объект на карте или в отчете.

Унаследован от: Serializable

От него наследуются:

draw(geom, context)

Отрисовка геометрии. Предполагается, что геометрия имеет координаты устройства рисования.

Параметры:
  • geom (GeometryInterface) – Геометрия
  • context (Context) – Контекст, в котором будет отрисована геометрия
isEqual(style)

Производит сравнение стилей на идентичность

Параметры:style (Style) – Сравниваемый стиль
Результат:True, если стили эквивалентны. В противном случае False
Тип результата:bool

GeometryWithStyle

class axioma.render.GeometryWithStyle

Класс, объединяющий геометрию и стиль

geom

Геометрия

Type:Geometry
style

Стиль

Type:Style

Пример использования. Отрисовывает в окне диалога геометрии разного типа с различными стилями:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Импорт
from axioma.cs import *
from axioma.core.geometry import *
from axioma.mapinfo import *
from axioma.render import *

from PyQt5.QtCore import  *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

# Координатная система
cs_ne = CoordSysFactory.defaultCoordSysFactory().createFromPRJ("CoordSys Nonearth Units \"m\"" )

# Преобразование цвета в формат MapBasic
def colorToMapbasic(color):
    return QColor(color).rgb() - 0xFF000000
 
# Создание полилинии
def createLineString():
    poly = QPolygonF();
    poly << QPointF(110,310) << QPointF(110,400) << QPointF(150,350) << QPointF(200,400) << QPointF(200,310)
    ls = LineString(cs_ne, poly)
    return ls

# Создание полигона
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(cs_ne, poly)
    return polygon
    
# Создание точки
def createPoint():
    return Point(cs_ne, 250, 350)

# Создание текста
def createText():
    text = Text(cs_ne, "Sample text", QPointF(300,350) )
    return text

class Example(QDialog):
    
    def __init__(self, parent):
        QDialog.__init__(self, parent)
        self.initUI()

    def initUI(self):      
        self.setGeometry(200, 200, 700, 400)
        self.setWindowTitle('Пример отрисовки геометрии со стилем')

# Преобразование координат геометрии из координат карты в координаты окна
    def transformGeomerty(self, geom, context):
        return geom.transformed(context.sceneToDeviceTransform())

# Отрисовка геометрии с соответствующим стилем
    def drawGeometry(self, context, style, geom):
      if style is not None:
            geom_trans = self.transformGeomerty(geom, context)
            style.draw(geom_trans, context)

    def drawPolygon(self, context, num, color):
      style = MapBasicStyle().styleFromString("Pen (1, 5, 16711935) Brush (%d, 255, %d)"  % (num, color))
      self.drawGeometry(context, style, createPolygon())

    def drawLineString(self, context, num, color):
      style = MapBasicStyle().styleFromString("Pen (2, %d,%d)"  % (num, color))
      self.drawGeometry(context, style, createLineString())
      
    def drawPoint(self, context, num, color):
      style = MapBasicStyle().styleFromString("Symbol (%d,%d, 24)"  % (num, color))
      self.drawGeometry(context, style, createPoint())
      
    def drawText(self, context):
        style = MapBasicStyle().styleFromString("Font (\"Arial\",1,9,16711680)")
        self.drawGeometry(context, style, createText())

# Создание контекста
    def createContext(self, painter, deviceRect):
        sceneRect = QRectF(0,0,600,400)
        viewport = MapViewport (deviceRect,sceneRect,cs_ne)
        return MapContext(painter, viewport)

# Отрисовка
    def paintEvent(self, event):
        try:
            painter = QPainter(self)
            painter.fillRect(event.rect(), Qt.white)
# Создание контекста
            context1 = self.createContext(painter, QRectF(0,10,600,400))
# И отрисовка его (С использованием строки mapbasic)
            self.drawPolygon(context1, 8, colorToMapbasic(Qt.red))
            self.drawLineString(context1, 2, colorToMapbasic(Qt.green))
            self.drawPoint(context1, 36, colorToMapbasic(Qt.red))
            self.drawText(context1)
# Сдвинем вниз
            context2 = self.createContext(painter, QRectF(0,140,600,400))
            self.drawPolygon(context2, 2, colorToMapbasic(Qt.blue))
            self.drawLineString(context2, 90, colorToMapbasic(Qt.black))
# Ещё раз сдвинем вниз
            context3 = self.createContext(painter, QRectF(0,270,600,400))
# Полигон (создаем явно через конструктор)
            pstyle = MapInfoPolygonStyle()
            p_fill = MapInfoFillStyle(4, Qt.darkRed)
            pstyle.setAreaStyle(p_fill)
            p_pen= MapInfoLineStyle()
            p_pen.setPattern(8)
            p_pen.setColor(Qt.darkBlue)
            pstyle.setPeripheryStyle(p_pen)
            self.drawGeometry(context3, pstyle, createPolygon())
# Полилиния
            pen= MapInfoLineStyle()
            pen.setPattern(56)
            pen.setColor(Qt.darkGreen)
            pen.setWidth(UnitValue(Unit.pixel(), 4))
            self.drawGeometry(context3, pen, createLineString())
# Точка
            fs = FontSymbolStyle()
            fs.setFont(QFont("Mapinfo Symbols", 32))
            fs.setSymbolMapinfo(37)
            fs.setColor(Qt.blue)
            self.drawGeometry(context3, fs, createPoint())
# Текст
            ts = OverrideMapInfoTextStyle() # Стиль
            style_data = MapInfoTextStyleData() # Данные для стиля
            renderer = TextRenderer() # Оформление текста
            font =  QFont("Arial")
            font.setBold(True)
            renderer.setFont(font)
            renderer.setColor(Qt.blue)
            style_data.setFontSize(24)
            style_data.setTextRenderer(renderer) # Установка оформления
            ts.setMapInfoTextStyleData(style_data)  # Установка данных со стилем
            text = createText() # Непосредственно сама геометрия
            text.setAngle(45)
            text.setTextStyleData(style_data) # Устанавливаем данные
            self.drawGeometry(context3, ts, text)
# Пример отрисовки с массивом стилей 
            # Создаем предварительно стили, которые поместим в массив
            style1 = MapBasicStyle().styleFromString("Pen (2,2,0) Brush (2,%d)" % (colorToMapbasic(Qt.red)))
            style2 = MapBasicStyle().styleFromString("Pen (2,2,0) Brush (2,%d)" % (colorToMapbasic(Qt.blue)))
            arrayStyle = ArrayStyle('red', style1) # Создаем массив с одним элементом
            arrayStyle.setStyle('blue', style2)  # Добавляем еще один стиль. Установлено 2 стиля с активным red
            rectangle1 = Rectangle(cs_ne, QRectF(500, 300, 50,50))
            self.drawGeometry(context1, arrayStyle, rectangle1) # Рисуем первый прямоугольник
            arrayStyle.setActiveStyle('blue') # Меняем активный стиль на значение blue
            rectangle2 = Rectangle(cs_ne, QRectF(500, 200, 50,50))
            self.drawGeometry(context1, arrayStyle, rectangle2) # Рисуем второй прямоугольник
# Пример отрисовки с композитным стилем
            # Создаем стили-элементы
            styleComp0 = MapBasicStyle().styleFromString("Pen (5,2,16711680)")
            styleComp1 = MapBasicStyle().styleFromString("Pen (2,2,16776960)")
            styleComp2 = MapBasicStyle().styleFromString("Pen (2,9,0)")
            # Создаем сам композитный стиль
            compositeStyle = CompositeStyle()
            # Последовательно (как должны быть отрисованы) добавляем элементы в стиль
            compositeStyle.append(styleComp0)
            compositeStyle.append(styleComp1)
            compositeStyle.append(styleComp2)
            # Стиль можно создать из строки MapBasic, в которой стили разделены '|' или ';' (альтернатива предыдущим строкам)
            #compositeStyle = MapBasicStyle().styleFromString("Pen (5,2,16711680)|Pen (2,2,16776960)|Pen (2,9,0)")
            line = Line(cs_ne, QLineF(QPointF(400,100), QPointF(600,100)))
            self.drawGeometry(context1, compositeStyle, line) # Рисуем линию

        except Exception as ex:
            print(ex)

dlg = Example(axioma.app.mainWindow)
dlg.exec()