Re: Плагины
Добавлено: 15 фев 2024, 06:42
Александр ! Добрый день !
На ваше усмотрение
На ваше усмотрение
Пример создания модуля :
Code: Select all
import csv
import os
from pathlib import Path
import axipy as axp
from PySide2 import QtCore
from PySide2.QtCore import Qt
from PySide2.QtGui import QImage, QPainter, QPixmap
from PySide2.QtWidgets import QDialog, QTreeWidgetItem
from .forms.ui_form import Ui_Dialog as form
class Form(QDialog, form):
def __init__(self, parent=None):
super().__init__(parent)
# инициализация пользовательского интерфейса формы
self.setupUi(self)
# скрываем кнопку справки
self.setWindowFlag(QtCore.Qt.WindowContextHelpButtonHint, False)
# загрузка данных в форму
self.load()
# подключение сигналов
self.connect_signals()
def connect_signals(self):
# сменилась текущая строка в дереве
self.tree.currentItemChanged.connect(self.on_tree_current_item_changed)
# Нажали на кнопку "Показать условный знак"
self.btn_show_sign.clicked.connect(self.show_sign)
# Нажали на кнопку "Как нарисовать условный знак?"
self.btn_howto.clicked.connect(self.howto)
def load(self):
"""
Загружаем данные из файла form.csv в дерево
"""
path = Path(os.path.dirname(os.path.abspath(__file__)))
path = path / 'forms' / 'styles.csv'
# Открываем csv-файл для чтения
with open(str(path), mode="r", encoding="utf-8-sig") as file:
reader = csv.DictReader(file, skipinitialspace=True)
# Создаем словарь для хранения родительских элементов по ID
parents = {}
# Проходимся по каждой строке в csv-файле
for row in reader:
# Получаем значения из колонок
id = int(row['ID'])
parent_id = int(row['ParentID'])
text = row['text']
data = row['data']
# Создаем новый элемент QTreeWidgetItem
item = QTreeWidgetItem()
item.setText(0, text)
item.setData(0, Qt.UserRole, data)
# Если ParentID равен 0, то это объект верхнего уровня
if parent_id == 0:
self.tree.addTopLevelItem(item)
else:
# Иначе ищем родительский элемент по ParentID
parent = parents.get(parent_id)
if parent:
parent.addChild(item)
# Добавляем элемент в словарь родительских элементов
parents[id] = item
def on_tree_current_item_changed(self, current: QTreeWidgetItem, previous: QTreeWidgetItem):
if current and str(current.data(0, Qt.UserRole)) != "":
# Рисуем условное обозначение в рамку
self.draw_image(current.data(0, Qt.UserRole))
else:
self.lbl_img.setPixmap(None)
def draw_image(self, style: str):
"""
Рисуем условное обозначение в рамку
:param style: стиль в формате MapInfo
"""
image = QImage(50, 50, QImage.Format_ARGB32_Premultiplied)
image.fill(Qt.transparent)
painter = QPainter(image)
stl = axp.Style.from_mapinfo(style)
# Для каждого типа стиля, создаём свою геометрию и рисуем её в рамку
if isinstance(stl, axp.PointStyle):
point = axp.Point(25, 25)
stl.draw(point, painter)
self.lbl_img.setPixmap(QPixmap.fromImage(image))
elif isinstance(stl, axp.PolygonStyle):
polygon = axp.Polygon((5, 5), (10, 35), (45, 45), (45, 15))
stl.draw(polygon, painter)
self.lbl_img.setPixmap(QPixmap.fromImage(image))
elif isinstance(stl, axp.LineStyle):
line = axp.LineString([(5, 5), (20, 25), (25, 10), (45, 45)])
stl.draw(line, painter)
self.lbl_img.setPixmap(QPixmap.fromImage(image))
def show_sign(self):
print('show sign')
def howto(self):
print('how to')
@staticmethod
def show_dialog() -> None:
dlg = Form(axp.view_manager.global_parent)
dlg.open()