Как обойти GMSH и графический интерфейс Calculix в FreeCAD для автоматизации анализа методом конечных элементов с помощьPython

Программы на Python
Anonymous
Как обойти GMSH и графический интерфейс Calculix в FreeCAD для автоматизации анализа методом конечных элементов с помощь

Сообщение Anonymous »

Я создал макрос (скрипт Python) во FreeCAD, который генерирует консольную балку, создает анализ, выбирает материал и применяет ограничения к телу.

Как мне теперь расширить сценарий, чтобы я мог создать сетку (используя GMSH) и запустить анализ с помощью Calculix в том же сценарии?

Пожалуйста, посмотрите мой код ниже:

Код: Выделить всё

import FreeCAD
import PartDesign
import PartDesignGui
import Sketcher
import FemGui
import ObjectsFem
import Fem

# Open new Document
exec(open('/usr/share/freecad/Mod/Start/StartPage/LoadNew.py').read())
App.setActiveDocument("Unnamed")
App.ActiveDocument=App.getDocument("Unnamed")

#
# generate cantilever beam
#

# Start new part design
App.activeDocument().addObject('PartDesign::Body','Body')
App.activeDocument().Body.newObject('Sketcher::SketchObject','Sketch')
App.activeDocument().Sketch.Support = (App.activeDocument().XY_Plane, [''])
App.activeDocument().Sketch.MapMode = 'FlatFace'
App.ActiveDocument.recompute()

# create cross section sketch
geoList = []
geoList.append(Part.LineSegment(App.Vector(-10,  9,0),App.Vector( 10,  9,0)))
geoList.append(Part.LineSegment(App.Vector( 10,  9,0),App.Vector( 10,-10,0)))
geoList.append(Part.LineSegment(App.Vector( 10,-10,0),App.Vector(-10,-10,0)))
geoList.append(Part.LineSegment(App.Vector(-10,-10,0),App.Vector(-10,  9,0)))
App.ActiveDocument.Sketch.addGeometry(geoList,False)
conList = []
conList.append(Sketcher.Constraint('Coincident',0,2,1,1))
conList.append(Sketcher.Constraint('Coincident',1,2,2,1))
conList.append(Sketcher.Constraint('Coincident',2,2,3,1))
conList.append(Sketcher.Constraint('Coincident',3,2,0,1))
conList.append(Sketcher.Constraint('Horizontal',0))
conList.append(Sketcher.Constraint('Horizontal',2))
conList.append(Sketcher.Constraint('Vertical',1))
conList.append(Sketcher.Constraint('Vertical',3))
App.ActiveDocument.Sketch.addConstraint(conList)

# Pad the cross section to create beam
App.getDocument('Unnamed').recompute()
App.activeDocument().Body.newObject("PartDesign::Pad","Pad")
App.activeDocument().Pad.Profile = App.activeDocument().Sketch
App.activeDocument().Pad.Length = 10.0
App.ActiveDocument.recompute()
App.ActiveDocument.recompute()
App.ActiveDocument.Pad.Length = 200.000000
App.ActiveDocument.Pad.Length2 = 100.000000
App.ActiveDocument.Pad.Type = 0
App.ActiveDocument.Pad.UpToFace = None
App.ActiveDocument.Pad.Reversed = 0
App.ActiveDocument.Pad.Midplane = 0
App.ActiveDocument.Pad.Offset = 0.000000
App.ActiveDocument.recompute()

#
# Start FEM process
#

# make analysis
ObjectsFem.makeAnalysis(FreeCAD.ActiveDocument, 'Analysis')
FemGui.setActiveAnalysis(FreeCAD.ActiveDocument.ActiveObject)
ObjectsFem.makeSolverCalculixCcxTools(FreeCAD.ActiveDocument)
FemGui.getActiveAnalysis().addObject(FreeCAD.ActiveDocument.ActiveObject)
# Select Material
FemGui.getActiveAnalysis().addObject(ObjectsFem.makeMaterialSolid(FreeCAD.ActiveDocument,  'SolidMaterial'))
FreeCADGui.ActiveDocument.setEdit(FreeCAD.ActiveDocument.ActiveObject.Name)
# Add Fixed Constraint
App.activeDocument().addObject("Fem::ConstraintFixed","FemConstraintFixed")
App.activeDocument().FemConstraintFixed.Scale = 1
App.activeDocument().Analysis.addObject(App.activeDocument().FemConstraintFixed)
for amesh in App.activeDocument().Objects:
if "FemConstraintFixed" == amesh.Name:
amesh.ViewObject.Visibility = True
elif "Mesh" in amesh.TypeId:
aparttoshow = amesh.Name.replace("_Mesh","")
for apart in App.activeDocument().Objects:
if aparttoshow == apart.Name:
apart.ViewObject.Visibility = True
amesh.ViewObject.Visibility = False

App.ActiveDocument.recompute()
App.ActiveDocument.FemConstraintFixed.Scale = 1
App.ActiveDocument.FemConstraintFixed.References = [(App.ActiveDocument.Pad,"Face5")]
App.ActiveDocument.recompute()

# Add Force Constraint
App.activeDocument().addObject("Fem::ConstraintForce","FemConstraintForce")
App.activeDocument().FemConstraintForce.Force = 1.0
App.activeDocument().FemConstraintForce.Reversed = False
App.activeDocument().FemConstraintForce.Scale = 1
App.activeDocument().Analysis.addObject(App.activeDocument().FemConstraintForce)
for amesh in App.activeDocument().Objects:
if "FemConstraintForce" == amesh.Name:
amesh.ViewObject.Visibility = True
elif "Mesh" in amesh.TypeId:
aparttoshow = amesh.Name.replace("_Mesh","")
for apart in App.activeDocument().Objects:
if aparttoshow == apart.Name:
apart.ViewObject.Visibility = True
amesh.ViewObject.Visibility = False

App.ActiveDocument.recompute()
App.ActiveDocument.FemConstraintForce.Force = 1
App.ActiveDocument.FemConstraintForce.Direction = None
App.ActiveDocument.FemConstraintForce.Reversed = False
App.ActiveDocument.FemConstraintForce.Scale = 1
App.ActiveDocument.FemConstraintForce.References = [(App.ActiveDocument.Pad,"Face6")]
App.ActiveDocument.recompute()

# Generate Mesh
ObjectsFem.makeMeshGmsh(FreeCAD.ActiveDocument, 'FEMMeshGmsh')
FreeCAD.ActiveDocument.ActiveObject.Part = FreeCAD.ActiveDocument.Pad
FemGui.getActiveAnalysis().addObject(FreeCAD.ActiveDocument.ActiveObject)
FreeCADGui.ActiveDocument.setEdit(FreeCAD.ActiveDocument.ActiveObject.Name)
Когда я запускаю свой код, я получаю полный анализ настроек с примененными ограничениями и выбором материала. FreeCAD показывает мне вид «Сетка FEM от Gmsh», где я могу выбрать параметры и нажать кнопку для создания файла сетки. Я хотел бы нажать эту кнопку в коде.

Аналогично я могу дважды щелкнуть на моем решателе Calculix и открыть представление «Механический анализ», которое позволяет мне выбрать тип анализа, создать файл .inp и запустить анализ. Как мне выполнить эти шаги в коде?

Я готов вызывать из моего файла Python другие файлы сценариев, написанные на других языках. Но мне нужно, чтобы это было автоматизировано, т.е. Я мог бы выполнить различные анализы в цикле for.

Вернуться в «Python»