2022年1月4日 星期二

利用程式物件來快速定義拓樸

使用者可以指定每個格點的材料來定義馬達截面的拓樸結構。可搭配PyAEDT快速生成Maxwell2D的設計並完成模擬。

from matplotlib.patches import Wedge
from matplotlib.collections import PatchCollection
import matplotlib.pyplot as plt

m1 = 90
m2 = 45

class topology():
def __init__(self):
self.materials = {}
self.wedges = []
dx = 90 / 20
dy = 0.5 / 20

for i in range(1, 21):
for j in range(1, 20 + 1):
self.materials[i, j] = 0
w = Wedge((0, 0), 0.5 + j * dy, (i-1) * dx, i * dx, dy)
self.wedges.append(w)

def getmaterials(self):
result = []
for i in range(1, 21):
for j in range(1, 20 + 1):
result.append(self.materials[i, j])
return result

def show(self):
cmap = plt.cm.get_cmap('jet')
p = PatchCollection(s.wedges, alpha=1, cmap=cmap, )
p.set_clim(0, 100)
p.set_array(self.getmaterials())
p.set_color('w')
fig, ax = plt.subplots(figsize=(15, 15))
ax.add_collection(p)

s = topology()
s.materials[1, 20] = m1
s.materials[10, 10] = m2
s.materials[20, 1] = m2
for i in [5, 6, 7, 8]:
s.materials[i, 14] = m1
s.show()


2021年12月23日 星期四

HFSS API用來載入激發源設定的csv檔

現有的AEDT API不支援載入激發源的csv,這裡我自己寫了一個。

oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()
oModule = oDesign.GetModule("Solutions")


def loadExcitation(csv_path):
with open(csv_path) as f:
text = f.readlines()

if 'Source,Magnitude,Phase,Terminated,Resistance,Reactance' in text[0]:
items = []
for line in text[1:]:
Source, Magnitude, Phase, Terminated, Resistance, Reactance = line.strip().split(',')
try:
if Terminated == '1':
items.append([
"Name:=" , Source,
"Terminated:=" , True,
"Resistance:=" , Resistance,
"Reactance:=" , Reactance
])
else:
items.append([
"Name:=" , Source,
"Terminated:=" , False,
"Magnitude:=" , Magnitude,
"Phase:=" , Phase
])
except:
pass
AddWarningMessage(str(items))
oModule.EditSources(
[
[
"UseIncidentVoltage:=" , False,
"IncludePortPostProcessing:=", False,
"SpecifySystemPower:=" , False
]
] + items)

else:
items = []
for line in text[1:]:
try:
Source ,Magnitude ,Phase = line.strip().split(',')
items.append([
"Name:=" , Source,
"Magnitude:=" , Magnitude,
"Phase:=" , Phase])
except:
pass
AddWarningMessage(str(items))
oModule.EditSources(
[
[
"IncludePortPostProcessing:=", False,
"SpecifySystemPower:=" , False
]
] + items)


loadExcitation('d:/demo/sss2.csv')


將3D Layout當中沒有封閉的Polyline封閉成Polygon

如果沒有封閉的曲線不是一個polyline,而是多個分離的線段(line),那麼可以先執行Draw > Stitch Lines將其轉換成單一Polyline,再執行下面腳本。形成封閉polygon之後,接下來便可以進行電磁模擬。

oDesktop.ClearMessages("", "", 2)

oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()
oEditor = oDesign.GetActiveEditor()

selected = oEditor.GetSelections()

for i in selected:
data = []
placement_layer = oEditor.GetPropertyValue('BaseElementTab', i, 'PlacementLayer')

for j in oEditor.GetProperties('BaseElementTab', i):
if j.startswith('Pt'):
location = oEditor.GetPropertyValue('BaseElementTab', i, j)
x, y = [float(k) for k in location.split(',')]
data += ["x:=", x, "y:=", y]

name = oEditor.CreatePolygon(
[
"NAME:Contents",
"polyGeometry:=",
["Name:=", "poly_1002", "LayerName:=", placement_layer, "lw:=", "0", "n:=", len(data), "U:=", "mm", ] + data
])
AddWarningMessage('{} is created!'.format(name))

oEditor.Delete(selected)



2021年12月7日 星期二

在Q3D輸出頻率點

在Q3D當中找不到輸出頻率的API函數。一個方法是在模擬完成之後,用下面程式碼輸出頻率值:

import ScriptEnv
ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oDesktop.ClearMessages("", "", 2)
oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()

oModule = oDesign.GetModule("ReportSetup")
arr = oModule.GetSolutionDataPerVariation(
"Matrix",
"Setup1 : Sweep1",
["Context:=", "Original"],
['Freq:=', ['All']],
["mag(Freq)"])

freqs = arr[0].GetRealDataValues("mag(Freq)")
AddWarningMessage(str(freqs))

2021年12月1日 星期三

匯入.asc的程式碼

 PADS .asc轉檔程式已沒有更新,不建議使用

import os

os.environ['path'] = 'C:\Program Files\AnsysEM\AnsysEM21.2\Win64'

os.system('padstoanf.exe d:/demo/41266AAB-JOB.asc')
os.system('anfv4toanfv2.exe d:/demo/PadsLayout.anf')

oTool = oDesktop.GetTool("ImportExport")
oTool.ImportANFV2("D:/demo/PadsLayout_V2.anf", "D:/temp/PadsLayout_V21.aedb", "", "")

2021年11月30日 星期二

AEDT設計屬性匯出及匯入

 exportDesignProperties.py

import clr
clr.AddReference("System.Windows.Forms")

from System.Windows.Forms import DialogResult, SaveFileDialog
dialog = SaveFileDialog()
dialog.Title = "Export Design Properties"
dialog.Filter = "csv file (*.csv)|*.csv"

if dialog.ShowDialog() == DialogResult.OK:
csv_path = dialog.FileName
oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()

data = []
for key in oDesign.GetProperties('LocalVariableTab', "LocalVariables"):
value = oDesign.GetPropertyValue('LocalVariableTab', "LocalVariables", key)
data.append((key, value))

with open(csv_path, 'w') as f:
for key, value in data:
f.writelines('{}, {}\n'.format(key, value))
else:
pass

importDesignProperties.py

import clr
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import DialogResult, OpenFileDialog

dialog = OpenFileDialog()
dialog.Multiselect = False
dialog.Title = "HFSS ffd to csv converter"
dialog.Filter = "csv file (*.csv)|*.csv"

if dialog.ShowDialog() == DialogResult.OK:
csv_path = dialog.FileName

with open(csv_path) as f:
text = f.readlines()

data = []
for line in text:
try:
key, value = line.split(',')[0:2]
data.append((key, value))
except:
pass

oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()
for key, value in data:
oDesign.ChangeProperty(
[
"NAME:AllTabs",
[
"NAME:LocalVariableTab",
[
"NAME:PropServers",
"LocalVariables"
],
[
"NAME:ChangedProps",
[
"NAME:{}".format(key),
"Value:=" , value
]
]
]
])
else:
pass

2021年11月26日 星期五

輸出變數及使用該變數的物件名稱

輸出變數及使用該變數的物件名稱

import os, re

oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()
oEditor = oDesign.SetActiveEditor("3D Modeler")

oDesktop.ClearMessages("", "", 2)

properties = oDesign.GetProperties('LocalVariableTab', "LocalVariables")
prj_path = os.path.join(oProject.GetPath(), oProject.GetName() + '.aedt')
design_name = oDesign.GetName()

with open(prj_path) as f:
text = f.readlines()

models = []
for n, line in enumerate(text):
if "$begin 'HFSSModel'" in line:
model = []
elif "$end 'HFSSModel'" in line:
models.append(model)
del (model)

try:
model.append(line)
except:
pass

data = {}
for model in models:
if design_name not in model[2]:
continue
for prop_name in properties:
for line in model:
m = re.search("Name=(.*)", line)
if m:
obj = m.group(1).replace("'", '')
continue

if prop_name in line and '=' in line and 'obj' in locals():
try:
if obj not in data[prop_name]:
data[prop_name] += [obj]
except:
data[prop_name] = [obj]

for i, v in data.items():
AddWarningMessage(str(i) + ': ' + str(v))