dsh-plugin-pscad-expert-vyma 1.0.11 → 1.0.12
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.
- package/README.md +1 -1
- package/package.json +1 -1
- package/plugin.yaml +1 -1
- package/tools/main.py +68 -6
package/README.md
CHANGED
package/package.json
CHANGED
package/plugin.yaml
CHANGED
package/tools/main.py
CHANGED
|
@@ -522,6 +522,57 @@ def _gen_name(comp_type: str) -> str:
|
|
|
522
522
|
# ---------------------------------------------------------------------------
|
|
523
523
|
# 工具集 1:连接与工程加载(懒加载 mhi)
|
|
524
524
|
# ---------------------------------------------------------------------------
|
|
525
|
+
def _persist_case(prj: Any, project_name: str, folder: str) -> Optional[str]:
|
|
526
|
+
"""尽力把会话内新建工程落盘,返回实际 .pscx 路径;找不到返回 None。
|
|
527
|
+
|
|
528
|
+
mhi-pscad 2.9.7 的 create_case(project_name, folder=...) 与 save() 都可能
|
|
529
|
+
不按 folder 写 .pscx(工程仅在 PSCAD 会话内存)。依次尝试:
|
|
530
|
+
① save/save_as/save_case 变体;② prj 路径属性;③ 候选目录全盘搜同名文件。
|
|
531
|
+
"""
|
|
532
|
+
expected = os.path.join(folder, project_name + '.pscx')
|
|
533
|
+
try:
|
|
534
|
+
# ① 常见保存 API
|
|
535
|
+
for meth, args in (('save', ()), ('save_as', (expected,)),
|
|
536
|
+
('save_case', (expected,))):
|
|
537
|
+
try:
|
|
538
|
+
fn = getattr(prj, meth)
|
|
539
|
+
fn(*args)
|
|
540
|
+
except Exception:
|
|
541
|
+
continue
|
|
542
|
+
if os.path.isfile(expected):
|
|
543
|
+
return expected
|
|
544
|
+
# ② prj 自带路径属性
|
|
545
|
+
for attr in ('path', 'filename', 'file_name', 'case_path',
|
|
546
|
+
'project_path'):
|
|
547
|
+
try:
|
|
548
|
+
p = getattr(prj, attr)
|
|
549
|
+
if callable(p):
|
|
550
|
+
p = p()
|
|
551
|
+
if isinstance(p, str) and p.lower().endswith('.pscx') \
|
|
552
|
+
and os.path.isfile(p):
|
|
553
|
+
return p
|
|
554
|
+
except Exception:
|
|
555
|
+
continue
|
|
556
|
+
# ③ 候选目录搜最近生成的同名文件
|
|
557
|
+
import glob as _glob
|
|
558
|
+
bases = [folder, os.getcwd(), os.path.expanduser('~/Documents'),
|
|
559
|
+
os.path.expanduser('~/PSCAD')]
|
|
560
|
+
best = None
|
|
561
|
+
for base in bases:
|
|
562
|
+
try:
|
|
563
|
+
hits = _glob.glob(os.path.join(base, '**',
|
|
564
|
+
project_name + '.pscx'),
|
|
565
|
+
recursive=True)
|
|
566
|
+
except Exception:
|
|
567
|
+
hits = []
|
|
568
|
+
for h in hits:
|
|
569
|
+
if best is None or os.path.getmtime(h) > os.path.getmtime(best):
|
|
570
|
+
best = h
|
|
571
|
+
return best
|
|
572
|
+
except Exception:
|
|
573
|
+
return None
|
|
574
|
+
|
|
575
|
+
|
|
525
576
|
def connect_and_load_project(project_name: str,
|
|
526
577
|
folder: Optional[str] = None,
|
|
527
578
|
create_if_missing: bool = False,
|
|
@@ -558,6 +609,7 @@ def connect_and_load_project(project_name: str,
|
|
|
558
609
|
|
|
559
610
|
folder = folder or (DEFAULT_FOLDER or os.getcwd())
|
|
560
611
|
_prj_folder = folder
|
|
612
|
+
pscx_path: Optional[str] = None # 实际落盘的 .pscx 路径(探测后回报)
|
|
561
613
|
|
|
562
614
|
prj = None
|
|
563
615
|
try:
|
|
@@ -571,19 +623,23 @@ def connect_and_load_project(project_name: str,
|
|
|
571
623
|
try:
|
|
572
624
|
_pscad.load(pscx.replace('\\', '/'))
|
|
573
625
|
prj = _pscad.project(project_name)
|
|
626
|
+
pscx_path = pscx
|
|
574
627
|
except Exception as exc:
|
|
575
628
|
return _err('加载 %s 失败: %s' % (pscx, exc))
|
|
576
629
|
|
|
577
630
|
if prj is None and create_if_missing:
|
|
578
631
|
try:
|
|
579
|
-
|
|
580
|
-
prj = _pscad.project(project_name)
|
|
581
|
-
# mhi 2.9.7 的 create_case 可能只在 PSCAD 会话内存建工程、不落盘
|
|
582
|
-
# (与 2.2.1 语义差异);显式 save() 保证 folder 下生成 .pscx
|
|
632
|
+
# 目录不存在可能导致 create_case 静默不落盘:先确保目标目录存在
|
|
583
633
|
try:
|
|
584
|
-
|
|
634
|
+
os.makedirs(folder, exist_ok=True)
|
|
585
635
|
except Exception:
|
|
586
636
|
pass
|
|
637
|
+
_pscad.create_case(project_name, folder=folder)
|
|
638
|
+
prj = _pscad.project(project_name)
|
|
639
|
+
pscx_path = _persist_case(prj, project_name, folder)
|
|
640
|
+
if pscx_path:
|
|
641
|
+
folder = os.path.dirname(pscx_path) # 会话状态跟随真实落盘目录
|
|
642
|
+
_prj_folder = folder
|
|
587
643
|
except Exception as exc:
|
|
588
644
|
return _err('create_case 失败: %s' % exc)
|
|
589
645
|
|
|
@@ -599,7 +655,13 @@ def connect_and_load_project(project_name: str,
|
|
|
599
655
|
except Exception as exc:
|
|
600
656
|
_main = None
|
|
601
657
|
return _err('打开 Main 画布失败: %s' % exc)
|
|
602
|
-
|
|
658
|
+
result = {'project': project_name, 'canvas': 'Main',
|
|
659
|
+
'pscx_path': pscx_path}
|
|
660
|
+
if create_if_missing and not pscx_path:
|
|
661
|
+
result['warning'] = ('create_case 未能在磁盘找到 .pscx(mhi 2.9.7 可能仅'
|
|
662
|
+
'内存建工程):工程仅存在于当前 PSCAD 会话,退出即丢;'
|
|
663
|
+
'建议改用已有模板 .pscx 加载,或提供可写目录。')
|
|
664
|
+
return _ok(result)
|
|
603
665
|
except Exception as exc:
|
|
604
666
|
return _err(exc)
|
|
605
667
|
|