Commit e7a421fe authored by 刘乐's avatar 刘乐

1, 代码改造

parent 15675189
#include "CivAssembly.h"
CivAssembly::CivAssembly()
{
}
CivNode::CivNode()
{
}
CivPipe::CivPipe()
{
}
CivTank::CivTank()
{
}
CivValve::CivValve()
{
}
CivPumps::CivPumps()
{
}
CivReservoirs::CivReservoirs()
{
}
CivEmitters::CivEmitters()
{
}
\ No newline at end of file
#ifndef CIVASSEMBLY_H
#define CIVASSEMBLY_H
#include "CivTypes.h"
class CivAssembly;
class CivNode;
class CivPipe;
class CivTank;
class CivValve;
class CivPumps;
class CivEmitters;
/**
管网基本组件
*/
class CivAssembly
{
public:
CivAssembly();
protected:
};
/**
节点类型
*/
class CivNode: public CivAssembly
{
public:
CivNode();
private:
};
/**
* 管线类型
*/
class CivPipe: public CivAssembly
{
public:
CivPipe();
private:
Str mID; // id号
CivNode* mStartNode = nullptr; // 上点号
CivNode* mStopNode = nullptr; // 本点号
};
/*
水池类型
*/
class CivTank:public CivAssembly
{
public:
CivTank();
};
/*
阀门
*/
class CivValve :public CivAssembly
{
public:
CivValve();
};
/**
水泵
*/
class CivPumps :public CivAssembly
{
public:
CivPumps();
};
/*
水源
*/
class CivReservoirs :public CivAssembly
{
public:
CivReservoirs();
};
/**
EMITTERS将模拟节点定义为扩散器(喷嘴或者孔口)。
*/
class CivEmitters :public CivAssembly
{
public:
CivEmitters();
};
#endif // !CIVASSEMBLY_H
#include "CivComponent.h"
CivNode::CivNode()
{
}
CivPipe::CivPipe()
{
}
\ No newline at end of file
#pragma once
#include "CivTypes.h"
class CivNode;
class CivPipe;
/**
* 节点类型
*/
class CivNode
{
public:
CivNode();
private:
};
/**
* 管线类型
*/
class CivPipe {
public:
CivPipe();
private:
Str mID; // id号
CivNode* mStartNode = nullptr; // 上点号
CivNode* mStopNode = nullptr; // 本点号
};
......@@ -95,22 +95,22 @@ bool CivHydrCalc::hydrSimulation(char* fileName, char* rptFile, char* binOutFile
bool CivHydrCalc::qualitySimulation(char* inpFile, char* rptFile, char* binOutFile)
{
if (!hydrSimulation(inpFile, rptFile, binOutFile))
{
return false;
}
// 运行水质运算需要先进行水力运算,没有直接采用ENSolveH 是为了考虑减压阀的压力曲线设置
// 运行水质运算需要先进行水力运算
int errcode = 0;
// 进行水质分析
ENopenQ();
ENinitQ(1);
t = 0;
tstep = 0;
iTime = 0;
long t(0), tstep(0);
int iTime(0);
int errcode = 0;
do
{
errcode = ENrunQ(&t); // errcode > 100 是错误
......@@ -121,8 +121,7 @@ bool CivHydrCalc::qualitySimulation(char* inpFile, char* rptFile, char* binOutFi
return;
}
HydResultCache::GetInstance()->SetHydNodQualityResultTblAi(iTime);
HydResultCache::GetInstance()->SetHydLinQualityResultTblAi(iTime);
// 存储水质计算结果
ENstepQ(&tstep);
......@@ -180,8 +179,8 @@ bool CivHydrCalc::exportInp(char* fileName)
if (!mDbConn->open())
return false;
bool pattern = mDbConn->createTable(PATTERNTABLE, "public", CivDbConnection::PATTERN_TABLE);
bool cii = mDbConn->createTable(OPTIONTTABLE, "public", CivDbConnection::PARAMETER_TABLE);
bool pattern = mDbConn->createTable(PATTERNTABLE, "public", CivTableTemp::PATTERN_TABLE);
bool cii = mDbConn->createTable(OPTIONTTABLE, "public", CivTableTemp::PARAMETER_TABLE);
// 获取表格
Tables tables = mDbConn->getTables(mNetname);
......
......@@ -58,15 +58,9 @@ private:
*/
void getLinkResult(short time);
/**
*@brief 获取运行过程产生的错误
*/
std::string getLastError() { return mLastError; }
private:
CivDbConnection* mDbConn;
std::string mNetname;
std::string mLastError;
};
#include "CivInpBuilder.h"
#include "CivTypes.h"
CivInpBuilder::CivInpBuilder()
:mDbConn(nullptr)
{
}
CivInpBuilder::CivInpBuilder(CivDbConn* dbConn)
:mDbConn(dbConn)
{
}
CivInpBuilder::~CivInpBuilder()
{
delete mDbConn;
}
void CivInpBuilder::registDb(CivDbConn* dbConn)
{
if (mDbConn != nullptr)
{
delete mDbConn;
mDbConn = nullptr;
}
mDbConn = dbConn;
}
bool CivInpBuilder::exportInp(char* fileName)
{
//1 ,获取管网组件
if (!mDbConn)
return false;
if (!mDbConn->open())
return false;
bool pattern = mDbConn->createTable(PATTERNTABLE, "public", CivTableTemp::PATTERN_TABLE);
bool cii = mDbConn->createTable(OPTIONTTABLE, "public", CivTableTemp::PARAMETER_TABLE);
// 获取表格
Tables tables = mDbConn->getTables("");
//2,解析管网组件
// 解析管网组件顺序: 管线放最后
CivInp civInp(CivInp::HOURS);
int total = tables.size();
for (int i = 0; i < total; i++)
{
std::string table = tables[i];
if (PIPELINE == table)
continue;
assemble(table, civInp);
}
assemble(PIPELINE, civInp);
// 设置曲线
// Componets curves = mDbConn->getComponets(CURVETABLE);
// 初始化参数
Options options;
options.units = Options::UNITS::LPS;
options.TRIALS = "40";
options.ACCURACY = "0.001 ";
options.EMITTEREXPONENT = "0.5";
options.SpecificGravity = "0.998";
options.headLoss = Options::HEADLOSS::HW;
options.TOLERANCE = "0.0166666666666667 ";
options.quality = Options::QUALITY::AGE;
std::map<std::string, std::string> optMap;
optMap.insert(std::pair<std::string, std::string>("DAMPLIMIT", "0"));
optMap.insert(std::pair<std::string, std::string>("CHECKFREQ", "2"));
optMap.insert(std::pair<std::string, std::string>("MAXCHECK", "10"));
civInp.setOption(options, optMap);
// 设置
civInp.setDuration(24);
civInp.setTimestep("PATTERN", 1);
civInp.setTimestep("HYDRAULIC", 1);
civInp.setTimestep("QUALITY", 1);
civInp.setTimeStart("REPORT", 1);
civInp.writeToFile(fileName);
return true;
}
void CivInpBuilder::assemble(StrQuote table, CivInp& inp)
{
// 根据组建类型解析字段
if (PIPELINE == table)
{
// 管线
//;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
// 必备参数
Componets comps = mDbConn->getComponets(table);
PipeFields pipes;
Civitems items;
int total = comps.size();
for (int i = 0; i < total; i++)
{
Componet comp = comps[i];
// 过滤掉与阀门和水泵连接的管线
Str number = comp.find("id")->second;
FiledFilter filter = mDbConn->getFilter();
auto iter = filter.find(PIPELINE);
if (iter != filter.end())
{
auto lineFilter = iter->second;
if (lineFilter.count(number) > 0)
continue;
}
Str id = comp.find(pipes.ID)->second;
Str startNode = comp.find(pipes.Node1)->second;
Str endNode = comp.find(pipes.Node2)->second;
Str length = comp.find(pipes.Length)->second;
Str diameter = comp.find(pipes.Diameter)->second;
Str roughness = comp.find(pipes.Roughness)->second;
Str minorLoss = comp.find(pipes.MinorLoss)->second;
Str status = comp.find(pipes.Status)->second;
// 注意顺序
CivItem civItem;
if (id == "" || id.empty())
id = "GD" + comp.find("id")->second;
civItem.push_back(id);
civItem.push_back(startNode);
civItem.push_back(endNode);
civItem.push_back(length);
civItem.push_back(diameter);
civItem.push_back(roughness);
civItem.push_back(minorLoss);
civItem.push_back(status);
items.push_back(civItem);
}
inp.writeComponet(items, _PIPES);
}
else if (PIPENODE == table)
{
Componets comps = mDbConn->getComponets(table);
// 节点参数
// ;ID Elev Demand Pattern
// 坐标
//;Node X-Coord Y-Coord
JunctionsFields jontionFields;
Civitems jounItems;
Civitems nodeCoordItems;
Civitems patternItems;
int total = comps.size();
std::set<Str> patterNams;
for (int i = 0; i < total; i++)
{
Componet comp = comps[i];
Str id = comp.find(jontionFields.ID)->second;
Str elevation = comp.find(jontionFields.Elev)->second;
Str demand = comp.find(jontionFields.Demand)->second;
Str pattern = comp.find(jontionFields.Pattern)->second;
Str x_coord = comp.find(jontionFields.X_Coord)->second;
Str y_coord = comp.find(jontionFields.Y_Coord)->second;
// 注意顺序
//1, 节点
CivItem civItem;
civItem.push_back(id);
civItem.push_back(elevation);
civItem.push_back(demand);
civItem.push_back(pattern);
jounItems.push_back(civItem);
// 2, 节点坐标
CivItem nodeCoordItem;
nodeCoordItem.push_back(id);
nodeCoordItem.push_back(x_coord);
nodeCoordItem.push_back(y_coord);
nodeCoordItems.push_back(nodeCoordItem);
if (!pattern.empty())
{
patterNams.insert(pattern);
}
}
Componets patterns = mDbConn->getComponets(PATTERNTABLE);
PatternFields fileds;
size_t patternSize = patterns.size();
for (int i = 0; i < patternSize; i++)
{
Componet pattern = patterns[i];
Str paternName = pattern.find(fileds.Name)->second;
Str paternValue = pattern.find(fileds.Value)->second;
CivItem item;
item.push_back(paternName);
item.push_back(paternValue);
patternItems.push_back(item);
}
inp.writeComponet(jounItems, _JUNCTIONS);
inp.writeComponet(nodeCoordItems, _COORDS);
inp.writeComponet(patternItems, _PATTERNS);
}
else if (RESIVOIR == table) // 水源
{
Componets comps = mDbConn->getComponets(table);
//;ID Head Pattern
Civitems coordItems;
Civitems resirvoirItems;
ResivoirFields fields;
int total = comps.size();
for (int i = 0; i < total; i++)
{
Componet comp = comps[i];
Str id = comp.find(fields.ID)->second;
Str elevation = comp.find(fields.Elev)->second;
Str flow = comp.find(fields.Flow)->second;
Str head = comp.find(fields.Head)->second;
Str pattern = comp.find(fields.Pattern)->second;
Str x_coord = comp.find(fields.X_Coord)->second;
Str y_coord = comp.find(fields.Y_Coord)->second;
// 注意顺序
//1, coord
CivItem civItem;
civItem.push_back(id);
civItem.push_back(head);
civItem.push_back(pattern);
resirvoirItems.push_back(civItem);
// 2, 节点坐标
CivItem nodeCoordItem;
nodeCoordItem.push_back(id);
nodeCoordItem.push_back(x_coord);
nodeCoordItem.push_back(y_coord);
coordItems.push_back(nodeCoordItem);
}
inp.writeComponet(coordItems, _COORDS);
inp.writeComponet(resirvoirItems, _RESERVOIRS);
}
else if (PUMP == table) // 水泵
{
//;ID Node1 Node2 Parameters
Componets comps = mDbConn->getLikelyPipes(table);
PumpFields fields;
Civitems pumpItems;
int total = comps.size();
for (int i = 0; i < total; i++)
{
Componet comp = comps[i];
Str id = comp.find(fields.ID)->second;
Str node1 = comp.find(fields.node1)->second;
Str node2 = comp.find(fields.node2)->second;
std::vector<Str> vec;
Str head = comp.find(fields.head)->second;
if (!head.empty())
vec.push_back("HEAD " + head);
Str power = comp.find(fields.power)->second;
if (!power.empty())
vec.push_back("POWER " + power);
Str pattern = comp.find(fields.pattern)->second;
if (!pattern.empty())
vec.push_back("PATTERN " + pattern);
Str speed = comp.find(fields.speed)->second;
if (!speed.empty())
vec.push_back("SPEED " + speed);
// 水池数据
CivItem tankNode;
tankNode.push_back(id);
tankNode.push_back(node1);
tankNode.push_back(node2);
// 构建参数
char param[128] = " ";
int total = vec.size();
for (int i = 0; i < total; i++)
{
strcat_s(param, vec[i].c_str());
}
tankNode.push_back(param);
pumpItems.push_back(tankNode);
}
inp.writeComponet(pumpItems, _PUMPS);
}
else if (TANK == table) // 水池
{
Componets comps = mDbConn->getComponets(table);
// ; ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
TanksFields tkfFileds;
Civitems nodeCoordItems;
Civitems tankItems;
int total = comps.size();
for (int i = 0; i < total; i++)
{
Componet comp = comps[i];
Str id = comp.find(tkfFileds.ID)->second;
Str elevation = comp.find(tkfFileds.Elev)->second;
Str initLevel = comp.find(tkfFileds.InitLevel)->second;
Str minLevel = comp.find(tkfFileds.MinLevel)->second;
Str maxLevel = comp.find(tkfFileds.MaxLevel)->second;
Str diametor = comp.find(tkfFileds.Diameter)->second;
Str minVol = comp.find(tkfFileds.MinVol)->second;
Str x_coord = comp.find(tkfFileds.X_Coord)->second;
Str y_coord = comp.find(tkfFileds.Y_Coord)->second;
// 水池数据
CivItem tankNode;
tankNode.push_back(id);
tankNode.push_back(elevation);
tankNode.push_back(initLevel);
tankNode.push_back(minLevel);
tankNode.push_back(maxLevel);
tankNode.push_back(diametor);
tankNode.push_back(minVol);
tankItems.push_back(tankNode);
// 2, 节点坐标
CivItem nodeCoordItem;
nodeCoordItem.push_back(id);
nodeCoordItem.push_back(x_coord);
nodeCoordItem.push_back(y_coord);
nodeCoordItems.push_back(nodeCoordItem);
}
inp.writeComponet(nodeCoordItems, _COORDS);
inp.writeComponet(tankItems, _TANKS);
}
else
{
// 阀门
//;ID Node1 Node2 Diameter Type Setting MinorLoss
Componets comps = mDbConn->getLikelyPipes(table);
ValvesFields fields;
Civitems vavleItems;
int total = comps.size();
for (int i = 0; i < total; i++)
{
Componet comp = comps[i];
Str id = comp.find(fields.ID)->second;
Str node1 = comp.find(fields.node1)->second;
Str node2 = comp.find(fields.node2)->second;
Str diametor = comp.find(fields.Diameter)->second;
Str label = comp.find(fields.type)->second;
Str typeSeting = comp.find(fields.setting)->second;
Str minorLoss = comp.find(fields.minorLoss)->second;
// 阀门数据
CivItem vavleNode;
vavleNode.push_back(id);
vavleNode.push_back(node1);
vavleNode.push_back(node2);
vavleNode.push_back(diametor);
vavleNode.push_back(label);
vavleNode.push_back(typeSeting);
vavleNode.push_back(minorLoss);
vavleItems.push_back(vavleNode);
}
inp.writeComponet(vavleItems, _VALVES);
}
}
void CivInpBuilder::buildNode()
{
}
void CivInpBuilder::buildPipe()
{
}
void CivInpBuilder::buildTank()
{
}
void CivInpBuilder::buildVavle()
{
}
void CivInpBuilder::buildPump()
{
}
void CivInpBuilder::buildReservoir()
{
}
void CivInpBuilder::buildEmitter()
{
}
CivNewInp* CivInpBuilder::getNewInp()
{
}
\ No newline at end of file
#ifndef _CIVINPEXPOTER_H
#define _CIVINPEXPOTER_H
#include "CivPgConn.h"
#include "CivInp.h"
#include "CivNewInp.h"
/**
* 抽象建造者
*/
class CivAbsBuilder
{
public:
virtual void buildNode() = 0;
virtual void buildPipe() = 0;
virtual void buildTank() = 0;
virtual void buildVavle() = 0;
virtual void buildPump() = 0;
virtual void buildReservoir() = 0;
virtual void buildEmitter() = 0;
virtual CivNewInp* getNewInp() = 0;
};
/**
* 导出inp文件类
*/
class CivInpBuilder:public CivAbsBuilder
{
public:
CivInpBuilder();
CivInpBuilder(CivDbConn* dbConn);
~CivInpBuilder();
// 注册数据库连接
void registDb(CivDbConn* dbConn);
/**
*@brief 导出inp文件
*/
bool exportInp(char* fileName);
/**
*@brief 解析表字段名,按顺序写入
*@table:表
*@inp: inp文件对象
*/
void assemble(StrQuote table, CivInp& inp);
virtual void buildNode();
virtual void buildPipe();
virtual void buildTank() ;
virtual void buildVavle();
virtual void buildPump();
virtual void buildReservoir() ;
virtual void buildEmitter();
virtual CivNewInp* getNewInp();
private:
CivDbConn* mDbConn;
};
#endif // !_CIVINPEXPOTER_H
#include "CivInpExporter.h"
CivInpExporter::CivInpExporter()
{
}
CivInpExporter::~CivInpExporter()
{
}
\ No newline at end of file
#ifndef _CIVINPEXPOTER_H
#define _CIVINPEXPOTER_H
/**
* inpļ
*/
class CivInpExporter
{
public:
CivInpExporter();
~CivInpExporter();
private:
};
#endif // !_CIVINPEXPOTER_H
#ifndef CIVNEWINP_H
#define CIVNEWINP_H
#include "CivAssembly.h"
class CivNewInp
{
public:
CivNewInp();
~CivNewInp();
private:
//
CivNode mNode; // 节点
CivPipe mPipes; // 管线
CivTank mTanks; // 水池
CivValve mValves; // 阀门
CivPumps mPumps; // 水泵
CivEmitters mEmitters; // 喷嘴
};
#endif // !CIVNEWINP_H
......@@ -153,18 +153,19 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\pandaDbManager\CivCommonUtils.cpp" />
<ClCompile Include="CivComponent.cpp" />
<ClCompile Include="CivAssembly.cpp" />
<ClCompile Include="CivHydrCalc.cpp" />
<ClCompile Include="CivHydrFuncInter.cpp" />
<ClCompile Include="CivInp.cpp" />
<ClCompile Include="CivInpExporter.cpp" />
<ClCompile Include="CivInpBuilder.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="CivComponent.h" />
<ClInclude Include="CivAssembly.h" />
<ClInclude Include="CivHydrCalc.h" />
<ClInclude Include="CivHydrFuncInter.h" />
<ClInclude Include="CivInp.h" />
<ClInclude Include="CivInpExporter.h" />
<ClInclude Include="CivInpBuilder.h" />
<ClInclude Include="CivNewInp.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
......
......@@ -21,16 +21,16 @@
<ClCompile Include="CivInp.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="CivComponent.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="CivHydrFuncInter.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="..\pandaDbManager\CivCommonUtils.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="CivInpExporter.cpp">
<ClCompile Include="CivAssembly.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="CivInpBuilder.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
......@@ -41,13 +41,16 @@
<ClInclude Include="CivInp.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="CivComponent.h">
<ClInclude Include="CivHydrFuncInter.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="CivHydrFuncInter.h">
<ClInclude Include="CivAssembly.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="CivInpBuilder.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="CivInpExporter.h">
<ClInclude Include="CivNewInp.h">
<Filter>头文件</Filter>
</ClInclude>
</ItemGroup>
......
......@@ -4,10 +4,11 @@
#include "CivDbConn.h"
#include <libpq-fe.h>
#define DBEXPORT __declspec(dllexport)
/**
postgress 数据库
*/
class CivPgConn: public CivDbConn
class DBEXPORT CivPgConn: public CivDbConn
{
public:
CivPgConn(char* uri);
......
......@@ -151,7 +151,8 @@
<PostBuildEvent>
<Command>copy CivDbConnection.h $(OutDir)..\include /y
copy CivTypes.h $(OutDir)..\include /y
</Command>
copy CivPgConn.h $(OutDir)..\include /y
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment