cloudpss 4.1.1b8__py3-none-any.whl → 4.1.1b9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cloudpss/asyncio/__init__.py +8 -0
- cloudpss/asyncio/job/__init__.py +5 -0
- cloudpss/asyncio/job/job.py +116 -0
- cloudpss/asyncio/job/messageStreamReceiver.py +121 -0
- cloudpss/asyncio/job/messageStreamSender.py +45 -0
- cloudpss/asyncio/model/__init__.py +5 -0
- cloudpss/asyncio/model/model.py +257 -0
- cloudpss/asyncio/model/revision.py +41 -0
- cloudpss/asyncio/model/topology.py +34 -0
- cloudpss/asyncio/utils/__init__.py +6 -0
- cloudpss/{utils → asyncio/utils}/httpAsyncRequest.py +2 -2
- cloudpss/dslab/dslab.py +115 -21
- cloudpss/function/functionExecution.py +10 -0
- cloudpss/ieslab/DataManageModel.py +65 -16
- cloudpss/ieslab/IESLabPlan.py +78 -0
- cloudpss/ieslab/IESLabSimulation.py +59 -32
- cloudpss/ieslab/PlanModel.py +11 -7
- cloudpss/job/job.py +119 -132
- cloudpss/job/jobReceiver.py +7 -1
- cloudpss/job/messageStreamReceiver.py +42 -99
- cloudpss/job/messageStreamSender.py +5 -42
- cloudpss/job/view/EMTView.py +9 -11
- cloudpss/job/view/IESLabTypicalDayView.py +114 -5
- cloudpss/job/view/view.py +36 -7
- cloudpss/model/implements/diagram.py +113 -0
- cloudpss/model/jobDefinitions.py +6 -6
- cloudpss/model/model.py +181 -193
- cloudpss/model/revision.py +29 -34
- cloudpss/model/topology.py +12 -14
- cloudpss/runner/MessageStreamReceiver.py +2 -0
- cloudpss/utils/httprequests.py +6 -5
- cloudpss/version.py +1 -1
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.dist-info}/METADATA +1 -1
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.dist-info}/RECORD +37 -31
- cloudpss/job/jobMachine.py +0 -11
- cloudpss/job/jobPolicy.py +0 -129
- cloudpss/job/jobQueue.py +0 -14
- cloudpss/job/jobTres.py +0 -6
- /cloudpss/{utils → asyncio/utils}/AsyncIterable.py +0 -0
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.dist-info}/WHEEL +0 -0
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.1.1b9.dist-info}/top_level.txt +0 -0
cloudpss/dslab/dslab.py
CHANGED
@@ -76,71 +76,165 @@ class DSLab(object):
|
|
76
76
|
'''
|
77
77
|
return self.financialAnalysisModel.run(planID)
|
78
78
|
|
79
|
+
def runPowerFlow(self,job=None,name=None, **kwargs)->Runner[IESResult]:
|
80
|
+
'''
|
81
|
+
运行 时序潮流方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
82
|
+
|
83
|
+
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
84
|
+
:params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
79
85
|
|
80
|
-
|
86
|
+
:return: runner Runner[IESResult]
|
81
87
|
'''
|
82
|
-
|
88
|
+
rid = 'function/CloudPSS/ieslab-power-flow'
|
89
|
+
if job is None:
|
90
|
+
currentJob = self.model.context['currentJob']
|
91
|
+
job = self.model.jobs[currentJob]
|
92
|
+
if job['rid'] != rid:
|
93
|
+
for j in self.model.jobs:
|
94
|
+
if j['rid'] == rid:
|
95
|
+
job = j
|
96
|
+
if job is None:
|
97
|
+
raise Exception("找不到时序潮流方案内核运行的计算方案")
|
98
|
+
if job['rid'] != rid:
|
99
|
+
raise Exception("不是时序潮流方案内核运行生成算法的计算方案")
|
100
|
+
return self.run(job=job, name=name)
|
101
|
+
|
102
|
+
def runESS(self,job=None,name=None, **kwargs)->Runner[IESResult]:
|
103
|
+
'''
|
104
|
+
运行 储能规划方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
83
105
|
|
84
106
|
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
85
107
|
:params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
86
108
|
|
87
109
|
:return: runner Runner[IESResult]
|
88
110
|
'''
|
111
|
+
rid = 'function/CloudPSS/ieslab-energy-storage-plan'
|
89
112
|
if job is None:
|
90
113
|
currentJob = self.model.context['currentJob']
|
91
114
|
job = self.model.jobs[currentJob]
|
92
|
-
if job['rid'] !=
|
115
|
+
if job['rid'] != rid:
|
93
116
|
for j in self.model.jobs:
|
94
|
-
if j['rid'] ==
|
117
|
+
if j['rid'] == rid:
|
95
118
|
job = j
|
96
119
|
if job is None:
|
97
|
-
raise Exception("
|
98
|
-
if job['rid'] !=
|
99
|
-
raise Exception("
|
120
|
+
raise Exception("找不到储能规划方案内核运行的计算方案")
|
121
|
+
if job['rid'] != rid:
|
122
|
+
raise Exception("不是储能规划方案内核运行生成算法的计算方案")
|
123
|
+
return self.run(job=job, name=name)
|
124
|
+
|
125
|
+
def runShortCurrent(self,job=None,name=None, **kwargs)->Runner[IESResult]:
|
126
|
+
'''
|
127
|
+
运行 短路电流计算 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
128
|
+
|
129
|
+
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
130
|
+
:params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
131
|
+
|
132
|
+
:return: runner Runner[IESResult]
|
133
|
+
'''
|
134
|
+
rid = 'function/CloudPSS/short-circuit-current-calculation'
|
135
|
+
if job is None:
|
136
|
+
currentJob = self.model.context['currentJob']
|
137
|
+
job = self.model.jobs[currentJob]
|
138
|
+
if job['rid'] != rid:
|
139
|
+
for j in self.model.jobs:
|
140
|
+
if j['rid'] == rid:
|
141
|
+
job = j
|
142
|
+
if job is None:
|
143
|
+
raise Exception("找不到短路电流计算方案内核运行的计算方案")
|
144
|
+
if job['rid'] != rid:
|
145
|
+
raise Exception("不是短路电流计算方案内核运行生成算法的计算方案")
|
100
146
|
return self.run(job=job, name=name)
|
101
147
|
|
102
|
-
def
|
148
|
+
def runReliability(self,job=None,name=None, **kwargs)->Runner[IESResult]:
|
103
149
|
'''
|
104
|
-
运行
|
150
|
+
运行 可靠性分析 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
105
151
|
|
106
152
|
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
107
153
|
:params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
108
154
|
|
109
155
|
:return: runner Runner[IESResult]
|
110
156
|
'''
|
157
|
+
rid = 'function/CloudPSS/reliability-calculation'
|
111
158
|
if job is None:
|
112
159
|
currentJob = self.model.context['currentJob']
|
113
160
|
job = self.model.jobs[currentJob]
|
114
|
-
if job['rid'] !=
|
161
|
+
if job['rid'] != rid:
|
115
162
|
for j in self.model.jobs:
|
116
|
-
if j['rid'] ==
|
163
|
+
if j['rid'] == rid:
|
117
164
|
job = j
|
118
165
|
if job is None:
|
119
|
-
raise Exception("
|
120
|
-
if job['rid'] !=
|
121
|
-
raise Exception("
|
166
|
+
raise Exception("找不到可靠性分析计算方案内核运行的计算方案")
|
167
|
+
if job['rid'] != rid:
|
168
|
+
raise Exception("不是可靠性分析计算方案内核运行生成算法的计算方案")
|
122
169
|
return self.run(job=job, name=name)
|
170
|
+
|
171
|
+
def runStaticAnalysis(self,job=None,name=None, **kwargs)->Runner[IESResult]:
|
172
|
+
'''
|
173
|
+
运行 静态安全性分析 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
174
|
+
|
175
|
+
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
176
|
+
:params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
123
177
|
|
124
|
-
|
178
|
+
:return: runner Runner[IESResult]
|
125
179
|
'''
|
126
|
-
|
180
|
+
rid = 'function/CloudPSS/static-security-analysis'
|
181
|
+
if job is None:
|
182
|
+
currentJob = self.model.context['currentJob']
|
183
|
+
job = self.model.jobs[currentJob]
|
184
|
+
if job['rid'] != rid:
|
185
|
+
for j in self.model.jobs:
|
186
|
+
if j['rid'] == rid:
|
187
|
+
job = j
|
188
|
+
if job is None:
|
189
|
+
raise Exception("找不到静态安全性分析计算方案内核运行的计算方案")
|
190
|
+
if job['rid'] != rid:
|
191
|
+
raise Exception("不是静态安全性分析计算方案内核运行生成算法的计算方案")
|
192
|
+
return self.run(job=job, name=name)
|
193
|
+
|
194
|
+
def runRPO(self,job=None,name=None, **kwargs)->Runner[IESResult]:
|
195
|
+
'''
|
196
|
+
运行 无功优化 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
127
197
|
|
128
198
|
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
129
199
|
:params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
130
200
|
|
131
201
|
:return: runner Runner[IESResult]
|
132
202
|
'''
|
203
|
+
rid = 'function/CloudPSS/reactive-power-optimization'
|
133
204
|
if job is None:
|
134
205
|
currentJob = self.model.context['currentJob']
|
135
206
|
job = self.model.jobs[currentJob]
|
136
|
-
if job['rid'] !=
|
207
|
+
if job['rid'] != rid:
|
137
208
|
for j in self.model.jobs:
|
138
|
-
if j['rid'] ==
|
209
|
+
if j['rid'] == rid:
|
139
210
|
job = j
|
140
211
|
if job is None:
|
141
|
-
raise Exception("
|
142
|
-
if job['rid'] !=
|
143
|
-
raise Exception("
|
212
|
+
raise Exception("找不到无功优化计算方案内核运行的计算方案")
|
213
|
+
if job['rid'] != rid:
|
214
|
+
raise Exception("不是无功优化计算方案内核运行生成算法的计算方案")
|
215
|
+
return self.run(job=job, name=name)
|
216
|
+
|
217
|
+
def runLoadForecast(self,job=None,name=None, **kwargs)->Runner[IESResult]:
|
218
|
+
'''
|
219
|
+
运行 负荷预测方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
220
|
+
|
221
|
+
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
222
|
+
:params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
223
|
+
|
224
|
+
:return: runner Runner[IESResult]
|
225
|
+
'''
|
226
|
+
rid = 'function/CloudPSS/ieslab-load-prediction'
|
227
|
+
if job is None:
|
228
|
+
currentJob = self.model.context['currentJob']
|
229
|
+
job = self.model.jobs[currentJob]
|
230
|
+
if job['rid'] != rid:
|
231
|
+
for j in self.model.jobs:
|
232
|
+
if j['rid'] == rid:
|
233
|
+
job = j
|
234
|
+
if job is None:
|
235
|
+
raise Exception("找不到负荷预测方案内核运行的计算方案")
|
236
|
+
if job['rid'] != rid:
|
237
|
+
raise Exception("不是负荷预测方案内核运行生成算法的计算方案")
|
144
238
|
return self.run(job=job, name=name)
|
145
239
|
|
146
240
|
@staticmethod
|
@@ -396,4 +396,14 @@ class FunctionExecution(object):
|
|
396
396
|
'yAxis': layout.get('yaxis', {}),
|
397
397
|
}
|
398
398
|
}
|
399
|
+
self.print(result)
|
400
|
+
|
401
|
+
def custom(self, data, key=None,verb='replace'):
|
402
|
+
result = {
|
403
|
+
'key': key,
|
404
|
+
'version': 1,
|
405
|
+
'verb': verb,
|
406
|
+
'type': 'custom',
|
407
|
+
'data': data
|
408
|
+
}
|
399
409
|
self.print(result)
|
@@ -83,26 +83,50 @@ class DataManageModel(object):
|
|
83
83
|
|
84
84
|
:return: 无
|
85
85
|
'''
|
86
|
-
|
87
|
-
|
88
|
-
|
86
|
+
try:
|
87
|
+
r = request('GET',
|
88
|
+
self._dataManageUrl,
|
89
|
+
params={
|
90
|
+
"simulationId": self.simulationId
|
91
|
+
,
|
92
|
+
})
|
93
|
+
data = json.loads(r.text)
|
94
|
+
info = data['info']
|
95
|
+
for kind,value in info.items():
|
96
|
+
if kind =='Weather':
|
97
|
+
continue
|
98
|
+
|
99
|
+
for k,data in value.items():
|
100
|
+
self._kindItemDataMap[k]=value
|
101
|
+
for val in data:
|
102
|
+
self._itemDataMap[str(val['timeid'])]=val
|
103
|
+
self._itemDataMap[str(val['id'])]=val
|
104
|
+
self._kindIdMap[str(val['timeid'])]=k
|
105
|
+
self._kindIdMap[str(val['id'])]=k
|
106
|
+
except Exception as e:
|
107
|
+
print('获取数据失败',e)
|
108
|
+
pass
|
109
|
+
|
110
|
+
# list = ['thermalLoads', 'electricLoads', 'fuels', 'typhoon', 'rainfall', 'earthquake', 'extremeCold']
|
111
|
+
# for kind,value in self._kindUrlMap.items():
|
112
|
+
# try:
|
89
113
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
114
|
+
# if kind in list:
|
115
|
+
# dataList = self._fetchItemData(self._kindUrlMap[kind], None)
|
116
|
+
# else:
|
117
|
+
# dataList = self._fetchItemData(self._kindUrlMap[kind], kind)
|
118
|
+
# except Exception as e:
|
119
|
+
# pass
|
120
|
+
# self._kindItemDataMap[kind]=dataList
|
121
|
+
# for val in dataList:
|
122
|
+
# self._itemDataMap[str(val['timeid'])]=val
|
123
|
+
# self._itemDataMap[str(val['id'])]=val
|
124
|
+
# self._kindIdMap[str(val['timeid'])]=kind
|
125
|
+
# self._kindIdMap[str(val['id'])]=kind
|
102
126
|
|
103
127
|
def GetDataItem(self, ID: str):
|
104
128
|
'''
|
105
|
-
获取ID
|
129
|
+
获取ID对应的数据信息
|
106
130
|
|
107
131
|
:params: ID string类型,代表数据项的标识符,可以在所有类型的数据项中实现唯一标识
|
108
132
|
|
@@ -281,11 +305,35 @@ class DataManageModel(object):
|
|
281
305
|
})
|
282
306
|
weatherData = json.loads(r.text)
|
283
307
|
return weatherData['results']
|
308
|
+
|
309
|
+
def UpdateAtmosData(self, data):
|
310
|
+
'''
|
311
|
+
更新气象数据
|
312
|
+
:data: list类型,表示数据内容,其数据结构应满足对应数据项的满足如下结构要求:
|
313
|
+
"lat": string类型 坐标纬度
|
314
|
+
"lng": string类型 坐标经度
|
315
|
+
"time": string类型 表示时间 需满足格式YYYY-MM-DD hh:mm:ss 如"2016-01-01 00:00:00"
|
316
|
+
"t10m": string类型 表示环境温度(℃)
|
317
|
+
"lwgab_swgdn": string类型 表示太阳辐射强度(W/m2)
|
318
|
+
"u10m": string类型 距地面10m处东向风速(m/s)
|
319
|
+
"u50m": string类型 距地面50m处东向风速(m/s)
|
320
|
+
"v10m": string类型 距地面10m处北向风速(m/s)
|
321
|
+
"v50m": string类型 距地面50m处北向风速(m/s)
|
322
|
+
"adj_sfc_sw_direct_all_1h": string类型 短波直射强度(W/m²)
|
323
|
+
"adj_sfc_sw_diff_all_1h": string类型 短波散射强度(W/m²)
|
324
|
+
"solar_zen_angle_1h": string类型 太阳天顶角°
|
325
|
+
:return: bool 类型,返回True 更新成功
|
326
|
+
'''
|
327
|
+
r = request('POST',
|
328
|
+
self._weatherUrl,
|
329
|
+
data=json.dumps({"sid":self.simulationId, "data":data}))
|
330
|
+
return r.ok
|
284
331
|
|
285
332
|
|
286
333
|
class IESSimulationDataManageModel(DataManageModel):
|
287
334
|
_baseUri = 'api/ieslab-simulation/'
|
288
335
|
_weatherUrl = 'api/ieslab-simulation/rest/weather_data/'
|
336
|
+
_dataManageUrl = 'api/ieslab-simulation/editor/data_manage/'
|
289
337
|
_kindNameMap = {
|
290
338
|
"光伏": "PhotovoltaicSys",
|
291
339
|
"风机": "WindPowerGenerator",
|
@@ -352,6 +400,7 @@ class IESSimulationDataManageModel(DataManageModel):
|
|
352
400
|
class IESPlanDataManageModel(DataManageModel):
|
353
401
|
_baseUri = 'api/ieslab-plan/'
|
354
402
|
_weatherUrl = 'api/ieslab-plan/rest/weather_data/'
|
403
|
+
_dataManageUrl = 'api/ieslab-plan/editor/data_manage/'
|
355
404
|
_kindNameMap = {
|
356
405
|
"光伏": "PhotovoltaicSys",
|
357
406
|
"风机": "WindPowerGenerator",
|
cloudpss/ieslab/IESLabPlan.py
CHANGED
@@ -130,3 +130,81 @@ class IESLabPlan(object):
|
|
130
130
|
:return: Boolean
|
131
131
|
'''
|
132
132
|
return self.planModel.kill()
|
133
|
+
|
134
|
+
@staticmethod
|
135
|
+
def createProjectGroup(group_name, desc=None, createById=None):
|
136
|
+
'''
|
137
|
+
创建项目组
|
138
|
+
|
139
|
+
:params group_name: String 项目组名称
|
140
|
+
:params desc: String 项目组描述 可选参数
|
141
|
+
:params createById Int 父项目组id 可选参数,如果是从已有项目组导入的项目组,必填此项
|
142
|
+
|
143
|
+
:return: Int 返回创建的项目组id
|
144
|
+
'''
|
145
|
+
try:
|
146
|
+
if createById is None:
|
147
|
+
isImport = 0
|
148
|
+
else:
|
149
|
+
isImport = 1
|
150
|
+
payload = {
|
151
|
+
'group_name': group_name,
|
152
|
+
'desc': desc,
|
153
|
+
'isImport': isImport,
|
154
|
+
'createById': createById,
|
155
|
+
}
|
156
|
+
r = request(
|
157
|
+
'POST', 'api/ieslab-plan/rest/projectgroup/', data=json.dumps(payload))
|
158
|
+
project = json.loads(r.text)
|
159
|
+
return project.get('id', None)
|
160
|
+
except Exception as e:
|
161
|
+
raise Exception('创建项目组失败')
|
162
|
+
|
163
|
+
@staticmethod
|
164
|
+
def createProject(name, project_group, start_date, end_date, construction_cycle, desc=None, createById=None):
|
165
|
+
'''
|
166
|
+
创建项目
|
167
|
+
|
168
|
+
:params name: String 项目名称
|
169
|
+
:params project_group: Int 父项目组id
|
170
|
+
:param start_date: Int 项目开始年限,范围在[1500,3000]之间
|
171
|
+
:param end_date: Int 项目结束年限,范围在项目开始时间之后且不超过五十年
|
172
|
+
:param construction_cycle: Int 项目建设周期(年), 必须小于等于 项目结束年限 - 项目开始年限
|
173
|
+
:params desc: String 项目描述, 可选参数
|
174
|
+
:params createById Int 父项目id, 可选参数, 如果是从已有项目导入的项目,必填此项
|
175
|
+
|
176
|
+
:return: Int 返回创建的项目id
|
177
|
+
'''
|
178
|
+
try:
|
179
|
+
if start_date < 1500 or start_date > 3000:
|
180
|
+
raise Exception('项目开始年限错误,范围在[1500,3000]之间')
|
181
|
+
if end_date < start_date or end_date > start_date + 50:
|
182
|
+
raise Exception('项目结束年限错误,范围在项目开始时间之后且不超过五十年')
|
183
|
+
if construction_cycle > end_date - start_date:
|
184
|
+
raise Exception('项目建设周期错误,必须小于等于 项目结束年限 - 项目开始年限')
|
185
|
+
if createById is None:
|
186
|
+
payload = {
|
187
|
+
'name': name,
|
188
|
+
'project_group': project_group,
|
189
|
+
'start_date': start_date,
|
190
|
+
'end_date': end_date,
|
191
|
+
'construction_cycle': construction_cycle,
|
192
|
+
'desc': desc
|
193
|
+
}
|
194
|
+
else:
|
195
|
+
payload = {
|
196
|
+
'name': name,
|
197
|
+
'project_group': project_group,
|
198
|
+
'start_date': start_date,
|
199
|
+
'end_date': end_date,
|
200
|
+
'construction_cycle': construction_cycle,
|
201
|
+
'desc': desc,
|
202
|
+
'createById': createById
|
203
|
+
}
|
204
|
+
r = request(
|
205
|
+
'POST', 'api/ieslab-plan/rest/simu/', data=json.dumps(payload))
|
206
|
+
project = json.loads(r.text)
|
207
|
+
return project.get('id', None)
|
208
|
+
except Exception as e:
|
209
|
+
raise Exception('创建项目失败')
|
210
|
+
|
@@ -5,7 +5,7 @@ from .DataManageModel import IESSimulationDataManageModel
|
|
5
5
|
|
6
6
|
|
7
7
|
class IESLabSimulation(object):
|
8
|
-
def __init__(self, project={},model=None):
|
8
|
+
def __init__(self, project={},model:Model=None):
|
9
9
|
'''
|
10
10
|
初始化
|
11
11
|
'''
|
@@ -36,26 +36,7 @@ class IESLabSimulation(object):
|
|
36
36
|
return IESLabSimulation(project,model)
|
37
37
|
except:
|
38
38
|
raise Exception('未查询到当前算例')
|
39
|
-
|
40
|
-
async def fetchAsync(simulationId):
|
41
|
-
'''
|
42
|
-
获取算例信息
|
43
|
-
|
44
|
-
:params: simulationId string类型,代表数据项的算例id
|
45
|
-
|
46
|
-
:return: IESLabSimulation
|
47
|
-
'''
|
48
|
-
try:
|
49
|
-
r = request(
|
50
|
-
'GET', 'api/ieslab-simulation/rest/simu/{0}/'.format(simulationId))
|
51
|
-
project = json.loads(r.text)
|
52
|
-
modelRid = project.get('model', None)
|
53
|
-
model=None
|
54
|
-
if modelRid is not None:
|
55
|
-
model =await Model.fetchAsync(modelRid)
|
56
|
-
return IESLabSimulation(project,model)
|
57
|
-
except:
|
58
|
-
raise Exception('未查询到当前算例')
|
39
|
+
|
59
40
|
def run(self, job=None, name=None):
|
60
41
|
'''
|
61
42
|
调用仿真
|
@@ -71,19 +52,65 @@ class IESLabSimulation(object):
|
|
71
52
|
|
72
53
|
job['args']['simulationId'] = self.id
|
73
54
|
return self.model.run(job, name=name)
|
74
|
-
|
75
|
-
|
55
|
+
|
56
|
+
@staticmethod
|
57
|
+
def createProjectGroup(group_name, desc=None, createById=None):
|
76
58
|
'''
|
77
|
-
|
59
|
+
创建项目组
|
78
60
|
|
79
|
-
:params
|
80
|
-
:params
|
61
|
+
:params group_name: String 项目组名称
|
62
|
+
:params desc: String 项目组描述 可选参数
|
63
|
+
:params createById Int 父项目组id 可选参数,如果是从已有项目组导入的项目组,必填此项
|
81
64
|
|
82
|
-
:return:
|
65
|
+
:return: Int 返回创建的项目组id
|
83
66
|
'''
|
84
|
-
|
85
|
-
|
86
|
-
|
67
|
+
try:
|
68
|
+
if createById is None:
|
69
|
+
isImport = 0
|
70
|
+
else:
|
71
|
+
isImport = 1
|
72
|
+
payload = {
|
73
|
+
'group_name': group_name,
|
74
|
+
'desc': desc,
|
75
|
+
'isImport': isImport,
|
76
|
+
'createById': createById,
|
77
|
+
}
|
78
|
+
r = request(
|
79
|
+
'POST', 'api/ieslab-simulation/rest/projectgroup/', data=json.dumps(payload))
|
80
|
+
project = json.loads(r.text)
|
81
|
+
return project.get('id', None)
|
82
|
+
except Exception as e:
|
83
|
+
raise Exception('创建项目组失败')
|
87
84
|
|
88
|
-
|
89
|
-
|
85
|
+
@staticmethod
|
86
|
+
def createProject(name, project_group, desc=None, createById=None):
|
87
|
+
'''
|
88
|
+
创建项目
|
89
|
+
|
90
|
+
:params name: String 项目名称
|
91
|
+
:params project_group: Int 父项目组id,
|
92
|
+
:params desc: String 项目描述, 可选参数
|
93
|
+
:params createById Int 父项目id, 可选参数, 如果是从已有项目导入的项目,必填此项
|
94
|
+
|
95
|
+
:return: Int 返回创建的项目id
|
96
|
+
'''
|
97
|
+
try:
|
98
|
+
if createById is None:
|
99
|
+
payload = {
|
100
|
+
'name': name,
|
101
|
+
'project_group': project_group,
|
102
|
+
'desc': desc
|
103
|
+
}
|
104
|
+
else:
|
105
|
+
payload = {
|
106
|
+
'name': name,
|
107
|
+
'project_group': project_group,
|
108
|
+
'desc': desc,
|
109
|
+
'createById': createById
|
110
|
+
}
|
111
|
+
r = request(
|
112
|
+
'POST', 'api/ieslab-simulation/rest/simu/', data=json.dumps(payload))
|
113
|
+
project = json.loads(r.text)
|
114
|
+
return project.get('id', None)
|
115
|
+
except Exception as e:
|
116
|
+
raise Exception('创建项目失败')
|
cloudpss/ieslab/PlanModel.py
CHANGED
@@ -41,7 +41,7 @@ class IESLabPlanModel(object):
|
|
41
41
|
except:
|
42
42
|
return OptimizationMode['经济性']
|
43
43
|
|
44
|
-
def SetOptimizationInfo(self,
|
44
|
+
def SetOptimizationInfo(self, optType):
|
45
45
|
'''
|
46
46
|
无对应接口
|
47
47
|
设置当前算例的优化目标
|
@@ -128,12 +128,16 @@ class IESLabPlanModel(object):
|
|
128
128
|
status = data.get('status', '')
|
129
129
|
if status == 'stop':
|
130
130
|
isRunning = False
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
131
|
+
try:
|
132
|
+
|
133
|
+
logs = IESLabPlanResult(self.simulationId).GetLogs()
|
134
|
+
if logs is not None:
|
135
|
+
for log in logs:
|
136
|
+
if(log.get('data', '') == 'run ends'):
|
137
|
+
isRunning = False
|
138
|
+
break
|
139
|
+
except:
|
140
|
+
return False
|
137
141
|
return isRunning
|
138
142
|
|
139
143
|
|