Fidelity Pointwise 中用于 Python 的 Glyph API


2023 年 4 月 10 日• 11 分钟阅读    

曾经希望您可以使用 Tcl/Tk 以外的某种语言编写 Glyph 脚本来扩展或定制 Cadence 的 Fidelity Pointwise 软件的功能吗?Python 程序员:别再希望了!结合 2018 年 9 月发布的 Pointwise V18.2,我们开发并发布了一个包装器 API,它以一种非常 Python 风格的方式提供对 Glyph 命令的完全访问,这种方式对于 Tcl/Tk 脚本编写者来说仍然非常熟悉。对于 Python 编码人员来说,该界面看起来和感觉起来就像原生 Python,其明显优势是能够使用任何社区开发的 Python 包的全部功能。

(在我们继续之前,重要的是要注意,在本文中,Glyph 指的是 Pointwise 发布的基于 Tcl 的命令集。每当我们提到 Glyph 时,我们实际上指的是用于 Tcl/Tk 的 Glyph API。我们'我们将把 Python API 称为 Python/Glyph。)

Fidelity Pointwise 中用于 Python 的 Glyph API的图1

使用 Tkinter 和 matplotlib 的示例 Glyph/Python 脚本。

什么是字形 API?

从 Pointwise V18.0 R2(2016 年 11 月)开始,原始的 Glyph 接口得到增强,几乎可以通过任何支持 TCP/IP 套接字通信的脚本语言(或与此相关的编译语言)进行访问。关键的添加是一个名为 Glyph Server 的组件,它允许外部进程连接到用户指定的端口并与 Pointwise 交互以运行 Glyph 操作。最终结果是任何可以连接到运行 Pointwise 的主机上指定 TCP 端口的程序或脚本(在脚本菜单中启用 Glyph 服务器选项)可以传输包含 Glyph 命令的消息并接收包含 Tcl 的消息格式化的返回值以及 Tcl 结果代码。

在发布具有 Glyph Server 功能的 V18.0 R2 的同时,我们还在托管在 GitHub 上的 Glyph Script Exchange 上发布了 Python Glyph Client,它实现了 Python 的 TCP/IP 连接和基本消息处理。这建立了从 Python 脚本与正在运行的 Pointwise 实例进行通信的基线机制,但它没有提供任何方式来将 Glyph 对象和列表表示为 Python 对象和容器——留给读者作为练习。但这仍然没有达到真正的 Python 的外观和感觉,这就是 Python 的 Glyph API 的用武之地。

Fidelity Pointwise 中用于 Python 的 Glyph API的图2

Pointwise Glyph 服务器的架构

Python 的 Glyph API

随着 2018 年 9 月 V18.2 R2 的发布,我们扩展了 Python 客户端包以包含适用于 Python 的 Glyph API,这使得 Python 中的 Glyph 脚本看起来和行为都像……Python。也就是说,不需要您的 Python 脚本构建一个 Glyph 命令字符串并将其发送到服务器,然后按如下所示处理结果。

from pointwise import GlyphClient 

glf = GlyphClient(port=2807) 
dim = 11 
con1 = glf.eval("pw::Connector create") # con1 = "::pw::Connector_1" 
glf.eval(con1 + " setDimension " + str(昏暗))#ugly

你现在可以写类似的东西

from pointwise import GlyphClient 
from pointwise.glyphapi import * 

glf = GlyphClient(port=2807) 
pw = glf.get_glyphapi() 
dim = 11 
con1 = pw.Connector() # con1 是一个 Python 对象!
con1.setDimension(昏暗)#realpython

Python/Glyph 负责生成所需的 Glyph 命令字符串、发送请求、处理 Glyph 结果字符串和代码,以及创建 Python 包装器对象。事实上,它以这样一种方式执行此操作,即使每个 Glyph 命令(过去的、现在的和将来的)都可以作为 Python 对象使用,其外观和行为(大部分)与您期望的一样。

例子

GitHub 项目包含 Python API 的一些具体示例用法,包括非常熟悉的 Backstep 教程的完整脚本版本(可在所有 Pointwise 版本附带的教程工作簿中找到)。但是,为了稍微刺激一下您的胃口,这里有一个简单的示例,它从点的循环中创建了一个方形的非结构化域。

from pointwise import GlyphClient 
from pointwise.glyphapi import * 

# 端口 0 是特殊的,因为它在本地启动一个 Glyph 批处理
glf = GlyphClient(port=0) 
pw = glf.get_glyphapi() 

pw.Connector.setCalculateDimensionMethod("Spacing") 
pw. Connector.setCalculateDimensionSpacing(.3) 

# 从循环点列表创建一个连接器循环 points 
= [(0, 0, 0), (10, 0, 0), (10, 10, 0), (0, 10 , 0)] 
cons = [] 
with pw.Application.begin("Create") as creator: 
for p1, p2 in zip(points, points[1:]+points[:1]): 
seg = pw.SegmentSpline( ) 
seg.addPoint(p1) 
seg.addPoint(p2) 
con = pw.Connector() 
con.addSegment(seg) 
con.calculateDimension()
cons.append(con) 
creator.end() #使用 pw.Application.begin("Create") 作为创建者

从连接器创建一个非结构化域: edge = pw.Edge.createFromConnectors(cons) dom = pw.DomainUnstructured() dom.addEdge(edge) creator.end()打印(dom)

细节:将 Python 映射到字形

关于如何使用 Python/Glyph 的完整细节在 GitHub 上,但这里有几件事值得一提。该项目的主要目标之一是最小化或消除维护 Python 代码与 Pointwise 和 Glyph 一致的需要。也就是说,随着 Pointwise 和 Glyph 随着新的对象类型和操作的发展,如果除了传统的 Tcl API。

幸运的是,Python 语言包含许多特性,使我们能够自动将 Glyph 对象类型和操作映射到具有真实属性和方法的 Python 包装器对象。也就是说,通过将 Python 类、对象、属性和方法自动映射到 Glyph,不需要在 Python API 中定义单独的类、属性和方法。结果是 Python 中的所有 Glyph 对象和类都成为一个名为 GlyphObject 的特殊包装类的实例,该包装类负责在 Pointwise 中映射其关联的具体 Glyph 对象的实际类型、属性和操作的更精细细节。因此,没有一个名为 Connector 或 DomainUnstructured 的 Python 类,因此没有这些类型的实例,但是每个类都有一个 GlyphObject 实例知道如何将这些东西映射到 Glyph。

字形映射规则

上述示例中隐含了一些将 Python/Glyph 映射到 Glyph 的规则,但我们将在此处详细介绍基本规则。在使用 Python/Glyph 之前,必须首先通过在“pointwise”包中实例化 GlyphClient 来建立与 Glyph 服务器的连接。(我们将此对象称为“glf”。)请注意,在默认“localhost”上指定为端口“0”的连接将导致 Python/Glyph 启动新的批处理 Glyph (tclsh) 进程并启动 Glyph 服务器在任何可用端口上,然后在连接关闭时终止进程。

1. Python/Glyph API 的顶层始终是“glf.get_glyphapi()”返回的对象。使用该对象创建的所有后续 Python/Glyph 实例最终都链接到该顶级对象,因此也链接到它们所在的 Pointwise 工作空间。(我们将此对象称为“pw”。)

Tcl/Tk: package require PWI_Glyph 2 # 建立 'pw' 命名空间
Python: glf = GlyphClient(port=0) 
pw = glf.get_glyphapi()

2. Glyph 类名对于 Python 和 Tcl 都是区分大小写的,因此名称必须完全匹配。

3. 所有字形类都是顶级(“pw”)对象的有效属性。

Tcl/Tk:pw::Application 
Python:pw.Application

4. 任何公开静态“创建”操作的 Glyph 类都可以使用语法“pw.GlyphClassName()”直接实例化。如果 create 操作接受参数,它们可以像任何其他参数一样传递(参见规则 8)。

Tcl/Tk:设置 con [pw::Connector 创建] 
Python:con = pw.Connector()

5. 所有静态 Glyph 类操作都在等效的 Python/Glyph 对象上调用。

Tcl/Tk:pw::Application getVersion 
Python:pw.Application.getVersion()

6. 返回 Glyph 对象的 Glyph 动作被包装在 GlyphObject 的实例中,该实例以与关联的 Glyph 对象一致的方式起作用。在此对象上只能调用实例操作,并且没有隐式充当“setter/getter”方法(常见的 Python 习惯用法)的属性。

7. Python/Glyph 对象上的实例方法被转换为 Glyph 实例操作。

Tcl/Tk:设置昏暗 [$con getDimension] 
Python dim = con.getDimension()

8. 对于 Python 和 Tcl,命令参数可以是位置参数和/或关键字参数,但是映射它们的规则比人们想象的要复杂一些。

8a. Python 关键字参数用于所有 Glyph 标志参数。除了作为关键字参数之外,没有其他方法可以指定 Glyph 标志。

Tcl/Tk:$crv smoothC1 -tolerance $tol 
Python:crv.smoothC1(tolerance=tol)

8b. 不接受参数的字形标志必须在 Python 中指定为值为 True 的关键字。

Tcl/Tk:$con1 join -keepDistribution $con2 
Python:con1.join(con2, keepDistribution=True)

8c. 位置参数在 Tcl 中出现在最后,但在 Python 调用列表中必须出现在最前面。

Tcl/Tk:$con fitLSQ -tolerance $tol $refCon 
Python:con.fitLSQ(refCon,tolerance=tol)

8d。请注意,某些关键字参数可能看起来包含一个值,但仔细查看 Glyph 文档会发现它们并不包含。在这些情况下,使用任何一种形式的 Python/Glyph 命令都可以,但请注意这是语法异常。

Tcl/Tk: $con getPosition -arc 0.5 
Python: con.getPosition(0.5, arc=True) # 预期的形式
con.getPosition(arc=0.5) # 有效,但不正确

8e. 列表(或元组)可以作为参数传递,并转换为 Tcl 列表,除非在某些情况下。(有关这些附加规则,请参阅 GitHub 主页上的文档。)

Tcl/Tk: $segment addPoint {0 0 0} 
Python: segment.addPoint((0, 0, 0)) # 单个元组参数

高级 Python/字形列表

Python 语言提供了一些非常独特的句法特性来处理对象和值的容器。有经验的 Python 编码人员会发现 Python/Glyph 列表处理并不像他们希望的那样优雅。由于我们采用的自动一对一映射方案,Python/Glyph 脚本将倾向于相当接近地模仿 Glyph。如果您熟悉 Tcl/Tk 中的 Glyph 脚本,您会记得大多数处理集合或信息列表(例如,点或单元格)的操作只能使用循环一次检索一个形式:

set elist [list] 
for { set i 1 } { $i <= [$entity getObjectCount] } { incr i } { 
    lappend elist [$entity getObject $i] 
}

这是 Pointwise 中的一个有意识的设计选择,因为许多 Glyph 对象可能包含大量子元素,并且将元素列表转换为它们的 Tcl(字符串)等价物往往效率非常低(内存方面)。对于上面的例子,等效的 Python 代码通常是这样的:

elist = [] 
for i in range(1, entity.getObjectCount()+1): 
    elist.append(entity.getObject(i))

好吧……哎呀。但是,对于可能存在大量事物的集合(如点或单元格或检查度量数据),请考虑将列表从 Glyph 转换为 Tcl(字符串形式)以及从 Tcl 转换为 Python 需要多少额外开销(内存)。(请记住,所有 Glyph 对象都是通过 TCP/IP 连接作为字符串进行通信的。)当然,权衡是必须进行的 TCP/IP 往返次数才能以这种方式检索完整的对象列表。

作为妥协,我们有近期的开发计划,为通常不太大的对象/值列表添加许多直接的“getObjectList”操作到 Glyph。例如,在 Pointwise V18.2 R2 中,您将能够检索连接器的所有控制点或网格点:

con = pw.GridEntity.getByName("con-1") 
segs = con.getSegments() 
segpts = seg[0].getPoints() 
conpts = con.getPoints() # 网格点在连接器上的位置
gridxyzs = con.getXYZs (grid=True) # 所有网格点的XYZ值
cpxyzs = con.getXYZs(control=True) # 所有控制点的XYZ值

这应该可以满足大多数小型对象列表的要求,但是可能会包含点和单元格之类的大型列表仍然需要一次检索一个。现在,具有一定 Tcl 信誉的精明 Python 编码人员可能会认识到,可以使用类似以下内容的客户端 API 直接检索这些大型对象列表的全部或部分集合:

cmd = "set pts [list]\n" 
cmd += "set dom [pw::GridEntity getByName" + dom.getName() + "]\n" 
cmd += "for {set i 1} {$i < [$dom getPointCount] + 1} {incr i} {\n" 
cmd += " lappend pts [$dom getPoint $i]\n" 
cmd += "}\n" 
cmd += "set pts\n"

结果= glf.eval(cmd) 
# 'result' 现在是 Tcl 列表的原始字符串表示 {{x1 y1 z1} ...}, 
# 但我们可以通过一些内部知识将它转换为 Python:
pts = dom._toPythonObj (result) 
# pts 现在是实数列表的 python 列表 [[x1, y1, z1], ...]

公平警告,应谨慎使用此习语,注意非常大的集合将暂时需要大量内存用于服务器连接两侧的中间字符串表示。一个更可口的实现可能是通过重复使用与上述类似的技术来检索块中的列表。

获取 Python/字形

Python/Glyph 包已经在 GitHub 上托管的 Glyph Script Exchange 上可用,还有一些示例可以帮助您入门。请注意,有一个外部包依赖项 numpy,它用于直接在 Python 中简化某些实用程序函数的实现。您还可以使用 pip 和如下命令安装 Python/Glyph 及其依赖项:

python -m pip 安装 pointwise-glyph-client

如果您是现有客户,请随时下载并试用。它适用于 Python 2 或 3。欢迎所有反馈,您可以自由修改或扩展 API 以适合自己。与我们所有的 GitHub 项目一样,我们始终欢迎通过社区进行改进!在我们共享各种脚本示例的Fidelity Pointwise Github页面上了解更多信息。

Fidelity Pointwise 中用于 Python 的 Glyph API的图3

如果您不是当前客户,但想开始使用用 Python 编写的宏和模板自动化您的网格生成过程,现在是申请免费试用的时候了。

Fidelity Pointwise 中用于 Python 的 Glyph API的图4

致谢

在 Pointwise 产品开发团队的首席工程师(和 Python 专家)Mike Jefferies 的指导下,德克萨斯 A&M 大学应用数学专业的 Tyler Anderson 作为夏季实习生项目实施了 Glyph 的 Python API 的重要部分。

本文由 David Garlisch 撰写。

文章来源:cadence博客

Fidelity Pointwise二次开发

Fidelity Pointwise 中用于 Python 的 Glyph API的评论0条

    暂无评论

    Fidelity Pointwise 中用于 Python 的 Glyph API的相关案例教程

    ZOS-API 是个功能强大的工具,在 ZOS-API 中,用户可以用编程的方式执行OpticStudio 用户界面中可能实现的所有操作(以及更多操作)。本文将展示如何使用 Python 与 ZOS-API 交互来创建单透镜、添加 评价函数 ( Merit Function ) 目标,并优化系统。 (联系我们获取文章附件) 简介 此示例使用 COM 接口通过 pywin32 模块将 Python
    1. Moldex3D API for Studio 介绍(Introduction) Moldex3D Studio 是一个包含COM技术(组件对象模型)的Microsoft Windows应用程序。 可以使用多种程序语言创建COM对象。 设定(Setup) Moldex3D Studio 为 COM 服务器 要使用 Moldex3D Studio 作为 COM 服务器,应用程序必须在 Wind
    前言: 今天我们就利用Python脚本实现Github项目的更新,提醒方式是邮箱。直接开整~ 如果有正在跟我一样的自学的朋友,需要我本篇的代码或者其他的Python学习资料可以添加卫星小助手:ilove-python直接获取 项目地址: https://github.com/kenwoodjw/python_interview_question 实现过程 获取数据 Github官方提供了详细的数据
    本文对ZOS-API、ZPL和DLL进行了比较。我们将会对与OpticStudio的互联、代码执行、语句和数据存取与处理这些方面进行解释说明。作者 Haosheng Hu概述在OpticStudio中,用户可以通过编程(Programming)选项卡访问OpticStudio的编程功能,如Zemax编程语言(ZPL)、应用程序编程接口(ZOS-API)和动态链接库(DLL)。每种编程方法都有其独特
    本文对 ZOS-API 的主要接口 (Interfaces) 进行了介绍。它遵循编程(Programming)选项卡>关于 ZOS-API(About the ZOS-API) 下的帮助文件(Help File)中描述的内容。帮助文件中对每个接口都有对应的介绍,建议您阅读这些内容。本文将着重介绍其中重要的部分,您将有机会对照练习。本文是对应于 MATLAB 编写的。 简介 ZOS-API 是被作为
    影响力
    粉丝
    内容
    获赞
    收藏
      项目客服
      培训客服
      0 0