diff --git a/common/include/baseProperty.h b/common/include/baseProperty.h index 5214c54..6af7f78 100644 --- a/common/include/baseProperty.h +++ b/common/include/baseProperty.h @@ -101,6 +101,8 @@ public: virtual void setMetaModelName(QString sName) {sMetaName = sName;} virtual QString metaModelName() const {return sMetaName;} virtual void notifyUpdate(){emit updateData();} + virtual void setBay(QString s){sBay = s;} + virtual QString getBay(){return sBay;} void setPrepareDelete(bool b) {_prepareDelete = b;} bool prepareDelete() const {return _prepareDelete;} @@ -116,6 +118,7 @@ protected: int nGraphicsType; QString sModelName; //模型名 QString sMetaName; //元模型名 + QString sBay; //所属间隔 bool _dataChanged; //数据状态,为真则写入库 bool _prepareDelete; //状态,为真准备删除 diff --git a/diagramCavas/CMakeLists.txt b/diagramCavas/CMakeLists.txt index 0109dfd..1fbac30 100644 --- a/diagramCavas/CMakeLists.txt +++ b/diagramCavas/CMakeLists.txt @@ -48,6 +48,7 @@ set(DIAGRAMCAVAS_HEADER_FILES include/diagramEditor/diagramEditorTransDetailSettingDlg.h include/diagramEditor/diagramEditorTransPreviewDlg.h include/diagramEditor/diagramEditorPreviewDlg.h + include/diagramEditor/confirmEditorDlg.h include/graphicsDataModel/baseModel.h include/graphicsDataModel/fixedPortsModel.h include/graphicsDataModel/diagramEditorModel.h @@ -135,6 +136,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp source/diagramEditor/diagramEditorTransPreviewDlg.cpp source/diagramEditor/diagramEditorPreviewDlg.cpp + source/diagramEditor/confirmEditorDlg.cpp source/graphicsDataModel/baseModel.cpp source/graphicsDataModel/fixedPortsModel.cpp source/graphicsDataModel/diagramEditorModel.cpp @@ -192,6 +194,7 @@ set(UI_FILES ui/diagramEditorBayDetailAddDlg.ui ui/diagramEditorTransDetailSettingDlg.ui ui/diagramEditorTransDetailAddDlg.ui + ui/confirmEditorDlg.ui ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) diff --git a/diagramCavas/include/baseModelItem/electricBaseModelLineItem.h b/diagramCavas/include/baseModelItem/electricBaseModelLineItem.h index 6e5f907..a0230b9 100644 --- a/diagramCavas/include/baseModelItem/electricBaseModelLineItem.h +++ b/diagramCavas/include/baseModelItem/electricBaseModelLineItem.h @@ -11,15 +11,14 @@ class ElectricBaseModelLineItem : public GraphicsBaseModelItem { public: ElectricBaseModelLineItem(QGraphicsItem *parent = 0); + ElectricBaseModelLineItem(const ElectricBaseModelLineItem&); virtual ~ElectricBaseModelLineItem(); - + virtual ElectricBaseModelLineItem* clone() const override; void setStartPoint(const QPointF& p); void setEndPoint(const QPointF& p); - QPainterPath getPoints(void) const { return m_points; } void calculatePath(); void resetCurLine(){_curLine = QPoint();} - protected: virtual QPainterPath shape() const override; virtual QRectF boundingRect() const override; diff --git a/diagramCavas/include/baseModelItem/electricBaseModelPortItem.h b/diagramCavas/include/baseModelItem/electricBaseModelPortItem.h index 916b750..01492a4 100644 --- a/diagramCavas/include/baseModelItem/electricBaseModelPortItem.h +++ b/diagramCavas/include/baseModelItem/electricBaseModelPortItem.h @@ -8,6 +8,8 @@ class ElectricBaseModelPortItem :public GraphicsBaseModelItem Q_OBJECT public: ElectricBaseModelPortItem(QGraphicsItem *parent = 0); + ElectricBaseModelPortItem(const ElectricBaseModelPortItem&); + virtual ElectricBaseModelPortItem* clone() const override; virtual ~ElectricBaseModelPortItem(); void addPort(); diff --git a/diagramCavas/include/baseModelItem/electricBaseModelSvgItem.h b/diagramCavas/include/baseModelItem/electricBaseModelSvgItem.h index 79f4f68..763a4ac 100644 --- a/diagramCavas/include/baseModelItem/electricBaseModelSvgItem.h +++ b/diagramCavas/include/baseModelItem/electricBaseModelSvgItem.h @@ -9,6 +9,8 @@ class ElectricBaseModelSvgItem :public GraphicsBaseModelItem Q_OBJECT public: ElectricBaseModelSvgItem(const QRect &rect, QGraphicsItem *parent = 0); //genNewPort生成新接线点 + ElectricBaseModelSvgItem(const ElectricBaseModelSvgItem&); + virtual ElectricBaseModelSvgItem* clone() const override; virtual ~ElectricBaseModelSvgItem(); void updateCoordinate(); void move(const QPointF&); @@ -22,6 +24,7 @@ protected: protected: QRectF m_lastBoudingRect; //记录上一时刻的boundingRect QSvgRenderer* m_pRender; + QByteArray m_icon; }; diff --git a/diagramCavas/include/diagramCavas.h b/diagramCavas/include/diagramCavas.h index 6517130..87622aa 100644 --- a/diagramCavas/include/diagramCavas.h +++ b/diagramCavas/include/diagramCavas.h @@ -13,6 +13,7 @@ class DrawingPanel; class PowerEntity; class DiagramEditorWizard; class EditPanel; +class GraphicsBaseModelItem; class DIAGRAM_DESIGNER_PUBLIC DiagramCavas : public QMdiArea { @@ -53,7 +54,7 @@ public slots: void onSignal_createEditPanel(QString); EditPanel* onSignal_addEditPanel(QString); void onSignal_addEditWizard(QString); - void onSignal_wizardFinished(); + void onSignal_wizardFinished(QString,QMap); /*********************************间隔**************************************/ void onSignl_openCurrentBay(); private: diff --git a/diagramCavas/include/diagramEditor/confirmEditorDlg.h b/diagramCavas/include/diagramEditor/confirmEditorDlg.h new file mode 100644 index 0000000..c0b76cf --- /dev/null +++ b/diagramCavas/include/diagramEditor/confirmEditorDlg.h @@ -0,0 +1,34 @@ +#ifndef CONFIRMEDITORDLG_H +#define CONFIRMEDITORDLG_H +//确认生成接线 +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class confirmEditorDlg; } +QT_END_NAMESPACE + +class DiagramEditorModel; + +class ConfirmEditorDlg : public QDialog +{ + Q_OBJECT +public: + ConfirmEditorDlg(QWidget *parent = nullptr); + ~ConfirmEditorDlg(); + + void setModelDelegate(QPointer p){_pModel = p;} + QPointer getModel() {return _pModel;} + void initial(); + void showDlg(QString sName,QString sTime); +signals: + void onConfirmEditor(QString,QString); +public slots: + void onOkClicked(); + void onCancelClicked(); +private: + Ui::confirmEditorDlg *ui; + QPointer _pModel; +}; + +#endif diff --git a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h index ec11fe3..443406e 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h +++ b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h @@ -31,6 +31,8 @@ public: virtual QRectF getRecSize() {return recSize;} virtual void setSeceneDelta(QPointF p){sceneDelta = p;} virtual QPointF getSceneDelta() {return sceneDelta;} + virtual void setEditState(bool b){bEditState = b;} + virtual bool getEditState(){return bEditState;} protected: QString sName; int nType; //1母线,2间隔,3变压器 @@ -40,6 +42,7 @@ protected: QRectF recSize; //当前大小(根据内容确定) QPointF sceneDelta; //block中心相对位移(计算布局位置 DiagramEditorStructContainer* _curContainer; //当前所处的容器 + bool bEditState; //详细编辑状态 }; /***************************划分后的分段bus单元****************************/ diff --git a/diagramCavas/include/diagramEditor/diagramEditorPreviewDlg.h b/diagramCavas/include/diagramEditor/diagramEditorPreviewDlg.h index e75f4f7..ce5bd71 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorPreviewDlg.h +++ b/diagramCavas/include/diagramEditor/diagramEditorPreviewDlg.h @@ -7,7 +7,7 @@ #include "global.h" class EditView; -class EditScene; +class EditPreviewScene; class EditPanel; class DiagramEditorPreviewDlg : public QDialog @@ -22,7 +22,7 @@ public: void setParent(EditPanel* p) {_pParent = p;} private: EditView* _pView; - EditScene* _pScene; + EditPreviewScene* _pScene; QVBoxLayout* _pMainLayout; EditPanel* _pParent; }; diff --git a/diagramCavas/include/diagramEditor/editItems.h b/diagramCavas/include/diagramEditor/editItems.h index 012cd54..026f3a3 100644 --- a/diagramCavas/include/diagramEditor/editItems.h +++ b/diagramCavas/include/diagramEditor/editItems.h @@ -23,6 +23,8 @@ public: virtual QRectF boundingRect() const {return m_boundingRect;} virtual void setBlockData(QPointer p){_pBlock = p;} virtual QPointer getBlockData(){return _pBlock;} + virtual QString getShowType(){return QString();} //获取显示类别 + virtual QString getEditState(); //获取详细编辑状态 signals: void itemDbClicked(QPointer); protected: @@ -54,6 +56,7 @@ class EditBayItem: public EditBaseItem public: EditBayItem(QGraphicsItem *parent = nullptr); virtual ~EditBayItem(); + virtual QString getShowType() override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; }; @@ -65,6 +68,7 @@ class EditTransItem: public EditBaseItem public: EditTransItem(QGraphicsItem *parent = nullptr); virtual ~EditTransItem(); + virtual QString getShowType() override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; }; diff --git a/diagramCavas/include/diagramEditor/editPanel.h b/diagramCavas/include/diagramEditor/editPanel.h index b68d2c8..e530748 100644 --- a/diagramCavas/include/diagramEditor/editPanel.h +++ b/diagramCavas/include/diagramEditor/editPanel.h @@ -21,6 +21,7 @@ class DiagramEditorBayDetailSettingDlg; class DiagramEditorTransDetailSettingDlg; class DiagramEditorModel; class DiagramEditorPreviewDlg; +class ConfirmEditorDlg; class EditPanel : public QWidget { @@ -33,10 +34,14 @@ public: void initBlockConnection(); //初始化block之间的连接信息 void setOperateWizard(QPointer p) {_curWizard = p;} void showPreview(); //展示预览 + void showConfirmDlg(); //展示确认对话框 DiagramEditorModel* getModel() {return _pModel;} EditScene* getScene() {return m_pEditScene;} QList getBlockItems(EditorItemType typ = EditorItemType::none); //返回block对应的item,如母线,间隔,变压器, none返回所有类型 + + void setProjectName(const QString& s){_projectName = s;}; + QString getProjectName(){return _projectName;} public slots: void onWidthChanged(int width); void onContainerSizeChanged(EditContainerItem*); //容器大小改变时调整内部大小 @@ -62,6 +67,8 @@ private: QPointer _curWizard; DiagramEditorModel* _pModel; DiagramEditorPreviewDlg* _pPreview; + ConfirmEditorDlg* _confirmEditor; + QString _projectName; }; #endif diff --git a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h index 18f6f14..e5ba9a1 100644 --- a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h +++ b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h @@ -11,6 +11,7 @@ class ElectricBaseModelLineItem; class DiagramEditorTransformerBlock; class EditPanel; class DiagramEditorWizard; +class DiagramCavas; int const g_nHorizontalBlockSpacing = 100; //间隔横向间距 @@ -32,10 +33,16 @@ public: ElectricBaseModelLineItem* generateLine(QUuid uid,QString sName,int mode); //生成连线 mode 0局部1整体 void clearCurPreview(); void setPanel(EditPanel* p) {_pPanel = p;} + EditPanel* getPanel(){return _pPanel;} void setWizard(QPointer p){_pWizard = p;} + void setCavas(QPointer p){_pCavas = p;} + QPointer getCavas(){return _pCavas;} + QMap getPreviewItem(){return _previewItem;}; + void generatePreview(); //生成预览 void calculateBlockPos(); //重新计算block位置 void setItemInBlockPos(); //设置block中的item位置 + void refreshConnection(); //刷新连接线 void setCurBayRouteModel(QStandardItemModel* p) {_pCurBayRoute = p;} QStandardItemModel* getCurBayRouteModel() {return _pCurBayRoute;} @@ -52,11 +59,11 @@ public: void generateItemByModel(QStandardItemModel* pModel,int nFrom = 0,QPoint delta = QPoint(0,0)); //0间隔1变压器 QList generateItemByInfo(QMap mapRoute,QMap mapCompo,QPointF delta = QPointF(0,0)); //根据data生成item void generateOutConnection(QList,int nTypeTransCon,int nPos = 0); //生成外部连接(手动bind的连接) nTypeTransCon变压器连线类型,1中性点连接2外部连接,nPos中性点连接时的位置 - void updateTarget(QMap&,int nLayout,int nSource); //更新位置 nLayout主次朝向:8421,8421 上下左右,上下左右 nSource:0间隔1变压器 + QRectF updateTarget(QMap&,QMap&,int nLayout,int nSource,bool regenerate = true,bool saveToModel = true); //更新位置 nLayout主次朝向:8421,8421 上下左右,上下左右 nSource:0间隔1变压器 regenerate重新生成标志 saveToModel:生成到模型或map private: void bulidAndLinkComponent(QList,QMap); //生成并连接线路上的设备 lst,mapComponents(从map中获取正确数据) //DiagramEditorComponentInfo getCompoDataFromName(const QString&,QMap); //根据名称获取数据 - QList getRouteItemInfoList(QMap,QMap); //返回线路中包含的设备信息列表 + QList getRouteItemInfoList(QMap,QMap); //返回线路中包含的设备信息列表 private: QMap _tempItem; //临时预览对象 QMap _previewItem; //预览对象 @@ -67,5 +74,6 @@ private: EditBaseScene* _pCurPreviewScene; //当前预览scene EditPanel* _pPanel; //主界面 QPointer _pWizard; //向导界面数据 + QPointer _pCavas; //顶层界面容器 }; diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index 839462d..dbe8a51 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -69,7 +69,7 @@ public: QMap allBaseNodePos() const; bool addBaseItem(QUuid uuid,GraphicsBaseModelItem*); - BaseModelProperty* addBaseNodeData(QUuid id,int type,QString name,QString metaName); //添加图元基模数据 + BaseModelProperty* addBaseNodeData(QUuid id,int type,QString name,QString metaName,QString bay = QString()); //添加图元基模数据 void showProjectModelSettingDlg(GraphicsBaseModelItem*); //在基模拓扑图上打开工程模设置对话框 void generateProjectModel(const QString&,QList,QList); //由基模生成工程模 diff --git a/diagramCavas/include/graphicsItem/graphicsBaseItem.h b/diagramCavas/include/graphicsItem/graphicsBaseItem.h index b28c029..ea616c8 100644 --- a/diagramCavas/include/graphicsItem/graphicsBaseItem.h +++ b/diagramCavas/include/graphicsItem/graphicsBaseItem.h @@ -43,6 +43,26 @@ public: m_dSyncRotationByParent = 0.0; } + AbstractShapeType(const AbstractShapeType& obj) + { + m_type = T_undefined; + m_pen = QPen(Qt::NoPen); + m_brush = QBrush(QColor(rand() % 32 * 8, rand() % 32 * 8, rand() % 32 * 8)); + m_dWidth = m_dHeight = 0; + m_pOperationCopy = nullptr; + m_dSyncRotationByParent = 0.0; + + m_itemId = obj.m_itemId; + m_type = obj.m_type; + m_pen = obj.m_pen; + m_brush = obj.m_brush; + m_dWidth = obj.m_dWidth; + m_dHeight = obj.m_dHeight; + m_boundingRect = obj.m_boundingRect; + m_Itemtype = obj.m_Itemtype; + m_movingIniPos = obj.m_movingIniPos; + } + virtual ~AbstractShapeType() { @@ -151,9 +171,12 @@ class GraphicsBaseItem :public QObject, public AbstractShapeType Q_OBJECT public: GraphicsBaseItem(QGraphicsItem *parent); + GraphicsBaseItem(const GraphicsBaseItem&); virtual ~GraphicsBaseItem(); + public: virtual int addPort(PortState typ,QPointF vec,QString id = "",HandleType hType = T_lineInOut,PortPos pos = P_top); //新建,返回-1失败 + virtual void movePort(QString id,QPointF vec); //移动可动点 virtual void setEntity(PowerEntity*); //设置当前图元的拓扑数据 virtual PowerEntity* entity(); virtual void setProperty(ModelProperty* p); @@ -170,6 +193,8 @@ public: virtual void initialPortsByDatabase(int nComponentTypeId); //从数据库初始化port信息,component_type中的id virtual void setLastPoint(QPointF p) {m_lastPoint = p;} virtual void setTouched(bool b){m_touched = b;} + virtual void setPosChanged(bool b){_posChanged = b;} + virtual bool getPosChanged() {return _posChanged;} int collidesWithHandle(const QPointF& point) { @@ -458,6 +483,7 @@ protected: QPointF m_lastPoint; //鼠标上次点击位置 bool m_touched; //被触碰状态 QRectF m_boundingRect_selected; //选中矩形框 + bool _posChanged = false; //位置移动标志 }; class GraphicsBaseModelItem : public GraphicsBaseItem //基模item @@ -465,10 +491,15 @@ class GraphicsBaseModelItem : public GraphicsBaseItem //基模item Q_OBJECT public: GraphicsBaseModelItem(QGraphicsItem *parent); + GraphicsBaseModelItem(const GraphicsBaseModelItem&); virtual ~GraphicsBaseModelItem(); + virtual GraphicsBaseModelItem* clone() const = 0; virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; + virtual void setMask(bool b){_stateMask = b;} + virtual bool getMask(){return _stateMask;} protected: virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange, const QVariant&) override; + bool _stateMask = true; //状态遮罩 }; class GraphicsProjectModelItem : public GraphicsBaseItem //工程模item diff --git a/diagramCavas/include/powerConnection.h b/diagramCavas/include/powerConnection.h index 7635e87..60431ca 100644 --- a/diagramCavas/include/powerConnection.h +++ b/diagramCavas/include/powerConnection.h @@ -13,6 +13,7 @@ class PowerConnection : public QObject { public: PowerConnection(const QString& uuid,const QString& fromTerminalId,const QString& toTerminalId,const QString& fromId,const QString& toId,QObject* parent = nullptr); + PowerConnection* clone(); QString id() const {return m_uuid;} QString fromTerminalId() const { return m_fromTerminal; } QString toTerminalId() const { return m_toTerminal; } diff --git a/diagramCavas/include/powerEntity.h b/diagramCavas/include/powerEntity.h index 6b5a8a4..9e287dd 100644 --- a/diagramCavas/include/powerEntity.h +++ b/diagramCavas/include/powerEntity.h @@ -5,6 +5,8 @@ * *************************/ #include #include +#include "powerTerminal.h" +#include "topologyManager.h" #include "global.h" class PowerTerminal; @@ -20,6 +22,35 @@ public: //qDeleteAll(m_children); } + virtual PowerEntity* clone(){ + // 1. 检查是否已经拷贝过 + if (TopologyManager::instance().findEntity(this->m_id,ModelFunctionType::BaseModel)) { //拷贝的子项也加入到clonedMap + return TopologyManager::instance().findEntity(this->m_id,ModelFunctionType::BaseModel); + } + + // 2. 创建当前对象的新副本 + PowerEntity* newEntity = TopologyManager::instance().createEntity(m_type,m_id,m_name,ModelFunctionType::BaseModel); + + // 3. 清空子列表(避免浅拷贝) + newEntity->m_children.clear(); + newEntity->m_terminals.clear(); + + // 4. 递归克隆子项 + for (PowerEntity* child : m_children) { + newEntity->addChild(child->clone()); + } + + // 5. 深拷贝所有 PowerTerminal + for (PowerTerminal* terminal : m_terminals) { + auto pTer = TopologyManager::instance().getTerminal(terminal->id(),ModelFunctionType::BaseModel); + if(pTer == nullptr){ //BaseModel中不存在则拷贝 + TopologyManager::instance().createTerminal(m_id,terminal->type(),terminal->name(),terminal->relativePosition(),terminal->id(),ModelFunctionType::BaseModel); + } + } + + return newEntity; + } + // 添加/删除子元素 void addChild(PowerEntity* child) { if (child == this || getAllDescendants().contains(this)) { diff --git a/diagramCavas/include/topologyManager.h b/diagramCavas/include/topologyManager.h index c782e35..1cc0faf 100644 --- a/diagramCavas/include/topologyManager.h +++ b/diagramCavas/include/topologyManager.h @@ -21,10 +21,13 @@ public: PowerEntity* createEntity(EntityType type,const QString& uuid,const QString& name,ModelFunctionType tpe = ModelFunctionType::ProjectModel,const QString& block = QString()); PowerEntity* findEntity(const QString& id,ModelFunctionType = ModelFunctionType::ProjectModel) const; bool deleteEntity(const QString& id,ModelFunctionType = ModelFunctionType::ProjectModel); + QList getEntitiesByBlock(const QString&); //通过名称返回entity中的实体(blockEditor中) void moveTempBlockData(); //blockEditor中将临时数据转为全局数据 void clearGlobalBlockData(const QString&); //清除全局数据中的blockdata(block修改时) + void cloneEditorToBase(); //将editor中的数据深拷贝到base中 + // 连接管理 PowerConnection* createConnection(const QString& uuid,const QString& fromTerId, const QString& toTerId,const QString& fromId,const QString& toId,ModelFunctionType tpe = ModelFunctionType::ProjectModel); QList getConnectionsForTerminal(const QString& terminalId,ModelFunctionType tpe = ModelFunctionType::ProjectModel) const; diff --git a/diagramCavas/source/baseModelItem/electricBaseModelLineItem.cpp b/diagramCavas/source/baseModelItem/electricBaseModelLineItem.cpp index e8b6175..e490f1b 100644 --- a/diagramCavas/source/baseModelItem/electricBaseModelLineItem.cpp +++ b/diagramCavas/source/baseModelItem/electricBaseModelLineItem.cpp @@ -21,6 +21,27 @@ ElectricBaseModelLineItem::~ElectricBaseModelLineItem() { } +ElectricBaseModelLineItem::ElectricBaseModelLineItem(const ElectricBaseModelLineItem& obj) + :GraphicsBaseModelItem(obj) +{ + m_pen = QPen(Qt::black); + m_brush = QBrush(Qt::NoBrush); + setHandleVisible(false); + setFunctionHandleIfShow(false); + setFunctionHandleEnaable(false); + + m_points = obj.m_points; + m_pointsBoundingRect = obj.m_pointsBoundingRect; //包裹点的矩形集合 + m_lstPoints = obj.m_lstPoints; + _curLine = obj._curLine; +} + +ElectricBaseModelLineItem* ElectricBaseModelLineItem::clone() const +{ + ElectricBaseModelLineItem* newItem = new ElectricBaseModelLineItem(*this); + return newItem; +} + void ElectricBaseModelLineItem::setStartPoint(const QPointF& p) { int n = m_lstPoints.size(); diff --git a/diagramCavas/source/baseModelItem/electricBaseModelPortItem.cpp b/diagramCavas/source/baseModelItem/electricBaseModelPortItem.cpp index 6ebcfa5..966acea 100644 --- a/diagramCavas/source/baseModelItem/electricBaseModelPortItem.cpp +++ b/diagramCavas/source/baseModelItem/electricBaseModelPortItem.cpp @@ -16,6 +16,22 @@ ElectricBaseModelPortItem::ElectricBaseModelPortItem(QGraphicsItem *parent) setFunctionHandleEnaable(false); } +ElectricBaseModelPortItem::ElectricBaseModelPortItem(const ElectricBaseModelPortItem& obj) + :GraphicsBaseModelItem(obj) +{ + m_boundingRect = QRectF(-1,-1,2,2); + m_pen = QPen(Qt::black); + m_brush = QBrush(Qt::black); + setHandleVisible(false); + setFunctionHandleIfShow(false); + setFunctionHandleEnaable(false); +} + +ElectricBaseModelPortItem* ElectricBaseModelPortItem::clone() const +{ + return new ElectricBaseModelPortItem(*this); +} + ElectricBaseModelPortItem::~ElectricBaseModelPortItem() { diff --git a/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp b/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp index cbabf4f..eb28370 100644 --- a/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp +++ b/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp @@ -15,6 +15,19 @@ ElectricBaseModelSvgItem::ElectricBaseModelSvgItem(const QRect &rect, QGraphicsI m_dHeight = rect.height(); } +ElectricBaseModelSvgItem::ElectricBaseModelSvgItem(const ElectricBaseModelSvgItem& obj) + :GraphicsBaseModelItem(obj) +{ + m_lastBoudingRect = obj.m_lastBoudingRect; + m_icon = obj.m_icon; + m_pRender = new QSvgRenderer(m_icon); +} + +ElectricBaseModelSvgItem* ElectricBaseModelSvgItem::clone() const +{ + return new ElectricBaseModelSvgItem(*this); +} + ElectricBaseModelSvgItem::~ElectricBaseModelSvgItem() { @@ -72,7 +85,10 @@ void ElectricBaseModelSvgItem::paint(QPainter* painter, const QStyleOptionGraphi void ElectricBaseModelSvgItem::loadSvg(const QByteArray& data) { - m_pRender = new QSvgRenderer(data); + if(m_pRender == nullptr){ + m_icon = data; + m_pRender = new QSvgRenderer(data); + } } void ElectricBaseModelSvgItem::move(const QPointF& point) diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index 8f6acc8..5ab3b8f 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -4,7 +4,6 @@ #include #include "drawingPanel.h" #include "diagramCavas.h" -//#include "mainwindow.h" #include "dataBase.h" #include "graphicsItem/graphicsBaseItem.h" #include "topologyManager.h" @@ -14,6 +13,7 @@ #include "baseProperty.h" #include "diagramEditor/editPanel.h" #include "graphicsDataModel/diagramEditorModel.h" +#include "basePropertyManager.h" DiagramCavas::DiagramCavas(QWidget *parent) : QMdiArea(parent) @@ -365,6 +365,7 @@ void DiagramCavas::onSignal_createEditPanel(QString sName) EditPanel* DiagramCavas::onSignal_addEditPanel(QString sName) { EditPanel* pPanel = new EditPanel(this); + pPanel->setProjectName(sName); pPanel->setWindowTitle(_curPage); QMdiSubWindow* pSub = this->addSubWindow(pPanel); @@ -380,17 +381,55 @@ void DiagramCavas::onSignal_addEditWizard(QString name) EditPanel* pPanel = onSignal_addEditPanel(name); pPanel->setOperateWizard(_pEditorWizard); auto pModel = pPanel->getModel(); - if(pModel) + if(pModel){ pModel->setWizard(_pEditorWizard); + pModel->setCavas(this); + } pPanel->initByWizardInfo(); }); } _pEditorWizard->show(); } -void DiagramCavas::onSignal_wizardFinished() +void DiagramCavas::onSignal_wizardFinished(QString sName,QMap mapItem) { + PowerEntity* pEntity; + QUuid id = QUuid::createUuid(); + pEntity = TopologyManager::instance().findDiagram(id.toString()); + if(!pEntity) //不存在创建 + { + pEntity = TopologyManager::instance().createDiagram(id.toString(),sName); + onSignal_addDrawingPanel(pEntity,DM_baseModel); + DrawingPanel* pPanel = getPanel(pEntity->name()); + TopologyManager::instance().cloneEditorToBase(); //拷贝拓扑结构 + + QMap mapEditor = BasePropertyManager::instance().getEditorData(); + for(auto& pro:mapEditor){ + if(BasePropertyManager::instance().findBaseEntityData(pro->uuid()) == nullptr){ //拷贝editor数据到basemodel中 + auto pPro = pPanel->getModelController()->addBaseNodeData(pro->uuid(),pro->type(),pro->name(),pro->metaModelName(),pro->getBlock()); + pPro->setConnection(pro->getConnection()); + } + } + //pPanel->getModelController()->addTestData(); + + for(auto pItem:mapItem){ + auto cloneItem = pItem->clone(); + BaseModelProperty* pPro = BasePropertyManager::instance().findBaseEntityData(cloneItem->itemId()); + if(pPro){ + cloneItem->setProperty(pPro); + pPanel->getScene()->addItem(cloneItem); + if(pPro->type() != 8){ + PowerEntity* pEntity = TopologyManager::instance().findEntity(pPro->uuid().toString(),ModelFunctionType::BaseModel); + if(pEntity) + cloneItem->setEntity(pEntity); + } + else + { + } + } + } + } } /*******************bay************************/ void DiagramCavas::onSignl_openCurrentBay() diff --git a/diagramCavas/source/diagramEditor/confirmEditorDlg.cpp b/diagramCavas/source/diagramEditor/confirmEditorDlg.cpp new file mode 100644 index 0000000..22bb2f2 --- /dev/null +++ b/diagramCavas/source/diagramEditor/confirmEditorDlg.cpp @@ -0,0 +1,49 @@ +#include "ui_confirmEditorDlg.h" +#include "diagramEditor/confirmEditorDlg.h" +#include + +ConfirmEditorDlg::ConfirmEditorDlg(QWidget *parent) + : QDialog(parent) + , ui(new Ui::confirmEditorDlg) +{ + ui->setupUi(this); + this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + this->setWindowModality(Qt::WindowModal); + initial(); +} + +ConfirmEditorDlg::~ConfirmEditorDlg() +{ + delete ui; +} + +void ConfirmEditorDlg::initial() +{ + connect(ui->btn_ok,&QPushButton::clicked,this,&ConfirmEditorDlg::onOkClicked); + connect(ui->btn_cancel,&QPushButton::clicked,this,&ConfirmEditorDlg::onCancelClicked); +} + +void ConfirmEditorDlg::showDlg(QString sName,QString sTime) +{ + show(); + ui->le_name->setText(sName); + ui->le_time->setText(sTime); +} + +void ConfirmEditorDlg::onOkClicked() +{ + // 获取当前日期和时间 + QDateTime currentDateTime = QDateTime::currentDateTime(); + + // 将日期和时间格式化为字符串 + QString dateTimeString = currentDateTime.toString("yyyy-MM-dd hh:mm:ss"); + + emit onConfirmEditor(ui->le_name->text(),dateTimeString); + hide(); +} + +void ConfirmEditorDlg::onCancelClicked() +{ + hide(); +} + diff --git a/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp b/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp index 0e82e1f..f3edf3c 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp @@ -6,6 +6,7 @@ DiagramEditorBaseBlock::DiagramEditorBaseBlock(QObject *parent) { nType = 0; nContainerLevel = 0; + bEditState = false; } DiagramEditorBaseBlock::~DiagramEditorBaseBlock() { diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp index 0fadf69..d5d0e73 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayDetailSettingDlg.cpp @@ -69,73 +69,87 @@ void DiagramEditorBayDetailSettingDlg::refreshModel() QStandardItem *itemObj = new QStandardItem(); QStandardItem *itemRoute = new QStandardItem(); QString sCategory; + QString sType; if(info.nCategory == 0){ sCategory = "设备"; + if(info.nType == 1) + { + sType = "母线"; + } + else if(info.nType == 2) + { + sType = "异步电动机"; + } + else if(info.nType == 3) + { + sType = "断路器"; + } + else if(info.nType == 4) + { + sType = "电缆"; + } + else if(info.nType == 5) + { + sType = "电流互感器"; + } + else if(info.nType == 6) + { + sType = "电压互感器"; + } + else if(info.nType == 7) + { + sType = "隔离开关"; + } + else if(info.nType == 8) + { + sType = "接地开关"; + } + else if(info.nType == 9) + { + sType = "快速接地开关"; + } + else if(info.nType == 10) + { + sType = "双掷接地隔离开关"; + } + else if(info.nType == 11) + { + sType = "带电指示器"; + } + else if(info.nType == 12) + { + sType = "避雷器"; + } + else if(info.nType == 13) + { + sType = "电缆出线套筒"; + } + else if(info.nType == 14) + { + sType = "电缆端"; + } } else if(info.nCategory == 1){ sCategory = "连接关系"; + if(info.nType == 1){ + sType = "连接点"; + } } - QString sType; - if(info.nType == 1) - { - sType = "母线"; - } - else if(info.nType == 2) - { - sType = "异步电动机"; - } - else if(info.nType == 3) - { - sType = "断路器"; - } - else if(info.nType == 4) - { - sType = "电缆"; - } - else if(info.nType == 5) - { - sType = "电流互感器"; - } - else if(info.nType == 6) - { - sType = "电压互感器"; - } - else if(info.nType == 7) - { - sType = "隔离开关"; - } - else if(info.nType == 8) - { - sType = "接地开关"; - } - else if(info.nType == 9) - { - sType = "快速接地开关"; - } - else if(info.nType == 10) - { - sType = "双掷接地隔离开关"; - } - else if(info.nType == 11) - { - sType = "带电指示器"; - } - else if(info.nType == 12) - { - sType = "避雷器"; - } - else if(info.nType == 13) - { - sType = "电缆出线套筒"; - } - else if(info.nType == 14) - { - sType = "电缆端"; - } + itemCate->setText(sCategory); + itemCate->setData(info.nCategory); itemName->setText(info.sName); + itemName->setData(info.nUsedDirection); + itemName->setData(info.deltaPos,Qt::UserRole+2); + itemName->setData(info.uid,Qt::UserRole+3); + itemName->setData(info.nFlag,Qt::UserRole+4); + itemName->setData(info.nRotate,Qt::UserRole+5); itemType->setText(sType); + itemType->setData(info.nType); itemObj->setText(info.sBindObj); + itemObj->setData(info.nBindType); + itemObj->setData(info.nBindPara,Qt::UserRole+2); + itemObj->setData(info.sBindParent,Qt::UserRole+3); itemRoute->setText(info.sUsedRoute.join("、")); QList lstItems; @@ -234,9 +248,22 @@ void DiagramEditorBayDetailSettingDlg::onOkClicked() int nLayout = ui->cb_layout->currentData().toInt(); _curBayInfo.nLayout = nLayout; _curBayInfo.mapComponent = mapComponents; + + int nDir = 0; + if(nLayout == 0){ //纵,下右 + nDir = 41; + } + else if(nLayout == 1){ //横,右下 + nDir = 14; + } + QRectF recBounding = getModel()->updateTarget(_curBayInfo.mapRoute,_curBayInfo.mapComponent,nDir,0,true,false); + if(_curOperateObj->getRecSize().isEmpty()) + _curOperateObj->setRecSize(recBounding); _curOperateObj->setBayInfo(_curBayInfo); + TopologyManager::instance().clearGlobalBlockData(_curOperateObj->getName()); TopologyManager::instance().moveTempBlockData(); + _curOperateObj->setEditState(true); _curOperateObj = nullptr; } hide(); diff --git a/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp index d4d3435..a13467b 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBayPreviewDlg.cpp @@ -45,219 +45,6 @@ void DiagramEditorBayPreviewDlg::showDlg(int nLayout) else if(nLayout == 1){ //横,右下 nDir = 14; } - _pParent->getModel()->updateTarget(_pParent->getBayInfo().mapRoute,nDir,0); - //updateModelData(); + _pParent->getModel()->updateTarget(_pParent->getBayInfo().mapRoute,_pParent->getBayInfo().mapComponent,nDir,0); } -/*void DiagramEditorBayPreviewDlg::updateModelData() -{ - auto& mapRoute = _pParent->getRouteMap(); - QString sMainRoute; - int nCount = 0; - for(auto& route:mapRoute){ //寻找包含设备最多的线路 - if(nCount < route.lstCompo.count()){ - nCount = route.lstCompo.count(); - sMainRoute = route.sRouteName; - route.bMainRoute = true; - } - } - - auto& maoCompo = mapRoute[sMainRoute].lstCompo; //假设竖直情况下,上下等分为nSeg段 假设主线路水平居中 - int nSeg = maoCompo.size()*0.5; - int nSegIndex = -nSeg; //计数器,计算deltaY - for(int i = 0;i < maoCompo.size();++i){ //优先遍历主线路,构建主体结构 - int nDir = 0; - if(i == 0){ //队首 - maoCompo[i].nUsedDirection |= 4; //默认向下,队首单向下(单线路记录,不可作为跨线判断依据) - nDir = 4; - } - else if(i == maoCompo.size()-1){ - maoCompo[i].nUsedDirection |= 8; //队尾单向上(单线路记录,不可作为跨线判断依据) - nDir = 8; - } - else{ - maoCompo[i].nUsedDirection |= 12; //其余向上向下都被占用(单线路记录,不可作为跨线判断依据) - nDir = 12; - } - int deltaY = nSegIndex*g_nVDiagramSpacing; - - auto pItemName = _pParent->getModel()->getNameItem(maoCompo[i].sName); - if(pItemName){ - int nVal = pItemName->data().toInt(); - pItemName->setData(QString::number(nVal |= nDir)); //在公用模型中更新设备方向占用(重要) - pItemName->setData(QPoint(0,deltaY),Qt::UserRole+2); //设置相对位置 - } - nSegIndex += 1; - } - - for(auto& route:mapRoute){ //遍历主线路之外的线路 - if(route.sRouteName == sMainRoute){ - continue; - } - - if(!route.lstCompo.isEmpty()){ //拆分线路为以节点为首 - auto pItemFirst = _pParent->getModel()->getNameItem(route.lstCompo.first().sName); - int nFirstVal = pItemFirst->data().toInt(); - auto pItemLast = _pParent->getModel()->getNameItem(route.lstCompo.last().sName); - int nLastVal = pItemLast->data().toInt(); - if(nFirstVal != 0){ //首位为节点 - route.lstOrder = route.lstCompo; - } - else if(nLastVal != 0){ //末位为节点 - for (auto it = route.lstCompo.rbegin(); it != route.lstCompo.rend(); ++it) { - route.lstReverse.append(*it); - } - } - else{ //节点在中间 - int nIndex = 0; - for(int i = 0;i < route.lstCompo.size();++i){ - auto pItem = _pParent->getModel()->getNameItem(route.lstCompo[i].sName); - if(pItem){ - int nVal = pItem->data().toInt(); - if(nVal != 0){ - nIndex = i; - break; - } - } - } - - for(int i = nIndex;i >= 0;--i){ - route.lstReverse.append(route.lstCompo[i]); - } - - for(int i = nIndex;i < route.lstCompo.size();++i){ - route.lstOrder.append(route.lstCompo[i]); - } - } - } - - int nOrderFirstDeltaY = 0; //首节点y偏移量(假设后续节点与头节点水平) - int nXOrderIndex = 1; //横向计数 - int nOrderPolarity = 1; //方向 1右 -1左 - if(route.lstOrder.size() > 1){ - for(int i = 0;i < route.lstOrder.size()-1;++i){ //遍历以节点为首的队列 - auto pItem = _pParent->getModel()->getNameItem(route.lstOrder[i].sName); - int nVal = pItem->data().toInt(); - QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); - auto pNextItem = _pParent->getModel()->getNameItem(route.lstOrder[i+1].sName); //下一个item - nOrderFirstDeltaY = deltaP.y(); - int nNextVal = pNextItem->data().toInt(); - if(i == 0){ //首节点 - if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ - qDebug()<setData(QString::number(nVal | 1)); - pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 - nOrderPolarity = 1; - pNextItem->setData(-90,Qt::UserRole+5); - } - else if((nVal & 1) == 1){ - //右被占用,左空 - pItem->setData(QString::number(nVal | 2)); - pNextItem->setData(QString::number(nNextVal | 1)); - nOrderPolarity = -1; - pNextItem->setData(90,Qt::UserRole+5); - } - else{ //左右都没被占,默认放到左边 - pItem->setData(QString::number(nVal | 1)); - pNextItem->setData(QString::number(nNextVal | 2)); - nOrderPolarity = 1; - pNextItem->setData(-90,Qt::UserRole+5); - } - int deltaX = nXOrderIndex*nOrderPolarity*g_nHDiagramSpacing; - pNextItem->setData(QPoint(deltaX,nOrderFirstDeltaY),Qt::UserRole + 2); - continue; - } - - if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ - qDebug()<setData(QString::number(nVal | 1)); - pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 - } - else if((nVal & 1) == 1){ - //右被占用,左空 - pItem->setData(QString::number(nVal | 2)); - pNextItem->setData(QString::number(nNextVal | 1)); - } - else{ //左右都没被占,默认放到左边 - pItem->setData(QString::number(nVal | 1)); - pNextItem->setData(QString::number(nNextVal | 2)); - } - int deltaX = nXOrderIndex*nOrderPolarity*g_nHDiagramSpacing; - pNextItem->setData(QPoint(deltaX,nOrderFirstDeltaY),Qt::UserRole + 2); - nXOrderIndex += 1; - } - } - - int nReverseFirstDeltaY = 0; //首节点y偏移量(假设后续节点与头节点水平) - int nXReverseIndex = 1; //横向计数 - int nReversePolarity = 1; //方向 1右 -1左 - if(route.lstReverse.size() > 1){ - for(int i = 0;i < route.lstReverse.size()-1;++i){ //遍历以节点为首的队列 - auto pItem = _pParent->getModel()->getNameItem(route.lstReverse[i].sName); - int nVal = pItem->data().toInt(); - QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); - - auto pNextItem = _pParent->getModel()->getNameItem(route.lstReverse[i+1].sName); //下一个item - nReverseFirstDeltaY = deltaP.y(); - - int nNextVal = pNextItem->data().toInt(); - if(i == 0){ //首节点 - if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ - qDebug()<setData(QString::number(nVal | 1)); - pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 - nReversePolarity = 1; - pNextItem->setData(-90,Qt::UserRole+5); - } - else if((nVal & 1) == 1){ - //右被占用,左空 - pItem->setData(QString::number(nVal | 2)); - pNextItem->setData(QString::number(nNextVal | 1)); - nReversePolarity = -1; - pNextItem->setData(90,Qt::UserRole+5); - } - else{ //左右都没被占,默认放到左边 - pItem->setData(QString::number(nVal | 1)); - pNextItem->setData(QString::number(nNextVal | 2)); - nReversePolarity = 1; - pNextItem->setData(-90,Qt::UserRole+5); - } - int deltaX = nXReverseIndex*nReversePolarity*g_nHDiagramSpacing; - pNextItem->setData(QPoint(deltaX,nReverseFirstDeltaY),Qt::UserRole + 2); - continue; - } - - if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ - qDebug()<setData(QString::number(nVal | 1)); - pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 - } - else if((nVal & 1) == 1){ - //右被占用,左空 - pItem->setData(QString::number(nVal | 2)); - pNextItem->setData(QString::number(nNextVal | 1)); - } - else{ //左右都没被占,默认放到左边 - pItem->setData(QString::number(nVal | 1)); - pNextItem->setData(QString::number(nNextVal | 2)); - } - int deltaX = nXReverseIndex*nReversePolarity*g_nHDiagramSpacing; - pNextItem->setData(QPoint(deltaX,nReverseFirstDeltaY),Qt::UserRole + 2); - nXReverseIndex += 1; - } - } - } -} -*/ diff --git a/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp index 78438d4..356df25 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorPreviewDlg.cpp @@ -30,7 +30,7 @@ void DiagramEditorPreviewDlg::initial() _pMainLayout = new QVBoxLayout(this); _pView = new EditView(this); _pMainLayout->addWidget(_pView); - _pScene = new EditScene(this); + _pScene = new EditPreviewScene(this); _pScene->setSceneRect(_pParent->getScene()->sceneRect()); //使用父窗口scene大小 _pView->setScene(_pScene); } diff --git a/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp index 0d3c902..23b48c5 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorTransDetailSettingDlg.cpp @@ -158,9 +158,19 @@ void DiagramEditorTransDetailSettingDlg::refreshModel() sType = "电缆端"; } itemCate->setText(sCategory); + itemCate->setData(info.nCategory); itemName->setText(info.sName); + itemName->setData(info.nUsedDirection); + itemName->setData(info.deltaPos,Qt::UserRole+2); + itemName->setData(info.uid,Qt::UserRole+3); + itemName->setData(info.nFlag,Qt::UserRole+4); + itemName->setData(info.nRotate,Qt::UserRole+5); itemType->setText(sType); + itemType->setData(info.nType); itemObj->setText(info.sBindObj); + itemObj->setData(info.nBindType); + itemObj->setData(info.nBindPara,Qt::UserRole+2); + itemObj->setData(info.sBindParent,Qt::UserRole+3); itemRoute->setText(info.sUsedRoute.join("、")); QList lstItems; @@ -261,21 +271,41 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked() } //_curOperateObj->setComponentMap(mapComponents); _transInfo.mapComponent = mapComponents; + QRectF rec1; + QRectF rec2; + QRectF rec3; + QRectF result; if(_transInfo.mapNeutral.contains(0)){ + QPointF delta = QPointF(100,-25); _transInfo.mapNeutral[0].nType = 0; - _transInfo.mapNeutral[0].delPoint = QPointF(100,-100); + _transInfo.mapNeutral[0].delPoint = delta; + rec1 = getModel()->updateTarget(_transInfo.mapNeutral[0].mapRoute,_transInfo.mapComponent,18,1,true,false); //1右2上 + rec1.translate(delta); //相对trans偏移 + result = result.united(rec1); } if(_transInfo.mapNeutral.contains(1)){ + QPointF delta = QPointF(-150,0); _transInfo.mapNeutral[1].nType = 1; - _transInfo.mapNeutral[1].delPoint = QPointF(-100,-50); + _transInfo.mapNeutral[1].delPoint = delta; + rec2 = getModel()->updateTarget(_transInfo.mapNeutral[1].mapRoute,_transInfo.mapComponent,14,1,true,false); //1右2下 + rec2.translate(delta); + result = result.united(rec2); } if(_transInfo.mapNeutral.contains(2)){ + QPointF delta = QPointF(100,25); _transInfo.mapNeutral[2].nType = 2; - _transInfo.mapNeutral[2].delPoint = QPointF(100,0); + _transInfo.mapNeutral[2].delPoint = delta; + rec3 = getModel()->updateTarget(_transInfo.mapNeutral[2].mapRoute,_transInfo.mapComponent,24,1,true,false); //1左2下 + rec3.translate(delta); + result = result.united(rec3); } + + if(_curOperateObj->getRecSize().isEmpty()) + _curOperateObj->setRecSize(result); _curOperateObj->setTransInfo(_transInfo); TopologyManager::instance().clearGlobalBlockData(_curOperateObj->getName()); TopologyManager::instance().moveTempBlockData(); + _curOperateObj->setEditState(true); _curOperateObj = nullptr; } hide(); diff --git a/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp index 1902326..43cb901 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorTransPreviewDlg.cpp @@ -44,11 +44,11 @@ void DiagramEditorTransPreviewDlg::showDlg(int nType) void DiagramEditorTransPreviewDlg::updateModelData(int nType) { if(nType == 0 || nType == 1 || nType == 2){ - _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[nType].mapRoute,14,1); //1右2下 + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[nType].mapRoute,_pParent->getTransInfo().mapComponent,14,1); //1右2下 } else if(nType == 3){ //整个变压器 - _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[0].mapRoute,18,1); //1右2上 - _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[1].mapRoute,14,1); //1右2下 - _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[2].mapRoute,24,1); //1左2下 + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[0].mapRoute,_pParent->getTransInfo().mapComponent,18,1); //1右2上 + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[1].mapRoute,_pParent->getTransInfo().mapComponent,14,1); //1右2下 + _pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[2].mapRoute,_pParent->getTransInfo().mapComponent,24,1); //1左2下 } } diff --git a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp index cca26d5..8d4111a 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp @@ -484,6 +484,7 @@ void DiagramEditorWizard::onAddBayFinished(DiagramEditorWizardBayInfo info) } DiagramEditorBayBlock* pBlock = new DiagramEditorBayBlock(this); + pBlock->setId(QUuid::createUuid()); pBlock->setName(info.sName); pBlock->setType(2); pBlock->setBayType(info.nType); diff --git a/diagramCavas/source/diagramEditor/editItems.cpp b/diagramCavas/source/diagramEditor/editItems.cpp index 633e0bd..90944b3 100644 --- a/diagramCavas/source/diagramEditor/editItems.cpp +++ b/diagramCavas/source/diagramEditor/editItems.cpp @@ -13,6 +13,19 @@ EditBaseItem::~EditBaseItem() } +QString EditBaseItem::getEditState() +{ + QString str; + if(_pBlock){ + bool state = _pBlock->getEditState(); + if(state) + str = "已编辑"; + else + str = "未编辑"; + } + return str; +} + QPainterPath EditBaseItem::shape() { QPainterPath path; @@ -63,11 +76,62 @@ EditBayItem::~EditBayItem() } +QString EditBayItem::getShowType() +{ + QString str; + if(_pBlock){ + auto pBay = dynamic_cast(_pBlock.data()); + if(pBay){ + BayType tpe = pBay->getBayType(); + switch (tpe) { + case BayType::busSectionBay: + str = "分段间隔"; + break; + case BayType::busCouplerBay: + str = "母联间隔"; + break; + case BayType::ptBay: + str = "PT间隔"; + break; + case BayType::incomingBay: + str = "进线间隔"; + break; + case BayType::outcomingBay: + str = "出线间隔"; + break; + case BayType::compensationBay: + str = "无功补偿间隔"; + break; + case BayType::bypassBay: + str = "旁路间隔"; + break; + default: + break; + } + } + } + return str; +} + void EditBayItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { + Q_UNUSED(option); + Q_UNUSED(widget); + painter->setPen(QColor(220,220,230)); painter->drawRect(m_boundingRect); painter->drawText(QPointF(-10,0),sName); + + painter->setFont(QFont("Arial", 12)); + painter->setPen(Qt::cyan); + + QString str1 = "类型:"+getShowType(); + QString str2 = "状态:"+getEditState(); + QString text = str1+"\n"+str2; + + QTextOption op; + op.setAlignment(Qt::AlignCenter); + painter->drawText(boundingRect(), text, op); } /********************trans*********************/ @@ -82,11 +146,47 @@ EditTransItem::~EditTransItem() } +QString EditTransItem::getShowType() +{ + QString str; + if(_pBlock){ + auto pTrans = dynamic_cast(_pBlock.data()); + if(pTrans){ + TransformerType tpe = pTrans->getTransType(); + switch (tpe) { + case TransformerType::twoWinding: + str = "两绕组变压器"; + break; + case TransformerType::threeWinding: + str = "三绕组变压器"; + break; + default: + break; + } + } + } + return str; +} + void EditTransItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { + Q_UNUSED(option); + Q_UNUSED(widget); + painter->setPen(QColor(180,235,155)); painter->drawRect(m_boundingRect); painter->drawText(QPointF(-10,0),sName); + + painter->setFont(QFont("Arial", 12)); + painter->setPen(Qt::cyan); + + QString str1 = "类型:"+getShowType(); + QString str2 = "状态:"+getEditState(); + QString text = str1+"\n"+str2; + + QTextOption op; + op.setAlignment(Qt::AlignCenter); + painter->drawText(boundingRect(), text, op); } /********************连线*********************/ diff --git a/diagramCavas/source/diagramEditor/editPanel.cpp b/diagramCavas/source/diagramEditor/editPanel.cpp index 79a6124..43a556a 100644 --- a/diagramCavas/source/diagramEditor/editPanel.cpp +++ b/diagramCavas/source/diagramEditor/editPanel.cpp @@ -19,6 +19,8 @@ #include "diagramEditor/diagramEditorTransDetailSettingDlg.h" #include "graphicsDataModel/diagramEditorModel.h" #include "diagramEditor/diagramEditorPreviewDlg.h" +#include "diagramEditor/confirmEditorDlg.h" +#include "diagramCavas.h" #include "global.h" #include @@ -29,6 +31,7 @@ EditPanel::EditPanel(QWidget *parent) ,_transDetailSetting(nullptr) ,_pModel(nullptr) ,_pPreview(nullptr) + ,_confirmEditor(nullptr) { _pModel = new DiagramEditorModel(); _pModel->setPanel(this); @@ -39,7 +42,7 @@ EditPanel::EditPanel(QWidget *parent) m_pEditScene->setModel(_pModel); //设置场景大小.前两个参数为scene的坐标远点,设置到view的中心点后,无论view如何缩放,secne的坐标原点都不会动,方便后续的位置计算 //m_pEditScene->setSceneRect(-g_dGriaphicsScene_Width / 2, -g_dGriaphicsScene_Height / 2, g_dGriaphicsScene_Width, g_dGriaphicsScene_Height); - m_pEditScene->setSceneRect(0, 0, g_dGriaphicsScene_Width*2, g_dGriaphicsScene_Height*2); + m_pEditScene->setSceneRect(0, 0, g_dGriaphicsScene_Width*4, g_dGriaphicsScene_Height*4); m_pEditView = new EditView(this); m_pEditView->setScene(m_pEditScene); @@ -361,6 +364,22 @@ void EditPanel::showPreview() _pPreview->showDlg(); } +void EditPanel::showConfirmDlg() +{ + if(!_confirmEditor){ + _confirmEditor = new ConfirmEditorDlg(this); + _confirmEditor->setModelDelegate(_pModel); + + connect(_confirmEditor,&ConfirmEditorDlg::onConfirmEditor,this,[&](QString sAuthor,QString sTime){ + auto pCavas = _pModel->getCavas(); + if(pCavas){ + pCavas->onSignal_wizardFinished(_projectName,_pModel->getPreviewItem()); + } + }); + } + _confirmEditor->show(); +} + QList EditPanel::getBlockItems(EditorItemType typ) { QList lst; diff --git a/diagramCavas/source/diagramEditor/editScene.cpp b/diagramCavas/source/diagramEditor/editScene.cpp index 8a4a49b..4d96947 100644 --- a/diagramCavas/source/diagramEditor/editScene.cpp +++ b/diagramCavas/source/diagramEditor/editScene.cpp @@ -3,6 +3,7 @@ #include #include #include "graphicsDataModel/diagramEditorModel.h" +#include "diagramEditor/editPanel.h" EditBaseScene::EditBaseScene(QObject *parent) : QGraphicsScene(parent) @@ -34,9 +35,12 @@ void EditScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) if(_pModel){ //_pModel->setCurPreviewScene(this); _pModel->generatePreview(); + _pModel->calculateBlockPos(); + _pModel->setItemInBlockPos(); + _pModel->refreshConnection(); } } else if (selectedAction == generateAction) { - + _pModel->getPanel()->showConfirmDlg(); } } /************************预览*********************/ diff --git a/diagramCavas/source/drawingPanel.cpp b/diagramCavas/source/drawingPanel.cpp index 44ab441..0523aa6 100644 --- a/diagramCavas/source/drawingPanel.cpp +++ b/diagramCavas/source/drawingPanel.cpp @@ -31,7 +31,7 @@ DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode m_pSelectorManager = new SelectorManager(_pModel,this); m_pGraphicsScene = new DesignerScene(_pModel,this); //设置场景大小.前两个参数为scene的坐标远点,设置到view的中心点后,无论view如何缩放,secne的坐标原点都不会动,方便后续的位置计算 - m_pGraphicsScene->setSceneRect(-g_dGriaphicsScene_Width / 2, -g_dGriaphicsScene_Height / 2, g_dGriaphicsScene_Width, g_dGriaphicsScene_Height); + m_pGraphicsScene->setSceneRect(-g_dGriaphicsScene_Width, -g_dGriaphicsScene_Height, g_dGriaphicsScene_Width*2, g_dGriaphicsScene_Height*2); m_pGraphicsScene->setGridVisible(true); m_pGraphicsView = new DesignerView(this); diff --git a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp index 655e5a9..a9272c8 100644 --- a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp +++ b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp @@ -40,6 +40,7 @@ bool DiagramEditorModel::addPreviewItem(QUuid uuid,GraphicsBaseModelItem* pItem, return false; else { + pItem->setMask(false); _tempItem.insert(uuid,pItem); return true; } @@ -49,6 +50,7 @@ bool DiagramEditorModel::addPreviewItem(QUuid uuid,GraphicsBaseModelItem* pItem, return false; else { + pItem->setMask(false); _previewItem.insert(uuid,pItem); return true; } @@ -313,7 +315,8 @@ void DiagramEditorModel::generateTempTrans(int nType,DiagramEditorTransformerBlo if(_pCurPreviewScene){ QRectF itemsRect = _pCurPreviewScene->itemsBoundingRect(); - block->setRecSize(itemsRect); + if(block->getRecSize().isEmpty()) + block->setRecSize(itemsRect); } } } @@ -426,6 +429,8 @@ void DiagramEditorModel::generatePreview() QRectF rec = item->boundingRect(); QPointF pos = item->scenePos(); + if(_previewItem.contains(uid)) + continue; auto pItem = generateComponent(uid,name,0,1,pos,0,1); if(nMaxLen > rec.width()) rec.setWidth(nMaxLen); @@ -501,8 +506,6 @@ void DiagramEditorModel::generatePreview() } } } - - calculateBlockPos(); } void DiagramEditorModel::calculateBlockPos() @@ -520,6 +523,8 @@ void DiagramEditorModel::calculateBlockPos() for(auto &pCon:iter.value()){ //首次循环遍历每行container,计算最大上空间高度,最大下空间高度,容器宽度 auto mapBlocks = pCon->getBlockMap(); auto lstBlockUp = mapBlocks.value(0); + auto lstBus1 = mapBlocks.value(1); //1母 + auto lstBus2 = mapBlocks.value(2); //2母 auto lstBlockDown = mapBlocks.value(3); double dConWidth = 0; @@ -532,6 +537,7 @@ void DiagramEditorModel::calculateBlockPos() dMaxUp = dHeight; dWidthUp += g_nHorizontalBlockSpacing+dWidth; } + dMaxUp += g_dEditorItem_Height; double dWidthDown = 0; for(auto pBlock:lstBlockDown){ @@ -542,12 +548,32 @@ void DiagramEditorModel::calculateBlockPos() dMaxDown = dHeight; dWidthDown = g_nHorizontalBlockSpacing+dWidth; } + dMaxDown += g_dEditorItem_Height; + + int nBusLen = 0; + if(!lstBus1.empty()){ + nBusLen = lstBus1.first()->getRecSize().width(); + } + + if(!lstBus2.empty()){ + int nLen = lstBus2.first()->getRecSize().width(); + if(nBusLen < nLen) + nBusLen = nLen; + } dConWidth = dWidthUp > dWidthDown ? dWidthUp : dWidthDown; + if(dConWidth < nBusLen) + dConWidth = nBusLen; pCon->setWidth(dConWidth); } - double dDeltaX = 0; //每行横向偏移 + if(dMaxUp == 0){ + dMaxUp = g_dEditorItem_Height; + } + if(dMaxDown == 0){ + dMaxDown = g_dEditorItem_Height; + } + double dDeltaX = 50; //每行横向偏移 for(auto &pCon:iter.value()){ //第二次循环赋值,计算位置(首先确定母线位置) pCon->setMaxUpH(dMaxUp); pCon->setMaxDownH(dMaxDown); @@ -555,10 +581,18 @@ void DiagramEditorModel::calculateBlockPos() if(iter == mapTotal.begin()){ //首行 deltaY = 首行dMaxUpH deltaY = pCon->getMaxUpH(); } + else if(iter == std::next(mapTotal.begin())){ //第二行 + if(!mapTotal.value(g_transformerLevel).empty()){ //有变压器 + deltaY = deltaY + pCon->getMaxUpH(); + } + else + deltaY = deltaY + 50 + lastMaxDownH + pCon->getMaxUpH(); + } else //其他行 deltaY = deltaY+母线高度+上行dMaxDownH+本行dMaxUpH { deltaY = deltaY + 50 + lastMaxDownH + pCon->getMaxUpH(); } + lastMaxDownH = pCon->getMaxDownH(); } pCon->setMidUpY(deltaY); @@ -579,18 +613,18 @@ void DiagramEditorModel::calculateBlockPos() QPointF center; if(pBlock->getType() == 1){ //母线 if(it.key() == 1){ //1母 - center = QPointF(pStartX+recBlock.width()*0.5,dMiddleUpY+recBlock.height()*0.5); + center = QPointF(pStartX/*+recBlock.width()*0.5*/,dMiddleUpY+recBlock.height()*0.5); } else if(it.key() == 2){ //2母 - center = QPointF(pStartX+recBlock.width()*0.5,dMiddleDownY-recBlock.height()*0.5); + center = QPointF(pStartX/*+recBlock.width()*0.5*/,dMiddleDownY-recBlock.height()*0.5); } } else if(pBlock->getType() == 2){ //间隔 if(it.key() == 0){ //容器最上层 - center = QPointF(deltaX+recBlock.width()*0.5,dMiddleUpY-recBlock.height()*0.5); + center = QPointF(deltaX+recBlock.width()*0.5,dMiddleUpY-recBlock.height()*0.5-g_dEditorItem_Height*0.5); } else if(it.key() == 3){ //容器最下层 - center = QPointF(deltaX+recBlock.width()*0.5,dMiddleDownY+recBlock.height()*0.5); + center = QPointF(deltaX+recBlock.width()*0.5,dMiddleDownY+recBlock.height()*0.5+g_dEditorItem_Height*0.5); } deltaX += recBlock.width(); } @@ -599,14 +633,16 @@ void DiagramEditorModel::calculateBlockPos() if(!center.isNull()) pBlock->setSeceneDelta(center); + //qDebug()<getName()<<":"<getBlockMap(); auto lstBlock = mapBlocks.value(1); for(auto &pb:lstBlock){ @@ -616,14 +652,16 @@ void DiagramEditorModel::calculateBlockPos() } } - for(auto &pCon:iter.value()){ //计算位置 - if(pCon == iter.value().first()){ + for(auto &pCon:lstCon){ //计算位置 + if(pCon == lstCon.first()){ //只在每行第一次改变deltaY - deltaY += pCon->getHeight(); + deltaY = deltaY + 50 + lastMaxDownH + pCon->getHeight(); } - pCon->setStartY(deltaY-pCon->getHeight()); + double dHeight = pCon->getHeight(); + double dWidth = pCon->getWidth(); + pCon->setStartY(deltaY-dHeight*0.5); pCon->setStartX(dDeltaX); - dDeltaX += pCon->getWidth(); + dDeltaX += dWidth+100; auto mapBlocks = pCon->getBlockMap(); @@ -632,6 +670,7 @@ void DiagramEditorModel::calculateBlockPos() QRectF recBlock = pBlock->getRecSize(); QPointF center = QPointF(pCon->getStartX()+recBlock.width()*0.5,pCon->getStartY()+recBlock.height()*0.5); pBlock->setSeceneDelta(center); + qDebug()<getName()<<":"<getSceneDelta(); pItem->setPos(pPos); + pItem->setPosChanged(true); + //qDebug()<sceneBoundingRect()<boundingRect(); } } } @@ -672,6 +713,7 @@ void DiagramEditorModel::setItemInBlockPos() if(pItem){ QPointF pos = info.deltaPos+pBay->getSceneDelta(); pItem->setPos(pos); + pItem->setPosChanged(true); } } } @@ -682,6 +724,11 @@ void DiagramEditorModel::setItemInBlockPos() if(pTrans){ auto transInfo = pTrans->getTranInfo(); auto mapCompo = transInfo.mapComponent; + //item->setPos(pTrans->getSceneDelta()); + auto transItem = _previewItem.value(pTrans->getId()); + if(transItem){ + transItem->setPos(pTrans->getSceneDelta()); + } for(auto &neuInfo:transInfo.mapNeutral){ auto mapRoute = neuInfo.mapRoute; @@ -690,8 +737,56 @@ void DiagramEditorModel::setItemInBlockPos() for(auto& info:lst){ auto pItem = _previewItem.value(info.uid); if(pItem){ - QPointF pos = info.deltaPos+(pTrans->getSceneDelta()-info.deltaPos); + QPointF pos = info.deltaPos+transItem->mapToScene(neuInfo.delPoint); pItem->setPos(pos); + pItem->setPosChanged(true); + //qDebug()<getProperty(); + if(pData){ + int nType = pData->type(); + QUuid uid = pData->uuid(); + if(nType == 8){ //是电缆 + auto pLine = dynamic_cast(item); + if(pLine){ + PowerConnection* pCon = TopologyManager::instance().connection(uid.toString(),ModelFunctionType::EditorModel); + if(pCon){ + QString fromTerId = pCon->fromTerminalId(); + QString toTerId = pCon->toTerminalId(); + QString fromId = pCon->fromComponent(); + QString toId = pCon->toComponent(); + + GraphicsBaseModelItem* pFromItem = _previewItem.value(QUuid(fromId)); + GraphicsBaseModelItem* pToItem = _previewItem.value(QUuid(toId)); + + auto pFromData = pFromItem->getProperty(); + auto pToData = pToItem->getProperty(); + if(pFromData->type() == 1){ //from是母线 + pFromItem->movePort(fromTerId,pFromItem->mapFromScene(calculateBusPortPos(pFromItem,pToItem))); + } + else if(pToData->type() == 1){ //to是母线 + pToItem->movePort(toTerId,pToItem->mapFromScene(calculateBusPortPos(pToItem,pFromItem))); + } + + auto portsFrom = pFromItem->getPorts(); + auto portsTo = pToItem->getPorts(); + + ItemPort* pFrom = portsFrom.value(fromTerId); + ItemPort* pTo = portsTo.value(toTerId); + if(pFrom && pTo){ //更新连线起点终点位置 + pLine->setStartPoint(pFrom->scenePos()); + pLine->setEndPoint(pTo->scenePos()); + pLine->calculatePath(); } } } @@ -795,6 +890,8 @@ QList DiagramEditorModel::generateItemByInfo(QMap DiagramEditorModel::generateItemByInfo(QMap DiagramEditorModel::generateItemByInfo(QMap } } -void DiagramEditorModel::updateTarget(QMap& data,int nLayout,int nSource) +QRectF DiagramEditorModel::updateTarget(QMap& data,QMap& compos,int nLayout,int nSource,bool regenerate,bool saveToModel) { + QRectF recBounding; //包含所有元件的矩形 auto& mapRoute = data; QString sMainRoute; + if(regenerate){ //清空方位数据 + if(saveToModel){ + for(auto &routeInfo:data){ + routeInfo.lstOrder.clear(); + routeInfo.lstReverse.clear(); + for(auto &compo:routeInfo.lstCompo){ + compo.nUsedDirection = 0; + + auto pItemName = getNameItem(compo.sName,nSource); + if(pItemName){ //手动清空item数据 + int nVal = pItemName->data().toInt(); + pItemName->setData(QString::number(0)); //在公用模型中更新设备方向占用(重要) + //pItemName->setData(QPoint(0,0),Qt::UserRole+2); //设置相对位置 + pItemName->setData(0,Qt::UserRole+5); //旋转 + } + } + } + } + else{ + for(auto &routeInfo:data){ + routeInfo.lstOrder.clear(); + routeInfo.lstReverse.clear(); + for(auto &compo:routeInfo.lstCompo){ + compo.nUsedDirection = 0; + } + } + + for(auto &compoInfo:compos){ + compoInfo.nUsedDirection = 0; + compoInfo.nRotate = 0; + //compoInfo.deltaPos = QPoint(0,0); + } + } + } + bool hasMain = false; for(auto& route:mapRoute){ if(route.bMainRoute == true){ @@ -959,20 +1096,32 @@ void DiagramEditorModel::updateTarget(QMap& data } int deltaY = nSegIndex*g_nVDiagramSpacing; - auto pItemName = getNameItem(maoCompo[i].sName,nSource); - if(pItemName){ - int nVal = pItemName->data().toInt(); - pItemName->setData(QString::number(nVal |= nDir)); //在公用模型中更新设备方向占用(重要) - pItemName->setData(QPoint(0,deltaY),Qt::UserRole+2); //设置相对位置 - if(nMainDir == 4){ - maoCompo[i].nRotate = 0; - pItemName->setData(0,Qt::UserRole+5); - } - else{ - maoCompo[i].nRotate = 180; - pItemName->setData(180,Qt::UserRole+5); + int rotate = 0; + if(nMainDir == 4) + rotate = 0; + else + rotate = 180; + + if(saveToModel){ + auto pItemName = getNameItem(maoCompo[i].sName,nSource); + if(pItemName){ + int nVal = pItemName->data().toInt(); + pItemName->setData(QString::number(nVal |= nDir)); //在公用模型中更新设备方向占用(重要) + pItemName->setData(QPoint(0,deltaY),Qt::UserRole+2); //设置相对位置 + maoCompo[i].nRotate = rotate; + pItemName->setData(rotate,Qt::UserRole+5); } } + else{ + if(compos.contains(maoCompo[i].sName)){ + auto &compInfo = compos[maoCompo[i].sName]; + compInfo.nUsedDirection |= nDir; + compInfo.deltaPos = QPoint(0,deltaY); + maoCompo[i].nRotate = rotate; + compInfo.nRotate = rotate; + } + } + if(nMainDir == 8) nSegIndex -= 1; else @@ -985,37 +1134,77 @@ void DiagramEditorModel::updateTarget(QMap& data } if(!route.lstCompo.isEmpty()){ //拆分线路为以节点为首 - auto pItemFirst = getNameItem(route.lstCompo.first().sName,nSource); - int nFirstVal = pItemFirst->data().toInt(); - auto pItemLast = getNameItem(route.lstCompo.last().sName,nSource); - int nLastVal = pItemLast->data().toInt(); - if(nFirstVal != 0){ //首位为节点 - route.lstOrder = route.lstCompo; - } - else if(nLastVal != 0){ //末位为节点 - for (auto it = route.lstCompo.rbegin(); it != route.lstCompo.rend(); ++it) { - route.lstReverse.append(*it); + if(saveToModel){ + auto pItemFirst = getNameItem(route.lstCompo.first().sName,nSource); + int nFirstVal = pItemFirst->data().toInt(); + auto pItemLast = getNameItem(route.lstCompo.last().sName,nSource); + int nLastVal = pItemLast->data().toInt(); + if(nFirstVal != 0){ //首位为节点 + route.lstOrder = route.lstCompo; } - } - else{ //节点在中间 - int nIndex = 0; - for(int i = 0;i < route.lstCompo.size();++i){ - auto pItem = getNameItem(route.lstCompo[i].sName,nSource); - if(pItem){ - int nVal = pItem->data().toInt(); - if(nVal != 0){ - nIndex = i; - break; - } + else if(nLastVal != 0){ //末位为节点 + for (auto it = route.lstCompo.rbegin(); it != route.lstCompo.rend(); ++it) { + route.lstReverse.append(*it); } } + else{ //节点在中间 + int nIndex = 0; + for(int i = 0;i < route.lstCompo.size();++i){ + auto pItem = getNameItem(route.lstCompo[i].sName,nSource); + if(pItem){ + int nVal = pItem->data().toInt(); + if(nVal != 0){ + nIndex = i; + break; + } + } + } - for(int i = nIndex;i >= 0;--i){ - route.lstReverse.append(route.lstCompo[i]); + for(int i = nIndex;i >= 0;--i){ + route.lstReverse.append(route.lstCompo[i]); + } + + for(int i = nIndex;i < route.lstCompo.size();++i){ + route.lstOrder.append(route.lstCompo[i]); + } } + } + else{ + if(compos.contains(route.lstCompo.first().sName) && compos.contains(route.lstCompo.last().sName)){ + auto compoFirst = compos[route.lstCompo.first().sName]; + int nFirstVal = compoFirst.nUsedDirection; + auto compoLast = compos[route.lstCompo.last().sName]; + int nLastVal = compoLast.nUsedDirection; - for(int i = nIndex;i < route.lstCompo.size();++i){ - route.lstOrder.append(route.lstCompo[i]); + if(nFirstVal != 0){ //首位为节点 + route.lstOrder = route.lstCompo; + } + else if(nLastVal != 0){ //末位为节点 + for (auto it = route.lstCompo.rbegin(); it != route.lstCompo.rend(); ++it) { + route.lstReverse.append(*it); + } + } + else{ //节点在中间 + int nIndex = 0; + for(int i = 0;i < route.lstCompo.size();++i){ + if(compos.contains(route.lstCompo[i].sName)){ + auto compo = compos[route.lstCompo[i].sName]; + int nVal = compo.nUsedDirection; + if(nVal != 0){ + nIndex = i; + break; + } + } + } + + for(int i = nIndex;i >= 0;--i){ + route.lstReverse.append(route.lstCompo[i]); + } + + for(int i = nIndex;i < route.lstCompo.size();++i){ + route.lstOrder.append(route.lstCompo[i]); + } + } } } } @@ -1025,13 +1214,52 @@ void DiagramEditorModel::updateTarget(QMap& data int nOrderPolarity = 1; //方向 1右 -1左 if(route.lstOrder.size() > 1){ for(int i = 0;i < route.lstOrder.size()-1;++i){ //遍历以节点为首的队列 - auto pItem = getNameItem(route.lstOrder[i].sName,nSource); - int nVal = pItem->data().toInt(); - QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); - auto pNextItem = getNameItem(route.lstOrder[i+1].sName,nSource); //下一个item - nOrderFirstDeltaY = deltaP.y(); - int nNextVal = pNextItem->data().toInt(); - if(i == 0){ //首节点 + if(saveToModel){ + auto pItem = getNameItem(route.lstOrder[i].sName,nSource); + int nVal = pItem->data().toInt(); + QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); + auto pNextItem = getNameItem(route.lstOrder[i+1].sName,nSource); //下一个item + nOrderFirstDeltaY = deltaP.y(); + int nNextVal = pNextItem->data().toInt(); + if(i == 0){ //首节点 + if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ + qDebug()<setData(QString::number(nVal | 1)); + pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 + nOrderPolarity = 1; + route.lstOrder[i+1].nRotate = -90; + pNextItem->setData(-90,Qt::UserRole+5); + } + else if((nVal & 1) == 1){ + //右被占用,左空 + pItem->setData(QString::number(nVal | 2)); + pNextItem->setData(QString::number(nNextVal | 1)); + nOrderPolarity = -1; + route.lstOrder[i+1].nRotate = 90; + pNextItem->setData(90,Qt::UserRole+5); + } + else{ //左右都没被占,放到倾向位置 + pItem->setData(QString::number(nVal | nSubDir)); + pNextItem->setData(QString::number(nNextVal | 3-nSubDir)); + if(nSubDir == 1){ + nOrderPolarity = 1; + route.lstOrder[i+1].nRotate = -90; + pNextItem->setData(-90,Qt::UserRole+5); + } + else if(nSubDir == 2){ + nOrderPolarity = -1; + route.lstOrder[i+1].nRotate = 90; + pNextItem->setData(90,Qt::UserRole+5); + } + } + int deltaX = nXOrderIndex*nOrderPolarity*g_nHDiagramSpacing; + pNextItem->setData(QPoint(deltaX,nOrderFirstDeltaY),Qt::UserRole + 2); + continue; + } + if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ qDebug()<& data //左被占用,右空 pItem->setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 - nOrderPolarity = 1; route.lstOrder[i+1].nRotate = -90; pNextItem->setData(-90,Qt::UserRole+5); } @@ -1047,61 +1274,107 @@ void DiagramEditorModel::updateTarget(QMap& data //右被占用,左空 pItem->setData(QString::number(nVal | 2)); pNextItem->setData(QString::number(nNextVal | 1)); - nOrderPolarity = -1; route.lstOrder[i+1].nRotate = 90; pNextItem->setData(90,Qt::UserRole+5); } - else{ //左右都没被占,放到倾向位置 + else{ //左右都没被占,放到设定位置 pItem->setData(QString::number(nVal | nSubDir)); pNextItem->setData(QString::number(nNextVal | 3-nSubDir)); if(nSubDir == 1){ - nOrderPolarity = 1; route.lstOrder[i+1].nRotate = -90; pNextItem->setData(-90,Qt::UserRole+5); } else if(nSubDir == 2){ - nOrderPolarity = -1; route.lstOrder[i+1].nRotate = 90; pNextItem->setData(90,Qt::UserRole+5); } } int deltaX = nXOrderIndex*nOrderPolarity*g_nHDiagramSpacing; pNextItem->setData(QPoint(deltaX,nOrderFirstDeltaY),Qt::UserRole + 2); - continue; + nXOrderIndex += 1; } + else{ + if(compos.contains(route.lstOrder[i].sName) && compos.contains(route.lstOrder[i+1].sName)){ + auto &compo = compos[route.lstOrder[i].sName]; + auto &compoNext = compos[route.lstOrder[i+1].sName]; + int nVal = compo.nUsedDirection; + QPoint deltaP = compo.deltaPos; + nOrderFirstDeltaY = deltaP.y(); + int nNextVal = compoNext.nUsedDirection; - if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ - qDebug()<setData(QString::number(nVal | 1)); - pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 - route.lstOrder[i+1].nRotate = -90; - pNextItem->setData(-90,Qt::UserRole+5); - } - else if((nVal & 1) == 1){ - //右被占用,左空 - pItem->setData(QString::number(nVal | 2)); - pNextItem->setData(QString::number(nNextVal | 1)); - route.lstOrder[i+1].nRotate = 90; - pNextItem->setData(90,Qt::UserRole+5); - } - else{ //左右都没被占,放到设定位置 - pItem->setData(QString::number(nVal | nSubDir)); - pNextItem->setData(QString::number(nNextVal | 3-nSubDir)); - if(nSubDir == 1){ - route.lstOrder[i+1].nRotate = -90; - pNextItem->setData(-90,Qt::UserRole+5); - } - else if(nSubDir == 2){ - route.lstOrder[i+1].nRotate = 90; - pNextItem->setData(90,Qt::UserRole+5); + if(i == 0){ //首节点 + if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ + qDebug()<setData(QPoint(deltaX,nOrderFirstDeltaY),Qt::UserRole + 2); - nXOrderIndex += 1; } } @@ -1110,15 +1383,54 @@ void DiagramEditorModel::updateTarget(QMap& data int nReversePolarity = 1; //方向 1右 -1左 if(route.lstReverse.size() > 1){ for(int i = 0;i < route.lstReverse.size()-1;++i){ //遍历以节点为首的队列 - auto pItem = getNameItem(route.lstReverse[i].sName,nSource); - int nVal = pItem->data().toInt(); - QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); + if(saveToModel){ + auto pItem = getNameItem(route.lstReverse[i].sName,nSource); + int nVal = pItem->data().toInt(); + QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); - auto pNextItem = getNameItem(route.lstReverse[i+1].sName,nSource); //下一个item - nReverseFirstDeltaY = deltaP.y(); + auto pNextItem = getNameItem(route.lstReverse[i+1].sName,nSource); //下一个item + nReverseFirstDeltaY = deltaP.y(); + + int nNextVal = pNextItem->data().toInt(); + if(i == 0){ //首节点 + if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ + qDebug()<setData(QString::number(nVal | 1)); + pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 + nReversePolarity = 1; + route.lstReverse[i+1].nRotate = -90; + pNextItem->setData(-90,Qt::UserRole+5); + } + else if((nVal & 1) == 1){ + //右被占用,左空 + pItem->setData(QString::number(nVal | 2)); + pNextItem->setData(QString::number(nNextVal | 1)); + nReversePolarity = -1; + route.lstReverse[i+1].nRotate = 90; + pNextItem->setData(90,Qt::UserRole+5); + } + else{ //左右都没被占,放到倾向位置 + pItem->setData(QString::number(nVal | nSubDir)); + pNextItem->setData(QString::number(nNextVal | 3-nSubDir)); + if(nSubDir == 1){ + nReversePolarity = 1; + route.lstReverse[i+1].nRotate = -90; + pNextItem->setData(-90,Qt::UserRole+5); + } + else if(nSubDir == 2){ + nReversePolarity = -1; + route.lstReverse[i+1].nRotate = 90; + pNextItem->setData(90,Qt::UserRole+5); + } + } + int deltaX = nXReverseIndex*nReversePolarity*g_nHDiagramSpacing; + pNextItem->setData(QPoint(deltaX,nReverseFirstDeltaY),Qt::UserRole + 2); + continue; + } - int nNextVal = pNextItem->data().toInt(); - if(i == 0){ //首节点 if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ qDebug()<& data //左被占用,右空 pItem->setData(QString::number(nVal | 1)); pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 - nReversePolarity = 1; route.lstReverse[i+1].nRotate = -90; pNextItem->setData(-90,Qt::UserRole+5); } @@ -1134,61 +1445,107 @@ void DiagramEditorModel::updateTarget(QMap& data //右被占用,左空 pItem->setData(QString::number(nVal | 2)); pNextItem->setData(QString::number(nNextVal | 1)); - nReversePolarity = -1; route.lstReverse[i+1].nRotate = 90; pNextItem->setData(90,Qt::UserRole+5); } - else{ //左右都没被占,放到倾向位置 + else{ //左右都没被占,放到设定位置 pItem->setData(QString::number(nVal | nSubDir)); pNextItem->setData(QString::number(nNextVal | 3-nSubDir)); if(nSubDir == 1){ - nReversePolarity = 1; route.lstReverse[i+1].nRotate = -90; pNextItem->setData(-90,Qt::UserRole+5); } else if(nSubDir == 2){ - nReversePolarity = -1; route.lstReverse[i+1].nRotate = 90; pNextItem->setData(90,Qt::UserRole+5); } } int deltaX = nXReverseIndex*nReversePolarity*g_nHDiagramSpacing; pNextItem->setData(QPoint(deltaX,nReverseFirstDeltaY),Qt::UserRole + 2); - continue; + nXReverseIndex += 1; } + else{ + if(compos.contains(route.lstReverse[i].sName) && compos.contains(route.lstReverse[i+1].sName)){ + auto &compo = compos[route.lstReverse[i].sName]; + auto &compoNext = compos[route.lstReverse[i+1].sName]; + int nVal = compo.nUsedDirection; + QPoint deltaP = compo.deltaPos; + nReverseFirstDeltaY = deltaP.y(); + int nNextVal = compoNext.nUsedDirection; - if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ - qDebug()<setData(QString::number(nVal | 1)); - pNextItem->setData(QString::number(nNextVal | 2)); //同时连接下个点的一侧占用 - route.lstReverse[i+1].nRotate = -90; - pNextItem->setData(-90,Qt::UserRole+5); - } - else if((nVal & 1) == 1){ - //右被占用,左空 - pItem->setData(QString::number(nVal | 2)); - pNextItem->setData(QString::number(nNextVal | 1)); - route.lstReverse[i+1].nRotate = 90; - pNextItem->setData(90,Qt::UserRole+5); - } - else{ //左右都没被占,放到设定位置 - pItem->setData(QString::number(nVal | nSubDir)); - pNextItem->setData(QString::number(nNextVal | 3-nSubDir)); - if(nSubDir == 1){ - route.lstReverse[i+1].nRotate = -90; - pNextItem->setData(-90,Qt::UserRole+5); - } - else if(nSubDir == 2){ - route.lstReverse[i+1].nRotate = 90; - pNextItem->setData(90,Qt::UserRole+5); + if(i == 0){ //首节点 + if(((nVal & 2) == 1) && ((nVal & 1) == 1)){ + qDebug()<setData(QPoint(deltaX,nReverseFirstDeltaY),Qt::UserRole + 2); - nXReverseIndex += 1; } } } @@ -1216,21 +1573,32 @@ void DiagramEditorModel::updateTarget(QMap& data nDir = 3; } int deltaX = nSegIndex*g_nHDiagramSpacing; + int rotate = 0; + if(nMainDir == 1) + rotate = -90; + else + rotate = 90; - auto pItemName = getNameItem(maoCompo[i].sName,nSource); - if(pItemName){ - int nVal = pItemName->data().toInt(); - pItemName->setData(QString::number(nVal |= nDir)); //在公用模型中更新设备方向占用(重要) - pItemName->setData(QPoint(deltaX,0),Qt::UserRole+2); //设置相对位置 - if(nMainDir == 1){ - maoCompo[i].nRotate = -90; - pItemName->setData(-90,Qt::UserRole+5); //转至水平 - } - else{ - maoCompo[i].nRotate = 90; - pItemName->setData(90,Qt::UserRole+5); + if(saveToModel){ + auto pItemName = getNameItem(maoCompo[i].sName,nSource); + if(pItemName){ + int nVal = pItemName->data().toInt(); + pItemName->setData(QString::number(nVal |= nDir)); //在公用模型中更新设备方向占用(重要) + pItemName->setData(QPoint(deltaX,0),Qt::UserRole+2); //设置相对位置 + maoCompo[i].nRotate = rotate; + pItemName->setData(rotate,Qt::UserRole+5); } } + else{ + if(compos.contains(maoCompo[i].sName)){ + auto &compInfo = compos[maoCompo[i].sName]; + compInfo.nUsedDirection |= nDir; + compInfo.deltaPos = QPoint(deltaX,0); + maoCompo[i].nRotate = rotate; + compInfo.nRotate = rotate; + } + } + if(nMainDir == 2) nSegIndex -= 1; else @@ -1243,7 +1611,7 @@ void DiagramEditorModel::updateTarget(QMap& data } if(!route.lstCompo.isEmpty()){ //拆分线路为以节点为首 - auto pItemFirst = getNameItem(route.lstCompo.first().sName,nSource); + /*auto pItemFirst = getNameItem(route.lstCompo.first().sName,nSource); int nFirstVal = pItemFirst->data().toInt(); auto pItemLast = getNameItem(route.lstCompo.last().sName,nSource); int nLastVal = pItemLast->data().toInt(); @@ -1275,6 +1643,79 @@ void DiagramEditorModel::updateTarget(QMap& data for(int i = nIndex;i < route.lstCompo.size();++i){ route.lstOrder.append(route.lstCompo[i]); } + }*/ + if(saveToModel){ + auto pItemFirst = getNameItem(route.lstCompo.first().sName,nSource); + int nFirstVal = pItemFirst->data().toInt(); + auto pItemLast = getNameItem(route.lstCompo.last().sName,nSource); + int nLastVal = pItemLast->data().toInt(); + if(nFirstVal != 0){ //首位为节点 + route.lstOrder = route.lstCompo; + } + else if(nLastVal != 0){ //末位为节点 + for (auto it = route.lstCompo.rbegin(); it != route.lstCompo.rend(); ++it) { + route.lstReverse.append(*it); + } + } + else{ //节点在中间 + int nIndex = 0; + for(int i = 0;i < route.lstCompo.size();++i){ + auto pItem = getNameItem(route.lstCompo[i].sName,nSource); + if(pItem){ + int nVal = pItem->data().toInt(); + if(nVal != 0){ + nIndex = i; + break; + } + } + } + + for(int i = nIndex;i >= 0;--i){ + route.lstReverse.append(route.lstCompo[i]); + } + + for(int i = nIndex;i < route.lstCompo.size();++i){ + route.lstOrder.append(route.lstCompo[i]); + } + } + } + else{ + if(compos.contains(route.lstCompo.first().sName) && compos.contains(route.lstCompo.last().sName)){ + auto compoFirst = compos[route.lstCompo.first().sName]; + int nFirstVal = compoFirst.nUsedDirection; + auto compoLast = compos[route.lstCompo.last().sName]; + int nLastVal = compoLast.nUsedDirection; + + if(nFirstVal != 0){ //首位为节点 + route.lstOrder = route.lstCompo; + } + else if(nLastVal != 0){ //末位为节点 + for (auto it = route.lstCompo.rbegin(); it != route.lstCompo.rend(); ++it) { + route.lstReverse.append(*it); + } + } + else{ //节点在中间 + int nIndex = 0; + for(int i = 0;i < route.lstCompo.size();++i){ + if(compos.contains(route.lstCompo[i].sName)){ + auto compo = compos[route.lstCompo[i].sName]; + int nVal = compo.nUsedDirection; + if(nVal != 0){ + nIndex = i; + break; + } + } + } + + for(int i = nIndex;i >= 0;--i){ + route.lstReverse.append(route.lstCompo[i]); + } + + for(int i = nIndex;i < route.lstCompo.size();++i){ + route.lstOrder.append(route.lstCompo[i]); + } + } + } } } @@ -1283,13 +1724,52 @@ void DiagramEditorModel::updateTarget(QMap& data int nOrderPolarity = 1; //方向 1下 -1上 if(route.lstOrder.size() > 1){ for(int i = 0;i < route.lstOrder.size()-1;++i){ //遍历以节点为首的队列 - auto pItem = getNameItem(route.lstOrder[i].sName,nSource); - int nVal = pItem->data().toInt(); - QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); - auto pNextItem = getNameItem(route.lstOrder[i+1].sName,nSource); //下一个item - nOrderFirstDeltaX = deltaP.x(); - int nNextVal = pNextItem->data().toInt(); - if(i == 0){ //首节点 + if(saveToModel){ + auto pItem = getNameItem(route.lstOrder[i].sName,nSource); + int nVal = pItem->data().toInt(); + QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); + auto pNextItem = getNameItem(route.lstOrder[i+1].sName,nSource); //下一个item + nOrderFirstDeltaX = deltaP.x(); + int nNextVal = pNextItem->data().toInt(); + if(i == 0){ //首节点 + if(((nVal & 8) == 1) && ((nVal & 4) == 1)){ + qDebug()<setData(QString::number(nVal | 4)); + pNextItem->setData(QString::number(nNextVal | 8)); //同时连接下个点的一侧占用 + nOrderPolarity = 1; + route.lstOrder[i+1].nRotate = 0; + pNextItem->setData(0,Qt::UserRole+5); + } + else if((nVal & 4) == 1){ + //下被占用,上空 + pItem->setData(QString::number(nVal | 8)); + pNextItem->setData(QString::number(nNextVal | 4)); + nOrderPolarity = -1; + route.lstOrder[i+1].nRotate = 180; + pNextItem->setData(180,Qt::UserRole+5); + } + else{ //上下都没占,放到设定位置 + pItem->setData(QString::number(nVal | nSubDir)); + pNextItem->setData(QString::number(nNextVal | 12-nSubDir)); + if(nSubDir == 4){ + nOrderPolarity = 1; + route.lstOrder[i+1].nRotate = 0; + pNextItem->setData(0,Qt::UserRole+5); + } + else if(nSubDir == 8){ + nOrderPolarity = -1; + route.lstOrder[i+1].nRotate = 180; + pNextItem->setData(180,Qt::UserRole+5); + } + } + int deltaY = nYOrderIndex*nOrderPolarity*g_nVDiagramSpacing; + pNextItem->setData(QPoint(nOrderFirstDeltaX,deltaY),Qt::UserRole + 2); + continue; + } + if(((nVal & 8) == 1) && ((nVal & 4) == 1)){ qDebug()<& data //上被占用,下空 pItem->setData(QString::number(nVal | 4)); pNextItem->setData(QString::number(nNextVal | 8)); //同时连接下个点的一侧占用 - nOrderPolarity = 1; - route.lstOrder[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } else if((nVal & 4) == 1){ //下被占用,上空 pItem->setData(QString::number(nVal | 8)); pNextItem->setData(QString::number(nNextVal | 4)); - nOrderPolarity = -1; - route.lstOrder[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } - else{ //上下都没占,放到设定位置 + else{ //上下都没被占,放到设定位置 pItem->setData(QString::number(nVal | nSubDir)); pNextItem->setData(QString::number(nNextVal | 12-nSubDir)); if(nSubDir == 4){ - nOrderPolarity = 1; + //nOrderPolarity = 1; route.lstOrder[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } else if(nSubDir == 8){ - nOrderPolarity = -1; + //nOrderPolarity = -1; route.lstOrder[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } } int deltaY = nYOrderIndex*nOrderPolarity*g_nVDiagramSpacing; pNextItem->setData(QPoint(nOrderFirstDeltaX,deltaY),Qt::UserRole + 2); - continue; + nYOrderIndex += 1; } + else{ + if(compos.contains(route.lstOrder[i].sName) && compos.contains(route.lstOrder[i+1].sName)){ + auto &compo = compos[route.lstOrder[i].sName]; + auto &compoNext = compos[route.lstOrder[i+1].sName]; + int nVal = compo.nUsedDirection; + QPoint deltaP = compo.deltaPos; + nOrderFirstDeltaX = deltaP.x(); + int nNextVal = compoNext.nUsedDirection; - if(((nVal & 8) == 1) && ((nVal & 4) == 1)){ - qDebug()<setData(QString::number(nVal | 4)); - pNextItem->setData(QString::number(nNextVal | 8)); //同时连接下个点的一侧占用 - pNextItem->setData(0,Qt::UserRole+5); - } - else if((nVal & 4) == 1){ - //下被占用,上空 - pItem->setData(QString::number(nVal | 8)); - pNextItem->setData(QString::number(nNextVal | 4)); - pNextItem->setData(180,Qt::UserRole+5); - } - else{ //上下都没被占,放到设定位置 - pItem->setData(QString::number(nVal | nSubDir)); - pNextItem->setData(QString::number(nNextVal | 12-nSubDir)); - if(nSubDir == 4){ - //nOrderPolarity = 1; - route.lstOrder[i+1].nRotate = 0; - pNextItem->setData(0,Qt::UserRole+5); - } - else if(nSubDir == 8){ - //nOrderPolarity = -1; - route.lstOrder[i+1].nRotate = 180; - pNextItem->setData(180,Qt::UserRole+5); + if(i == 0){ //首节点 + if(((nVal & 8) == 1) && ((nVal & 4) == 1)){ + qDebug()<setData(QPoint(nOrderFirstDeltaX,deltaY),Qt::UserRole + 2); - nYOrderIndex += 1; } } @@ -1368,91 +1891,205 @@ void DiagramEditorModel::updateTarget(QMap& data int nReversePolarity = 1; //方向 1下 -1上 if(route.lstReverse.size() > 1){ for(int i = 0;i < route.lstReverse.size()-1;++i){ //遍历以节点为首的队列 - auto pItem = getNameItem(route.lstReverse[i].sName,nSource); - int nVal = pItem->data().toInt(); - QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); + if(saveToModel){ + auto pItem = getNameItem(route.lstReverse[i].sName,nSource); + int nVal = pItem->data().toInt(); + QPoint deltaP = pItem->data(Qt::UserRole+2).toPoint(); - auto pNextItem = getNameItem(route.lstReverse[i+1].sName,nSource); //下一个item - nReverseFirstDeltaX = deltaP.x(); + auto pNextItem = getNameItem(route.lstReverse[i+1].sName,nSource); //下一个item + nReverseFirstDeltaX = deltaP.x(); + + int nNextVal = pNextItem->data().toInt(); + if(i == 0){ //首节点 + if(((nVal & 8) == 1) && ((nVal & 4) == 1)){ + qDebug()<setData(QString::number(nVal | 4)); + pNextItem->setData(QString::number(nNextVal | 8)); //同时连接下个点的一侧占用 + nReversePolarity = 1; + route.lstReverse[i+1].nRotate = 0; + pNextItem->setData(0,Qt::UserRole+5); + } + else if((nVal & 1) == 4){ + //下被占用,上空 + pItem->setData(QString::number(nVal | 8)); + pNextItem->setData(QString::number(nNextVal | 4)); + nReversePolarity = -1; + route.lstReverse[i+1].nRotate = 180; + pNextItem->setData(180,Qt::UserRole+5); + } + else{ //上下都没被占,放到设定位置 + pItem->setData(QString::number(nVal | nSubDir)); + pNextItem->setData(QString::number(nNextVal | 12-nSubDir)); + if(nSubDir == 4){ + nReversePolarity = 1; + route.lstReverse[i+1].nRotate = 0; + pNextItem->setData(0,Qt::UserRole+5); + } + else if(nSubDir == 8){ + nReversePolarity = -1; + route.lstReverse[i+1].nRotate = 180; + pNextItem->setData(180,Qt::UserRole+5); + } + } + int deltaY = nYReverseIndex*nReversePolarity*g_nVDiagramSpacing; + pNextItem->setData(QPoint(nReverseFirstDeltaX,deltaY),Qt::UserRole + 2); + continue; + } - int nNextVal = pNextItem->data().toInt(); - if(i == 0){ //首节点 if(((nVal & 8) == 1) && ((nVal & 4) == 1)){ - qDebug()<setData(QString::number(nVal | 4)); pNextItem->setData(QString::number(nNextVal | 8)); //同时连接下个点的一侧占用 - nReversePolarity = 1; route.lstReverse[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } - else if((nVal & 1) == 4){ + else if((nVal & 4) == 1){ //下被占用,上空 pItem->setData(QString::number(nVal | 8)); pNextItem->setData(QString::number(nNextVal | 4)); - nReversePolarity = -1; route.lstReverse[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } - else{ //上下都没被占,放到设定位置 + else{ //上下都没被占,默认放到下边 pItem->setData(QString::number(nVal | nSubDir)); pNextItem->setData(QString::number(nNextVal | 12-nSubDir)); if(nSubDir == 4){ - nReversePolarity = 1; + //nReversePolarity = 1; route.lstReverse[i+1].nRotate = 0; pNextItem->setData(0,Qt::UserRole+5); } else if(nSubDir == 8){ - nReversePolarity = -1; + //nReversePolarity = -1; route.lstReverse[i+1].nRotate = 180; pNextItem->setData(180,Qt::UserRole+5); } } int deltaY = nYReverseIndex*nReversePolarity*g_nVDiagramSpacing; pNextItem->setData(QPoint(nReverseFirstDeltaX,deltaY),Qt::UserRole + 2); - continue; + nYReverseIndex += 1; } + else{ + if(compos.contains(route.lstReverse[i].sName) && compos.contains(route.lstReverse[i+1].sName)){ + auto &compo = compos[route.lstReverse[i].sName]; + auto &compoNext = compos[route.lstReverse[i+1].sName]; + int nVal = compo.nUsedDirection; + QPoint deltaP = compo.deltaPos; + nReverseFirstDeltaX = deltaP.x(); + int nNextVal = compoNext.nUsedDirection; - if(((nVal & 8) == 1) && ((nVal & 4) == 1)){ - qDebug()<setData(QString::number(nVal | 4)); - pNextItem->setData(QString::number(nNextVal | 8)); //同时连接下个点的一侧占用 - route.lstReverse[i+1].nRotate = 0; - pNextItem->setData(0,Qt::UserRole+5); - } - else if((nVal & 4) == 1){ - //下被占用,上空 - pItem->setData(QString::number(nVal | 8)); - pNextItem->setData(QString::number(nNextVal | 4)); - route.lstReverse[i+1].nRotate = 180; - pNextItem->setData(180,Qt::UserRole+5); - } - else{ //上下都没被占,默认放到下边 - pItem->setData(QString::number(nVal | 4)); - pNextItem->setData(QString::number(nNextVal | 8)); - if(nSubDir == 4){ - //nReversePolarity = 1; - route.lstReverse[i+1].nRotate = 0; - pNextItem->setData(0,Qt::UserRole+5); - } - else if(nSubDir == 8){ - //nReversePolarity = -1; - route.lstReverse[i+1].nRotate = 180; - pNextItem->setData(180,Qt::UserRole+5); + if(i == 0){ //首节点 + if(((nVal & 8) == 1) && ((nVal & 4) == 1)){ + qDebug()<setData(QPoint(nReverseFirstDeltaX,deltaY),Qt::UserRole + 2); - nYReverseIndex += 1; } } } } + + if(!saveToModel){ //保存到模型时由scene获取recBounding + + QList points; + for(auto &info:compos){ + if(info.nUsedDirection != 0){ //该元件被使用 + QPointF pDelta = info.deltaPos; //todo:考虑元件宽度 + points.append(pDelta); + } + } + + if(!points.empty()){ + qreal minX = points[0].x(); + qreal maxX = points[0].x(); + qreal minY = points[0].y(); + qreal maxY = points[0].y(); + + for (const QPointF& point : points) { + minX = qMin(minX, point.x()); + maxX = qMax(maxX, point.x()); + minY = qMin(minY, point.y()); + maxY = qMax(maxY, point.y()); + } + + recBounding = QRectF(QPointF(minX, minY), QPointF(maxX, maxY)); + } + } + return recBounding; } void DiagramEditorModel::bulidAndLinkComponent(QList lst,QMap components) @@ -1467,6 +2104,8 @@ void DiagramEditorModel::bulidAndLinkComponent(QList GraphicsBaseModelItem* p2 = _previewItem.value(info2.uid); auto pLineData = TopologyManager::instance().ifConnection(info1.uid.toString(),info2.uid.toString(),ModelFunctionType::EditorModel); //判断两个item是否有连接 if(pLineData != nullptr){ + if(_previewItem.contains(QUuid(pLineData->id()))) //已绘制 + continue; if(!_previewItem.contains(QUuid(pLineData->id()))){ //connectdata已存在,item未绘制 auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制 if(pLine) diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index 2bbde09..9c1527d 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -891,7 +891,7 @@ bool FixedPortsModel::addBaseItem(QUuid uuid,GraphicsBaseModelItem* pItem) } } -BaseModelProperty* FixedPortsModel::addBaseNodeData(QUuid id,int type,QString name,QString metaName) +BaseModelProperty* FixedPortsModel::addBaseNodeData(QUuid id,int type,QString name,QString metaName,QString bay) { BaseModelProperty* pData = BasePropertyManager::instance().findBaseEntityData(id); //已存在不不创建 if(pData != nullptr) @@ -906,6 +906,8 @@ BaseModelProperty* FixedPortsModel::addBaseNodeData(QUuid id,int type,QString na item->setType(type); item->setTag(name); item->setName(name); + if(!bay.isEmpty()) + item->setBay(bay); BasePropertyManager::instance().insertBaseEntityData(id,item); } return item; diff --git a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp index ceb51a1..97337c3 100644 --- a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp +++ b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp @@ -23,6 +23,20 @@ GraphicsBaseItem::GraphicsBaseItem(QGraphicsItem *parent) setAcceptHoverEvents(true); } +GraphicsBaseItem::GraphicsBaseItem(const GraphicsBaseItem& obj) + :AbstractShapeType(obj) + ,_property(nullptr) + ,_pEntity(nullptr) +{ + m_lastPoint = obj.m_lastPoint; + m_touched = obj.m_touched; + m_boundingRect_selected = obj.m_boundingRect_selected; + + for(auto& port:obj.m_mapPort){ + addPort(p_movable,port->pos(),port->getId(),port->getType(),port->portPos()); + } +} + GraphicsBaseItem::~GraphicsBaseItem() { foreach (int key, m_vecHanle.keys()) @@ -71,6 +85,14 @@ int GraphicsBaseItem::addPort(PortState typ,QPointF vec,QString id,HandleType hT return ntagId; } +void GraphicsBaseItem::movePort(QString id,QPointF vec) +{ + if(m_mapPort.contains(id)){ + auto pPort = m_mapPort.value(id); + pPort->setPos(vec); + } +} + void GraphicsBaseItem::setEntity(PowerEntity* pEntity) { _pEntity = pEntity; @@ -190,6 +212,13 @@ GraphicsBaseModelItem::GraphicsBaseModelItem(QGraphicsItem *parent) { } + +GraphicsBaseModelItem::GraphicsBaseModelItem(const GraphicsBaseModelItem& obj) + :GraphicsBaseItem(obj) +{ + +} + GraphicsBaseModelItem::~GraphicsBaseModelItem() { @@ -197,11 +226,13 @@ GraphicsBaseModelItem::~GraphicsBaseModelItem() void GraphicsBaseModelItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { - if(getProperty()->modelName().isEmpty()) - { - painter->setPen(QColor(255,0,0,80)); - painter->setBrush(QColor(255,0,0,80)); - painter->drawRoundedRect(m_boundingRect,10,10); + if(_stateMask){ + if(getProperty()->modelName().isEmpty()) + { + painter->setPen(QColor(255,0,0,80)); + painter->setBrush(QColor(255,0,0,80)); + painter->drawRoundedRect(m_boundingRect,10,10); + } } } diff --git a/diagramCavas/source/powerConnection.cpp b/diagramCavas/source/powerConnection.cpp index 4af0075..ab3c4d6 100644 --- a/diagramCavas/source/powerConnection.cpp +++ b/diagramCavas/source/powerConnection.cpp @@ -4,6 +4,13 @@ PowerConnection::PowerConnection(const QString& uuid,const QString& fromTerminal, const QString& toTerminal,const QString& fromId,const QString& toId, QObject* parent) : QObject(parent),m_uuid(uuid), m_fromTerminal(fromTerminal), m_toTerminal(toTerminal),m_fromComponent(fromId),m_toComponent(toId) {} + +PowerConnection* PowerConnection::clone() +{ + PowerConnection* newCon = new PowerConnection(m_uuid,m_fromTerminal,m_toTerminal,m_fromComponent,m_toComponent); + return newCon; +} + QJsonObject PowerConnection::toJson() const { QJsonObject obj; obj["id"] = m_uuid; diff --git a/diagramCavas/source/topologyManager.cpp b/diagramCavas/source/topologyManager.cpp index a03af97..b853dcf 100644 --- a/diagramCavas/source/topologyManager.cpp +++ b/diagramCavas/source/topologyManager.cpp @@ -281,6 +281,18 @@ void TopologyManager::clearGlobalBlockData(const QString& sName) } } +void TopologyManager::cloneEditorToBase() +{ + for(auto& editorEntity:m_editorEntities){ + editorEntity->clone(); + } + + for(auto& con:m_editorConnections){ + if(connection(con->id(),ModelFunctionType::BaseModel) == nullptr) + createConnection(con->id(),con->fromTerminalId(),con->toTerminalId(),con->fromComponent(),con->toComponent(),ModelFunctionType::BaseModel); + } +} + PowerConnection* TopologyManager::createConnection(const QString& connId,const QString& fromTerId, const QString& toTerId,const QString& fromId,const QString& toId,ModelFunctionType funType) { PowerConnection* conn = nullptr; diff --git a/diagramCavas/ui/confirmEditorDlg.ui b/diagramCavas/ui/confirmEditorDlg.ui new file mode 100644 index 0000000..dc7a834 --- /dev/null +++ b/diagramCavas/ui/confirmEditorDlg.ui @@ -0,0 +1,222 @@ + + + confirmEditorDlg + + + + 0 + 0 + 390 + 276 + + + + + Microsoft YaHei UI + 12 + false + false + + + + Dialog + + + background-color: rgb(255, 255, 255); +color: rgb(0, 0, 0); +font: 12pt "Microsoft YaHei UI"; + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 16777215 + 25 + + + + background-color: rgb(193, 193, 193); + + + + 0 + + + 0 + + + + + + Microsoft YaHei UI + 12 + false + false + + + + color: rgb(0, 0, 0); + + + 生成接线 + + + + + + + Qt::Orientation::Horizontal + + + + 323 + 20 + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 67 + + + + + + + + Qt::Orientation::Horizontal + + + + 106 + 20 + + + + + + + + 20 + + + + + 用户签名: + + + + + + + true + + + + + + + + 120 + 0 + + + + + + + + + + + 上次修改: + + + + + + + + + Qt::Orientation::Horizontal + + + + 105 + 20 + + + + + + + + + + Qt::Orientation::Horizontal + + + + 78 + 20 + + + + + + + + 确定 + + + + + + + 取消 + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 75 + + + + + + + + +