AutoEM coreparameter update
目标:增加核心参数的一次性罗列!在每一次call Ansys maxwell 完成计算之后,获取结果参数,call back 到UI上!
方式:核心参数还是用qgrid生成,保持动态特性。价值是维护方便

数据存在df_for_detail 的变量里面!
暂时的问题是对数据结构的设计,需要呈现哪些data还需要仔细的思考!
n5321 | 2025年11月2日 23:29
目标:增加核心参数的一次性罗列!在每一次call Ansys maxwell 完成计算之后,获取结果参数,call back 到UI上!
方式:核心参数还是用qgrid生成,保持动态特性。价值是维护方便

数据存在df_for_detail 的变量里面!
暂时的问题是对数据结构的设计,需要呈现哪些data还需要仔细的思考!
n5321 | 2025年11月2日 23:29
目标:在matplotlib的曲线图里添加对照组。
方式:在UI里添加button,选择,读取csv文档 add traces,沿用原始的chart设置!
测试idea: 写了一个try_compare.py,UI, path齐全,分分钟搞定了!
实操:添加进AutoEM。
完全不是那么回事!
try_compare写的logic 跟AutoEM完全不同!try_compare在一段script把所有的东西都包括进去了,所以debug 也极其简单!
在AutoEM中有一个很复杂的操作,因为数据和控制要传到到N个object!他具体的logi大概如下:
page默认生成一个chart! chart是在fig 里面!
UI提供chart的框子——准备填matplot的figure,设置成canva
worker get data
plotting tool 升成figure(用新曲线完全替代)
再返回到worker
UI清楚原来的figure,添加新的figure
尝试实操!
更改logic!不在替换figure,考虑用同一个figure,在figure的框架里做删改traces!
问题是figure里面对于chart的设置有大量的代码,把设置代码从plotting_tool改到init之中,后续recall的时候又会用默认设置。
放弃新idea,继续用figure替换的思路。
未做深入思考,考虑增加一个function,plotting_tool生成sim chart,增加一个ref_chart的功能几乎一致的function,来生成ref chart。然后卡住了。
晚上睡觉才想起本质上是替换的,把设置全部堆到plotting_tool才是正常操作!
增加新功能,UI里添加button,click以后,可以看到ref chart!
需要把UI get 到的data 传递到worker,worker生成fig,再传递会UI
本质上我对signal and slot的逻辑没有搞清楚。
问题:在这种细节繁复的装配体结构中,数据的传递,logic线的设计,是架构师内容。还蛮麻烦的!
自己对QT的框架理解本质上不够!
还是需要深入阅读代码!
n5321 | 2025年11月2日 10:42
matlab 有invoke 函数来探测COM!
在python 下面用的dir
dir(self.maxwell_app) ['Design', 'Desktop', 'Editor', 'Module', 'Project', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'analyze_design', 'connect_maxwell', 'export_reports', 'iMaxwell', 'open_project_and_design', 'release_maxwell', 'set_properties']
具体来看:
| 属性名 | 类型/用途 | 说明 |
|---|---|---|
Desktop | AEDT 桌面对象(oDesktop) | 控制 Maxwell AEDT 会话、项目打开、退出等操作。 |
Project | AEDT 工程对象(oProject) | 当前打开的 Maxwell 工程。 |
Design | AEDT 设计对象(oDesign) | 当前工程下的具体设计,如“RMxprtDesign”或“Maxwell3DDesign”。 |
Editor | AEDT 编辑器对象(oEditor) | 用于修改几何、材料、属性、参数。通常是 "3D Modeler" 编辑器。 |
Module | AEDT 模块对象(oModule) | 可调用报告、求解、场后处理等功能模块,如 "ReportSetup"、"FieldsReporter" 等。 |
iMaxwell | COM 接口对象 | 由 win32com.client.Dispatch("Ansoft.ElectronicsDesktop") 获取,用于连接 AEDT。 |
| 方法名 | 主要功能 | 典型调用示例 |
|---|---|---|
__init__() | 初始化 MaxwellAutomation 实例 | app = MaxwellAutomation() |
connect_maxwell() | 建立与 Maxwell AEDT 的 COM 连接 | app.connect_maxwell() |
open_project_and_design(config) | 打开指定工程与设计 | app.open_project_and_design(config) |
set_properties(property_changes) | 批量修改参数属性 | app.set_properties(property_changes) |
analyze_design(setup_name) | 启动指定 Setup 的仿真 | app.analyze_design("Setup1") |
export_reports(config) | 导出仿真结果报告或数据文件 | app.export_reports(config) |
release_maxwell() | 关闭并释放 Maxwell 会话 | app.release_maxwell() |
这些是 Python 自动提供的类方法,用于对象描述、比较、属性访问等,一般不手动使用:
| 方法 | 功能 |
|---|---|
__init__ | 构造函数 |
__str__ / __repr__ | 控制打印输出格式 |
__eq__, __lt__, __gt__ | 对象比较 |
__getattribute__, __setattr__ | 控制属性访问 |
__dict__, __doc__ | 存放实例属性与文档说明 |
__sizeof__, __reduce__, __module__ | 内部运行支持 |
n5321 | 2025年10月30日 22:20
python通过com32 来更改ansys 参数的logic 跟matlab 确实不同!
一个简单的事情,居然还花了几个小时的时间!
背景:
1. matlab基本上copy record vbscript 就可以了!但是python 用的是不一样的logic!
通过com32, 他是直接插入到Ansys对象里面去的!一个com又已经被封装了! 我熟悉的是actxserver下面对ansys 的manipulate!
2. Ansys Maxwell下面的数据结构对于不同的参数来说,是不一样的!所以他需要设计不同的控制结构!开始考虑是做成一个数组结构,然后添加索引,match 到了以后直接调用。
问题是中间debug的过程比较麻烦!因为封装了,所以有点难把问题点拎出来!
logic! 暂时用的这个code 实现!
def set_properties(self, prop_changes):
"""Applies a list of property changes to the active design or editor."""
for prop_change in prop_changes:
changed_props = ["NAME:" + prop_change['name']]
print('更改的参数', changed_props)
if prop_change['name'] == 'Wire Size':
# Wire Size 复合属性
changed_props += [
"WireSizeWireDiameter:=", prop_change['value'],
"WireSizeGauge:=", "0",
"WireSizeWireWidth:=", "0mm",
"WireSizeWireThickness:=", "0mm",
"WireSizeMixedWireRectType:=", False,
["NAME:WireSizeMixedDiameter"],
["NAME:WireSizeMixedWidth"],
["NAME:WireSizeMixedThickness"],
["NAME:WireSizeMixedThicknessMixedFillet"],
["NAME:WireSizeMixedThicknessMixedNumber"]
]
print('wiresize data is', changed_props)
# 不同类型的参数修改方式
if 'type' in prop_change:
if prop_change['type'] == 'Value':
changed_props += ["Value:=", prop_change['value']]
elif prop_change['type'] == 'Material':
changed_props += ["Material:=", prop_change['value']]
elif prop_change['type'] == 'MustBeInt':
changed_props += [
"MustBeInt:=", prop_change.get('must_be_int', False),
"Value:=", prop_change['value']
]
else:
# 默认只写 Value
changed_props += ["Value:=", prop_change['value']]
# 选择目标对象
if prop_change['target'] == 'Editor':
self.Editor.ChangeProperty([
"NAME:AllTabs",
[
f"NAME:{prop_change['tab']}",
["NAME:PropServers", prop_change['prop_server']],
["NAME:ChangedProps", changed_props]
]
])
elif prop_change['target'] == 'Design':
self.Design.ChangeProperty([
"NAME:AllTabs",
[
f"NAME:{prop_change['tab']}",
["NAME:PropServers", prop_change['prop_server']],
["NAME:ChangedProps", [
"NAME:" + prop_change['name'],
"Value:=", prop_change['value']
]]
]
])
几个点记录一下!
1, 考虑更改的参数,暂时用的prop_changes来统一。里面去changed_props来做微调。
最后通过self.editer or self.design来更改。
2, 更改的参数点,需要把所以的参数都记录进来!
更改文档
maxwell_automation.py
ai_search_page.py
n5321 | 2025年10月26日 11:00
properties setup暂时用的这个function!
感觉是一个坑
def _get_property_changes_from_table(self) -> List[dict]:
"""
从参数表格中获取用户输入的属性修改。
返回一个字典列表,每个字典包含一个属性的修改信息。
"""
prop_changes = []
prop_map = {
"Reference Speed": {'target': 'Editor', 'tab': 'Machine', 'prop_server': 'Machine', 'type': 'Value'},
"Steel Type (Stator)": {'target': 'Editor', 'tab': 'Stator', 'prop_server': 'Stator', 'type': 'Material'},
"Steel Type (Rotor)": {'target': 'Editor', 'tab': 'Rotor', 'prop_server': 'Rotor', 'type': 'Material'},
"Embrace": {'target': 'Editor', 'tab': 'Pole', 'prop_server': 'Rotor:Pole', 'type': 'Value'},
"Magnet Thickness": {'target': 'Editor', 'tab': 'Pole', 'prop_server': 'Rotor:Pole', 'type': 'Value'},
"Rated Output Power": {'target': 'Design', 'tab': 'General', 'prop_server': 'AnalysisSetup:all', 'type': 'Value'},
"Rated Speed": {'target': 'Design', 'tab': 'General', 'prop_server': 'AnalysisSetup:Setup1', 'type': 'Value'},
}
for row in range(self.param_table.rowCount()):
name_item = self.param_table.item(row, 0)
value_item = self.param_table.item(row, 1)
if name_item and value_item:
name = name_item.text().strip()
value = value_item.text().strip()
if name in prop_map:
info = prop_map[name].copy()
info['name'] = name
info['value'] = value
prop_changes.append(info)
elif name: # 如果参数名不为空但不在映射中
self.log_output.append(f"<span style='color:orange;'>警告: 未知参数 '{name}',将跳过。</span>")
logging.warning(f"未知参数 '{name}',将跳过。")
logging.debug(f"Collected property changes: {prop_changes}")
return prop_changes
n5321 | 2025年10月21日 00:13
new page
chart的字体太大了!已经从12改到10号,怎么好像还是有点不好看!
核心参数的内容需要思考一下!
重点是要把对比体现出来!user的目标是设计最好的电机,最好是比较出来的!
日志的位置可以考虑调整,参数设置的地方需要更改!chart 那里考虑做tab!同时需要看的还有其他好几个图,比如齿槽扭力的chart就值得看一眼!这个改动感觉需要一两周才搞得完啊!
debug的工作量有点大!
n5321 | 2025年10月20日 00:30
问题:
数据获取已经搞定!
有了一个最简单的可以work的GUI版本!

问题:
结果图表需要整理!
Log,目前的log未填充文本进文档。需要添加进去!
参数不用table,用edit_line!_后续更改!
button keep one!
文档加密的问题!后续添加?keep MVP框架?!
n5321 | 2025年10月14日 00:00
制样单 and 检测要求两个东西需要添加进来。

考虑这个表用db生成!
class里面需要设计一个虚拟class,应用design pattern!

这个检验标准本质上意义不大!目的是维持一致性!
n5321 | 2025年4月22日 10:05
通用工具还是专用工具?!
Ansoft本身的臃肿,用户体验差就是因为通用才导致的。不同电机的结构逻辑是不同的,可是他要用一个UI layout来实现。现在在refactoring工作上,要搞通用本质上就没有意义了。
应该还是make contract app!
项目做多了以后,整个的思想好像完全不在以前的层面上了!
看自己3年前的code。原生态,不考虑维护和扩展性,专注于解决一个单一、具体的问题确实还是生猛!
这个生猛按编程的正常思路来看可以算是不成熟,可是在business domain上面却可以算是criteria!按painting界大佬的台词,
自己打小、也就是十几岁的时候就可以画很精细的、古典画派的素描,但是长大了以后,一直想的是画得像个小朋友一样,这样子才生猛。
结合生猛、与成熟,才是境界!
在architect的角度上重构,存在若干的逻辑细节,居然还是需要一些时间!
n5321 | 2025年4月17日 23:28