cloudpss 4.1.1b8__py3-none-any.whl → 4.5.0__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/__init__.py +2 -3
- 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/function/functionExecution.py +36 -3
- cloudpss/ieslab/DataManageModel.py +131 -9
- cloudpss/ieslab/EvaluationModel.py +80 -9
- cloudpss/ieslab/IESLabOpt.py +235 -0
- cloudpss/ieslab/IESLabPlan.py +82 -4
- cloudpss/ieslab/IESLabSimulation.py +59 -32
- cloudpss/ieslab/PlanModel.py +276 -33
- cloudpss/ieslab/__init__.py +2 -1
- cloudpss/job/job.py +136 -141
- cloudpss/job/jobReceiver.py +8 -2
- cloudpss/job/messageStreamReceiver.py +42 -99
- cloudpss/job/messageStreamSender.py +5 -42
- cloudpss/job/{view/EMTView.py → result/EMTResult.py} +11 -13
- cloudpss/job/result/IESLabSimulationResult.py +5 -0
- cloudpss/job/result/IESLabTypicalDayResult.py +136 -0
- cloudpss/job/{view/IESView.py → result/IESResult.py} +2 -2
- cloudpss/job/{view/PowerFlowView.py → result/PowerFlowResult.py} +2 -2
- cloudpss/job/result/__init__.py +39 -0
- cloudpss/job/{view/view.py → result/result.py} +37 -8
- cloudpss/model/implements/diagram.py +113 -0
- cloudpss/model/jobDefinitions.py +6 -6
- cloudpss/model/model.py +232 -209
- cloudpss/model/revision.py +30 -35
- cloudpss/model/topology.py +13 -15
- cloudpss/runner/IESLabEvaluationResult.py +14 -6
- cloudpss/runner/IESLabPlanResult.py +91 -35
- cloudpss/runner/IESLabTypicalDayResult.py +62 -50
- cloudpss/runner/MessageStreamReceiver.py +5 -100
- cloudpss/runner/result.py +6 -1
- cloudpss/runner/runner.py +77 -48
- cloudpss/utils/IO.py +1 -1
- cloudpss/utils/graphqlUtil.py +3 -2
- cloudpss/utils/httprequests.py +16 -8
- cloudpss/version.py +1 -1
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/METADATA +2 -2
- cloudpss-4.5.0.dist-info/RECORD +70 -0
- cloudpss/dslab/__init__.py +0 -2
- cloudpss/dslab/dataManageModel.py +0 -275
- cloudpss/dslab/dslab.py +0 -210
- cloudpss/dslab/files/__init__.py +0 -2
- cloudpss/dslab/files/curveData.py +0 -140229
- cloudpss/dslab/files/files.py +0 -27
- cloudpss/dslab/financialAnalysisModel.py +0 -137
- 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/job/view/IESLabSimulationView.py +0 -5
- cloudpss/job/view/IESLabTypicalDayView.py +0 -27
- cloudpss/job/view/__init__.py +0 -42
- cloudpss/runner/DSLabResult.py +0 -92
- cloudpss-4.1.1b8.dist-info/RECORD +0 -71
- /cloudpss/{utils → asyncio/utils}/AsyncIterable.py +0 -0
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/WHEEL +0 -0
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/top_level.txt +0 -0
    
        cloudpss/model/model.py
    CHANGED
    
    | @@ -1,12 +1,11 @@ | |
| 1 | 
            -
            import asyncio
         | 
| 2 1 | 
             
            import os
         | 
| 3 2 | 
             
            import re
         | 
| 4 3 | 
             
            from copy import deepcopy
         | 
| 5 | 
            -
             | 
| 6 4 | 
             
            from cloudpss.job.job import Job
         | 
| 5 | 
            +
            from cloudpss.job.result import EMTResult, IESResult, PowerFlowResult
         | 
| 6 | 
            +
            from cloudpss.job.result.result import Result
         | 
| 7 7 | 
             
            from cloudpss.utils.IO import IO
         | 
| 8 | 
            -
            from cloudpss.utils | 
| 9 | 
            -
             | 
| 8 | 
            +
            from cloudpss.utils import graphql_request
         | 
| 10 9 | 
             
            from .revision import ModelRevision
         | 
| 11 10 | 
             
            from .jobDefinitions import JOB_DEFINITIONS
         | 
| 12 11 | 
             
            from ..verify import userName
         | 
| @@ -36,6 +35,34 @@ class Model(object): | |
| 36 35 | 
             
                context     当前项目的上下文相关信息
         | 
| 37 36 |  | 
| 38 37 | 
             
                """
         | 
| 38 | 
            +
                __models_query="""query($input:ModelsInput!){models(input:$input){cursor total count items{rid name description owner tags updatedAt }}}"""
         | 
| 39 | 
            +
                
         | 
| 40 | 
            +
                __model_query= """
         | 
| 41 | 
            +
                        query  t($rid:ResourceId!){
         | 
| 42 | 
            +
                            model(input:{rid: $rid}) {
         | 
| 43 | 
            +
                                configs
         | 
| 44 | 
            +
                                context
         | 
| 45 | 
            +
                                description
         | 
| 46 | 
            +
                                jobs
         | 
| 47 | 
            +
                                name
         | 
| 48 | 
            +
                                rid
         | 
| 49 | 
            +
                                tags
         | 
| 50 | 
            +
                                revision {
         | 
| 51 | 
            +
                                    author
         | 
| 52 | 
            +
                                    documentation
         | 
| 53 | 
            +
                                    graphic
         | 
| 54 | 
            +
                                    hash
         | 
| 55 | 
            +
                                    implements
         | 
| 56 | 
            +
                                    message
         | 
| 57 | 
            +
                                    parameters
         | 
| 58 | 
            +
                                    pins
         | 
| 59 | 
            +
                                    version
         | 
| 60 | 
            +
                                }
         | 
| 61 | 
            +
                            }
         | 
| 62 | 
            +
                        }
         | 
| 63 | 
            +
                    """
         | 
| 64 | 
            +
                __create_model= """mutation($a:CreateModelInput!){createModel(input:$a){rid}}"""
         | 
| 65 | 
            +
                __update_model = """mutation($a:UpdateModelInput!){updateModel(input:$a){rid}}"""
         | 
| 39 66 |  | 
| 40 67 | 
             
                context: dict
         | 
| 41 68 | 
             
                jobs: list
         | 
| @@ -68,7 +95,7 @@ class Model(object): | |
| 68 95 | 
             
                    model = {**self.__dict__, "revision": self.revision.toJSON()}
         | 
| 69 96 | 
             
                    return model
         | 
| 70 97 |  | 
| 71 | 
            -
                def getAllComponents(self):
         | 
| 98 | 
            +
                def getAllComponents(self)->dict:
         | 
| 72 99 | 
             
                    """
         | 
| 73 100 | 
             
                    获取实现
         | 
| 74 101 |  | 
| @@ -83,6 +110,46 @@ class Model(object): | |
| 83 110 | 
             
                    if diagramImplement is None:
         | 
| 84 111 | 
             
                        raise ValueError("不存在拓扑实现")
         | 
| 85 112 | 
             
                    return diagramImplement.getAllComponents()
         | 
| 113 | 
            +
                
         | 
| 114 | 
            +
                def addComponent(self, definition, label, args, pins, canvas=None, position=None, size=None):
         | 
| 115 | 
            +
                    """
         | 
| 116 | 
            +
                    创建一个
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                    :return: Component
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                    >>>> model.addComponent(args)
         | 
| 121 | 
            +
                    """
         | 
| 122 | 
            +
                    diagramImplement = self.revision.getImplements().getDiagram()
         | 
| 123 | 
            +
                    if diagramImplement is None:
         | 
| 124 | 
            +
                        raise ValueError("不存在拓扑实现")
         | 
| 125 | 
            +
                    return diagramImplement.addComponent(definition, label, args, pins, canvas, position, size)
         | 
| 126 | 
            +
                
         | 
| 127 | 
            +
                def removeComponent(self, key):
         | 
| 128 | 
            +
                    """
         | 
| 129 | 
            +
                    删除元件实现
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                    :return: boolean
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                    >>>> model.removeComponent(key)
         | 
| 134 | 
            +
                    """
         | 
| 135 | 
            +
                    diagramImplement = self.revision.getImplements().getDiagram()
         | 
| 136 | 
            +
                    if diagramImplement is None:
         | 
| 137 | 
            +
                        raise ValueError("不存在拓扑实现")
         | 
| 138 | 
            +
                    return diagramImplement.removeComponent(key)
         | 
| 139 | 
            +
                
         | 
| 140 | 
            +
                def updateComponent(self, key, args):
         | 
| 141 | 
            +
                    """
         | 
| 142 | 
            +
                    更新元件实现
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                    :return: bool
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                    >>>> model.updateComponent(key, args)
         | 
| 147 | 
            +
                    """
         | 
| 148 | 
            +
                    diagramImplement = self.revision.getImplements().getDiagram()
         | 
| 149 | 
            +
                    if diagramImplement is None:
         | 
| 150 | 
            +
                        raise ValueError("不存在拓扑实现")
         | 
| 151 | 
            +
                    return diagramImplement.updateComponent(key, args)
         | 
| 152 | 
            +
             | 
| 86 153 |  | 
| 87 154 | 
             
                def getComponentsByRid(self, rid: str):
         | 
| 88 155 | 
             
                    """
         | 
| @@ -144,7 +211,7 @@ class Model(object): | |
| 144 211 |  | 
| 145 212 | 
             
                    return jobs
         | 
| 146 213 |  | 
| 147 | 
            -
                def createJob(self, jobType: | 
| 214 | 
            +
                def createJob(self, jobType:str, name:str):
         | 
| 148 215 | 
             
                    """
         | 
| 149 216 | 
             
                    创建一个计算方案
         | 
| 150 217 | 
             
                    创建出的方案默认不加入到项目中,需要加入请调用 addJob
         | 
| @@ -207,7 +274,8 @@ class Model(object): | |
| 207 274 | 
             
                    """
         | 
| 208 275 |  | 
| 209 276 | 
             
                    config = deepcopy(self.configs[0])
         | 
| 210 | 
            -
                    config[ | 
| 277 | 
            +
                    config['name'] = name
         | 
| 278 | 
            +
                    self.__updateConfigDefault(config)
         | 
| 211 279 | 
             
                    return config
         | 
| 212 280 |  | 
| 213 281 | 
             
                def addConfig(self, config):
         | 
| @@ -221,14 +289,11 @@ class Model(object): | |
| 221 289 | 
             
                    """
         | 
| 222 290 |  | 
| 223 291 | 
             
                    self.configs.append(config)
         | 
| 292 | 
            +
                    self.__updateConfigDefault(config)
         | 
| 224 293 | 
             
                    return config
         | 
| 225 294 |  | 
| 226 295 | 
             
                @staticmethod
         | 
| 227 | 
            -
                def fetchMany(name=None, cursor=[]):
         | 
| 228 | 
            -
                    return asyncio.run(Model.fetchManyAsync(name, cursor))
         | 
| 229 | 
            -
             | 
| 230 | 
            -
                @staticmethod
         | 
| 231 | 
            -
                async def fetchManyAsync(name=None, cursor=[]):
         | 
| 296 | 
            +
                def fetchMany(name=None, cursor=[], pageSize=10,owner=None):
         | 
| 232 297 | 
             
                    """
         | 
| 233 298 | 
             
                    获取用户可以运行的项目列表
         | 
| 234 299 |  | 
| @@ -237,41 +302,38 @@ class Model(object): | |
| 237 302 |  | 
| 238 303 | 
             
                    :return: 按分页信息返回项目列表
         | 
| 239 304 |  | 
| 240 | 
            -
                    >>> data= await Model. | 
| 241 | 
            -
                     | 
| 242 | 
            -
                         | 
| 243 | 
            -
             | 
| 244 | 
            -
             | 
| 245 | 
            -
                        ],
         | 
| 246 | 
            -
                        cursor: ["1699353593000"],
         | 
| 247 | 
            -
             | 
| 248 | 
            -
                    }
         | 
| 249 | 
            -
             | 
| 305 | 
            +
                    >>> data= await Model.fetchMany()
         | 
| 306 | 
            +
                    [
         | 
| 307 | 
            +
                        {'rid': 'model/demo/demo', 'name': 'demo', 'description': 'demo'}
         | 
| 308 | 
            +
                        ...
         | 
| 309 | 
            +
                    ]
         | 
| 250 310 |  | 
| 251 311 | 
             
                    """
         | 
| 252 | 
            -
                     | 
| 312 | 
            +
                    if owner is None:
         | 
| 313 | 
            +
                        owner = userName()
         | 
| 314 | 
            +
                    elif owner == "*":
         | 
| 315 | 
            +
                        owner = None
         | 
| 253 316 | 
             
                    variables = {
         | 
| 254 317 | 
             
                        "cursor": cursor,
         | 
| 255 | 
            -
                        "limit":  | 
| 256 | 
            -
                        "orderBy": [ | 
| 257 | 
            -
             | 
| 318 | 
            +
                        "limit": pageSize,
         | 
| 319 | 
            +
                        "orderBy": [
         | 
| 320 | 
            +
                            "updatedAt<",
         | 
| 321 | 
            +
                            "type",
         | 
| 322 | 
            +
                            "owner",
         | 
| 323 | 
            +
                            "key"
         | 
| 324 | 
            +
                        ],
         | 
| 325 | 
            +
                        "owner":owner,
         | 
| 258 326 | 
             
                    }
         | 
| 259 327 | 
             
                    if name is not None:
         | 
| 260 328 | 
             
                        variables["_search"] = name
         | 
| 261 329 |  | 
| 262 | 
            -
                    data =  | 
| 263 | 
            -
             | 
| 330 | 
            +
                    data = graphql_request(Model.__models_query, {"input": variables})
         | 
| 264 331 | 
             
                    if "errors" in data:
         | 
| 265 332 | 
             
                        raise Exception(data["errors"][0]["message"])
         | 
| 266 | 
            -
             | 
| 267 | 
            -
                    return data["data"]["models"]
         | 
| 333 | 
            +
                    return data["data"]["models"]['items']
         | 
| 268 334 |  | 
| 269 335 | 
             
                @staticmethod
         | 
| 270 336 | 
             
                def fetch(rid):
         | 
| 271 | 
            -
                    return asyncio.run(Model.fetchAsync(rid))
         | 
| 272 | 
            -
             | 
| 273 | 
            -
                @staticmethod
         | 
| 274 | 
            -
                async def fetchAsync(rid):
         | 
| 275 337 | 
             
                    """
         | 
| 276 338 | 
             
                    获取项目
         | 
| 277 339 |  | 
| @@ -282,72 +344,36 @@ class Model(object): | |
| 282 344 | 
             
                    >>> model=Model.fetch('model/Demo/test')
         | 
| 283 345 |  | 
| 284 346 | 
             
                    """
         | 
| 285 | 
            -
                     | 
| 286 | 
            -
                        query  t($rid:ResourceId!){
         | 
| 287 | 
            -
                            model(input:{rid: $rid}) {
         | 
| 288 | 
            -
                                configs
         | 
| 289 | 
            -
                                context
         | 
| 290 | 
            -
                                description
         | 
| 291 | 
            -
                                jobs
         | 
| 292 | 
            -
                                name
         | 
| 293 | 
            -
                                rid
         | 
| 294 | 
            -
                                tags
         | 
| 295 | 
            -
                                
         | 
| 296 | 
            -
                                revision {
         | 
| 297 | 
            -
                                    author
         | 
| 298 | 
            -
                                    documentation
         | 
| 299 | 
            -
                                    graphic
         | 
| 300 | 
            -
                                    hash
         | 
| 301 | 
            -
                                    implements
         | 
| 302 | 
            -
                                    message
         | 
| 303 | 
            -
                                    parameters
         | 
| 304 | 
            -
                                    pins
         | 
| 305 | 
            -
                                    version
         | 
| 306 | 
            -
                                }
         | 
| 307 | 
            -
                            }
         | 
| 308 | 
            -
                        }
         | 
| 309 | 
            -
                    """
         | 
| 310 | 
            -
                    data = await graphql_fetch(query, {"rid": rid})
         | 
| 347 | 
            +
                    data = graphql_request(Model.__model_query, {"rid": rid})
         | 
| 311 348 | 
             
                    if "errors" in data:
         | 
| 312 349 | 
             
                        raise Exception(data["errors"][0]["message"])
         | 
| 313 350 | 
             
                    return Model(data["data"]["model"])
         | 
| 314 351 |  | 
| 315 | 
            -
                def run(self, job=None, config=None, name=None,  | 
| 316 | 
            -
                    
         | 
| 317 | 
            -
                    job= asyncio.run(self.runAsync(job, config, name, policy,stop_on_entry, **kwargs))
         | 
| 318 | 
            -
                    job._Job__connect_legacy()
         | 
| 319 | 
            -
                    return job
         | 
| 320 | 
            -
             | 
| 321 | 
            -
                async def runAsync(self, job=None, config=None, name=None, policy=None,stop_on_entry=None, **kwargs):
         | 
| 352 | 
            +
                def run(self, job=None, config=None, name=None, **kwargs):
         | 
| 322 353 | 
             
                    """
         | 
| 323 354 |  | 
| 324 | 
            -
             | 
| 355 | 
            +
                        调用仿真 
         | 
| 325 356 |  | 
| 326 | 
            -
             | 
| 327 | 
            -
             | 
| 328 | 
            -
             | 
| 357 | 
            +
                        :params job:  调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
         | 
| 358 | 
            +
                        :params config:  调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
         | 
| 359 | 
            +
                        :params name:  任务名称,为空时使用项目的参数方案名称和计算方案名称
         | 
| 329 360 |  | 
| 330 | 
            -
             | 
| 361 | 
            +
                        :return: 返回一个运行实例
         | 
| 331 362 |  | 
| 332 | 
            -
             | 
| 333 | 
            -
             | 
| 363 | 
            +
                        >>> runner=model.run(job,config,'')
         | 
| 364 | 
            +
                        runner
         | 
| 334 365 |  | 
| 335 366 | 
             
                    """
         | 
| 336 367 | 
             
                    if job is None:
         | 
| 337 | 
            -
                        currentJob = self.context[ | 
| 368 | 
            +
                        currentJob = self.context['currentJob']
         | 
| 338 369 | 
             
                        job = self.jobs[currentJob]
         | 
| 339 370 | 
             
                    if config is None:
         | 
| 340 | 
            -
                        currentConfig = self.context[ | 
| 371 | 
            +
                        currentConfig = self.context['currentConfig']
         | 
| 341 372 | 
             
                        config = self.configs[currentConfig]
         | 
| 342 | 
            -
                     | 
| 343 | 
            -
             | 
| 344 | 
            -
                    )
         | 
| 345 | 
            -
                    if stop_on_entry is not None:
         | 
| 346 | 
            -
                        job['args']['stop_on_entry'] = stop_on_entry
         | 
| 347 | 
            -
                    return await Job.create(
         | 
| 348 | 
            -
                        revision["hash"], job, config, name, self.rid, policy, **kwargs
         | 
| 349 | 
            -
                    )
         | 
| 373 | 
            +
                    self.__updateConfigDefault(config)
         | 
| 374 | 
            +
                    return self.revision.run(job, config, name, rid=self.rid, **kwargs)
         | 
| 350 375 |  | 
| 376 | 
            +
             
         | 
| 351 377 | 
             
                def iesSimulationRun(self, job=None, config=None, name=None, **kwargs):
         | 
| 352 378 | 
             
                    return self.run(job=job, config=config, name=name, kwargs=kwargs)
         | 
| 353 379 |  | 
| @@ -369,7 +395,7 @@ class Model(object): | |
| 369 395 | 
             
                    if not os.path.exists(filePath):
         | 
| 370 396 | 
             
                        raise FileNotFoundError("未找到文件")
         | 
| 371 397 | 
             
                    data = IO.load(filePath, format)
         | 
| 372 | 
            -
                    return  | 
| 398 | 
            +
                    return data
         | 
| 373 399 |  | 
| 374 400 | 
             
                @staticmethod
         | 
| 375 401 | 
             
                def dump(model, file, format="yaml", compress="gzip"):
         | 
| @@ -386,12 +412,9 @@ class Model(object): | |
| 386 412 | 
             
                    >>> Model.dump(model,file)
         | 
| 387 413 | 
             
                    """
         | 
| 388 414 |  | 
| 389 | 
            -
                    IO.dump(model, file, format, compress)
         | 
| 415 | 
            +
                    IO.dump(model.toJSON(), file, format, compress)
         | 
| 390 416 |  | 
| 391 417 | 
             
                def save(self, key=None):
         | 
| 392 | 
            -
                    return asyncio.run(self.saveAsync(key))
         | 
| 393 | 
            -
             | 
| 394 | 
            -
                async def saveAsync(self, key=None):
         | 
| 395 418 | 
             
                    """
         | 
| 396 419 | 
             
                    保存/创建项目
         | 
| 397 420 |  | 
| @@ -399,7 +422,6 @@ class Model(object): | |
| 399 422 | 
             
                    key 为空时如果项目 rid 不存在则抛异常,需要重新设置 key。
         | 
| 400 423 | 
             
                    如果保存时,当前用户不是该项目的拥有者时,将重新创建项目,重建项目时如果参数的 key 为空将使用当前当前项目的 key 作为资源的 key ,当资源的 key 和远程冲突时保存失败
         | 
| 401 424 |  | 
| 402 | 
            -
                    :params: model 项目
         | 
| 403 425 | 
             
                    :params: key 资源 id 的唯一标识符,
         | 
| 404 426 |  | 
| 405 427 | 
             
                    :return: 保存成功/保存失败
         | 
| @@ -415,9 +437,9 @@ class Model(object): | |
| 415 437 | 
             
                        if matchObj:
         | 
| 416 438 | 
             
                            self.rid = "model/" + username + "/" + key
         | 
| 417 439 | 
             
                            try:
         | 
| 418 | 
            -
                                return  | 
| 440 | 
            +
                                return Model.update(self)
         | 
| 419 441 | 
             
                            except:
         | 
| 420 | 
            -
                                return  | 
| 442 | 
            +
                                return Model.create(self)
         | 
| 421 443 | 
             
                        else:
         | 
| 422 444 | 
             
                            raise Exception("key 能包含字母数子和下划线")
         | 
| 423 445 | 
             
                    else:
         | 
| @@ -428,18 +450,15 @@ class Model(object): | |
| 428 450 | 
             
                        elif owner[0] != username:
         | 
| 429 451 | 
             
                            rid = re.sub(t, username, self.rid)
         | 
| 430 452 | 
             
                            try:
         | 
| 431 | 
            -
                                return  | 
| 453 | 
            +
                                return Model.create(self)
         | 
| 432 454 | 
             
                            except:
         | 
| 433 455 | 
             
                                raise Exception(rid + " 该资源已存在,无法重复创建,请修改 key")
         | 
| 434 456 |  | 
| 435 | 
            -
                    return  | 
| 457 | 
            +
                    return Model.update(self)
         | 
| 436 458 |  | 
| 437 | 
            -
                @staticmethod
         | 
| 438 | 
            -
                def create(model):
         | 
| 439 | 
            -
                    return asyncio.run(Model.createAsync(model))
         | 
| 440 459 |  | 
| 441 460 | 
             
                @staticmethod
         | 
| 442 | 
            -
                 | 
| 461 | 
            +
                def create(model):
         | 
| 443 462 | 
             
                    """
         | 
| 444 463 | 
             
                    新建项目
         | 
| 445 464 |  | 
| @@ -460,19 +479,13 @@ class Model(object): | |
| 460 479 | 
             
                    elif owner[0] != username:
         | 
| 461 480 | 
             
                        raise Exception("rid 错误,无法保存")
         | 
| 462 481 |  | 
| 463 | 
            -
                    modelQuery = """
         | 
| 464 | 
            -
                                mutation($a:CreateModelInput!){createModel(input:$a){
         | 
| 465 | 
            -
                                                     rid
         | 
| 466 | 
            -
                                            }}
         | 
| 467 | 
            -
                            """
         | 
| 468 482 | 
             
                    isPublic = model.context.get("auth", "") != "private"
         | 
| 469 | 
            -
                    isComponent = model.context.get("category", "") == "component"
         | 
| 470 483 | 
             
                    publicRead = model.context.get("publicRead", "") != False
         | 
| 471 484 | 
             
                    auth = (65539 if publicRead else 65537) if isPublic else 0
         | 
| 472 | 
            -
                    revision =  | 
| 485 | 
            +
                    revision = ModelRevision.create(model.revision, model.revision.hash)
         | 
| 473 486 |  | 
| 474 | 
            -
                    return  | 
| 475 | 
            -
                         | 
| 487 | 
            +
                    return graphql_request(
         | 
| 488 | 
            +
                        Model.__create_model,
         | 
| 476 489 | 
             
                        {
         | 
| 477 490 | 
             
                            "a": {
         | 
| 478 491 | 
             
                                "rid": model.rid,
         | 
| @@ -492,12 +505,10 @@ class Model(object): | |
| 492 505 | 
             
                        },
         | 
| 493 506 | 
             
                    )
         | 
| 494 507 |  | 
| 495 | 
            -
                 | 
| 496 | 
            -
                def update(model):
         | 
| 497 | 
            -
                    return asyncio.run(Model.updateAsync(model))
         | 
| 508 | 
            +
                
         | 
| 498 509 |  | 
| 499 510 | 
             
                @staticmethod
         | 
| 500 | 
            -
                 | 
| 511 | 
            +
                def update(model):
         | 
| 501 512 | 
             
                    """
         | 
| 502 513 | 
             
                    更新项目
         | 
| 503 514 |  | 
| @@ -517,48 +528,50 @@ class Model(object): | |
| 517 528 | 
             
                    elif owner[0] != username:
         | 
| 518 529 | 
             
                        raise Exception("rid 错误,无法保存")
         | 
| 519 530 |  | 
| 520 | 
            -
                     | 
| 521 | 
            -
                                mutation($a:UpdateModelInput!){updateModel(input:$a){
         | 
| 522 | 
            -
                                                     rid
         | 
| 523 | 
            -
                                            }}
         | 
| 524 | 
            -
                            """
         | 
| 531 | 
            +
                    
         | 
| 525 532 | 
             
                    isPublic = model.context.get("auth", "") != "private"
         | 
| 526 533 | 
             
                    isComponent = model.context.get("category", "") == "component"
         | 
| 527 534 | 
             
                    publicRead = model.context.get("publicRead", "") != False
         | 
| 528 535 | 
             
                    auth = (65539 if publicRead else 65537) if isPublic else 0
         | 
| 529 | 
            -
                    revision =  | 
| 530 | 
            -
             | 
| 531 | 
            -
                    xVersion = int(float(os.environ.get("X_CLOUDPSS_VERSION", 4)))
         | 
| 532 | 
            -
                    tags = {"replace": model.tags}
         | 
| 533 | 
            -
                    if xVersion == 3:
         | 
| 534 | 
            -
                        tags = model.tags
         | 
| 536 | 
            +
                    revision = ModelRevision.create(model.revision, model.revision.hash)
         | 
| 535 537 |  | 
| 536 | 
            -
                     | 
| 537 | 
            -
             | 
| 538 | 
            -
                         | 
| 539 | 
            -
             | 
| 540 | 
            -
             | 
| 541 | 
            -
             | 
| 542 | 
            -
             | 
| 543 | 
            -
             | 
| 544 | 
            -
             | 
| 545 | 
            -
             | 
| 546 | 
            -
                                 | 
| 547 | 
            -
                                 | 
| 538 | 
            +
                    xVersion = int(float(os.environ.get('X_CLOUDPSS_VERSION', 4)))
         | 
| 539 | 
            +
                    tags= {
         | 
| 540 | 
            +
                        "replace":model.tags
         | 
| 541 | 
            +
                    }
         | 
| 542 | 
            +
                    if xVersion==3:
         | 
| 543 | 
            +
                        tags=model.tags
         | 
| 544 | 
            +
                    
         | 
| 545 | 
            +
                    r= graphql_request(
         | 
| 546 | 
            +
                        Model.__update_model, {
         | 
| 547 | 
            +
                            'a': {
         | 
| 548 | 
            +
                                'rid': model.rid,
         | 
| 549 | 
            +
                                'revision': revision['hash'],
         | 
| 550 | 
            +
                                'context': model.context,
         | 
| 551 | 
            +
                                'configs': model.configs,
         | 
| 552 | 
            +
                                'jobs': model.jobs,
         | 
| 553 | 
            +
                                'name': model.name,
         | 
| 554 | 
            +
                                'description': model.description,
         | 
| 555 | 
            +
                                'tags': tags,
         | 
| 548 556 | 
             
                                "permissions": {
         | 
| 549 557 | 
             
                                    "moderator": 1,
         | 
| 550 558 | 
             
                                    "member": 1,
         | 
| 551 559 | 
             
                                    "everyone": auth,
         | 
| 552 560 | 
             
                                },
         | 
| 553 561 | 
             
                            }
         | 
| 554 | 
            -
                        } | 
| 555 | 
            -
                     | 
| 562 | 
            +
                        })
         | 
| 563 | 
            +
                    if "errors" in r:
         | 
| 564 | 
            +
                        raise Exception(r["errors"][0]["message"])
         | 
| 565 | 
            +
                    return r
         | 
| 566 | 
            +
             | 
| 556 567 |  | 
| 568 | 
            +
                
         | 
| 557 569 | 
             
                def fetchTopology(
         | 
| 558 570 | 
             
                    self,
         | 
| 559 571 | 
             
                    implementType=None,
         | 
| 560 572 | 
             
                    config=None,
         | 
| 561 573 | 
             
                    maximumDepth=None,
         | 
| 574 | 
            +
                     **kwargs
         | 
| 562 575 | 
             
                ):
         | 
| 563 576 | 
             
                    """
         | 
| 564 577 | 
             
                    通过项目信息,获取当前项目对应的拓扑数据
         | 
| @@ -573,132 +586,151 @@ class Model(object): | |
| 573 586 | 
             
                        topology=model.fetchTopology(implementType='powerFlow',config=config) # 获取潮流实现的拓扑数据
         | 
| 574 587 | 
             
                        topology=model.fetchTopology(maximumDepth=2) # 获取仅展开 2 层的拓扑数据
         | 
| 575 588 | 
             
                    """
         | 
| 576 | 
            -
             | 
| 577 589 | 
             
                    if self.revision is not None:
         | 
| 578 590 | 
             
                        if implementType is None:
         | 
| 579 591 | 
             
                            implementType = "emtp"
         | 
| 580 592 | 
             
                        if config is None:
         | 
| 581 593 | 
             
                            currentConfig = self.context["currentConfig"]
         | 
| 582 594 | 
             
                            config = self.configs[currentConfig]
         | 
| 583 | 
            -
                        return self.revision.fetchTopology(implementType, config, | 
| 595 | 
            +
                        return self.revision.fetchTopology(implementType, config,
         | 
| 596 | 
            +
                            maximumDepth, **kwargs)
         | 
| 584 597 | 
             
                    return None
         | 
| 598 | 
            +
                
         | 
| 585 599 |  | 
| 586 | 
            -
                def  | 
| 600 | 
            +
                def __updateConfigDefault(self, config):
         | 
| 601 | 
            +
                    paramters = self.revision.parameters
         | 
| 602 | 
            +
                    if paramters is None:
         | 
| 603 | 
            +
                        return
         | 
| 604 | 
            +
                    for param in paramters:
         | 
| 605 | 
            +
                        for val in param['items']:
         | 
| 606 | 
            +
                            if config['args'].get(val['key'],None) is None:
         | 
| 607 | 
            +
                                config['args'][val['key']] = val['value']
         | 
| 608 | 
            +
                
         | 
| 609 | 
            +
                def runEMT(self,job=None,config=None,**kwargs)->Runner[EMTResult]:
         | 
| 587 610 | 
             
                    """
         | 
| 588 | 
            -
             | 
| 611 | 
            +
                        运行 emtp 内核,如果当前 model 没有创建  Job 时报错,默认使用第一个计算方案,进行仿真。
         | 
| 589 612 |  | 
| 590 | 
            -
             | 
| 591 | 
            -
             | 
| 613 | 
            +
                        :params job:  调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
         | 
| 614 | 
            +
                        :params config:  调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
         | 
| 615 | 
            +
                        :params name:  任务名称,为空时使用项目的参数方案名称和计算方案名称
         | 
| 616 | 
            +
             | 
| 617 | 
            +
                        :return: 返回一个运行实例
         | 
| 618 | 
            +
             | 
| 619 | 
            +
                        >>> runner=model.run(job,config,'')
         | 
| 620 | 
            +
                        runner
         | 
| 592 621 |  | 
| 593 | 
            -
                    :return: job 运行结果
         | 
| 594 622 | 
             
                    """
         | 
| 595 623 | 
             
                    if job is None:
         | 
| 596 624 | 
             
                        currentJob = self.context["currentJob"]
         | 
| 597 625 | 
             
                        job = self.jobs[currentJob]
         | 
| 598 | 
            -
             | 
| 599 | 
            -
             | 
| 600 | 
            -
             | 
| 601 | 
            -
             | 
| 626 | 
            +
                    if config is None:
         | 
| 627 | 
            +
                        currentConfig = self.context["currentConfig"]
         | 
| 628 | 
            +
                        config = self.configs[currentConfig]
         | 
| 629 | 
            +
                    return self.revision.run(
         | 
| 630 | 
            +
                        job, config, name,  policy, stop_on_entry,self.rid,**kwargs
         | 
| 631 | 
            +
                    )
         | 
| 632 | 
            +
                    
         | 
| 633 | 
            +
                def __findJob(self, jobType):
         | 
| 634 | 
            +
                    currentJob = self.context["currentJob"]
         | 
| 635 | 
            +
                    job = self.jobs[currentJob]
         | 
| 636 | 
            +
                    if job["rid"] != jobType:
         | 
| 637 | 
            +
                        for j in self.jobs:
         | 
| 638 | 
            +
                            if j["rid"] ==jobType:
         | 
| 639 | 
            +
                                job = j
         | 
| 640 | 
            +
                    return job        
         | 
| 641 | 
            +
                    
         | 
| 642 | 
            +
                def runEMT(self, job=None, config=None,**kwargs) -> Job[EMTResult]:
         | 
| 643 | 
            +
                    """
         | 
| 644 | 
            +
                    运行 emtp 内核,如果当前 model 没有创建  Job 时报错,默认使用算例中选中的计算方案进行仿真,如果选中的计算方案不是 EMT 方案则选第一个EMT 计算方案,如果不存在计算方案则直接报错。
         | 
| 645 | 
            +
             | 
| 646 | 
            +
                    :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
         | 
| 647 | 
            +
                    :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
         | 
| 648 | 
            +
             | 
| 649 | 
            +
                    :return: 生成的任务
         | 
| 650 | 
            +
                    """
         | 
| 651 | 
            +
                    if job is None:
         | 
| 652 | 
            +
                        job = self.__findJob("function/CloudPSS/emtps")
         | 
| 602 653 | 
             
                    if job is None:
         | 
| 603 654 | 
             
                        raise Exception("找不到电磁暂态运行的计算方案")
         | 
| 604 | 
            -
                    if job["rid"] != " | 
| 655 | 
            +
                    if job["rid"] != "function/CloudPSS/emtp" and job["rid"] != "function/CloudPSS/emtps":
         | 
| 605 656 | 
             
                        raise Exception("不是电磁暂态运行生成算法的计算方案")
         | 
| 606 657 | 
             
                    if config is None:
         | 
| 607 658 | 
             
                        currentConfig = self.context["currentConfig"]
         | 
| 608 659 | 
             
                        config = self.configs[currentConfig]
         | 
| 609 | 
            -
                     | 
| 660 | 
            +
                    
         | 
| 661 | 
            +
                    return self.run(job=job, config=config,**kwargs)
         | 
| 610 662 |  | 
| 611 | 
            -
                def runSFEMT(self, | 
| 663 | 
            +
                def runSFEMT(self,job=None,config=None,**kwargs)->Runner[EMTResult]:
         | 
| 612 664 | 
             
                    """
         | 
| 613 | 
            -
             | 
| 665 | 
            +
                        运行 移频电磁暂态 内核,如果当前 model 没有创建  Job 时报错,默认使用第一个计算方案,进行仿真。
         | 
| 614 666 |  | 
| 615 667 | 
             
                    :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
         | 
| 616 668 | 
             
                    :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
         | 
| 617 669 |  | 
| 618 | 
            -
                    :return:  | 
| 670 | 
            +
                    :return: Job[EMTView]
         | 
| 619 671 | 
             
                    """
         | 
| 620 672 | 
             
                    if job is None:
         | 
| 621 | 
            -
                         | 
| 622 | 
            -
                        job = self.jobs[currentJob]
         | 
| 623 | 
            -
                        if job["rid"] != "job-definition/cloudpss/sfemt":
         | 
| 624 | 
            -
                            for j in self.jobs:
         | 
| 625 | 
            -
                                if j["rid"] == "job-definition/cloudpss/sfemt":
         | 
| 626 | 
            -
                                    job = j
         | 
| 673 | 
            +
                        job = self.__findJob("function/CloudPSS/sfemt")
         | 
| 627 674 | 
             
                    if job is None:
         | 
| 628 675 | 
             
                        raise Exception("找不到移频电磁暂态运行的计算方案")
         | 
| 629 | 
            -
                    if job["rid"] != " | 
| 676 | 
            +
                    if job["rid"] != "function/CloudPSS/sfemt":
         | 
| 630 677 | 
             
                        raise Exception("不是移频电磁暂态运行生成算法的计算方案")
         | 
| 631 678 | 
             
                    if config is None:
         | 
| 632 679 | 
             
                        currentConfig = self.context["currentConfig"]
         | 
| 633 680 | 
             
                        config = self.configs[currentConfig]
         | 
| 634 | 
            -
                    return self.run(job=job, config=config)
         | 
| 681 | 
            +
                    return self.run(job=job, config=config,**kwargs)
         | 
| 635 682 |  | 
| 636 | 
            -
                def runPowerFlow(self, | 
| 683 | 
            +
                def runPowerFlow(self,job=None,config=None,**kwargs)->Runner[PowerFlowResult]:
         | 
| 637 684 | 
             
                    """
         | 
| 638 | 
            -
             | 
| 685 | 
            +
                        运行 潮流 内核,如果当前 model 没有创建  Job 时报错,默认使用第一个计算方案,进行仿真。
         | 
| 639 686 |  | 
| 640 | 
            -
             | 
| 641 | 
            -
             | 
| 687 | 
            +
                        :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
         | 
| 688 | 
            +
                        :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
         | 
| 642 689 |  | 
| 643 | 
            -
             | 
| 690 | 
            +
                        :return: Job[EMTView]
         | 
| 644 691 | 
             
                    """
         | 
| 645 692 | 
             
                    if job is None:
         | 
| 646 | 
            -
                         | 
| 647 | 
            -
                        job = self.jobs[currentJob]
         | 
| 648 | 
            -
                        if job["rid"] != "job-definition/cloudpss/power-flow":
         | 
| 649 | 
            -
                            for j in self.jobs:
         | 
| 650 | 
            -
                                if j["rid"] == "job-definition/cloudpss/power-flow":
         | 
| 651 | 
            -
                                    job = j
         | 
| 693 | 
            +
                        job = self.__findJob("function/CloudPSS/power-flow")
         | 
| 652 694 | 
             
                    if job is None:
         | 
| 653 695 | 
             
                        raise Exception("找不到潮流内核运行的计算方案")
         | 
| 654 | 
            -
                    if job["rid"] != " | 
| 696 | 
            +
                    if job["rid"] != "function/CloudPSS/power-flow":
         | 
| 655 697 | 
             
                        raise Exception("不是潮流内核运行生成算法的计算方案")
         | 
| 656 698 | 
             
                    if config is None:
         | 
| 657 699 | 
             
                        currentConfig = self.context["currentConfig"]
         | 
| 658 700 | 
             
                        config = self.configs[currentConfig]
         | 
| 659 | 
            -
                    return self.run(job=job, config=config)
         | 
| 701 | 
            +
                    return self.run(job=job, config=config,**kwargs)
         | 
| 660 702 |  | 
| 661 | 
            -
                def runThreePhasePowerFlow(self, job=None, config=None) -> Job:
         | 
| 703 | 
            +
                def runThreePhasePowerFlow(self, job=None, config=None,**kwargs) -> Job[PowerFlowResult]:
         | 
| 662 704 | 
             
                    """
         | 
| 663 705 | 
             
                    运行 三相不平衡潮流 内核,如果当前 model 没有创建  Job 时报错,默认使用第一个计算方案,进行仿真。
         | 
| 664 706 |  | 
| 665 707 | 
             
                    :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
         | 
| 666 708 | 
             
                    :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
         | 
| 667 709 |  | 
| 668 | 
            -
                    :return:  | 
| 710 | 
            +
                    :return: Job[PowerFlowView]
         | 
| 669 711 | 
             
                    """
         | 
| 670 712 | 
             
                    if job is None:
         | 
| 671 | 
            -
                         | 
| 672 | 
            -
                        job = self.jobs[currentJob]
         | 
| 673 | 
            -
                        if job["rid"] != "job-definition/cloudpss/three-phase-powerFlow":
         | 
| 674 | 
            -
                            for j in self.jobs:
         | 
| 675 | 
            -
                                if j["rid"] == "job-definition/cloudpss/three-phase-powerFlow":
         | 
| 676 | 
            -
                                    job = j
         | 
| 713 | 
            +
                        job = self.__findJob("function/CloudPSS/three-phase-powerFlow")
         | 
| 677 714 | 
             
                    if job is None:
         | 
| 678 715 | 
             
                        raise Exception("找不到三相不平衡潮流内核运行的计算方案")
         | 
| 679 | 
            -
                    if job["rid"] != " | 
| 716 | 
            +
                    if job["rid"] != "function/CloudPSS/three-phase-powerFlow":
         | 
| 680 717 | 
             
                        raise Exception("不是三相不平衡潮流内核运行生成算法的计算方案")
         | 
| 681 718 | 
             
                    if config is None:
         | 
| 682 719 | 
             
                        currentConfig = self.context["currentConfig"]
         | 
| 683 720 | 
             
                        config = self.configs[currentConfig]
         | 
| 684 | 
            -
                    return self.run(job=job, config=config)
         | 
| 721 | 
            +
                    return self.run(job=job, config=config,**kwargs)
         | 
| 685 722 |  | 
| 686 | 
            -
                def runIESLoadPrediction(self, job=None, config=None) ->  | 
| 723 | 
            +
                def runIESLoadPrediction(self, job=None, config=None,**kwargs) -> Job[IESResult]:
         | 
| 687 724 | 
             
                    """
         | 
| 688 725 | 
             
                    运行 负荷预测方案 内核,如果当前 model 没有创建  Job 时报错,默认使用第一个计算方案,进行仿真。
         | 
| 689 726 |  | 
| 690 727 | 
             
                    :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
         | 
| 691 728 | 
             
                    :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
         | 
| 692 729 |  | 
| 693 | 
            -
                    :return:  | 
| 730 | 
            +
                    :return: Job[IESView]
         | 
| 694 731 | 
             
                    """
         | 
| 695 732 | 
             
                    if job is None:
         | 
| 696 | 
            -
                         | 
| 697 | 
            -
                        job = self.jobs[currentJob]
         | 
| 698 | 
            -
                        if job["rid"] != "job-definition/ies/ies-load-prediction":
         | 
| 699 | 
            -
                            for j in self.jobs:
         | 
| 700 | 
            -
                                if j["rid"] == "job-definition/ies/ies-load-prediction":
         | 
| 701 | 
            -
                                    job = j
         | 
| 733 | 
            +
                        job = self.__findJob("job-definition/ies/ies-load-prediction")
         | 
| 702 734 | 
             
                    if job is None:
         | 
| 703 735 | 
             
                        raise Exception("找不到负荷预测方案内核运行的计算方案")
         | 
| 704 736 | 
             
                    if job["rid"] != "job-definition/ies/ies-load-prediction":
         | 
| @@ -708,22 +740,17 @@ class Model(object): | |
| 708 740 | 
             
                        config = self.configs[currentConfig]
         | 
| 709 741 | 
             
                    return self.run(job=job, config=config)
         | 
| 710 742 |  | 
| 711 | 
            -
                def runIESPowerFlow(self, job=None, config=None) ->  | 
| 743 | 
            +
                def runIESPowerFlow(self, job=None, config=None,**kwargs) -> Job[IESResult]:
         | 
| 712 744 | 
             
                    """
         | 
| 713 745 | 
             
                    运行 时序潮流方案 内核,如果当前 model 没有创建  Job 时报错,默认使用第一个计算方案,进行仿真。
         | 
| 714 746 |  | 
| 715 747 | 
             
                    :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
         | 
| 716 748 | 
             
                    :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
         | 
| 717 749 |  | 
| 718 | 
            -
                    :return:  | 
| 750 | 
            +
                    :return: Job[IESView]
         | 
| 719 751 | 
             
                    """
         | 
| 720 752 | 
             
                    if job is None:
         | 
| 721 | 
            -
                         | 
| 722 | 
            -
                        job = self.jobs[currentJob]
         | 
| 723 | 
            -
                        if job["rid"] != "job-definition/ies/ies-power-flow":
         | 
| 724 | 
            -
                            for j in self.jobs:
         | 
| 725 | 
            -
                                if j["rid"] == "job-definition/ies/ies-power-flow":
         | 
| 726 | 
            -
                                    job = j
         | 
| 753 | 
            +
                        job = self.__findJob("job-definition/ies/ies-power-flow")
         | 
| 727 754 | 
             
                    if job is None:
         | 
| 728 755 | 
             
                        raise Exception("找不到时序潮流方案内核运行的计算方案")
         | 
| 729 756 | 
             
                    if job["rid"] != "job-definition/ies/ies-power-flow":
         | 
| @@ -731,24 +758,19 @@ class Model(object): | |
| 731 758 | 
             
                    if config is None:
         | 
| 732 759 | 
             
                        currentConfig = self.context["currentConfig"]
         | 
| 733 760 | 
             
                        config = self.configs[currentConfig]
         | 
| 734 | 
            -
                    return self.run(job=job, config=config)
         | 
| 761 | 
            +
                    return self.run(job=job, config=config,**kwargs)
         | 
| 735 762 |  | 
| 736 | 
            -
                def runIESEnergyStoragePlan(self, job=None, config=None) ->  | 
| 763 | 
            +
                def runIESEnergyStoragePlan(self, job=None, config=None,**kwargs) -> Job[IESResult]:
         | 
| 737 764 | 
             
                    """
         | 
| 738 765 | 
             
                    运行 储能规划方案 内核,如果当前 model 没有创建  Job 时报错,默认使用第一个计算方案,进行仿真。
         | 
| 739 766 |  | 
| 740 767 | 
             
                    :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
         | 
| 741 768 | 
             
                    :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
         | 
| 742 769 |  | 
| 743 | 
            -
                    :return:  | 
| 770 | 
            +
                    :return: Job[IESView]
         | 
| 744 771 | 
             
                    """
         | 
| 745 772 | 
             
                    if job is None:
         | 
| 746 | 
            -
                         | 
| 747 | 
            -
                        job = self.jobs[currentJob]
         | 
| 748 | 
            -
                        if job["rid"] != "job-definition/ies/ies-energy-storage-plan":
         | 
| 749 | 
            -
                            for j in self.jobs:
         | 
| 750 | 
            -
                                if j["rid"] == "job-definition/ies/ies-energy-storage-plan":
         | 
| 751 | 
            -
                                    job = j
         | 
| 773 | 
            +
                        job = self.__findJob("job-definition/ies/ies-energy-storage-plan")
         | 
| 752 774 | 
             
                    if job is None:
         | 
| 753 775 | 
             
                        raise Exception("找不到储能规划方案内核运行的计算方案")
         | 
| 754 776 | 
             
                    if job["rid"] != "job-definition/ies/ies-energy-storage-plan":
         | 
| @@ -756,4 +778,5 @@ class Model(object): | |
| 756 778 | 
             
                    if config is None:
         | 
| 757 779 | 
             
                        currentConfig = self.context["currentConfig"]
         | 
| 758 780 | 
             
                        config = self.configs[currentConfig]
         | 
| 759 | 
            -
                    return self.run(job=job, config=config)
         | 
| 781 | 
            +
                    return self.run(job=job, config=config,**kwargs)
         | 
| 782 | 
            +
             |