add diagram editor preview

This commit is contained in:
baiYue 2025-09-19 18:11:28 +08:00
parent 15b2be3fef
commit 6a6d407da7
17 changed files with 680 additions and 139 deletions

View File

@ -460,8 +460,10 @@ struct DiagramEditorComponentInfo //组态设备信息
int nCategory = 0; //分类 0电气设备1连接关系
QString sName;
int nType = 0; //类型 1母线2异步电动机3断路器4电缆5电流互感器6电压互感器7隔离开关8接地开关9快速接地开关10双掷接地隔离开关11带电指示器12避雷器13电缆出线套筒14电缆端
QString sBindObj; //所关联的实体名 (母线block,间隔block)
QString sBindObj; //所关联的实体名 (母线block,间隔block,变压器高中低端子)
int nBindType = 0; //关联实体的类型 1母线2间隔3变压器
int nBindPara = 0; //关联额外参数,关联变压器时为(0高1中2低)
QString sBindParent; //关联父item名关联变压器时为变压器名
QStringList sUsedRoute; //使用设备的线路名
int nUsedDirection = 0; //被占用的方向 8421 上下左右
QPoint deltaPos = QPoint(0,0); //相对坐标(相对间隔)
@ -478,6 +480,10 @@ struct DiagramEditorComponentInfo //组态设备信息
}
};
inline uint qHash(const DiagramEditorComponentInfo &key, uint seed = 0) {
return qHash(key.uid, seed);
}
struct DiagramEditorRouteInfo //间隔中单条线路信息
{
QString sRouteName;
@ -489,12 +495,27 @@ struct DiagramEditorRouteInfo //间隔中单条线路信息
struct DiagramEditorBayInfo //组态编辑间隔信息
{
QString name;
QString name; //间隔名
int nLayout; //布局 0纵向1横向
QMap<QString,DiagramEditorRouteInfo> mapRoute; //线路信息
QMap<QString,DiagramEditorComponentInfo> mapComponent; //设备信息
};
struct DiagramEditorTransNeutralInfo //组态编辑变压器中性点信息
{
QString name; //中性点名
int nType = 0; //中性点类型 0高1中2低
QPointF delPoint; //相对变压器偏移量
QMap<QString,DiagramEditorRouteInfo> mapRoute; //中性点对应的线路结构
};
struct DiagramEditorTransInfo //组态编辑变压器信息
{
QString name; //变压器名
QMap<int,DiagramEditorTransNeutralInfo> mapNeutral; //中性点结构
QMap<QString,DiagramEditorComponentInfo> mapComponent; //设备信息
};
enum class DiagramEditorStructType
{
block = 0, //模块(母线段、间隔、变压器)

View File

@ -27,12 +27,18 @@ public:
virtual DiagramEditorStructContainer* getCurContainer() {return _curContainer;}
virtual void setContainerLevel(int n) {nContainerLevel = n;}
virtual int getContainerLevel() {return nContainerLevel;}
virtual void setRecSize(QRectF rec) {recSize = rec;}
virtual QRectF getRecSize() {return recSize;}
virtual void setSeceneDelta(QPointF p){sceneDelta = p;}
virtual QPointF getSceneDelta() {return sceneDelta;}
protected:
QString sName;
int nType; //1母线,2间隔,3变压器
int nContainerLevel; //所处容器的层级 0,1,2,3
QUuid uid;
QList<QUuid> _lstCon; //连接信息
QRectF recSize; //当前大小(根据内容确定)
QPointF sceneDelta; //block中心相对位移(计算布局位置
DiagramEditorStructContainer* _curContainer; //当前所处的容器
};
@ -81,13 +87,10 @@ public:
virtual ~DiagramEditorTransformerBlock();
virtual void setTransType(TransformerType typ) {nTransType = typ;}
virtual TransformerType getTransType() {return nTransType;}
virtual void setRouteInfoMaps(QMap<int,QMap<QString,DiagramEditorRouteInfo>> info) {mapsRouteInfo = info;}
virtual QMap<int,QMap<QString,DiagramEditorRouteInfo>>& getRouteInfoMaps() {return mapsRouteInfo;}
virtual void setComponentMap(QMap<QString,DiagramEditorComponentInfo> info) {mapComponents = info;}
virtual QMap<QString,DiagramEditorComponentInfo>& getComponentMap() {return mapComponents;}
virtual void setTransInfo(DiagramEditorTransInfo info) {transInfo = info;}
virtual DiagramEditorTransInfo& getTranInfo() {return transInfo;}
protected:
TransformerType nTransType;
QMap<int,QMap<QString,DiagramEditorRouteInfo>> mapsRouteInfo; //变压器中性点线路信息 0高1中2低
QMap<QString,DiagramEditorComponentInfo> mapComponents; //变压器中性点设备信息
DiagramEditorTransInfo transInfo;
};
#endif

View File

@ -19,9 +19,34 @@ public:
auto& getBlockMap() {return _mapBlocks;}
void setId(const QString& s) {sId = s;}
QString getId() {return sId;}
void setMidUpY(double d){dMidUpY = d;}
double getMidUpY() {return dMidUpY;}
void setMidDownY(double d){dMidDownY = d;}
double getMidDownY() {return dMidDownY;}
void setWidth(double d){dWidth = d;}
double getWidth() {return dWidth;}
void setHeight(double d){dHeight = d;}
double getHeight() {return dHeight;}
void setStartX(double d){dStartX = d;}
double getStartX() {return dStartX;}
void setStartY(double d){dStartY = d;}
double getStartY() {return dStartY;}
void setMaxUpH(double d){dMaxUpH = d;}
double getMaxUpH() {return dMaxUpH;}
void setMaxDownH(double d){dMaxDownH = d;}
double getMaxDownH() {return dMaxDownH;}
private:
QString sId;
QMap<int,QList<DiagramEditorBaseBlock*>> _mapBlocks; //容器中包含的对象列表,<pos,listBlocks> pos当前容器中的位置:0上,1中上,2中下3下
double dMidUpY; //1母上边界
double dMidDownY; //2母下边界
double dStartX; //起始x
double dStartY; //起始y
double dWidth; //宽度
double dHeight;
double dMaxUpH; //上方最大高度(1母线到上边界)
double dMaxDownH; //下方最大高度(2母线到下边界)
};
#endif

View File

@ -21,6 +21,8 @@ public:
void showDlg(int n);
void showDlg(DiagramEditorRouteInfo info); //编辑
void setParent(DiagramEditorTransDetailSettingDlg* p) {_pParent = p;}
private:
void updateBindLst(); //刷新关联列表
public slots:
void onAddClicked();
void onDeleteClicked();
@ -39,6 +41,7 @@ private:
DiagramEditorTransDetailSettingDlg* _pParent;
int _curMode; //0新建1修改
int _curType; //当前回路类型 0高压中性点1中2低
QStandardItemModel* _bindItemModel; //绑定的对象模型
};
#endif

View File

@ -25,13 +25,17 @@ public:
void initial();
void refreshModel(); //刷新view显示的model
void showDlg(DiagramEditorTransformerBlock*);
void setParent(DiagramEditorWizard* p) {_pWizard = p;}
void setWizard(DiagramEditorWizard* p) {_pWizard = p;}
QStandardItemModel* getComponentModel() {return _compoModel;}
QMap<int,QStandardItemModel*> getRouteModels() {return _routeModels;}
void setRouteMaps(QMap<int,QMap<QString,DiagramEditorRouteInfo>> map) {_mapsRouteInfo = map;}
QMap<int,QMap<QString,DiagramEditorRouteInfo>>& getRouteMaps(){return _mapsRouteInfo;}
//void setRouteMaps(QMap<int,QMap<QString,DiagramEditorRouteInfo>> map) {_mapsRouteInfo = map;}
//QMap<int,QMap<QString,DiagramEditorRouteInfo>>& getRouteMaps(){return _mapsRouteInfo;}
void setTransInfo(DiagramEditorTransInfo info){_transInfo = info;}
DiagramEditorTransInfo& getTransInfo(){return _transInfo;}
void setModelDelegate(DiagramEditorModel* p){_pModel = p;}
DiagramEditorModel* getModel() {return _pModel;}
DiagramEditorTransformerBlock* getCurBlock(){return _curOperateObj;}
DiagramEditorWizard* getWizard() {return _pWizard;}
public slots:
void onAddClicked();
void onOkClicked();
@ -50,7 +54,8 @@ private:
DiagramEditorTransformerBlock* _curOperateObj; //当前加载的block对象
QStandardItemModel* _compoModel; //设备库model name中的data:1为占用方向,2为相对坐标,3为uuid,4为item标志位(1新建2修改)5旋转角度
QMap<int,QStandardItemModel*> _routeModels; //中性点拓扑,0,1,2高中低
QMap<int,QMap<QString,DiagramEditorRouteInfo>> _mapsRouteInfo; //侧中性点线路信息
//QMap<int,QMap<QString,DiagramEditorRouteInfo>> _mapsRouteInfo; //中性点线路信息 int:0高1中2低
DiagramEditorTransInfo _transInfo; //变压器信息
DiagramEditorModel* _pModel;
QTableView* _curOperateRouteView; //当前操作的中性点拓扑view
};

View File

@ -20,7 +20,7 @@ class BaseModel : public QObject
public:
void createTopoTerminalsByItem(GraphicsBaseItem*,ModelFunctionType funType = ModelFunctionType::ProjectModel); //通过图形对象创建port接线点(新建)
QPointF calculateBusPortPos(GraphicsBaseItem* pBus,GraphicsBaseItem* item); //计算母线上接线点位置
template<typename TypeLine> void establishConnection(GraphicsBaseItem*,GraphicsBaseItem*,TypeLine*,ModelFunctionType,int nMode=0,int nParam = 0); //在两个item之间建立连接 nMode:0正常1变压器中性点 nParam附加参数:中性点中表示需连接的位置(012高中低)
template<typename TypeLine> void establishConnection(GraphicsBaseItem*,GraphicsBaseItem*,TypeLine*,ModelFunctionType,int nMode=0,int nParam = 0); //在两个item之间建立连接 nMode:0正常1变压器中性点2变压器 nParam附加参数:中性点中表示需连接的位置(012高中低)
double distanceBetweenItems(QGraphicsItem* item1, QGraphicsItem* item2) {
QPointF center1 = item1->mapToScene(item1->boundingRect().center());
QPointF center2 = item2->mapToScene(item2->boundingRect().center());

View File

@ -12,6 +12,8 @@ class DiagramEditorTransformerBlock;
class EditPanel;
class DiagramEditorWizard;
int const g_nHorizontalBlockSpacing = 100; //间隔横向间距
class DiagramEditorModel : public BaseModel
{
Q_OBJECT
@ -22,7 +24,7 @@ public:
bool addPreviewItem(QUuid uuid,GraphicsBaseModelItem*,int mode); //mode 0局部1整体
DiagramEditorItemProperty* addPreviewData(QUuid id,int type,QString name,QString metaName,QString sBlock,int mode = 0); //添加图元基模数据 mode:0局部1整体
void createTopoTerminalsByItem(GraphicsBaseItem*,ModelFunctionType funType = ModelFunctionType::ProjectModel); //通过图形对象创建port接线点(新建)
void generateTempBay(); //通过设置生成间隔预览对象
QRectF generateTempBay(); //通过设置生成间隔预览对象
void generateTempTrans(int nType,DiagramEditorTransformerBlock* block = nullptr); //0高压侧1中压侧2低压侧3整个变压器
void connectTransToNeutral(DiagramEditorTransformerBlock* block); //连接变压器与中性点设备
void linkTransItem(GraphicsBaseModelItem*,QStandardItemModel*); //连接中性点与设备点
@ -32,6 +34,8 @@ public:
void setPanel(EditPanel* p) {_pPanel = p;}
void setWizard(QPointer<DiagramEditorWizard> p){_pWizard = p;}
void generatePreview(); //生成预览
void calculateBlockPos(); //重新计算block位置
void setItemInBlockPos(); //设置block中的item位置
void setCurBayRouteModel(QStandardItemModel* p) {_pCurBayRoute = p;}
QStandardItemModel* getCurBayRouteModel() {return _pCurBayRoute;}
@ -46,11 +50,13 @@ public:
QStandardItem* getNameItem(const QString&,int nFrom = 0); //获取返回当前设备模型中的name项 nFrom,0间隔1变压器
void generateItemByModel(QStandardItemModel* pModel,int nFrom = 0,QPoint delta = QPoint(0,0)); //0间隔1变压器
void generateItemByInfo(QMap<QString,DiagramEditorRouteInfo> mapRoute,QMap<QString,DiagramEditorComponentInfo> mapCompo,QPointF delta = QPointF(0,0)); //根据data生成item
QList<DiagramEditorComponentInfo> generateItemByInfo(QMap<QString,DiagramEditorRouteInfo> mapRoute,QMap<QString,DiagramEditorComponentInfo> mapCompo,QPointF delta = QPointF(0,0)); //根据data生成item
void generateOutConnection(QList<DiagramEditorComponentInfo>,int nTypeTransCon,int nPos = 0); //生成外部连接手动bind的连接 nTypeTransCon变压器连线类型,1中性点连接2外部连接,nPos中性点连接时的位置
void updateTarget(QMap<QString,DiagramEditorRouteInfo>&,int nLayout,int nSource); //更新位置 nLayout主次朝向:8421,8421 上下左右,上下左右 nSource:0间隔1变压器
private:
void bulidAndLinkComponent(QList<DiagramEditorComponentInfo>); //生成并连接线路上的设备
void bulidAndLinkComponent(QList<DiagramEditorComponentInfo>,QMap<QString,DiagramEditorComponentInfo>); //生成并连接线路上的设备 lstmapComponents(从map中获取正确数据)
//DiagramEditorComponentInfo getCompoDataFromName(const QString&,QMap<QString,DiagramEditorComponentInfo>); //根据名称获取数据
QList<DiagramEditorComponentInfo> getRouteItemInfoList(QMap<QString,DiagramEditorComponentInfo>,QMap<QString,DiagramEditorRouteInfo>); //返回线路中包含的设备信息列表
private:
QMap<QUuid,GraphicsBaseModelItem*> _tempItem; //临时预览对象
QMap<QUuid,GraphicsBaseModelItem*> _previewItem; //预览对象

View File

@ -72,14 +72,15 @@ void DiagramEditorBayDetailAddDlg::initial()
ui->cb_lineType->setItemData(0,1); //设置主线支线
ui->cb_lineType->setItemData(1,0);
//_bindItemModel = new QStandardItemModel(this);
//ui->cb_bindObj->setModel(_bindItemModel);
_bindItemModel = new QStandardItemModel(this);
ui->cb_bindObj->setModel(_bindItemModel);
}
void DiagramEditorBayDetailAddDlg::updateBindLst()
{
ui->cb_bindObj->clear();
ui->cb_bindObj->addItem("");
_bindItemModel->clear();
QStandardItem* it = new QStandardItem("");
_bindItemModel->appendRow(it);
DiagramEditorBayBlock* pBlock = _pParent->getCurBlock();
if(pBlock){
QList<QUuid> lstCon = pBlock->getConnect();
@ -91,41 +92,35 @@ void DiagramEditorBayDetailAddDlg::updateBindLst()
auto con = mapCon.value(uid);
DiagramEditorConnectType conOp = con.getOpposite(pBlock->getName());
if(conOp.nType == 1){ //母线单block单item
ui->cb_bindObj->addItem(conOp.sName,conOp.nType);
//ui->cb_bindObj->addItem(conOp.sName,conOp.nType);
QStandardItem* item = new QStandardItem(conOp.sName);
item->setData(conOp.nType, Qt::UserRole+1); // 设置用户数据
_bindItemModel->appendRow(item);
}
else if(conOp.nType == 3){ //变压器,选择对应进/出线口
QStandardItem* item = nullptr;
if(con.nPara == 0){
item = new QStandardItem("高压接线端子");
}
else if(con.nPara == 1){
item = new QStandardItem("中压接线端子");
}
else if(con.nPara == 2){
item = new QStandardItem("低压接线端子");
}
if(item){
item->setData(conOp.nType, Qt::UserRole+1);
item->setData(con.nPara, Qt::UserRole+2);
item->setData(conOp.sName, Qt::UserRole+3);
_bindItemModel->appendRow(item);
}
}
}
}
}
}
ui->cb_bindObj->setCurrentIndex(0);
//_bindItemModel->clear();
/** pBlock = _pParent->getCurBlock();
if(pBlock){
QList<QUuid> lstCon = pBlock->getConnect();
DiagramEditorWizard* pWizard = _pParent->getWizard();
if(pWizard){
QMap<QUuid,DiagramEditorBriefConnect> mapCon = pWizard->getConnection();
for(auto& uid:lstCon){
if(mapCon.contains(uid)){
auto con = mapCon.value(uid);
DiagramEditorConnectType conOp = con.getOpposite(pBlock->getName());
auto container = pWizard->getContainerByBlock_all(conOp.sName);
if(conOp.nType == 1){
//ui->cb_bindObj->addItem(conOp.sName,conOp.nType);
auto pItem = new QStandardItem(conOp.sName);
pItem->setData(conOp.nType,Qt::UserRole);
pItem->setData(container->getId(),Qt::UserRole+1);
}
}
}
}
}
ui->cb_bindObj->setCurrentIndex(0);*/
}
void DiagramEditorBayDetailAddDlg::showDlg()
@ -323,7 +318,9 @@ void DiagramEditorBayDetailAddDlg::onSaveClicked()
QString sType = ui->cb_type->currentText();
int nType = ui->cb_type->currentData().toInt();
QString sBindObj = ui->cb_bindObj->currentText();
int nBindType = ui->cb_bindObj->currentData().toInt();
int nBindType = ui->cb_bindObj->currentData(Qt::UserRole+1).toInt();
int nBindPara = ui->cb_bindObj->currentData(Qt::UserRole+2).toInt();
QString sBindParent = ui->cb_bindObj->currentData(Qt::UserRole+3).toString();
if(_pParent){
auto pCompoModel = _pParent->getComponentModel();
@ -377,7 +374,9 @@ void DiagramEditorBayDetailAddDlg::onSaveClicked()
itemType->setText(sType);
itemType->setData(nType);
itemObj->setText(sBindObj);
itemObj->setData(nBindType);
itemObj->setData(nBindType,Qt::UserRole+1);
itemObj->setData(nBindPara,Qt::UserRole+2);
itemObj->setData(sBindParent,Qt::UserRole+3);
QList<QStandardItem*> lstItems;
lstItems<<itemCate<<itemName<<itemType<<itemObj<<itemRoute;
@ -406,7 +405,9 @@ void DiagramEditorBayDetailAddDlg::onOkClicked()
QString sName = itemName->text();
QString sType = itemType->text();
QString sBind = itemBind->text();
int nBindType = itemBind->data().toInt();
int nBindType = itemBind->data(Qt::UserRole + 1).toInt();
int nBindPara = itemBind->data(Qt::UserRole + 2).toInt();
QString sBindParent = itemBind->data(Qt::UserRole + 3).toString();
QString sAllRoute = itemAllRoute->text();
QUuid uid = itemName->data(Qt::UserRole+3).toUuid();
@ -424,6 +425,8 @@ void DiagramEditorBayDetailAddDlg::onOkClicked()
compoInfo.nType = nType;
compoInfo.sBindObj = sBind;
compoInfo.nBindType = nBindType;
compoInfo.nBindPara = nBindPara;
compoInfo.sBindParent = sBindParent;
compoInfo.uid = uid;
compoInfo.sUsedRoute = sAllRoute.split(",");

View File

@ -220,6 +220,8 @@ void DiagramEditorBayDetailSettingDlg::onOkClicked()
compoInfo.nType = itemType->data().toInt();
compoInfo.sBindObj = itemBind->text();
compoInfo.nBindType = itemBind->data().toInt();
compoInfo.nBindPara = itemBind->data(Qt::UserRole+2).toInt();
compoInfo.sBindParent = itemBind->data(Qt::UserRole+3).toString();
compoInfo.sUsedRoute = itemRoute->text().split(",");
compoInfo.nUsedDirection = nDir;
compoInfo.deltaPos = deltaPos;
@ -341,7 +343,10 @@ void DiagramEditorBayDetailSettingDlg::onPreviewClicked()
}
if(!_pPreviewDlg->isVisible()){
_pPreviewDlg->showDlg(nLayout);
_pModel->generateTempBay();
QRectF recContainAll = _pModel->generateTempBay();
if(_curOperateObj){
_curOperateObj->setRecSize(recContainAll);
}
}
else
_pPreviewDlg->hide();

View File

@ -3,12 +3,15 @@
#include "diagramEditor/diagramEditorTransDetailAddDlg.h"
#include "diagramEditor/diagramEditorTransDetailSettingDlg.h"
#include "ui_diagramEditorTransDetailAddDlg.h"
#include "diagramEditor/diagramEditorBaseBlock.h"
#include "diagramEditor/diagramEditorWizard.h"
DiagramEditorTransDetailAddDlg::DiagramEditorTransDetailAddDlg(QWidget *parent)
: QDialog(parent)
, ui(new Ui::diagramEditorTransDetailAddDlg)
,_selectedModel(nullptr)
,_pParent(nullptr)
,_bindItemModel(nullptr)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
@ -65,6 +68,9 @@ void DiagramEditorTransDetailAddDlg::initial()
ui->tableView_selected->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView_selected->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableView_selected->verticalHeader()->setVisible(false);
_bindItemModel = new QStandardItemModel(this);
ui->cb_bindObj->setModel(_bindItemModel);
}
void DiagramEditorTransDetailAddDlg::showDlg(int nType)
@ -72,6 +78,7 @@ void DiagramEditorTransDetailAddDlg::showDlg(int nType)
if(_pParent){
_selectedModel->clear();
_selectedModel->setHorizontalHeaderLabels({"分类", "名称", "类型", "关联对象", "引用线路"});
updateBindLst();
show();
auto pCompo = _pParent->getComponentModel();
auto pRoute = _pParent->getRouteModels().value(nType);
@ -156,12 +163,14 @@ void DiagramEditorTransDetailAddDlg::showDlg(DiagramEditorRouteInfo info)
itemName->setText(component.sName);
itemType->setText(sType);
itemObj->setText(component.sBindObj);
itemObj->setData(component.nBindType);
itemRoute->setText(component.sUsedRoute.join(","));
QList<QStandardItem*> lstItems;
lstItems<<itemCate<<itemName<<itemType<<itemObj<<itemRoute;
_selectedModel->appendRow(lstItems);
}
updateBindLst();
show();
ui->label->setText("编辑线路");
ui->le_routeName->setReadOnly(false);
@ -169,6 +178,83 @@ void DiagramEditorTransDetailAddDlg::showDlg(DiagramEditorRouteInfo info)
}
}
void DiagramEditorTransDetailAddDlg::updateBindLst()
{
_bindItemModel->clear();
QStandardItem* it = new QStandardItem("");
_bindItemModel->appendRow(it);
DiagramEditorTransformerBlock* pBlock = _pParent->getCurBlock();
if(pBlock){
TransformerType typ = pBlock->getTransType();
if(typ == TransformerType::twoWinding){
QStandardItem* itemH = new QStandardItem("高压绕组中性点");
QStandardItem* itemL = new QStandardItem("低压绕组中性点");
itemH->setData(3, Qt::UserRole+1);
itemH->setData(0, Qt::UserRole+2);
itemH->setData(pBlock->getName(), Qt::UserRole+3);
_bindItemModel->appendRow(itemH);
itemL->setData(3, Qt::UserRole+1);
itemL->setData(2, Qt::UserRole+2);
itemL->setData(pBlock->getName(), Qt::UserRole+3);
_bindItemModel->appendRow(itemL);
}
else{ //三绕组
QStandardItem* itemH = new QStandardItem("高压绕组中性点");
QStandardItem* itemM = new QStandardItem("中压绕组中性点");
QStandardItem* itemL = new QStandardItem("低压绕组中性点");
itemH->setData(3, Qt::UserRole+1);
itemH->setData(0, Qt::UserRole+2);
itemH->setData(pBlock->getName(), Qt::UserRole+3);
_bindItemModel->appendRow(itemH);
itemM->setData(3, Qt::UserRole+1);
itemM->setData(1, Qt::UserRole+2);
itemM->setData(pBlock->getName(), Qt::UserRole+3);
_bindItemModel->appendRow(itemM);
itemL->setData(3, Qt::UserRole+1);
itemL->setData(2, Qt::UserRole+2);
itemL->setData(pBlock->getName(), Qt::UserRole+3);
_bindItemModel->appendRow(itemL);
}
QList<QUuid> lstCon = pBlock->getConnect();
DiagramEditorWizard* pWizard = _pParent->getWizard();
if(pWizard){
QMap<QUuid,DiagramEditorBriefConnect> mapCon = pWizard->getConnection();
for(auto& uid:lstCon){
if(mapCon.contains(uid)){
auto con = mapCon.value(uid);
DiagramEditorConnectType conOp = con.getOpposite(pBlock->getName());
if(conOp.nType == 3){ //变压器,选择对应进/出线口
QStandardItem* item = nullptr;
if(con.nPara == 0){
item = new QStandardItem("高压绕组中性点");
}
else if(con.nPara == 1){
item = new QStandardItem("中压绕组中性点");
}
else if(con.nPara == 2){
item = new QStandardItem("低压绕组中性点");
}
if(item){
item->setData(conOp.nType, Qt::UserRole+1);
item->setData(con.nPara, Qt::UserRole+2);
item->setData(conOp.sName, Qt::UserRole+3);
_bindItemModel->appendRow(item);
}
}
}
}
}
}
ui->cb_bindObj->setCurrentIndex(0);
}
void DiagramEditorTransDetailAddDlg::onAddClicked()
{
// 获取当前选中的索引
@ -236,6 +322,8 @@ void DiagramEditorTransDetailAddDlg::onSaveClicked()
QString sType = ui->cb_type->currentText();
int nType = ui->cb_type->currentData().toInt();
QString sBindObj = ui->cb_bindObj->currentText();
int nBindType = ui->cb_bindObj->currentData(Qt::UserRole+1).toInt();
QString sBindParent = ui->cb_bindObj->currentData(Qt::UserRole+3).toString();
if(_pParent){
auto pCompoModel = _pParent->getComponentModel();
@ -289,6 +377,8 @@ void DiagramEditorTransDetailAddDlg::onSaveClicked()
itemType->setText(sType);
itemType->setData(nType);
itemObj->setText(sBindObj);
itemObj->setData(nBindType);
itemObj->setData(sBindParent,Qt::UserRole+3);
QList<QStandardItem*> lstItems;
lstItems<<itemCate<<itemName<<itemType<<itemObj<<itemRoute;
@ -299,7 +389,7 @@ void DiagramEditorTransDetailAddDlg::onSaveClicked()
void DiagramEditorTransDetailAddDlg::onOkClicked()
{
QString sRoute = ui->le_routeName->text();
auto& mapRoute = _pParent->getRouteMaps()[_curType];
auto& mapRoute = _pParent->getTransInfo().mapNeutral[_curType].mapRoute;
QStringList lstName; //线路的设备列表
DiagramEditorRouteInfo routeInfo;
routeInfo.sRouteName = sRoute;
@ -317,6 +407,8 @@ void DiagramEditorTransDetailAddDlg::onOkClicked()
QString sName = itemName->text();
QString sType = itemType->text();
QString sBind = itemBind->text();
int nBindType = itemBind->data().toInt();
QString sBindParent = itemBind->data(Qt::UserRole+3).toString();
QString sAllRoute = itemAllRoute->text();
int nCate = 0;
@ -332,6 +424,8 @@ void DiagramEditorTransDetailAddDlg::onOkClicked()
compoInfo.sName = sName;
compoInfo.nType = nType;
compoInfo.sBindObj = sBind;
compoInfo.nBindType = nBindType;
compoInfo.sBindParent = sBindParent;
compoInfo.sUsedRoute = sAllRoute.split(",");
routeInfo.lstCompo.append(compoInfo);
@ -429,7 +523,7 @@ void DiagramEditorTransDetailAddDlg::onComponentDeleteClicked()
QString sName = indexName.data().toString();
bool bUsed = false;
auto& mapRoute = _pParent->getRouteMaps()[_curType]; //检索所有路线,判断设备占用情况
auto& mapRoute = _pParent->getTransInfo().mapNeutral[_curType].mapRoute; //检索所有路线,判断设备占用情况
for(auto& route:mapRoute){
QString sRoute = route.sRouteName;
for(auto& compo:route.lstCompo){

View File

@ -84,8 +84,9 @@ void DiagramEditorTransDetailSettingDlg::refreshModel()
_compoModel->clear();
_compoModel->setColumnCount(5);
_compoModel->setHorizontalHeaderLabels({"分类", "名称", "类型", "关联对象", "引用线路"});
auto mapComponent = _curOperateObj->getComponentMap();
for(auto& comp:mapComponent){
auto transInfo = _curOperateObj->getTranInfo();
for(auto& comp:transInfo.mapComponent){
DiagramEditorComponentInfo info = comp;
QStandardItem *itemCate = new QStandardItem();
QStandardItem *itemName = new QStandardItem();
@ -173,10 +174,9 @@ void DiagramEditorTransDetailSettingDlg::refreshModel()
pModel->setHorizontalHeaderLabels({"线路名", "包含设备"});
}
auto mapRoutes = _curOperateObj->getRouteInfoMaps();
setRouteMaps(mapRoutes); //更新路径数据到本界面
for(auto it = mapRoutes.begin();it != mapRoutes.end();++it){
for(auto& route:it.value()){
setTransInfo(transInfo); //更新路径数据到本界面
for(auto it = transInfo.mapNeutral.begin();it != transInfo.mapNeutral.end();++it){
for(auto& route:it.value().mapRoute){
QString sRoute = route.sRouteName;
QStringList lstComp;
for(auto& comp:route.lstCompo){
@ -220,7 +220,7 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked()
{
//将ui设置的参数更新到对应block
if(_curOperateObj){
_curOperateObj->setRouteInfoMaps(_mapsRouteInfo);
//_curOperateObj->setRouteInfoMaps(_mapsRouteInfo);
QMap<QString,DiagramEditorComponentInfo> mapComponents;
int nRowCount = _compoModel->rowCount();
@ -235,6 +235,7 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked()
QUuid uid = itemName->data(Qt::UserRole+3).toUuid(); //uid
int nVal = itemName->data(Qt::UserRole+4).toInt(); //标志
int nRotate = itemName->data(Qt::UserRole+5).toInt(); //旋转角度
int nBindType = itemBind->data(Qt::UserRole+1).toInt();
DiagramEditorComponentInfo compoInfo;
if(itemCate->text() == "电气设备"){
@ -246,6 +247,9 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked()
compoInfo.sName = itemName->text();
compoInfo.nType = itemType->data().toInt();
compoInfo.sBindObj = itemBind->text();
compoInfo.nBindType = nBindType;
compoInfo.nBindPara = itemBind->data(Qt::UserRole+2).toInt();
compoInfo.sBindParent = itemBind->data(Qt::UserRole+3).toString();
compoInfo.sUsedRoute = itemRoute->text().split(",");
compoInfo.nUsedDirection = nDir;
compoInfo.deltaPos = deltaPos;
@ -255,7 +259,21 @@ void DiagramEditorTransDetailSettingDlg::onOkClicked()
mapComponents.insert(compoInfo.sName,compoInfo);
}
_curOperateObj->setComponentMap(mapComponents);
//_curOperateObj->setComponentMap(mapComponents);
_transInfo.mapComponent = mapComponents;
if(_transInfo.mapNeutral.contains(0)){
_transInfo.mapNeutral[0].nType = 0;
_transInfo.mapNeutral[0].delPoint = QPointF(100,-100);
}
if(_transInfo.mapNeutral.contains(1)){
_transInfo.mapNeutral[1].nType = 1;
_transInfo.mapNeutral[1].delPoint = QPointF(-100,-50);
}
if(_transInfo.mapNeutral.contains(2)){
_transInfo.mapNeutral[2].nType = 2;
_transInfo.mapNeutral[2].delPoint = QPointF(100,0);
}
_curOperateObj->setTransInfo(_transInfo);
TopologyManager::instance().clearGlobalBlockData(_curOperateObj->getName());
TopologyManager::instance().moveTempBlockData();
_curOperateObj = nullptr;
@ -305,7 +323,8 @@ void DiagramEditorTransDetailSettingDlg::onRouteDeleteClicked()
_routeModels.value(n)->removeRow(row);
}
_mapsRouteInfo.value(n).remove(sName); //同步移除数据
//_mapsRouteInfo.value(n).remove(sName); //同步移除数据
_transInfo.mapNeutral.value(n).mapRoute.remove(sName); //同步移除数据
}
void DiagramEditorTransDetailSettingDlg::onRouteRbtnClicked(const QPoint &pos)
@ -363,7 +382,8 @@ void DiagramEditorTransDetailSettingDlg::onRouteEditClicked()
QString sName = indexName.data().toString();
int n = ui->tabWidget->currentIndex();
auto routeInfo = _mapsRouteInfo.value(n).value(sName);
//auto routeInfo = _mapsRouteInfo.value(n).value(sName);
auto routeInfo = _transInfo.mapNeutral.value(n).mapRoute.value(sName);
_pAddDlg->showDlg(routeInfo);
}

View File

@ -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->getRouteMaps()[nType],14,1); //1右2下
_pParent->getModel()->updateTarget(_pParent->getTransInfo().mapNeutral[nType].mapRoute,14,1); //1右2下
}
else if(nType == 3){ //整个变压器
_pParent->getModel()->updateTarget(_pParent->getRouteMaps()[0],18,1); //1右2上
_pParent->getModel()->updateTarget(_pParent->getRouteMaps()[1],14,1); //1右2下
_pParent->getModel()->updateTarget(_pParent->getRouteMaps()[2],24,1); //1左2下
_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下
}
}

View File

@ -581,9 +581,13 @@ void DiagramEditorWizard::onAddTransFinished(DiagramEditorWizardTransformerInfo
for(auto& obj:info.lstBindObj){
QUuid uid = addConnection(pTrans->getName(),obj.sName,3,2,obj.nPara);
pTrans->addConnect(uid);
auto pBlock = getBlockByName_all(obj.sName); //连接的双方都保存连接(todo:修改时删除对面保存的连接)
if(pBlock){
pBlock->addConnect(uid);
}
}
pContainer->insertBlock(1,pTrans);
pContainer->insertBlock(1,pTrans); //***变压器添加到了1层***
int nIndex =_mapSturctContainer.value(g_transformerLevel).size();
_mapSturctContainer[g_transformerLevel].insert(nIndex,pContainer);

View File

@ -431,6 +431,7 @@ void EditPanel::onItemDbClicked(QPointer<DiagramEditorBaseBlock> pBlock)
if(_transDetailSetting == nullptr){
_transDetailSetting = new DiagramEditorTransDetailSettingDlg(this);
_transDetailSetting->setModelDelegate(_pModel);
_transDetailSetting->setWizard(_curWizard);
}
auto pTrans = dynamic_cast<DiagramEditorTransformerBlock*>(pBlock.data());
if(pTrans)

View File

@ -106,16 +106,6 @@ template<typename TypeLine> void BaseModel::establishConnection(GraphicsBaseItem
QMap<QString,ItemPort*> mapPorts = pDest->getPorts();
if(nMode == 0){
/*double minDis = 999;
for(auto& port:mapPorts) //与母线或节点连接时,连接最近接线点
{
double dis = distanceBetweenItems(port,pSrc);
if(dis < minDis){
minDis = dis;
pDestPort = port;
}
}*/
pDestPort = getClosestUnusedPort(mapPorts,pSrc,nType);
}
else if(nMode == 1){
@ -142,6 +132,30 @@ template<typename TypeLine> void BaseModel::establishConnection(GraphicsBaseItem
}
}
}
else if(nMode == 2){
for(auto& port:mapPorts) //连接非中性点
{
int nTpe = port->getType();
int nPos = port->portPos();
if(nTpe != T_newTral){
if(nParam == 0){
if(nPos == P_top){
pDestPort = port;
}
}
else if(nParam == 1){
if(nPos == P_left || nPos == P_right){
pDestPort = port;
}
}
else if(nParam == 2){
if(nPos == P_down){
pDestPort = port;
}
}
}
}
}
}
else if((nTypeDest == 1 || nTypeDest == 0) && (nTypeSrc != 1 && nTypeSrc != 0))
{
@ -156,16 +170,6 @@ template<typename TypeLine> void BaseModel::establishConnection(GraphicsBaseItem
QMap<QString,ItemPort*> mapPorts = pSrc->getPorts();
if(nMode == 0){
/*double minDis = 999;
for(auto& port:mapPorts) //与母线或节点连接时,连接最近接线点
{
double dis = distanceBetweenItems(port,pDest);
if(dis < minDis){
minDis = dis;
pSrcPort = port;
}
}*/
pSrcPort = getClosestUnusedPort(mapPorts,pDest,nType);
}
else if(nMode == 1){
@ -192,7 +196,30 @@ template<typename TypeLine> void BaseModel::establishConnection(GraphicsBaseItem
}
}
}
else if(nMode == 2){
for(auto& port:mapPorts) //连接非中性点
{
int nTpe = port->getType();
int nPos = port->portPos();
if(nTpe != T_newTral){
if(nParam == 0){
if(nPos == P_top){
pSrcPort = port;
}
}
else if(nParam == 1){
if(nPos == P_left || nPos == P_right){
pSrcPort = port;
}
}
else if(nParam == 2){
if(nPos == P_down){
pSrcPort = port;
}
}
}
}
}
}
else if((nTypeSrc == 1 || nTypeSrc == 0) && (nTypeDest == 1 || nTypeDest == 0)){ //两个都是母线或节点
int index = 0;

View File

@ -15,6 +15,8 @@
#include "diagramEditor/diagramEditorBaseBlock.h"
#include "diagramEditor/editItems.h"
#include "diagramEditor/editPanel.h"
#include "diagramEditor/diagramEditorWizard.h"
#include "diagramEditor/diagramEditorStructContainer.h"
DiagramEditorModel::DiagramEditorModel()
:_pCurBayRoute(nullptr)
@ -120,9 +122,14 @@ void DiagramEditorModel::createTopoTerminalsByItem(GraphicsBaseItem* pItem,Model
}
}
void DiagramEditorModel::generateTempBay()
QRectF DiagramEditorModel::generateTempBay()
{
QRectF itemsRect;
generateItemByModel(_pCurBayRoute);
if(_pCurPreviewScene)
itemsRect = _pCurPreviewScene->itemsBoundingRect();
return itemsRect;
}
GraphicsBaseModelItem* DiagramEditorModel::generateComponent(QUuid uid,QString sName,int nCategory,int nType,QPointF pos,int nRotate,int mode)
@ -285,18 +292,29 @@ void DiagramEditorModel::generateTempTrans(int nType,DiagramEditorTransformerBlo
}
else if(nType == 3){
TransformerType typ = block->getTransType();
auto pInfo = block->getTranInfo();
int nT = 0;
if(typ == TransformerType::twoWinding){
generateItemByModel(_pCurTransLRoutes.value(0),1,QPoint(100,-25));
generateItemByModel(_pCurTransLRoutes.value(2),1,QPoint(100,25));
pInfo.mapNeutral[0].delPoint = QPoint(100,-25);
pInfo.mapNeutral[2].delPoint = QPoint(100,25);
}
else if(typ == TransformerType::threeWinding){
generateItemByModel(_pCurTransLRoutes.value(0),1,QPoint(100,-25));
generateItemByModel(_pCurTransLRoutes.value(1),1,QPoint(-150,0));
generateItemByModel(_pCurTransLRoutes.value(2),1,QPoint(100,25));
pInfo.mapNeutral[0].delPoint = QPoint(100,-25);
pInfo.mapNeutral[1].delPoint = QPoint(-150,0);
pInfo.mapNeutral[2].delPoint = QPoint(100,25);
}
connectTransToNeutral(block);
if(_pCurPreviewScene){
QRectF itemsRect = _pCurPreviewScene->itemsBoundingRect();
block->setRecSize(itemsRect);
}
}
}
@ -313,9 +331,10 @@ void DiagramEditorModel::connectTransToNeutral(DiagramEditorTransformerBlock* bl
else if(typ == TransformerType::threeWinding){
nT = 16;
}
generateComponent(uid,sName,0,nT,QPoint(0,0),0,1);
generateComponent(uid,sName,0,nT,QPoint(0,0),0,0);
auto pTransItem = _tempItem.value(uid);
if(pTransItem){
if(typ == TransformerType::twoWinding){
linkTransItem(pTransItem,_pCurTransLRoutes.value(0));
linkTransItem(pTransItem,_pCurTransLRoutes.value(2));
@ -327,6 +346,7 @@ void DiagramEditorModel::connectTransToNeutral(DiagramEditorTransformerBlock* bl
}
}
}
}
void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardItemModel* pModel)
{
@ -356,7 +376,7 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt
auto pLineData = TopologyManager::instance().ifConnection(uid1.toString(),uid2.toString()); //判断两个item是否有连接
if(pLineData != nullptr){
if(!_tempItem.contains(QUuid(pLineData->id()))){ //connectdata已存在item未绘制
auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制
auto pLine = generateLine(QUuid(pLineData->id()),"",0); //重新绘制
if(pLine)
establishConnection(pItem,pTrans,pLine,ModelFunctionType::BlockEditorModel,1,nPos);
}
@ -364,7 +384,7 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt
}
}
else{ //connectdata不存在新建
auto pLine = generateLine(QUuid::createUuid(),"",1);
auto pLine = generateLine(QUuid::createUuid(),"",0);
if(pLine)
establishConnection(pItem,pTrans,pLine,ModelFunctionType::BlockEditorModel,1,nPos);
}
@ -379,25 +399,45 @@ void DiagramEditorModel::generatePreview()
if(_pPanel){
_pPanel->showPreview();
QList<EditBaseItem*> lst = _pPanel->getBlockItems();
QMap<QString,QList<DiagramEditorComponentInfo>> baysCompo;
QMap<QString,QMap<int,QList<DiagramEditorComponentInfo>>> transCompo;
for(auto item:lst){
if(item->getType() == EditorItemType::bus){ //首次循环生成母线
auto p = item->getBlockData(); //获取blockitem对应的data
if(p){
QUuid uid = p->getId();
QString name = p->getName();
auto pContainer = _pWizard->getContainerByBlock_all(name); //获取block所在的container
auto mapBlocks = pContainer->getBlockMap();
int nMaxLen = 0;
for(auto &lst:mapBlocks){ //根据容器中block的最大长度计算出母线最小length
int nLen = 0;
for(auto block:lst){
if(block->getType() == 1) //容器中block是母线不计算
continue;
nLen = 100+block->getRecSize().width();
}
if(nMaxLen < nLen)
nMaxLen = nLen;
}
QRectF rec = item->boundingRect();
QPointF pos = item->scenePos();
auto pItem = generateComponent(uid,name,0,1,pos,0,1);
pItem->setBoundingRect(item->boundingRect());
if(nMaxLen > rec.width())
rec.setWidth(nMaxLen);
pItem->setBoundingRect(rec);
p->setRecSize(rec);
}
}
}
for(auto item:lst){
if(item->getType() == EditorItemType::bay){ //第二次生成间隔,部分接线
else if(item->getType() == EditorItemType::bay){ //第二次生成间隔、变压器
auto p = item->getBlockData(); //获取blockitem对应的data
DiagramEditorBayBlock* pBay = dynamic_cast<DiagramEditorBayBlock*>(p.data());
if(pBay){
QString sBay = pBay->getName();
auto mapRoute = pBay->getBayInfo().mapRoute;
auto mapCompo = pBay->getBayInfo().mapComponent;
@ -406,14 +446,255 @@ void DiagramEditorModel::generatePreview()
QPointF centerLocal = rect.center();
// 转换为场景坐标系
QPointF centerScene = item->mapToScene(centerLocal);
generateItemByInfo(mapRoute,mapCompo,centerScene);
QList<DiagramEditorComponentInfo> lstCompo = generateItemByInfo(mapRoute,mapCompo,centerScene); //返回与外部连接的compo
if(!baysCompo.contains(sBay))
baysCompo.insert(sBay,lstCompo);
}
}
else if(item->getType() == EditorItemType::trans){
auto p = item->getBlockData(); //获取blockitem对应的data
DiagramEditorTransformerBlock* pTrans = dynamic_cast<DiagramEditorTransformerBlock*>(p.data());
if(pTrans){
//首先绘制本体
auto pType = pTrans->getTransType();
QString sTrans = pTrans->getName();
QUuid uid = pTrans->getId();
QString name = pTrans->getName();
QPointF pos = item->scenePos();
int nType = 0;
if(pType == TransformerType::twoWinding)
nType = 15;
else
nType = 16;
auto pItem = generateComponent(uid,name,0,nType,pos,0,1);
QRectF rect = item->boundingRect();
// 计算中心点(本地坐标系)
QPointF centerLocal = rect.center();
// 转换为场景坐标系
QPointF centerScene = item->mapToScene(centerLocal);
auto transInfo = pTrans->getTranInfo();
QMap<int,QList<DiagramEditorComponentInfo>> neutralInfo;
for(auto &neutral:transInfo.mapNeutral){
QPointF pDelta = neutral.delPoint;
int nT = neutral.nType;
QList<DiagramEditorComponentInfo> lstCompo = generateItemByInfo(neutral.mapRoute,transInfo.mapComponent,centerScene+pDelta);
if(!neutralInfo.contains(nT))
neutralInfo.insert(nT,lstCompo);
}
if(!transCompo.contains(sTrans)) //添加需连接的中性点
transCompo.insert(sTrans,neutralInfo);
}
}
}
for(auto &lst:baysCompo){
generateOutConnection(lst,2);
}
for(auto &map:transCompo){
for(auto it = map.begin(); it != map.end();++it){
generateOutConnection(it.value(),1,it.key());
}
}
}
calculateBlockPos();
}
void DiagramEditorModel::calculateBlockPos()
{
if(_pWizard){
double deltaY = 0; //竖直方向每行增量
double lastMaxDownH = 0; //上一行的下部最大高度
auto mapTotal = _pWizard->getContainerStruct();
for(auto iter = mapTotal.begin();iter != mapTotal.end();++iter){
if(iter.key() == g_transformerLevel)
continue;
double dMaxUp = 0; //计算最大上方空间
double dMaxDown = 0; //计算最大下方空间
for(auto &pCon:iter.value()){ //首次循环遍历每行container,计算最大上空间高度,最大下空间高度,容器宽度
auto mapBlocks = pCon->getBlockMap();
auto lstBlockUp = mapBlocks.value(0);
auto lstBlockDown = mapBlocks.value(3);
double dConWidth = 0;
double dWidthUp = 0;
for(auto pBlock:lstBlockUp){
QRectF rec = pBlock->getRecSize();
double dHeight = rec.height();
double dWidth = rec.width();
if(dMaxUp < dHeight)
dMaxUp = dHeight;
dWidthUp += g_nHorizontalBlockSpacing+dWidth;
}
double dWidthDown = 0;
for(auto pBlock:lstBlockDown){
QRectF rec = pBlock->getRecSize();
double dHeight = rec.height();
double dWidth = rec.width();
if(dMaxDown < dHeight)
dMaxDown = dHeight;
dWidthDown = g_nHorizontalBlockSpacing+dWidth;
}
dConWidth = dWidthUp > dWidthDown ? dWidthUp : dWidthDown;
pCon->setWidth(dConWidth);
}
double dDeltaX = 0; //每行横向偏移
for(auto &pCon:iter.value()){ //第二次循环赋值,计算位置(首先确定母线位置)
pCon->setMaxUpH(dMaxUp);
pCon->setMaxDownH(dMaxDown);
if(iter.value().first() == pCon){ //每行只进行一次y位移
if(iter == mapTotal.begin()){ //首行 deltaY = 首行dMaxUpH
deltaY = pCon->getMaxUpH();
}
else //其他行 deltaY = deltaY+母线高度+上行dMaxDownH+本行dMaxUpH
{
deltaY = deltaY + 50 + lastMaxDownH + pCon->getMaxUpH();
}
lastMaxDownH = pCon->getMaxDownH();
}
pCon->setMidUpY(deltaY);
pCon->setMidDownY(deltaY+50);
pCon->setStartX(dDeltaX);
dDeltaX += pCon->getWidth();
//计算container中block中心点的位置
auto mapBlocks = pCon->getBlockMap();
for(auto it = mapBlocks.begin();it != mapBlocks.end();++it){
double pStartX = pCon->getStartX(); //容器起始x
double dMiddleUpY = pCon->getMidUpY(); //获取1母上边y
double dMiddleDownY = pCon->getMidDownY(); //获取2母下边y
double deltaX = pStartX;
for(auto pBlock:it.value()){
QRectF recBlock = pBlock->getRecSize();
QPointF center;
if(pBlock->getType() == 1){ //母线
if(it.key() == 1){ //1母
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);
}
}
else if(pBlock->getType() == 2){ //间隔
if(it.key() == 0){ //容器最上层
center = QPointF(deltaX+recBlock.width()*0.5,dMiddleUpY-recBlock.height()*0.5);
}
else if(it.key() == 3){ //容器最下层
center = QPointF(deltaX+recBlock.width()*0.5,dMiddleDownY+recBlock.height()*0.5);
}
deltaX += recBlock.width();
}
else if(pBlock->getType() == 3){ //变压器
}
if(!center.isNull())
pBlock->setSeceneDelta(center);
}
}
}
dDeltaX = 0;
if(iter.key() == 0){ //若设置了变压器,直接插入到第一行下方
if(!mapTotal.value(g_transformerLevel).empty()){
for(auto &pCon:iter.value()){ //首次计算变压器大小
auto mapBlocks = pCon->getBlockMap();
auto lstBlock = mapBlocks.value(1);
for(auto &pb:lstBlock){
QRectF rec = pb->getRecSize();
pCon->setWidth(rec.width());
pCon->setHeight(rec.height());
}
}
for(auto &pCon:iter.value()){ //计算位置
if(pCon == iter.value().first()){
//只在每行第一次改变deltaY
deltaY += pCon->getHeight();
}
pCon->setStartY(deltaY-pCon->getHeight());
pCon->setStartX(dDeltaX);
dDeltaX += pCon->getWidth();
auto mapBlocks = pCon->getBlockMap();
for(auto it = mapBlocks.begin();it != mapBlocks.end();++it){
for(auto pBlock:it.value()){
QRectF recBlock = pBlock->getRecSize();
QPointF center = QPointF(pCon->getStartX()+recBlock.width()*0.5,pCon->getStartY()+recBlock.height()*0.5);
pBlock->setSeceneDelta(center);
}
}
}
}
}
}
}
}
void DiagramEditorModel::setItemInBlockPos()
{
QList<EditBaseItem*> lst = _pPanel->getBlockItems();
for(auto item:lst){
if(item->getType() == EditorItemType::trans){ //第三次生成变压器,部分接线
if(item->getType() == EditorItemType::bus){
auto p = item->getBlockData(); //获取blockitem对应的data
if(p){
QUuid uid = p->getId();
auto pItem = _previewItem.value(uid);
if(pItem){
QPointF pPos = p->getSceneDelta();
pItem->setPos(pPos);
}
}
}
else if(item->getType() == EditorItemType::bay){
auto p = item->getBlockData(); //获取blockitem对应的data
DiagramEditorBayBlock* pBay = dynamic_cast<DiagramEditorBayBlock*>(p.data());
if(pBay){
QString sBay = pBay->getName();
auto bayInfo = pBay->getBayInfo();
auto mapRoute = bayInfo.mapRoute;
auto mapCompo = bayInfo.mapComponent;
auto lst = getRouteItemInfoList(mapCompo,mapRoute);
for(auto& info:lst){
auto pItem = _previewItem.value(info.uid);
if(pItem){
QPointF pos = info.deltaPos+pBay->getSceneDelta();
pItem->setPos(pos);
}
}
}
}
else if(item->getType() == EditorItemType::trans){
auto p = item->getBlockData(); //获取blockitem对应的data
DiagramEditorTransformerBlock* pTrans = dynamic_cast<DiagramEditorTransformerBlock*>(p.data());
if(pTrans){
auto transInfo = pTrans->getTranInfo();
auto mapCompo = transInfo.mapComponent;
for(auto &neuInfo:transInfo.mapNeutral){
auto mapRoute = neuInfo.mapRoute;
auto lst = getRouteItemInfoList(mapCompo,mapRoute);
for(auto& info:lst){
auto pItem = _previewItem.value(info.uid);
if(pItem){
QPointF pos = info.deltaPos+(pTrans->getSceneDelta()-info.deltaPos);
pItem->setPos(pos);
}
}
}
}
}
}
@ -505,7 +786,7 @@ void DiagramEditorModel::generateItemByModel(QStandardItemModel* pModel,int nFro
}
}
void DiagramEditorModel::generateItemByInfo(QMap<QString,DiagramEditorRouteInfo> mapRoute,QMap<QString,DiagramEditorComponentInfo> mapCompo,QPointF delta)
QList<DiagramEditorComponentInfo> DiagramEditorModel::generateItemByInfo(QMap<QString,DiagramEditorRouteInfo> mapRoute,QMap<QString,DiagramEditorComponentInfo> mapCompo,QPointF delta)
{
QList<DiagramEditorComponentInfo> lstBind; //连接外部对象的component
QString sMain;
@ -522,7 +803,7 @@ void DiagramEditorModel::generateItemByInfo(QMap<QString,DiagramEditorRouteInfo>
}
if(route.lstCompo.size() > 1){
bulidAndLinkComponent(route.lstCompo);
bulidAndLinkComponent(route.lstCompo,mapCompo);
}
}
}
@ -550,14 +831,19 @@ void DiagramEditorModel::generateItemByInfo(QMap<QString,DiagramEditorRouteInfo>
}
if(route.lstOrder.size() > 1){
bulidAndLinkComponent(route.lstOrder);
bulidAndLinkComponent(route.lstOrder,mapCompo);
}
if(route.lstReverse.size() > 1){
bulidAndLinkComponent(route.lstReverse);
bulidAndLinkComponent(route.lstReverse,mapCompo);
}
}
return lstBind;
}
void DiagramEditorModel::generateOutConnection(QList<DiagramEditorComponentInfo> lstBind,int nTypeTransCon,int nPos)
{
for(auto& compo:lstBind){ //遍历关联外部的item进行连线
if(compo.nBindType == 1){ //关联的是母线 母线没有数据获取绘制的母线item
for(auto& pItem:_previewItem){
@ -586,6 +872,41 @@ void DiagramEditorModel::generateItemByInfo(QMap<QString,DiagramEditorRouteInfo>
}
}
}
else if(compo.nBindType == 3){ //关联变压器
for(auto& pItem:_previewItem){
auto pro = pItem->getProperty();
if(pro){
QString sName = pro->name();
if(sName == compo.sBindParent){ //判断变压器名
GraphicsBaseModelItem* pSrc = _previewItem.value(compo.uid);
GraphicsBaseModelItem* pTarget = pItem;
auto pLineData = TopologyManager::instance().ifConnection(pSrc->itemId().toString(),pTarget->itemId().toString(),ModelFunctionType::EditorModel); //判断两个item是否有连接
if(pLineData != nullptr){
if(!_previewItem.contains(QUuid(pLineData->id()))){ //connectdata已存在item未绘制
auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制
if(pLine){
if(nTypeTransCon == 2)
establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel,2,compo.nBindPara);
else
establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel,nTypeTransCon,nPos);
}
}
else{ //已绘制,略过
}
}
else{ //connectdata不存在新建
auto pLine = generateLine(QUuid::createUuid(),"",1);
if(pLine){
if(nTypeTransCon == 2)
establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel,2,compo.nBindPara);
else
establishConnection(pSrc,pTarget,pLine,ModelFunctionType::EditorModel,nTypeTransCon,nPos);
}
}
}
}
}
}
}
}
@ -1134,15 +1455,17 @@ void DiagramEditorModel::updateTarget(QMap<QString,DiagramEditorRouteInfo>& data
}
}
void DiagramEditorModel::bulidAndLinkComponent(QList<DiagramEditorComponentInfo> lst)
void DiagramEditorModel::bulidAndLinkComponent(QList<DiagramEditorComponentInfo> lst,QMap<QString,DiagramEditorComponentInfo> components)
{
for(int i = 0;i < lst.size()-1;++i){
auto item1 = lst[i];
auto item2 = lst[i+1];
if(_previewItem.contains(item1.uid) && _previewItem.contains(item2.uid)){
GraphicsBaseModelItem* p1 = _previewItem.value(item1.uid);
GraphicsBaseModelItem* p2 = _previewItem.value(item2.uid);
auto pLineData = TopologyManager::instance().ifConnection(item1.uid.toString(),item2.uid.toString(),ModelFunctionType::EditorModel); //判断两个item是否有连接
auto info1 = components.value(item1.sName);
auto info2 = components.value(item2.sName);
if(_previewItem.contains(info1.uid) && _previewItem.contains(info2.uid)){
GraphicsBaseModelItem* p1 = _previewItem.value(info1.uid);
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()))){ //connectdata已存在item未绘制
auto pLine = generateLine(QUuid(pLineData->id()),"",1); //重新绘制
@ -1160,3 +1483,25 @@ void DiagramEditorModel::bulidAndLinkComponent(QList<DiagramEditorComponentInfo>
}
}
}
QList<DiagramEditorComponentInfo> DiagramEditorModel::getRouteItemInfoList(QMap<QString,DiagramEditorComponentInfo> mapCompo,QMap<QString,DiagramEditorRouteInfo> mapRoute)
{
QList<DiagramEditorComponentInfo> lst;
for(auto& route:mapRoute){ //总路线中包含主路,首次生成主路
for(auto& compo:route.lstCompo){ //首先生成设备
auto info = mapCompo.value(compo.sName);
bool exist = false;
for(auto& inf:lst){
if(inf == info){
exist = true;
break;
}
}
if(!exist){
lst.append(info);
}
}
}
return lst;
}

View File

@ -201,28 +201,7 @@
</widget>
</item>
<item row="3" column="2">
<widget class="QComboBox" name="cb_bindObj">
<item>
<property name="text">
<string>无</string>
</property>
</item>
<item>
<property name="text">
<string>高压绕组中性点</string>
</property>
</item>
<item>
<property name="text">
<string>中压绕组中性点</string>
</property>
</item>
<item>
<property name="text">
<string>低压绕组中性点</string>
</property>
</item>
</widget>
<widget class="QComboBox" name="cb_bindObj"/>
</item>
<item row="4" column="1" colspan="2">
<spacer name="verticalSpacer">