关于: "AutoEM":

AutoEM coreparameter update

目标:增加核心参数的一次性罗列!在每一次call Ansys maxwell 完成计算之后,获取结果参数,call back 到UI上!

方式:核心参数还是用qgrid生成,保持动态特性。价值是维护方便

数据存在df_for_detail 的变量里面!

暂时的问题是对数据结构的设计,需要呈现哪些data还需要仔细的思考!



n5321 | 2025年11月2日 23:29

AutoEM chart update

一个logic 看上去很简单的update,居然花了差不多两天的时间!

目标:在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大概如下:

  1. page默认生成一个chart! chart是在fig 里面!

  2. UI提供chart的框子——准备填matplot的figure,设置成canva

  3. worker get data

  4. plotting tool 升成figure(用新曲线完全替代)

  5. 再返回到worker

  6. UI清楚原来的figure,添加新的figure

尝试实操!

  1. 更改logic!不在替换figure,考虑用同一个figure,在figure的框架里做删改traces!

    1. 问题是figure里面对于chart的设置有大量的代码,把设置代码从plotting_tool改到init之中,后续recall的时候又会用默认设置。

    2. 放弃新idea,继续用figure替换的思路。

  2. 未做深入思考,考虑增加一个function,plotting_tool生成sim chart,增加一个ref_chart的功能几乎一致的function,来生成ref chart。然后卡住了。

    1. 晚上睡觉才想起本质上是替换的,把设置全部堆到plotting_tool才是正常操作!

  3. 增加新功能,UI里添加button,click以后,可以看到ref chart!

    1. 需要把UI get 到的data 传递到worker,worker生成fig,再传递会UI

    2. 本质上我对signal and slot的逻辑没有搞清楚。

  4. 问题:在这种细节繁复的装配体结构中,数据的传递,logic线的设计,是架构师内容。还蛮麻烦的!

  5. 自己对QT的框架理解本质上不够!

还是需要深入阅读代码!

暂时解决问题!


n5321 | 2025年11月2日 10:42

maxwell 作为com对象分析

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']

具体来看:

 MaxwellAutomation 类结构概览

🧩 一、核心对象属性(Attributes)

属性名类型/用途说明
DesktopAEDT 桌面对象(oDesktop)控制 Maxwell AEDT 会话、项目打开、退出等操作。
ProjectAEDT 工程对象(oProject)当前打开的 Maxwell 工程。
DesignAEDT 设计对象(oDesign)当前工程下的具体设计,如“RMxprtDesign”或“Maxwell3DDesign”。
EditorAEDT 编辑器对象(oEditor)用于修改几何、材料、属性、参数。通常是 "3D Modeler" 编辑器。
ModuleAEDT 模块对象(oModule)可调用报告、求解、场后处理等功能模块,如 "ReportSetup""FieldsReporter" 等。
iMaxwellCOM 接口对象win32com.client.Dispatch("Ansoft.ElectronicsDesktop") 获取,用于连接 AEDT。

⚙️ 二、主要方法(Methods)

方法名主要功能典型调用示例
__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 魔法方法(不需手动调用)

这些是 Python 自动提供的类方法,用于对象描述、比较、属性访问等,一般不手动使用:

方法功能
__init__构造函数
__str__ / __repr__控制打印输出格式
__eq__, __lt__, __gt__对象比较
__getattribute__, __setattr__控制属性访问
__dict__, __doc__存放实例属性与文档说明
__sizeof__, __reduce__, __module__内部运行支持


n5321 | 2025年10月30日 22:20

Python modify Ansys Maxwell properties!

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

潜在bug!

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

AutoEM desktop app design

new page

chart的字体太大了!已经从12改到10号,怎么好像还是有点不好看!

核心参数的内容需要思考一下!

重点是要把对比体现出来!user的目标是设计最好的电机,最好是比较出来的!

日志的位置可以考虑调整,参数设置的地方需要更改!chart 那里考虑做tab!同时需要看的还有其他好几个图,比如齿槽扭力的chart就值得看一眼!这个改动感觉需要一两周才搞得完啊!

debug的工作量有点大!



n5321 | 2025年10月20日 00:30

python 版AutoEM

问题:

数据获取已经搞定!

有了一个最简单的可以work的GUI版本!

问题:
结果图表需要整理!

Log,目前的log未填充文本进文档。需要添加进去!

参数不用table,用edit_line!_后续更改!

button keep one!

文档加密的问题!后续添加?keep MVP框架?!




n5321 | 2025年10月14日 00:00

AutoEMthinking

制样单 and 检测要求两个东西需要添加进来。

考虑这个表用db生成!

class里面需要设计一个虚拟class,应用design pattern!

这个检验标准本质上意义不大!目的是维持一致性!




n5321 | 2025年4月22日 10:05

AutoEM_thinking

通用工具还是专用工具?!

Ansoft本身的臃肿,用户体验差就是因为通用才导致的。不同电机的结构逻辑是不同的,可是他要用一个UI layout来实现。现在在refactoring工作上,要搞通用本质上就没有意义了。

应该还是make contract app!

项目做多了以后,整个的思想好像完全不在以前的层面上了!

看自己3年前的code。原生态,不考虑维护和扩展性,专注于解决一个单一、具体的问题确实还是生猛!

这个生猛按编程的正常思路来看可以算是不成熟,可是在business domain上面却可以算是criteria!按painting界大佬的台词,

自己打小、也就是十几岁的时候就可以画很精细的、古典画派的素描,但是长大了以后,一直想的是画得像个小朋友一样,这样子才生猛。

结合生猛、与成熟,才是境界!


在architect的角度上重构,存在若干的逻辑细节,居然还是需要一些时间!




n5321 | 2025年4月17日 23:28