双标识符变量访问:塔板组成分布

RadFrac 的液相组成分布是需要两个标识符的变量示例。 对于 pfdtut 模拟结果,变量 X 在 Variable Explorer 树形视图中的位置如图所示:

image.png

在变量 X 下方的第一层节点代表塔板,每个节点的 Name 属性即为塔板号; 第二层节点为各组分的组成,其 Name 属性为组分 ID,对应 Value 属性即为该塔板内该组分的液相摩尔分数。

以下代码片段演示如何从这一两层结构中取出组分组成: 使用两层嵌套循环依次遍历各塔板与各组分,最终访问到具体数值节点。

Public Sub CompProfExample(ByVal ihAPsim As Happ.IHapp)
' 本例获取带两个标识符的非标量变量值(液相组成分布)
Dim ihTrayNode As Happ.IHNode   ' 塔板节点(第一维)
Dim ihXNode   As Happ.IHNode    ' 变量 X 节点
Dim ihCompNode As Happ.IHNode   ' 组分节点(第二维)
Dim strOut As String
Dim nLines As Integer
On Error GoTo ErrorHandler

    ihXNode = ihAPsim.Tree.Data.Blocks.B6.Output.Elements("X")
    nLines = 0
    strOut = ""

    ' 第一层循环:遍历各塔板
    For Each ihTrayNode In ihXNode.Elements
        ' 第二层循环:遍历各组分
        For Each ihCompNode In ihTrayNode.Elements
            strOut = strOut & Chr(13) & ihTrayNode.Name & _
                     Chr(9) & ihCompNode.Name & Chr(9) & _
                     ihCompNode.Value
            nLines = nLines + 1
            ' 每满 40 行弹一次窗,避免消息框过长
            If nLines = 40 Then
                MsgBox strOut, , "CompProfExample"
                strOut = ""
                nLines = 0
            End If
        Next ihCompNode
    Next ihTrayNode

    ' 剩余不足 40 行也显示
    If nLines > 0 Then
        MsgBox strOut, , "CompProfExample"
    End If

Exit Sub
ErrorHandler:
    MsgBox "CompProfExample raised error " & Err.Description
End Sub

Python翻译

import win32com.client as win32
from tkinter import Tk, messagebox

def comp_prof_example(ih_ap_sim):
    """与 VB CompProfExample 完全一致:双标识符非标量变量"""
    ih_x_node = ih_ap_sim.Tree.Data.Blocks.B6.Output.Elements("X")  # 液相组成 X

    str_out, n_lines = "", 0
    for ih_tray_node in ih_x_node.Elements:          # 第1维:塔板
        for ih_comp_node in ih_tray_node.Elements:   # 第2维:组分
            str_out += f"\n{ih_tray_node.Name}\t{ih_comp_node.Name}\t{ih_comp_node.Value}"
            n_lines += 1
            if n_lines == 40:                        # 满40行弹窗
                _show(str_out, "CompProfExample")
                str_out, n_lines = "", 0

    if n_lines > 0:                                  # 剩余不足40行
        _show(str_out, "CompProfExample")


def _show(text, title):
    root = Tk()
    root.withdraw()
    messagebox.showinfo(title, text.strip())
    root.destroy()


# ---------------- 调用入口 ----------------
if __name__ == "__main__":
    ap = win32.Dispatch("AspenPlus.Document.34.0")
    ap.InitNew2()                 # 或 GetObject 打开已有文件
    comp_prof_example(ap)
    ap.Quit()