2021年1月21日 星期四

如何在3D Layout當中生成陣列結構

import ScriptEnv


ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()
oEditor = oDesign.GetActiveEditor()


def create_rect(x, y, w, l, layer):
x0, y0 = x - w / 2, y - l / 2
x1, y1 = x + w / 2, y + l / 2
objname = oEditor.CreateRectangle(
[
"NAME:Contents",
"rectGeometry:=",
["Name:=", "", "LayerName:=", layer, "lw:=", "0", "Ax:=", str(x0), "Ay:=", str(y0), "Bx:=", str(x1), "By:=",
str(y1), "cr:=", "0deg", "ang:=", "0deg"]
])

return objname


def build_array(obj_name, m, n, dx, dy):
obj_type = oEditor.GetPropertyValue('BaseElementTab', obj_name, 'Type')
old = oEditor.FindObjects('Type', obj_type)
oEditor.Duplicate(
[
"NAME:options",
"count:=" , m
],
[
"NAME:elements",
obj_name
], [dx, 0])
new = oEditor.FindObjects('Type', obj_type)
x = [obj_name] + list(set(new) -set(old))

oEditor.Duplicate(
[
"NAME:options",
"count:=" , n
],
["NAME:elements"] + x,
[0, dy])
new = oEditor.FindObjects('Type', obj_type)
return [obj_name] + list(set(new) -set(old))


def copytolayer(obj_list, layer_name):
oEditor.DuplicateAcrossLyrs(
["NAME:elements"] + obj_list,
[
"NAME:layers",
layer_name,
])


x = create_rect(0, 0, 1e-3, 1e-3, layer='top')
y = build_array(x, 5, 5, 2e-3, 2e-3)
copytolayer(y, 'bottom')
(圖一)多層陣列



2021年1月11日 星期一

如何處理大stp檔案

使用者提供了一個400MB的複雜機構stp檔,需要找出當中某些部件輸出到HFSS當中做模擬。正常狀況機構工程師應該只輸出實體物件到stp檔當中,但是這個stp檔並不是。該檔案當中包含了極多的輔助線以及輔助面,要在HFSS當中載入全部物件再從中篩選出所要的實體部件極為耗時(十幾個小時)。為了解決這個問題,我安裝了FreeCAD,當中提供了Python API。我寫了腳本先讀取stp檔,當中用函數輸出所有的實體部件(共600多個)並將其匯出到新的stp當中。最後載入stp到HFSS當中做操作即可。這時候要再設定就簡單多了。

從腳本讀取stp檔的實體物件到生成新的stp檔到最後匯入stp到HFSS,完成所有工作僅需20分鐘。環境為Python3.6版,在Anaconda當中執行。

import sys
sys.path.append('D:/Program Files/FreeCAD 0.18/bin')
import FreeCAD
import Part #載入Part模組

shape = Part.Shape()
shape.read('D:/demo/design.stp') #讀取stp

model = Part.makeCompound(shape.Solids) #solid部件轉成shape
model.exportStep('d:/demo12/final.stp') #shape輸出stp

(圖一) 匯入到HFSS的實體物件