#include <spdlog/spdlog.h>#include <iostream>#include"node_node.h"#include "node_scene.h"#include "node_edge.h"#include "node_graphics_node.h"#include "FlowChartScene.h"#include "node_content_widget.h"inline static bool NODEDEBUG = false;unsigned int Node::m_count = 10000;/*** @brief Node* 1.在这个类中创建了QDMGraphicsNode对象* 2.向FlowChart场景中加入了QDMGraphicsNode对象* 3.此类中可获取所绑定的场景(Scene)* 4.为啥不直接在QDMGraphicsNode中实现所有功能而是要使用Node这个类来添加暂未明晰。可能和代码的优化有一定关系?* 5.感觉主要是为了明晰场景中有哪些图形项而实现的此级代码* 6. 【todo】此构造函数中有必要强制指定必须为智能指针么?*/Node::Node(std::weak_ptr<Scene> scene, QString title):m_scene(scene),m_title(title){m_id = ++m_count;if (NODEDEBUG){spdlog::info("Node {0} create sucess", m_title.toStdString());}}Node::~Node(){m_grNode=nullptr;//这里不要调用删除,m_grnode被被FcScene管理,赋空即可spdlog::info("Node {} delete sucess",m_title.toStdString());}void Node::initUi(QList<int> inputindexs, QList<int> outputindexs){if (m_id > 19999){spdlog::critical("Attention! node id is more than limit");};//创建一个QDMGraphicsNode对象 此处的m_grNode被FcScene管理m_grNode = new QDMGraphicsNode(shared_from_this());//向场景中添加此对象,会被scene管理,所以不用deletem_scene.lock()->getFcScene()->addItem(m_grNode);m_scene.lock()->addNode(shared_from_this());//向Node中添加socket 且在此处定义了socket的方向int counter = 0;for (int i = 0; i < inputindexs.size(); ++i){auto socket = std::make_shared<Socket>(shared_from_this(), counter, SOCKETPOS::LEFT_BOTTOM, SOCKETTYPE::SCOKETIN);socket->initUi();counter += 1;m_inputs.append(socket);// 在这里对每个元素进行操作}counter = 0;for (int i = 0; i < outputindexs.size(); ++i){auto socket = std::make_shared<Socket>(shared_from_this(), counter, SOCKETPOS::RIGHT_TOP, SOCKETTYPE::SCOKETOUT);socket->initUi();counter += 1;m_outputs.append(socket);// 在这里对每个元素进行操作}}const QString Node::getTitle(){return m_title;}void Node::setPos(QPointF pos){m_grNode->setPos(pos);}void Node::setPos(qreal x, qreal y){m_grNode->setPos(x,y);}const QPointF Node::getPos(){return m_grNode->pos();}const QPointF Node::getSocketPos(int index, SOCKETPOS postion){qreal x = 0.0;if (postion == SOCKETPOS::LEFT_TOP || postion == SOCKETPOS::LEFT_BOTTOM){x = 0.0;}else{x = getGrNode()->getWidth();}qreal y = 0;if (postion == SOCKETPOS::LEFT_BOTTOM || postion == SOCKETPOS::RIGHT_BOTTOM){//start from bottomy = getGrNode()->getHeight() - getGrNode()->getEdgeSize() - index * m_socketSpacing;}else{y = getGrNode()->getTitleHeight() + getGrNode()->getPadding() + getGrNode()->getEdgeSize()+ index * m_socketSpacing;}return QPointF(x, y);}QList<std::shared_ptr<Socket>> Node::getInputs(){return m_inputs;}QList<std::shared_ptr<Socket>> Node::getOutputs(){return m_outputs;}void Node::updateConnectedEdge(){for (int i = 0; i < m_inputs.count(); ++i){if (!m_inputs[i]->getEdge().expired()){m_inputs[i]->getEdge().lock()->updatePosition();}}for (int i = 0; i < m_outputs.count(); ++i){if (!m_outputs[i]->getEdge().expired()){m_outputs[i]->getEdge().lock()->updatePosition();}}}void Node::remove(){m_grNode->hide();//从gr场景中删除grNode,子类grSocket会一起删除for (auto const& socket : m_inputs+ m_outputs){if (socket->hasEdge()){socket->getEdge().lock()->remove();}}m_scene.lock()->getFcScene()->removeItem(m_grNode);m_scene.lock()->getFcScene()->update();//在场景中删除Nodem_scene.lock()->removeNode(shared_from_this());}const rapidjson::Document Node::serialize(){// 创建一个空的Document对象rapidjson::Document d; // 创建JSON对象d.SetObject();d.AddMember("id", m_id, d.GetAllocator());//d.AddMember需要一个Value对象作为其值。const char* 不是RapidJSON的Value类型,因此你不能直接这样使用。//创建一个Value对象,并将其设置为字符串。const std::string& str = m_title.toStdString();rapidjson::Value val(str.c_str(), d.GetAllocator());d.AddMember("title", val, d.GetAllocator());d.AddMember("pos_x", getPos().x(), d.GetAllocator());d.AddMember("pos_y", getPos().y(), d.GetAllocator());rapidjson::Value inputSocketsArray(rapidjson::kArrayType);//生成一个Array类型的元素,用来存放Objectfor (const auto& socket : m_inputs){rapidjson::Value nodeValue;nodeValue.CopyFrom(socket->serialize(), d.GetAllocator());inputSocketsArray.PushBack(nodeValue, d.GetAllocator());}d.AddMember("inputs", inputSocketsArray, d.GetAllocator());rapidjson::Value outSocketsArray(rapidjson::kArrayType);//生成一个Array类型的元素,用来存放Objectfor (const auto& socket : m_outputs){rapidjson::Value nodeValue;nodeValue.CopyFrom(socket->serialize(), d.GetAllocator());outSocketsArray.PushBack(nodeValue, d.GetAllocator());}d.AddMember("outputs", outSocketsArray, d.GetAllocator());//content serialize//生成一个objectrapidjson::Value contentObj(rapidjson::kObjectType);//生成一个Array类型的元素,用来存放ObjectcontentObj.CopyFrom(m_grNode->getContentWidget()->serialize(),d.GetAllocator());d.AddMember("Content", contentObj, d.GetAllocator());return d;}void Node::deserialize(const rapidjson::Value& value){//nothing}void Node::deserializePre(const rapidjson::Value& value){//Node初始化完成前更新if (value.HasMember("id")){m_id = value["id"].GetUint();}if (value.HasMember("title")){m_title = value["title"].GetString();}}void Node::deserializePost(const rapidjson::Value& value){//Node初始化完成后更新qreal posx = 0.0, posy = 0.0;if (value.HasMember("pos_x")){posx = value["pos_x"].GetDouble();}if (value.HasMember("pos_y")){posy = value["pos_y"].GetDouble();}setPos(posx, posy);m_grNode->update();if (value["inputs"].IsArray()){int size = value["inputs"].Size();//socket属于调用它的nodefor (int i = 0; i < size; i++){int counter = 0;unsigned int postion = 0;unsigned int socketType = 0;if (value["inputs"][i].HasMember("index")){counter = value["inputs"][i]["index"].GetUint();};if (value["inputs"][i].HasMember("position")){postion = value["inputs"][i]["position"].GetUint();};if (value["inputs"][i].HasMember("socket_Type")){socketType = value["inputs"][i]["socket_Type"].GetUint();};auto socket = std::make_shared<Socket>(shared_from_this(), counter, SOCKETPOS(postion), SOCKETTYPE(socketType));socket->initUi();socket->deserialize(value["inputs"][i]);m_inputs.append(socket);// 在这里对每个元素进行操作}}if (value["outputs"].IsArray()){int size = value["outputs"].Size();//socket属于调用它的nodefor (int i = 0; i < size; i++){int counter = 0;unsigned int postion = 0;unsigned int socketType = 0;if (value["outputs"][i].HasMember("index")){counter = value["outputs"][i]["index"].GetUint();};if (value["outputs"][i].HasMember("position")){postion = value["outputs"][i]["position"].GetUint();};if (value["outputs"][i].HasMember("socket_Type")){socketType = value["outputs"][i]["socket_Type"].GetUint();};auto socket = std::make_shared<Socket>(shared_from_this(), counter, SOCKETPOS(postion), SOCKETTYPE(socketType));socket->initUi();socket->deserialize(value["outputs"][i]);m_outputs.append(socket);// 在这里对每个元素进行操作}}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。