例子

下面这段 VB 代码演示了如何通过集合对象逐级获取树节点,并说明了 IHNodeCol 的两种访问方式:遍历与显式索引。

vb

复制

Sub GetCollectionExample(ByVal ihAPsim As Happ.IHapp)
    ' 示例:使用集合对象获取根节点的下一级
    Dim ihRoot   As Happ.IHNode     '根节点
    Dim ihcolOffspring As Happ.IHNodeCol  '子节点集合
    Dim ihOffspring As Happ.IHNode        '单个节点
    Dim strOut As String

    On Error GoTo ErrorHandler

    '1. 取根节点
    ihRoot = ihAPsim.Tree

    '2. 取根节点下一级集合(Data、Unit Table、Settings)
    ihcolOffspring = ihRoot.Elements

    '3. 遍历方式:For Each … Next
    strOut = ""
    For Each ihOffspring In ihcolOffspring
        strOut = strOut & vbCrLf & ihOffspring.Name
    Next
    MsgBox "Offspring nodes are:" & strOut, , "GetCollectionExample"
    Exit Sub

ErrorHandler:
    MsgBox "GetCollectionExample 报错:" & Err.Description
End Sub

集合访问的两种写法

  1. 遍历:

vb

复制

For Each ihOffspring In ihcolOffspring
    '…
Next
  1. 显式索引(Item 为默认属性,可省略):

vb

复制

ihDataNode = ihcolOffspring.Item("Data")   '或简写:
ihDataNode = ihcolOffspring("Data")
  • 节点名称区分大小写。

  • Dimension 决定 Item 需要的参数个数: – 若 Dimension = 1:只需 1 个参数,如 "Data" – 若 Dimension = 2:需 2 个参数,如 ihcolOffspring("Data", "id2")

用Python来解释

1.连接Aspen

import win32com.client as win32
import os

VERSION_NUMBER = "34.0"          # 对应 V14
prog_id = f"AspenPlus.Document.{VERSION_NUMBER}"  # 进程外服务器

# 新建空白模拟
ap = win32.Dispatch(prog_id)
ap.InitNew2()

# 如果打开已有文件
# ap = win32.GetObject(r"完整路径\xxx.bkp")
  1. 取根节点并遍历第一层
root = ap.Tree                       # HappLS.Tree -> IHNode
col = root.Elements                  # IHNodeCol

for node in col:                     # For Each … Next 的 Python 版
    print(node.Name)
  1. 显式取子节点(Dimension=1 时)
data_node = col("Data")              # 默认属性 Item,可省略
# 或 data_node = col.Item("Data")
  1. 继续往深处钻

Python

复制

blocks_col = data_node.Elements("Blocks").Elements
b6 = blocks_col("B6")                # 取出 RadFrac 模块 B6
input_node = b6.Elements("Input")("NSTAGE")   # 塔板数节点
print(input_node.Value)              # 读/写均可
  1. 运行、保存、退出
ap.Engine.Run2()                     # 调用 IHAPEngine
ap.SaveAs(r"C:\Temp\my.bkp")
ap.Quit()
  1. 错误处理
import pythoncom
pythoncom.CoInitialize()             # 多线程环境需要
try:
    ap = win32.Dispatch(prog_id)
    ...
except Exception as e:
    print("COM 错误:", e)
finally:
    ap.Quit()