1.变压器接地支路放在左端
2.添加把所有线路合并起来的脚本 Signed-off-by: dmy@lab <dmy@lab.lab>
This commit is contained in:
parent
8a5d392450
commit
b52bfd2935
|
|
@ -9,4 +9,6 @@ release
|
|||
Makefile*
|
||||
testHasttable/*Debug
|
||||
testHasttable/*Release
|
||||
output
|
||||
output
|
||||
.idea
|
||||
__pycache__
|
||||
|
|
@ -0,0 +1,843 @@
|
|||
__author__ = 'dmy'
|
||||
|
||||
## store iPso file data
|
||||
|
||||
import os
|
||||
import sys
|
||||
import distutils.dir_util
|
||||
import shutil
|
||||
|
||||
|
||||
class iPsoData:
|
||||
def __init__(self, filePath):
|
||||
self.__basicInfo = []
|
||||
self.__balanceInfo = []
|
||||
self.__line = []
|
||||
self.__trans = []
|
||||
self.__nodePwer = []
|
||||
self.__gen = []
|
||||
self.__reGen = []
|
||||
self.__voltLimit = []
|
||||
self.__ground = []
|
||||
self.__isAvailable = False
|
||||
self.__read__(filePath)
|
||||
pass
|
||||
|
||||
|
||||
def __read__(self, filePath):
|
||||
if not os.path.exists(filePath):
|
||||
self.__isAvailable = True
|
||||
cur = 0
|
||||
with open(filePath) as f: # 把iPso文件的数据读到内存中
|
||||
line = f.readline()
|
||||
while line:
|
||||
formatedLine = line.strip()
|
||||
if line == '':
|
||||
line = f.readline()
|
||||
continue
|
||||
sep = formatedLine.split(' ')
|
||||
if len(sep) < 1:
|
||||
line = f.readline()
|
||||
continue
|
||||
if sep[0] == '0':
|
||||
cur += 1
|
||||
line = f.readline()
|
||||
continue
|
||||
try:
|
||||
floatSep = [float(s) for s in sep]
|
||||
except:
|
||||
print(sep)
|
||||
if cur == 0:
|
||||
self.__basicInfo.append(floatSep)
|
||||
if cur == 1:
|
||||
self.__balanceInfo.append(floatSep)
|
||||
if cur == 2:
|
||||
self.__line.append(floatSep)
|
||||
if cur == 3:
|
||||
self.__trans.append(floatSep)
|
||||
if cur == 5:
|
||||
self.__ground.append(floatSep)
|
||||
if cur == 8:
|
||||
self.__nodePwer.append(floatSep)
|
||||
if cur == 9:
|
||||
self.__gen.append(floatSep)
|
||||
if cur == 11:
|
||||
self.__reGen.append(floatSep)
|
||||
if cur == 13:
|
||||
self.__voltLimit.append(floatSep)
|
||||
line = f.readline()
|
||||
|
||||
def GetBasicInfo(self):
|
||||
return self.__basicInfo
|
||||
|
||||
def GetBalance(self):
|
||||
return self.__balanceInfo
|
||||
|
||||
def GetLine(self):
|
||||
return self.__line
|
||||
|
||||
def GetTrans(self):
|
||||
return self.__trans
|
||||
|
||||
def GetNodePower(self):
|
||||
return self.__nodePwer
|
||||
|
||||
def GetGen(self):
|
||||
return self.__gen
|
||||
|
||||
def GetReactiveGen(self):
|
||||
return self.__reGen
|
||||
|
||||
def GetVoltLimit(self):
|
||||
return self.__voltLimit
|
||||
|
||||
def GetGround(self):
|
||||
return self.__ground
|
||||
|
||||
|
||||
class MergeReconfigFile: # 合并重构用文件
|
||||
def __init__(self, fileList):
|
||||
self.__basicInfo = [[0, 0]] #节点数 支路数
|
||||
self.__line = []
|
||||
self.__trans = []
|
||||
self.__node = []
|
||||
self.__reverseDic = {}
|
||||
self.__mergedIpsoBalance = []
|
||||
self.__mergedIpsoLine = []
|
||||
self.__mergedIpsoTrans = []
|
||||
self.__mergedIpsoLoad = []
|
||||
self.__mergedIpsoGround = []
|
||||
self.__mergedNodeNameDic = {}
|
||||
# self.__addNumDic = {} #计算每个文件在新文件中的偏移量
|
||||
self.__balanceNodeOffset=[]#记录每条线路头节点在整个合并文件中的位置
|
||||
self.__merge(fileList)
|
||||
|
||||
def __merge(self, fileList):
|
||||
indLine = 1 #序号
|
||||
indTrans=1
|
||||
indNode = 1
|
||||
indGround = 1
|
||||
addNum = 1
|
||||
# offsetNodeNum = {} #记录每个一个文件在新文件里节点的偏移量
|
||||
for f in fileList:
|
||||
ipsodata = iPsoData(f)
|
||||
#节点数 可重构支路数
|
||||
self.__basicInfo[0][0] += len(ipsodata.GetNodePower())
|
||||
self.__basicInfo[0][1] += len(ipsodata.GetLine())
|
||||
self.__basicInfo[0][1] += len(ipsodata.GetTrans())
|
||||
#序号 变电站节点编号
|
||||
|
||||
for s in ipsodata.GetBalance():
|
||||
self.__balanceNodeOffset.append(s[1]+addNum)
|
||||
#序号 支路节点I 支路节点J
|
||||
for l in ipsodata.GetLine():
|
||||
self.__mergedIpsoLine.append([indLine, l[1] + addNum, l[2] + addNum, l[3], l[4], l[5], l[6]])
|
||||
self.__reverseDic[l[1] + addNum] = l[1]#反过来查是哪个节点
|
||||
self.__reverseDic[l[2] + addNum] = l[2]
|
||||
indLine += 1
|
||||
for t in ipsodata.GetTrans():
|
||||
self.__mergedIpsoTrans.append([indTrans,1, t[2] + addNum, t[3] + addNum, t[4], t[5], 1, 1, 1, 1])
|
||||
self.__reverseDic[t[2] + addNum] = t[2]
|
||||
self.__reverseDic[t[3] + addNum] = t[3]
|
||||
indTrans += 1
|
||||
#接地支路
|
||||
for g in ipsodata.GetGround():
|
||||
self.__mergedIpsoGround.append([indGround, g[1] + addNum, g[2], g[3]])
|
||||
#先给PG和QG赋值
|
||||
node = ipsodata.GetNodePower()
|
||||
#序号 节点编号 节点有功 节点无功 负荷有功 负荷无功
|
||||
for n in ipsodata.GetNodePower():
|
||||
self.__mergedIpsoLoad.append([indNode, n[1], n[2] + addNum, n[3], n[4], n[5], n[6], n[7], 0, 0])
|
||||
indNode += 1
|
||||
# self.__addNumDic[lineName] = len(ipsodata.GetNodePower()) #每条线路的节点数
|
||||
# offsetNodeNum[lineName] = addNum #记录的是与之前线路的偏移量
|
||||
addNum += len(ipsodata.GetNodePower())
|
||||
#用一个总的头节点把之前所有线路的头节点连接起来
|
||||
for b in self.__balanceNodeOffset:
|
||||
self.__mergedIpsoLine.append ([indLine, 1 , 1 + b, 0.01, 0.01, 0, 0])
|
||||
indLine+=1
|
||||
|
||||
def __GetLineName(self, filePath):
|
||||
baseName = os.path.basename(filePath)
|
||||
fileName = os.path.splitext(baseName)[0]
|
||||
lineName = fileName.split('_')[1]
|
||||
return lineName
|
||||
|
||||
|
||||
def __Swap(self, a, b):
|
||||
c = b
|
||||
b = a
|
||||
a = c
|
||||
return (a, b)
|
||||
|
||||
def Output(self, fileOutDir): #输出到文件
|
||||
#输出节点映射
|
||||
self.__outputNodeName(fileOutDir)
|
||||
with open(fileOutDir + '_Merged.txt', 'w') as f:
|
||||
for b in self.__basicInfo:
|
||||
f.write('%d %d 1 1e-5 1\n' % (b[0], b[1]))
|
||||
f.write('0\n')
|
||||
f.write('1 1 1.5\n')
|
||||
f.write('0\n')
|
||||
for b in self.__mergedIpsoLine:
|
||||
f.write('%d %d %d %f %f %f %f\n' % (b[0], b[1], b[2],b[3],b[4],b[5],b[6]))
|
||||
f.write('0\n')
|
||||
for b in self.__mergedIpsoTrans:
|
||||
f.write('%d %d %d %d %f %f %f %f %f %f\n' % (b[0], b[1], b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for g in self.__mergedIpsoGround:
|
||||
f.write('%d %d %f %f\n' % (g[0], g[1], b[2],b[3]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for n in self.__node:
|
||||
f.write('%d %d %d %d %.10f %.10f %.10f %.10f %.10f %.10f\n' % (n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9])) #负荷单位是kW
|
||||
f.write('0\n')
|
||||
f.write('1 1 1 1 -100 100 0 0 0 0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('1 1 1 1 1.05 -100 100 0 0 0 0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('1 1 0.999 1.001\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
with open(fileOutDir, 'w') as f:
|
||||
for b in self.__basicInfo:
|
||||
f.write('%d,%d' % (b[0], b[1]))
|
||||
f.write(',1,1,1\n')
|
||||
f.write('0\n')
|
||||
for s in self.__mergedIpsoBalance:
|
||||
f.write('%d,%d,%.10f\n' % (s[0], s[1], s[2]))
|
||||
f.write('0\n')
|
||||
for b in self.__mergedIpsoLine:
|
||||
f.write('%d,%d,%d,%.10f,%.10f,%.10f,%.10f\n' % (b[0], b[1], b[2], b[3], b[4], b[5], b[6]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for g in self.__mergedIpsoGround:
|
||||
f.write('%d,%d,%.10f,%.10f\n' % (g[0], g[1], g[2], g[3]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for b in self.__mergedIpsoLoad:
|
||||
f.write('%d,%d,%d,%d,%.10f,%.10f,%.10f,%.10f,%.10f,%.10f\n' % (
|
||||
b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for b in self.__mergedIpsoBalance:
|
||||
f.write('%d,%d,%d,%d,%.10f,%.10f,%.10f\n' % (b[0], 1, b[1], 1, 1, -100, 100))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
|
||||
def GetReverseMap(self): #通过新的节点号返回原来的节点号
|
||||
return self.__reverseDic;
|
||||
|
||||
def GetCanReconfig(self):
|
||||
return self.__canReconfig
|
||||
|
||||
|
||||
class AddLoadToReconfigFile: # 把负荷给加上
|
||||
def __init__(self, ReconfigFilepath):
|
||||
dirPath = os.path.dirname(ReconfigFilepath)
|
||||
reconfigData = ReconfigFileData(ReconfigFilepath)
|
||||
node = reconfigData.GetNodePowerInfo()
|
||||
PDFilePath = dirPath + '/PD.txt'
|
||||
with open(PDFilePath) as f:
|
||||
for i, line in enumerate(f):
|
||||
newLine = line.split()
|
||||
if newLine == '':
|
||||
continue
|
||||
node[i][4] = float(newLine[-1])
|
||||
QDFilePath = dirPath + '/QD.txt'
|
||||
with open(QDFilePath) as f:
|
||||
for i, line in enumerate(f):
|
||||
newLine = line.split()
|
||||
if newLine == '':
|
||||
continue
|
||||
node[i][5] = float(newLine[-1])
|
||||
dirName = os.path.basename(dirPath)
|
||||
newFilePath = dirPath + '/' + dirName + '_Reconfigure_newFile.txt'
|
||||
with open(newFilePath, 'w') as f:
|
||||
for b in reconfigData.GetBasicInfo():
|
||||
f.write('%d %d\n' % (b[0], b[1]))
|
||||
f.write('0\n')
|
||||
for b in reconfigData.GetSubstation():
|
||||
f.write('%d %d\n' % (b[0], b[1]))
|
||||
f.write('0\n')
|
||||
for b in reconfigData.GetBranchInfo():
|
||||
f.write('%d %d %d\n' % (b[0], b[1], b[2]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
#在发电机处加负荷
|
||||
for i in reconfigData.GetSubstation():
|
||||
reconfigData.GetNodePowerInfo()[i[1] - 1][2] = 100
|
||||
reconfigData.GetNodePowerInfo()[i[1] - 1][3] = 100
|
||||
for b in reconfigData.GetNodePowerInfo():
|
||||
f.write(
|
||||
'%d %d %.10f %.10f %.10f %.10f\n' % (b[0], b[1], b[2] * 1e4, b[3] * 1e4, b[4] * 1e4, b[5] * 1e4))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for b in reconfigData.GetInterLineInfo():
|
||||
f.write('%d %d %d %d\n' % (b[0], b[1], b[2], b[3]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
|
||||
|
||||
class AddLoadToIpsoFile: # 把负荷给加上
|
||||
def __init__(self, ipsoFilepath):
|
||||
dirPath = os.path.dirname(ipsoFilepath)
|
||||
ipsoData = iPsoData(ipsoFilepath)
|
||||
node = ipsoData.GetNodePower()
|
||||
PDFilePath = dirPath + '/PD.txt'
|
||||
with open(PDFilePath) as f:
|
||||
for i, line in enumerate(f):
|
||||
newLine = line.split()
|
||||
if newLine == '':
|
||||
continue
|
||||
node[i][6] = float(newLine[-1])
|
||||
QDFilePath = dirPath + '/QD.txt'
|
||||
with open(QDFilePath) as f:
|
||||
for i, line in enumerate(f):
|
||||
newLine = line.split()
|
||||
if newLine == '':
|
||||
continue
|
||||
node[i][7] = float(newLine[-1])
|
||||
dirName = os.path.basename(dirPath)
|
||||
newFilePath = dirPath + '/' + dirName + '_iPso_newFile.txt'
|
||||
with open(newFilePath, 'w') as f:
|
||||
for b in ipsoData.GetBasicInfo():
|
||||
f.write('%d\t%d\t%d\t%.10f\t%.10f\n' % (b[0], b[1], 1, b[3], b[4]))
|
||||
f.write('0\n')
|
||||
for b in ipsoData.GetBalance():
|
||||
f.write('%d\t%d\t%.10f\n' % (b[0], b[1], b[2]))
|
||||
f.write('0\n')
|
||||
for b in ipsoData.GetLine():
|
||||
f.write('%d\t%d\t%d\t%.10f\t%.10f\t%.10f\t%.10f\n' % (b[0], b[1], b[2], b[3], b[4], b[5], b[6]))
|
||||
f.write('0\n')
|
||||
for b in ipsoData.GetTrans():
|
||||
f.write('%d\t%d\t%d\t%d\t%.10f\t%.10f\t%.10f\t%.10f\t%.10f\t%.10f\n' % (
|
||||
b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for b in ipsoData.GetGround():
|
||||
f.write('%d\t%d\t%.10f\t%.10f\n' % (b[0], b[1], b[2], b[3]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for b in ipsoData.GetNodePower():
|
||||
f.write('%d\t%d\t%d\t%d\t%.10f\t%.10f\t%.10f\t%.10f\t%f\t%.10f\n' % (
|
||||
b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9]))
|
||||
f.write('0\n')
|
||||
for b in ipsoData.GetGen():
|
||||
f.write('%d\t%d\t%d\t%d\t%.10f\t%.10f\t%.10f\t%.10f\t%.10f\t%.10f\n' % (
|
||||
b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for b in ipsoData.GetReactiveGen():
|
||||
f.write('%d\t%d\t%d\t%d\t%.10f\t%.10f\t%.10f\n' % (b[0], b[1], b[2], b[3], b[4], b[5], b[6]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for b in ipsoData.GetVoltLimit():
|
||||
f.write('%d\t%d\t%.10f\t%.10f\n' % (b[0], b[1], b[2], b[3]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
|
||||
|
||||
class NodeInfo:
|
||||
def __init__(self, lineInfoPath, transInfoPath):
|
||||
self.__infoDic = {}
|
||||
with open(lineInfoPath) as f:
|
||||
for line in f:
|
||||
newLine = line.strip()
|
||||
if newLine == '':
|
||||
continue
|
||||
sep = newLine.split(',')
|
||||
if len(sep) < 4:
|
||||
continue
|
||||
nodeI = int(sep[1])
|
||||
nodeJ = int(sep[2])
|
||||
info = sep[3].split('-')
|
||||
if len(info) < 2:
|
||||
continue
|
||||
nodeIinfo = info[0].strip()
|
||||
nodeJinfo = info[1].strip()
|
||||
if not nodeI in self.__infoDic.keys():
|
||||
self.__infoDic[nodeI] = nodeIinfo
|
||||
if not nodeJ in self.__infoDic.keys():
|
||||
self.__infoDic[nodeJ] = nodeJinfo
|
||||
with open(transInfoPath) as f:
|
||||
for line in f:
|
||||
newLine = line.strip()
|
||||
if newLine == '':
|
||||
continue
|
||||
sep = newLine.split(',')
|
||||
if len(sep) < 4:
|
||||
continue
|
||||
nodeI = int(sep[1])
|
||||
info = sep[4].strip()
|
||||
if not nodeI in self.__infoDic.keys():
|
||||
self.__infoDic[nodeI] = info
|
||||
nodeJ = int(sep[2])
|
||||
if not nodeJ in self.__infoDic.keys():
|
||||
self.__infoDic[nodeJ] = info
|
||||
|
||||
def GetNodeName(self, nodeI):
|
||||
if nodeI in self.__infoDic.keys():
|
||||
return self.__infoDic[nodeI]
|
||||
else:
|
||||
return ""
|
||||
|
||||
|
||||
class AddLoadtoFileBatch:
|
||||
def __init__(self, baseDir, AddLoadInterface=AddLoadToIpsoFile):
|
||||
dirList = os.listdir(baseDir)
|
||||
for d in dirList:
|
||||
absDir = baseDir + '/' + d
|
||||
if not os.path.isdir(absDir):
|
||||
continue
|
||||
# 看有没有PD.txt 和 QD.txt
|
||||
PDFilePath = absDir + '/PD.txt'
|
||||
QDFilePath = absDir + '/QD.txt'
|
||||
if not os.path.exists(PDFilePath) or not os.path.exists(QDFilePath):
|
||||
continue
|
||||
if AddLoadInterface is AddLoadToReconfigFile:
|
||||
absDatFile = absDir + '/iPso_' + d + '_DisnetReconfig.txt'
|
||||
if AddLoadInterface is AddLoadToIpsoFile:
|
||||
absDatFile = absDir + '/iPso_' + d + '.txt'
|
||||
if not os.path.exists(absDatFile):
|
||||
continue
|
||||
AddLoadInterface(absDatFile)
|
||||
print('完成 %s' % (absDatFile))
|
||||
|
||||
|
||||
class LoadMapSingleton:
|
||||
PloadDic = {}
|
||||
QloadDic = {}
|
||||
|
||||
|
||||
class NodeLoadMap: # 依据变压器串号对负荷进行映射
|
||||
def __init__(self, manyFileDir, singleFileDir,
|
||||
AddLoadInterface=AddLoadToIpsoFile): #manyFileDir是分开的计算文件目录的上级目录 singleFileDir是合并后并形成重构的文件的目录
|
||||
dirList = os.listdir(manyFileDir)
|
||||
PloadDic = {}
|
||||
QloadDic = {}
|
||||
if len(LoadMapSingleton.PloadDic.keys()) == 0 or len(LoadMapSingleton.QloadDic.keys()) == 0:
|
||||
for d in dirList:
|
||||
absDir = manyFileDir + '/' + d
|
||||
if not os.path.exists(absDir):
|
||||
continue
|
||||
#看看有没有负荷文件
|
||||
PDFilePath = absDir + '/PD.txt'
|
||||
QDFilePath = absDir + '/QD.txt'
|
||||
if not os.path.exists(PDFilePath) or not os.path.exists(QDFilePath):
|
||||
continue
|
||||
print('利用了%s中的负荷' % absDir)
|
||||
#把负荷信息读出来
|
||||
PD = []
|
||||
with open(PDFilePath) as f:
|
||||
for line in f:
|
||||
newLine = line.strip()
|
||||
if len(newLine) == 0:
|
||||
continue
|
||||
PD.append(float(newLine))
|
||||
QD = []
|
||||
with open(QDFilePath) as f:
|
||||
for line in f:
|
||||
newLine = line.strip()
|
||||
if len(newLine) == 0:
|
||||
continue
|
||||
#if(float(newLine)<0):
|
||||
# print(newLine)
|
||||
|
||||
QD.append(float(newLine))
|
||||
#找到变压器信息文件
|
||||
manyTransFilePath = absDir + '/iPso_' + d + '_TransformerInfor.txt'
|
||||
if not os.path.exists(manyTransFilePath):
|
||||
continue
|
||||
with open(manyTransFilePath) as f:
|
||||
for line in f:
|
||||
newLine = line.strip()
|
||||
if len(newLine) == 0:
|
||||
continue
|
||||
sep = newLine.split(',')
|
||||
if len(sep) >= 6:
|
||||
ID = sep[5].strip()
|
||||
loadSideNum = int(sep[2])
|
||||
PloadDic[ID] = PD[loadSideNum - 1]
|
||||
QloadDic[ID] = QD[loadSideNum - 1]
|
||||
LoadMapSingleton.PloadDic = PloadDic
|
||||
LoadMapSingleton.QloadDic = QloadDic
|
||||
else:
|
||||
PloadDic = LoadMapSingleton.PloadDic
|
||||
QloadDic = LoadMapSingleton.QloadDic
|
||||
#开始处理合并红的文件。方法是在合并的文件夹下面生成PD.txt和QD.txt,然后利用AddLoadToIpso类来添加。
|
||||
singleTransFile = singleFileDir + '/iPso_' + os.path.basename(singleFileDir) + '_TransformerInfor.txt'
|
||||
if not os.path.exists(singleTransFile):
|
||||
print('合并后的变压器信息文件不存在')
|
||||
return
|
||||
if AddLoadInterface is AddLoadToIpsoFile:
|
||||
absDatFile = singleFileDir + '/iPso_' + os.path.basename(singleFileDir) + '.txt'
|
||||
data = iPsoData(absDatFile)
|
||||
basicInfo = data.GetBasicInfo()
|
||||
totalNum = int(basicInfo[0][0])
|
||||
if AddLoadInterface is AddLoadToReconfigFile:
|
||||
absDatFile = singleFileDir + '/iPso_' + os.path.basename(singleFileDir) + '_DisnetReconfig.txt'
|
||||
data = ReconfigFileData(absDatFile)
|
||||
basicInfo = data.GetBasicInfo()
|
||||
totalNum = int(basicInfo[0][0])
|
||||
singlePD = [0 for i in range(totalNum)]
|
||||
singleQD = [0 for i in range(totalNum)]
|
||||
totalPD = 0
|
||||
with open(singleTransFile) as f:
|
||||
for line in f:
|
||||
newLine = line.strip()
|
||||
if len(newLine) == 0:
|
||||
continue
|
||||
sep = newLine.split(',')
|
||||
if len(sep) >= 6:
|
||||
ID = sep[5].strip()
|
||||
loadSideNum = int(sep[2])
|
||||
if ID in PloadDic.keys():
|
||||
singlePD[loadSideNum - 1] = PloadDic[ID]
|
||||
singleQD[loadSideNum - 1] = QloadDic[ID]
|
||||
else:
|
||||
singlePD[loadSideNum - 1] = 1e-8
|
||||
singleQD[loadSideNum - 1] = 1e-8
|
||||
totalPD += singlePD[loadSideNum - 1]
|
||||
singlePDFilePath = singleFileDir + '/PD.txt'
|
||||
singleQDFilePath = singleFileDir + '/QD.txt'
|
||||
PDf = open(singlePDFilePath, 'w')
|
||||
QDf = open(singleQDFilePath, 'w')
|
||||
if not PDf or not QDf:
|
||||
print('无法创建文件')
|
||||
return
|
||||
for i in range(len(singlePD)):
|
||||
PDf.write('%.10f\n' % singlePD[i])
|
||||
QDf.write('%.10f\n' % singleQD[i])
|
||||
if PDf:
|
||||
PDf.close()
|
||||
if QDf:
|
||||
QDf.close()
|
||||
AddLoadInterface(absDatFile)
|
||||
print('完成%s中负荷的添加' % (absDatFile))
|
||||
print('总的有功负荷为%f' % (totalPD))
|
||||
|
||||
|
||||
class ReconfigFileData: # 读入祝靖用的重构文件格式
|
||||
def __init__(self, filePath):
|
||||
currBlock = 1
|
||||
self.__basicInfo = []
|
||||
self.__subStationInfo = []
|
||||
self.__branchInfo = []
|
||||
self.__nodePowerInfo = []
|
||||
self.__interLineInfo = []
|
||||
with open(filePath) as f:
|
||||
for line in f:
|
||||
newLine = line.strip()
|
||||
sep = line.split(' ')
|
||||
if len(sep) > 0:
|
||||
if int(sep[0]) == 0:
|
||||
currBlock += 1
|
||||
continue
|
||||
if currBlock == 1:
|
||||
self.__basicInfo.append([int(sep[0]), int(sep[1])])
|
||||
continue
|
||||
if currBlock == 2:
|
||||
self.__subStationInfo.append([int(s) for s in sep])
|
||||
continue
|
||||
if currBlock == 3:
|
||||
self.__branchInfo.append([int(s) for s in sep])
|
||||
continue
|
||||
if currBlock == 7:
|
||||
self.__nodePowerInfo.append(
|
||||
[int(sep[0]), int(sep[1]), float(sep[2]), float(sep[3]), float(sep[4]), float(sep[5])])
|
||||
continue
|
||||
if currBlock == 9:
|
||||
t = [int(s) for s in sep[:-1]]
|
||||
t.append(float(sep[-1]))
|
||||
self.__interLineInfo.append(t)
|
||||
|
||||
def GetBasicInfo(self):
|
||||
return self.__basicInfo
|
||||
|
||||
def GetSubstation(self):
|
||||
return self.__subStationInfo
|
||||
|
||||
def GetBranchInfo(self):
|
||||
return self.__branchInfo
|
||||
|
||||
def GetNodePowerInfo(self):
|
||||
return self.__nodePowerInfo
|
||||
|
||||
def GetInterLineInfo(self):
|
||||
return self.__interLineInfo
|
||||
|
||||
def SaveTo(self, filePath):
|
||||
with open(filePath, 'w') as f:
|
||||
for i in self.__basicInfo:
|
||||
f.write('%d %d\n' % (i[0], i[1]))
|
||||
f.write('0\n')
|
||||
for i in self.__subStationInfo:
|
||||
f.write('%d %d\n' % (i[0], i[1]))
|
||||
f.write('0\n')
|
||||
for i in self.__branchInfo:
|
||||
f.write('%d %d %d\n' % (i[0], i[1], i[2]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for i in self.__nodePowerInfo:
|
||||
f.write('%d %d %f %f %f %f\n' % (i[0], i[1], i[2], i[3], i[4], i[5]))
|
||||
f.write('0\n')
|
||||
f.write('0\n')
|
||||
for i in self.__interLineInfo:
|
||||
f.write('%d %d %d %d\n' % (i[0], i[1], i[2], i[3]))
|
||||
f.write('0\n')
|
||||
|
||||
|
||||
class StdiPsoToZJ: # 把iPso的文件转换为祝靖要的格式
|
||||
def __init__(self, iPsoDatFile):
|
||||
iPsoDat = iPsoData(iPsoDatFile)
|
||||
self.__madeStructure = []
|
||||
madeStructure = self.__madeStructure
|
||||
basicInfo = iPsoDat.GetBasicInfo()
|
||||
madeStructure.append([basicInfo[0][0], basicInfo[0][1]])
|
||||
madeStructure.append([0])
|
||||
balanceInfo = iPsoDat.GetBalance()
|
||||
for i in balanceInfo:
|
||||
madeStructure.append([i[0], i[1]])
|
||||
madeStructure.append([0])
|
||||
lineInfo = iPsoDat.GetLine()
|
||||
for i in lineInfo:
|
||||
madeStructure.append([i[0], i[1], i[2]])
|
||||
transInfo = iPsoDat.GetTrans()
|
||||
for i in transInfo:
|
||||
madeStructure.append([i[0], i[2], i[3]])
|
||||
madeStructure.append([0])
|
||||
madeStructure.append([0])
|
||||
madeStructure.append([0])
|
||||
madeStructure.append([0])
|
||||
loadInfo = iPsoDat.GetNodePower()
|
||||
loadInfo[int(basicInfo[0][1])][4] = 100
|
||||
loadInfo[int(basicInfo[0][1])][5] = 100
|
||||
for i in loadInfo:
|
||||
madeStructure.append([i[0], i[2], i[4], i[5], i[6], i[7]])
|
||||
madeStructure.append([0])
|
||||
madeStructure.append([0])
|
||||
#可重构支路
|
||||
for i in lineInfo:
|
||||
madeStructure.append([i[0], i[1], i[2], 1])
|
||||
madeStructure.append([0])
|
||||
|
||||
def Save(self, saveTo):
|
||||
with open(saveTo, 'w') as f:
|
||||
seperator = '\t'
|
||||
madeStructure = self.__madeStructure
|
||||
for i in madeStructure:
|
||||
strI = [str(j) for j in i]
|
||||
newLine = seperator.join(strI)
|
||||
f.write(newLine)
|
||||
f.write('\n')
|
||||
|
||||
|
||||
class NodeLoadMapBatch:
|
||||
def __init__(self, mappingFileDir, mappedFileDir,
|
||||
AddLoadInterface=AddLoadToIpsoFile): # mappingFileDir是有负荷的文件夹的上级目录,mappedFileDir是被填充的文件夹的上级目录
|
||||
dirList = os.listdir(mappedFileDir)
|
||||
for d in dirList:
|
||||
absDir = mappedFileDir + '/' + d
|
||||
if os.path.isdir(absDir):
|
||||
NodeLoadMap(mappingFileDir, absDir, AddLoadInterface)
|
||||
|
||||
|
||||
class ConnectionSwitch:
|
||||
def __init__(self, switchFile):
|
||||
if not os.path.exists(switchFile):
|
||||
raise Exception('swtich file not exists!')
|
||||
self.__switch = []
|
||||
with open(switchFile) as f:
|
||||
for line in f:
|
||||
newLine = line.strip()
|
||||
sep = newLine.split(',')
|
||||
if len(sep) == 0:
|
||||
continue
|
||||
if len(sep) == 4:
|
||||
self.__switch.append(sep)
|
||||
|
||||
def GetSwtich(self):
|
||||
return self.__switch
|
||||
|
||||
|
||||
class BuildReconfigurationArea: # 依据重构开关吧,把需要重构的文件准备好,拷贝到一个目录下
|
||||
def __init__(self, baseDir, switchDir,
|
||||
distFilePoolDir): #baseDir 是拷贝到的文件夹,switchDir是重构开关的文件夹,都是txt文件 distFilePoolDir是所有配网文件的目录
|
||||
self.__getDistFiles(distFilePoolDir)
|
||||
allSwitchFile = self.__GetAllSwtichFile(switchDir)
|
||||
for a in allSwitchFile:
|
||||
print('正在利用%s' % a)
|
||||
absDir = baseDir + '/' + os.path.splitext(os.path.basename(a))[0]
|
||||
#先删除原来就有的目录
|
||||
#if os.path.exists(absDir):
|
||||
# pass
|
||||
#shutil.rmtree(absDir)
|
||||
#建立一个新文件夹
|
||||
if not os.path.exists(absDir):
|
||||
distutils.dir_util.mkpath(absDir)
|
||||
switch = ConnectionSwitch(a)
|
||||
dupLineNam = [] #有重复的线路文件名称
|
||||
for s in switch.GetSwtich():
|
||||
dupLineNam.append(s[0])
|
||||
dupLineNam.append(s[2])
|
||||
uniqueLineName = set(dupLineNam)
|
||||
for u in uniqueLineName:
|
||||
try:
|
||||
copyTargetDir = absDir + '/' + os.path.basename(self.__distFileDic[u])
|
||||
if os.path.exists(copyTargetDir):
|
||||
shutil.rmtree(copyTargetDir)
|
||||
except Exception as e:
|
||||
print(a)
|
||||
print(e)
|
||||
srcDirPath = self.__distFileDic[u]
|
||||
shutil.copytree(srcDirPath, copyTargetDir, True)
|
||||
#然后再考新文件
|
||||
#拷贝联络开关文件
|
||||
|
||||
shutil.copy(a, absDir + '/breaker.txt')
|
||||
print('Build ReconfigurationArea Finished!')
|
||||
|
||||
def __getDistFiles(self, distFilePoolDir):
|
||||
dirList = os.listdir(distFilePoolDir)
|
||||
self.__distFileDic = {}
|
||||
for d in dirList:
|
||||
absDir = distFilePoolDir + '/' + d
|
||||
if not os.path.isdir(absDir):
|
||||
continue
|
||||
lineName = self.__getLineName(absDir)
|
||||
self.__distFileDic[lineName] = absDir
|
||||
|
||||
def __getLineName(self, linePath):
|
||||
baseName = os.path.basename(linePath)
|
||||
fileName = os.path.splitext(baseName)[0]
|
||||
lineName = fileName.split('_')[0]
|
||||
return lineName
|
||||
|
||||
def __GetAllSwtichFile(self, switchDir):
|
||||
dirList = os.listdir(switchDir)
|
||||
for d in dirList:
|
||||
absFilePath = switchDir + '/' + d
|
||||
if os.path.isfile(absFilePath):
|
||||
yield absFilePath
|
||||
|
||||
|
||||
class TargetDir:
|
||||
def __init__(self, dir):
|
||||
dirList = os.listdir(dir)
|
||||
opFileList = []
|
||||
for d in dirList:
|
||||
opDirPath = dir + '/' + d # 操作文件夹
|
||||
if os.path.isdir(opDirPath):
|
||||
opFile = opDirPath + '/iPso_' + d + '.txt'
|
||||
if not os.path.exists(opFile):
|
||||
print('文件 %s 不存在' % (opFile))
|
||||
opFileList.append(opFile)
|
||||
self.__opFileList = opFileList
|
||||
|
||||
def GetOpFileList(self):
|
||||
print('文件顺序为:')
|
||||
for o in self.__opFileList:
|
||||
print(o)
|
||||
return self.__opFileList
|
||||
|
||||
|
||||
class MergeReconfigBatch:
|
||||
def __init__(self, baseDir):
|
||||
listDir = os.listdir(baseDir)
|
||||
for l in listDir:
|
||||
absDir = baseDir + '/' + l
|
||||
if not os.path.isdir(absDir):
|
||||
continue
|
||||
# 清除旧文件
|
||||
self.__delOldFiles(absDir)
|
||||
opDirList = TargetDir(absDir)
|
||||
a = MergeReconfigFile(opDirList.GetOpFileList())
|
||||
if a.GetCanReconfig():
|
||||
a.Output(absDir + '/合并后iPso文件.txt')
|
||||
else:
|
||||
print('%s不满足重构条件' % absDir)
|
||||
|
||||
def __delOldFiles(self, dir):
|
||||
files = os.listdir(dir)
|
||||
for f in files:
|
||||
absFile = dir + '/' + f
|
||||
if not os.path.isfile(absFile):
|
||||
continue
|
||||
if f == 'breaker.txt':
|
||||
continue
|
||||
if f == 'output.txt':
|
||||
continue
|
||||
os.remove(absFile)
|
||||
# opDirList=TargetDir(r'C:\lz/test3')
|
||||
#a=MergeReconfigFile(opDirList.GetOpFileList())
|
||||
#a.Output('c:/lz/test3/合并后iPso文件.txt')
|
||||
|
||||
|
||||
class IslandedReconfig: # 有孤岛的重构文件
|
||||
def __init__(self, origFile, removedLine):
|
||||
reconfigFile = ReconfigFileData(origFile)
|
||||
removedLineDic = {}
|
||||
with open(removedLine) as f:
|
||||
for line in f:
|
||||
newLine = line.strip()
|
||||
sep = newLine.split(' ')
|
||||
if len(sep) == 0:
|
||||
continue
|
||||
if len(sep) >= 3:
|
||||
key = sep[0] + '_' + sep[1]
|
||||
removedLineDic[key] = 1
|
||||
branch = reconfigFile.GetBranchInfo()
|
||||
for i in branch[:]:
|
||||
key = str(i[1]) + '_' + str(i[2])
|
||||
if key in removedLineDic.keys():
|
||||
branch.remove(i)
|
||||
dirName = os.path.dirname(origFile)
|
||||
reconfigFile.SaveTo(dirName + '/断线后Reconfig.txt')
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
__author__ = 'dmy'
|
||||
|
||||
from FileData import *
|
||||
|
||||
if __name__=='__main__':
|
||||
fileList=[r"D:\MyPro\cimforreduceloss\testHasttable\output\pan\701港前南线.txt",r"D:\MyPro\cimforreduceloss\testHasttable\output\pan\702高尔夫I线.txt"]
|
||||
m=MergeReconfigFile(fileList)
|
||||
m.Output(r'D:\MyPro\cimforreduceloss\testHasttable\output\merge')
|
||||
|
|
@ -221,7 +221,7 @@ void CIMExporter::exportTo(const QString& path,const QString &rootID)
|
|||
writer<<1<<seperator;
|
||||
writer<<endLine;
|
||||
//保存接地支路
|
||||
groudBranch.push_back(CIMExporter::GroundBranch(ite->toNum, ite->tf->g1,ite->tf->b1));//都只用g1,b1的数据
|
||||
groudBranch.push_back(CIMExporter::GroundBranch(ite->fromNum, ite->tf->g1,ite->tf->b1));//都只用g1,b1的数据
|
||||
|
||||
|
||||
LoadMapping loadMapping;
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ void Task::doAgainstTaskFile(ElementHashtable &eleHT)
|
|||
eleHT.GoPath();
|
||||
eleHT.ExportTo(QString("D:/MyPro/cimforreduceloss/testHasttable/output/pan/")+sep.at(0)+".txt");
|
||||
eleHT.ShowContainerInfo(lineName);
|
||||
break;
|
||||
// break;
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue