当前位置: 首页 > news >正文

编写Python自动化脚本,使用Autodesk Fusion辅助Ansys HFSS进行建模

前言

最近正在复现一个Vivaldi天线,需要绘制由曲线阵列的圆形构成的开槽。由于HFSS如同大便一般的建模逻辑实在不方便完成这个操作,我决定研究一下使用Autodesk Fusion进行阵列,再将坐标导入到Ansys HFSS中绘制圆柱。

得益于这两款软件提供的自动化API,我们能够分别编写两个Python脚本,实现我们需要的功能。

Fusion 建模

导入参考图后,在草图中绘制阵列对象和曲线,之后进行路径阵列,如下图所示。注意路径起点

Snipaste_2025-10-13_18-04-45

在“实用程序-附加模块”中,点击加号,选择“创建脚本或附加模块”,在弹出的窗口中选择“脚本”,修改名称,选择编程语言为“Python”,最后点击“创建”。

Snipaste_2025-10-13_18-10-40

勾选左侧“由我创建”,找到刚才创建的脚本,右键,选择“在代码编辑器中编辑”。

编写脚本。脚本内容见附录。

运行脚本,保存阵列对象的坐标到CSV文件。

HFSS操作

在“Automation”菜单栏中,点击“Record Script”,填好文件名和路径。随便新建一点什么,再点击“Stop Recording”。

打开保存的Py,编写脚本。注意IronPython的版本貌似比较久远,不支持一些新语法。脚本内容见附录,注意修改文件路径。

最后点击“Run Script”,选择刚才创建的脚本。可以看到,我们成功完成了建模。成品如下图。

Snipaste_2025-10-13_18-23-52

附录

注意:以下代码由AI辅助编写。

Fusion脚本如下。

"""This file acts as the main module for this script."""import traceback
import adsk.core
import adsk.fusion
import csv# import adsk.cam# Initialize the global variables for the Application and UserInterface objects.
app = adsk.core.Application.get()
ui = app.userInterfacedef run(_context: str):"""This function is called by Fusion when the script is run."""try:# Your code goes here.product = app.activeProductdesign = adsk.fusion.Design.cast(product)if not design:ui.messageBox("需要激活的Fusion设计")return# 获取根组件rootComp = design.rootComponent# 准备导出数据positions = []# 遍历所有特征for feature in rootComp.features:# 检查是否是路径阵列特征if feature.classType() == adsk.fusion.PathPatternFeature.classType():pathPattern = adsk.fusion.PathPatternFeature.cast(feature)(returnValue, startPoint, endPoint) = pathPattern.path.item(0).curve.evaluator.getEndPoints()base_position = (startPoint.x * 10,startPoint.y * 10,startPoint.z * 10,)# 获取阵列中的所有实例for occurrence in pathPattern.patternElements:# 获取变换矩阵transform = occurrence.transform# 提取位置(矩阵的平移部分)translation = transform.translationpositions.append({"x": translation.x * 10 + base_position[0],"y": translation.y * 10 + base_position[1],"z": translation.z * 10 + base_position[2],})# 导出到CSV文件if positions:# 让用户选择保存位置fileDialog = ui.createFileDialog()fileDialog.title = "保存位置数据"fileDialog.filter = "CSV文件 (*.csv)"fileDialog.isMultiSelectEnabled = Falseif fileDialog.showSave() == adsk.core.DialogResults.DialogOK:filename = fileDialog.filenamewith open(filename, "w", newline="") as csvfile:writer = csv.DictWriter(csvfile, fieldnames=["x", "y", "z"])writer.writeheader()writer.writerows(positions)ui.messageBox(f"成功导出 {len(positions)} 个位置到:\n{filename}")except Exception:  # pylint:disable=bare-except# Write the error message to the TEXT COMMANDS window.app.log(f"Failed:\n{traceback.format_exc()}")

HFSS脚本如下。

# ----------------------------------------------
# Script Recorded by Ansys Electronics Desktop Version 2022.1.0# ----------------------------------------------
import ScriptEnv
import csv# Edit according to your project and design names
ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oProject = oDesktop.SetActiveProject("vivaldi")
oDesign = oProject.SetActiveDesign("AVA2")
oEditor = oDesign.SetActiveEditor("3D Modeler")# Read coordinates from CSV file
coordinates = []
# Make sure to change the path to your actual CSV file path
with open("D:\\docs\\fusion\\1.csv", "r") as file:csv_reader = csv.DictReader(file)for row in csv_reader:x = float(row["x"])y = float(row["y"])z = float(row["z"])print("read coordinates: x=%f, y=%f, z=%f" % (x, y, z))coordinates.append((x, y, z))# create cylinders at the specified coordinates
for i, (x, y, z) in enumerate(coordinates):oEditor.CreateCylinder(["NAME:CylinderParameters","XCenter:=","%f mm" % x,"YCenter:=","%f mm" % y,"ZCenter:=","%f mm" % z,"Radius:=","6mm","Height:=","-20mm","WhichAxis:=","Z","NumSides:=","0",],["NAME:Attributes","Name:=","Cylinder_From_CSV%d" % (i + 1),"Flags:=","NonModel#","Color:=","(143 175 143)","Transparency:=",0,"PartCoordinateSystem:=","Global","UDMId:=","","MaterialValue:=",'"vacuum"',"SurfaceMaterialValue:=",'""',"SolveInside:=",True,"ShellElement:=",False,"ShellElementThickness:=","0mm","IsMaterialEditable:=",True,"UseMaterialAppearance:=",False,"IsLightweight:=",False,],)
# Unite all cylinders into one object, then mirror the united object
# and unite the mirrored object with the original united object
UnitedObjects = ",".join(["Cylinder_From_CSV%d" % (i + 1) for i in range(len(coordinates))],
)
oEditor.Unite(["NAME:Selections", "Selections:=", UnitedObjects],["NAME:UniteParameters", "KeepOriginals:=", False],
)oEditor.DuplicateMirror(["NAME:Selections","Selections:=","Cylinder_From_CSV1","NewPartsModelFlag:=","Model",],["NAME:DuplicateToMirrorParameters","DuplicateMirrorBaseX:=","0mm","DuplicateMirrorBaseY:=","0mm","DuplicateMirrorBaseZ:=","0mm","DuplicateMirrorNormalX:=","-1mm","DuplicateMirrorNormalY:=","0mm","DuplicateMirrorNormalZ:=","0mm",],["NAME:Options", "DuplicateAssignments:=", True],["CreateGroupsForNewObjects:=", False],
)
oEditor.Unite(["NAME:Selections", "Selections:=", "Cylinder_From_CSV1,Cylinder_From_CSV1_1"],["NAME:UniteParameters", "KeepOriginals:=", False],
)

参考文献

[1] Prof. Halim Boutayeb, Metasurface Design: Theory, Applications & HFSS Simulations with Python | RF & Microwave Engineering, Youtube, https://www.youtube.com/watch?v=To8rcAq12mc, Nov.2024(accessed Oct. 2025).
[2] A. Hossain and A. -V. Pham, "A Novel Gain-Enhanced Miniaturized and Lightweight Vivaldi Antenna," in IEEE Transactions on Antennas and Propagation, vol. 71, no. 12, pp. 9431-9439, Dec. 2023.
[3] Ronghua.LI, [图文笔记]Fusion 创建Python脚本-入门篇01, Autodesk Community, https://forums.autodesk.com/t5/fusion-chan-pin-ji-shu-ying-yong-zhong-wen-lun-tan/tu-wen-bi-ji-fusion-chuang-jianpython-jiao-ben-ru-men-pian01/td-p/10677228, Oct. 2021(accessed Oct. 2025).

http://www.hskmm.com/?act=detail&tid=30257

相关文章:

  • 单 Pod DNS 记录(`web-0.nginx.default.svc.cluster.local`)排障与启用
  • 云原生周刊:KubeSphere社区版正式发布
  • 最好的感情
  • 三剑客系列-sed命令
  • 超景深立体显微镜厂家Top10推荐:拓界光电引领行业新风尚
  • 20232419 2025-2026-1《网络与系统攻防技术》实验一实验报告
  • 完整教程:用deepseek部署全自动的机器人--bytebot
  • 44. 开发商购买土地
  • 当AI与机器人走进生活:我们即将迎来的日常变革
  • 显微镜厂家TOP10推荐:拓界光电以创新技术引领精密观测新时代
  • net中使用了垃圾回收机制(GC)功能
  • 2025 超景深三维显微镜厂家 TOP10 推荐:三维成像技术的行业应用标杆​
  • 音乐节奏跳动
  • CF2160 Codeforces Round 1058 (Div. 2) 游记
  • 2025年国内铝单板工厂推荐/国内铝单板厂家/ 市场铝单板推/公司榜荐
  • 一个老码农的掏心窝推荐:微擎,我后悔没早点遇到的开发利器
  • 国内铝单板工厂推荐/国内铝单板厂家/ 市场铝单板推荐:四川汇才铝业有限公司
  • 超景深显微镜厂家TOP10推荐:拓界光电引领精密观测新时代
  • 2025 闪蒸/流化床/喷雾/实验型喷雾/离心喷雾/压力喷雾/流化床喷雾/桨叶/盘式/真空耙式干燥机厂家推荐榜单:技术适配与场景落地能力成核心考量
  • 2025 年点胶机源头厂家最新推荐排行榜:自动 / 果冻胶 / 无痕内衣 / 烫钻 / 珠宝热熔胶等多类型设备优质企业精选
  • harbor 局域网https 自签名证书搭建
  • HyperWorks许可证使用报告生成
  • 2025年国内铝单板工厂推荐/国内铝单板厂家/ 市场铝单板推/公司权威排行榜荐
  • 小程序 拖动节点
  • ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数
  • Python的解释器
  • 10月13号
  • shiro快速启动
  • netty思维导图总结
  • gitreset、revert