From 5d88ddf0ca42cf5af8324c1b6f478fb99aad549f Mon Sep 17 00:00:00 2001 From: "yang.yongquan" <3395816735@qq.com> Date: Wed, 15 Mar 2023 17:37:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9B=BE=E7=89=87=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E6=A7=BD=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Editor/ElementPoolWidget.cpp | 10 +++ .../src/Editor/ElementPoolWidget.h | 1 + .../src/Editor/util/PaintingUtil.cpp | 81 +++++++++++++------ .../src/Editor/util/PaintingUtil.h | 2 +- 4 files changed, 69 insertions(+), 25 deletions(-) diff --git a/ArchitectureColoredPainting/src/Editor/ElementPoolWidget.cpp b/ArchitectureColoredPainting/src/Editor/ElementPoolWidget.cpp index 64fadfd..1c5dc3c 100644 --- a/ArchitectureColoredPainting/src/Editor/ElementPoolWidget.cpp +++ b/ArchitectureColoredPainting/src/Editor/ElementPoolWidget.cpp @@ -78,4 +78,14 @@ void ElementPoolWidget::setElementManager(ElementManager* element) void ElementPoolWidget::refresh() { this->setElementList(this->elementManager->elements); // update(); +} + +void ElementPoolWidget::refreshPicture(GraphicElement* element) { + for (int i = 0; i < elements.size(); i++) { + if (element == elements[i]) { + pictureList->item(i)->setIcon(element->getPaintObject().getDetail().scaled(QSize(iconWidth - 25, iconHeight - 25))); + // update(); + return; + } + } } \ No newline at end of file diff --git a/ArchitectureColoredPainting/src/Editor/ElementPoolWidget.h b/ArchitectureColoredPainting/src/Editor/ElementPoolWidget.h index 2a880a7..f6c253e 100644 --- a/ArchitectureColoredPainting/src/Editor/ElementPoolWidget.h +++ b/ArchitectureColoredPainting/src/Editor/ElementPoolWidget.h @@ -28,5 +28,6 @@ signals: public slots: int pictureItemClicked(QListWidgetItem* item); void refresh(); + void refreshPicture(GraphicElement* element); }; diff --git a/ArchitectureColoredPainting/src/Editor/util/PaintingUtil.cpp b/ArchitectureColoredPainting/src/Editor/util/PaintingUtil.cpp index b863fcd..7c66c24 100644 --- a/ArchitectureColoredPainting/src/Editor/util/PaintingUtil.cpp +++ b/ArchitectureColoredPainting/src/Editor/util/PaintingUtil.cpp @@ -2,16 +2,26 @@ #include #include #include "PainterPathUtil.h" +#include using Renderer::Painting; using Renderer::Element; using Renderer::ElementTransform; using glm::bvec2; using std::max; +using std::shared_ptr; +using std::make_shared; using std::min; +using std::queue; const double PaintingUtil::pi = acos(-1); +struct LayerNode { + LayerWrapper* nowLayer; + QTransform transfrom; + bvec2 flip; +}; + QJsonObject PaintingUtil::readJsonFile(QString jsonFilePath) { QFile jsonFile(jsonFilePath); jsonFile.open(QFile::ReadOnly); @@ -28,29 +38,47 @@ Painting PaintingUtil::transfromToPainting(QString jsonFilePath) { glm::bvec2 flip(0, 0); QJsonObject jsonObj = readJsonFile(jsonFilePath); qDebug() << jsonObj; - ElementManager *elementManager = new ElementManager(jsonObj, Renderer::ElementRenderer::instance()); - LayerManager* layerManager = new LayerManager(jsonObj, elementManager); + shared_ptr elementManager = make_shared(jsonObj, Renderer::ElementRenderer::instance()); + shared_ptr layerManager = make_shared(jsonObj, elementManager.get()); //qDebug() << elementManager->toJson(); //qDebug() << layerManager->toJson(); - qDebug() << ((SimpleElement*)((LeafLayerWrapper*)((FolderLayerWrapper*)((FolderLayerWrapper*)layerManager->getRoot())->children[0].get())->children[0].get())->wrappedElement)->painterPath; - qDebug() << ((LeafLayerWrapper*)((FolderLayerWrapper*)((FolderLayerWrapper*)layerManager->getRoot())->children[0].get())->children[0].get())->getCache().painterPath; - - - traverseLayTree(layerManager->getRoot(), transform, flip, painting); + //qDebug() << ((SimpleElement*)((LeafLayerWrapper*)((FolderLayerWrapper*)((FolderLayerWrapper*)layerManager->getRoot())->children[0].get())->children[0].get())->wrappedElement)->painterPath; + //qDebug() << ((LeafLayerWrapper*)((FolderLayerWrapper*)((FolderLayerWrapper*)layerManager->getRoot())->children[0].get())->children[0].get())->getCache().painterPath; + queue layerQueue; + LayerWrapper* root = layerManager->getRoot(); + root->getCache(); + layerQueue.push({ root, transform, flip }); + while (!layerQueue.empty()) { + auto layerNode = layerQueue.front(); + layerQueue.pop(); + FolderLayerWrapper* nowLayer = handleLayerWrapper(layerNode.nowLayer, layerNode.transfrom, layerNode.flip, painting); + if (nowLayer != nullptr) { + for (auto sonLayer : nowLayer->children) { + layerQueue.push({ sonLayer.get(), layerNode.transfrom, layerNode.flip}); + } + } + } + return painting; } -void PaintingUtil::traverseLayTree(LayerWrapper* nowLayer, QTransform transform, bvec2 flip, Painting& painting) { +FolderLayerWrapper* PaintingUtil::handleLayerWrapper(LayerWrapper* nowLayer, QTransform& transform, bvec2& flip, Painting& painting) { LeafLayerWrapper* leafLayer = dynamic_cast(nowLayer); - PixelPath pixelPath = nowLayer->getCache(); - QPainterPath painterPath = pixelPath.getPainterPath(); - QRectF bound = painterPath.boundingRect(); flip ^= bvec2(nowLayer->property.flipHorizontally, nowLayer->property.flipVertically); transform = nowLayer->property.transform * transform; if (leafLayer != nullptr) { - qDebug() << leafLayer<<"------" << painterPath; + + GroupElement* wrapperElement = dynamic_cast(leafLayer->wrappedElement); + if (wrapperElement != nullptr) + return wrapperElement->sourceLayer; + + PixelPath pixelPath = nowLayer->getCache(); + QPainterPath painterPath = pixelPath.getPainterPath(); + QRectF bound = painterPath.boundingRect(); + //qDebug() << leafLayer<<"------" << painterPath; + //qDebug() << transform; Element element; ElementTransform elementTrans; element.ratio = bound.width() / bound.height(); @@ -60,36 +88,40 @@ void PaintingUtil::traverseLayTree(LayerWrapper* nowLayer, QTransform transform, trans.scale(1 / bound.width(), 1 / bound.height()); trans.translate(-bound.center().x(), -bound.center().y()); + qDebug() << trans.map(painterPath); element.contour = std::make_shared >>(PainterPathUtil::transformToLines(trans.map(painterPath))); QSize screenSize = pixelPath.getPixmap().size(); element.style = std::make_shared(0.06); painterPath = transform.map(painterPath); + qDebug() << painterPath; bound = painterPath.boundingRect(); + qDebug() << bound; elementTrans.center = glm::vec2( - (bound.center().x() - screenSize.width()) / screenSize.width(), - (bound.center().y() - screenSize.height()) / screenSize.height() + (2 * bound.center().x() - screenSize.width()) / screenSize.width(), + (2 * bound.center().y() - screenSize.height()) / screenSize.height() ); + qDebug() << elementTrans.center.x << elementTrans.center.y; decomposeTransform(transform, elementTrans.rotation, elementTrans.scale); + elementTrans.scale = glm::vec2( + bound.width() / screenSize.width(), + bound.height() / screenSize.height() + ); elementTrans.flip = glm::bvec2( nowLayer->property.flipHorizontally, nowLayer->property.flipVertically ); + qDebug() << elementTrans.scale.x << elementTrans.scale.y; painting.addElement(element, elementTrans); - return; + return nullptr; } FolderLayerWrapper* folderLayer = dynamic_cast(nowLayer); - if (folderLayer != nullptr) { - for (auto sonLayer : folderLayer->children) { - traverseLayTree(sonLayer.get(), transform, flip, painting); - } - } - return; + return folderLayer; } void PaintingUtil::decomposeTransform(QTransform trans, float& angle, glm::vec2& scale) { - qDebug() << trans; + //qDebug() << trans; trans.setMatrix( trans.m11(), trans.m12(), trans.m13(), trans.m21(), trans.m22(), trans.m23(), @@ -134,7 +166,8 @@ void PaintingUtil::decomposeTransform(QTransform trans, float& angle, glm::vec2& angle = 360 - angle; } qDebug() << angle; - R = R.inverted() * trans; - scale = glm::vec2(R.m11(), R.m22()); + //R = R.inverted() * trans; + //scale = glm::vec2(R.m11(), R.m22()); + //qDebug() << scale.x << scale.y; return; } \ No newline at end of file diff --git a/ArchitectureColoredPainting/src/Editor/util/PaintingUtil.h b/ArchitectureColoredPainting/src/Editor/util/PaintingUtil.h index 35ebe03..77e6ea2 100644 --- a/ArchitectureColoredPainting/src/Editor/util/PaintingUtil.h +++ b/ArchitectureColoredPainting/src/Editor/util/PaintingUtil.h @@ -7,7 +7,7 @@ class PaintingUtil private: static const double pi; static QJsonObject readJsonFile(QString jsonFilePath); - static void traverseLayTree(LayerWrapper* nowLayer, QTransform transform, glm::bvec2 flip, Renderer::Painting& painting); + static FolderLayerWrapper* handleLayerWrapper(LayerWrapper* nowLayer, QTransform& transform, glm::bvec2& flip, Renderer::Painting& painting); public: static Renderer::Painting transfromToPainting(QString jsonFilePath); static void decomposeTransform(QTransform trans, float& angle, glm::vec2& scale);