def selectPredefine(self): index = self.form.PredefinedMaterialLibraryComboBox.currentIndex() mat_file_path = self.form.PredefinedMaterialLibraryComboBox.itemData( index) if mat_file_path: self.material = self.materials[mat_file_path] self.selecting_predefined = True try: for m in self.fields: setQuantity(self.text_boxes[m], self.material.get(m, '')) finally: self.selecting_predefined = False self.form.fluidDescriptor.setText(self.material["Description"])
def load(self): """ fills the widgets """ self.form.if_rellen.setValue(self.obj.RelativeLength) if not self.mesh_obj.MeshUtility == "gmsh": setQuantity(self.form.if_refinethick, self.obj.RefinementThickness) self.form.check_boundlayer.setChecked(self.obj.NumberLayers > 1) self.form.if_numlayer.setValue(self.obj.NumberLayers) self.form.if_expratio.setValue(self.obj.ExpansionRatio) setQuantity(self.form.if_firstlayerheight, self.obj.FirstLayerHeight) self.form.if_edgerefinement.setValue(self.obj.RegionEdgeRefinement) if self.obj.Internal: self.form.volumeRefinementToggle.toggle()
def writeMesh(self): import importlib importlib.reload(CfdMeshTools) self.console_message_cart = '' self.Start = time.time() self.Timer.start() # Re-initialise CfdMeshTools with new parameters self.store() FreeCADGui.addModule("CfdMeshTools") FreeCADGui.addModule("CfdTools") FreeCADGui.doCommand( "FreeCAD.ActiveDocument." + self.mesh_obj.Name + ".Proxy.cart_mesh = " "CfdMeshTools.CfdMeshTools(FreeCAD.ActiveDocument." + self.mesh_obj.Name + ")") FreeCADGui.doCommand("cart_mesh = FreeCAD.ActiveDocument." + self.mesh_obj.Name + ".Proxy.cart_mesh") cart_mesh = self.mesh_obj.Proxy.cart_mesh self.consoleMessage("Preparing meshing ...") try: QApplication.setOverrideCursor(Qt.WaitCursor) setQuantity(self.form.if_max, str(cart_mesh.getClmax())) print('Part to mesh:\n Name: ' + cart_mesh.part_obj.Name + ', Label: ' + cart_mesh.part_obj.Label + ', ShapeType: ' + cart_mesh.part_obj.Shape.ShapeType) print(' CharacteristicLengthMax: ' + str(cart_mesh.clmax)) analysis = CfdTools.getParentAnalysisObject(self.mesh_obj) FreeCADGui.doCommand( "cart_mesh.getFilePaths(CfdTools.getOutputPath(FreeCAD.ActiveDocument." + analysis.Name + "))") FreeCADGui.doCommand("cart_mesh.setupMeshCaseDir()") self.consoleMessage("Exporting mesh refinement data ...") FreeCADGui.doCommand("cart_mesh.processRefinements()" ) # Writes stls so need file structure FreeCADGui.doCommand("cart_mesh.processDimension()") FreeCADGui.doCommand("cart_mesh.writeMeshCase()") self.consoleMessage("Exporting the part surfaces ...") FreeCADGui.doCommand("cart_mesh.writePartFile()") self.consoleMessage("Mesh case written to {}".format( self.cart_mesh.meshCaseDir)) except Exception as ex: self.consoleMessage("Error " + type(ex).__name__ + ": " + str(ex), '#FF0000') raise finally: self.Timer.stop() QApplication.restoreOverrideCursor() self.updateUI()
def createTextBoxesBasedOnPhysics(self): if self.physics_obj.Flow == 'Incompressible': self.fields = ['Density', 'DynamicViscosity'] else: self.fields = [ 'MolarMass', 'Cp', 'SutherlandTemperature', 'SutherlandRefTemperature', 'SutherlandRefViscosity' ] self.text_boxes = {} for name in self.fields: widget = FreeCADGui.UiLoader().createWidget("Gui::InputField") widget.setObjectName(name) widget.setProperty("format", "g") val = self.material.get(name, '0') widget.setProperty("unit", val) widget.setProperty("minimum", 0) widget.setProperty("singleStep", 0.1) self.form.propertiesLayout.addRow(name + ":", widget) self.text_boxes[name] = widget setQuantity(widget, val) widget.valueChanged.connect(self.manualEdit)
def load(self): """ Fills the widgets """ setQuantity(self.form.if_max, self.mesh_obj.CharacteristicLengthMax) point_in_mesh = self.mesh_obj.PointInMesh.copy() setQuantity(self.form.if_pointInMeshX, point_in_mesh.get('x')) setQuantity(self.form.if_pointInMeshY, point_in_mesh.get('y')) setQuantity(self.form.if_pointInMeshZ, point_in_mesh.get('z')) self.form.if_cellsbetweenlevels.setValue(self.mesh_obj.CellsBetweenLevels) self.form.if_edgerefine.setValue(self.mesh_obj.EdgeRefinement) index_dimension = self.form.cb_dimension.findText(self.mesh_obj.ElementDimension) self.form.cb_dimension.setCurrentIndex(index_dimension) index_utility = self.form.cb_utility.findText(self.mesh_obj.MeshUtility) self.form.cb_utility.setCurrentIndex(index_utility)
def searchPointInMesh(self): print("Searching for an internal vector point ...") # Apply latest mesh size self.store() pointCheck = self.cart_mesh.automaticInsidePointDetect() iMPx, iMPy, iMPz = pointCheck setQuantity(self.form.if_pointInMeshX, str(iMPx) + "mm") setQuantity(self.form.if_pointInMeshY, str(iMPy) + "mm") setQuantity(self.form.if_pointInMeshZ, str(iMPz) + "mm")
def load(self): if self.obj.Time == 'Steady': self.form.radioButtonSteady.toggle() elif self.obj.Time == 'Transient': self.form.radioButtonTransient.toggle() if self.obj.Phase == 'Single': self.form.radioButtonSinglePhase.toggle() elif self.obj.Phase == 'FreeSurface': self.form.radioButtonFreeSurface.toggle() if self.obj.Flow == 'Incompressible': self.form.radioButtonIncompressible.toggle() elif self.obj.Flow == 'Compressible': self.form.radioButtonCompressible.toggle() self.form.checkBoxHighMach.setChecked(False) elif self.obj.Flow == 'HighMachCompressible': self.form.radioButtonCompressible.toggle() self.form.checkBoxHighMach.setChecked(True) if self.obj.Turbulence == 'Inviscid': self.form.viscousCheckBox.setChecked(False) self.form.radioButtonLaminar.toggle() if self.obj.Turbulence == 'Laminar': self.form.viscousCheckBox.setChecked(True) self.form.radioButtonLaminar.toggle() elif self.obj.Turbulence == 'RANS': self.form.viscousCheckBox.setChecked(True) self.form.radioButtonRANS.toggle() ti = CfdTools.indexOrDefault(RANS_MODELS, self.obj.TurbulenceModel, 0) self.form.turbulenceComboBox.setCurrentIndex(ti) setQuantity(self.form.gx, self.obj.gx) setQuantity(self.form.gy, self.obj.gy) setQuantity(self.form.gz, self.obj.gz) self.updateUI()
def load(self): potential_foam = self.obj.PotentialFoam use_inlet_UP = self.obj.UseInletUPValues if potential_foam: self.form.radioButtonPotentialFlow.toggle() elif use_inlet_UP: self.form.radioButtonUseInletValuesUP.toggle() else: self.form.radioButtonSpecifyValues.toggle() setQuantity(self.form.Ux, self.obj.Ux) setQuantity(self.form.Uy, self.obj.Uy) setQuantity(self.form.Uz, self.obj.Uz) setQuantity(self.form.pressure, self.obj.Pressure) # Add volume fraction fields self.alphas = self.obj.VolumeFractions if self.physicsModel.Phase != 'Single': mat_names = [] for m in self.material_objs: mat_names.append(m.Label) self.form.comboFluid.clear() self.form.comboFluid.addItems(mat_names[:-1]) self.comboFluidChanged(self.form.comboFluid.currentIndex()) else: self.form.comboFluid.clear() use_inlet_turb = self.obj.UseInletTurbulenceValues self.form.checkUseInletValues.setChecked(use_inlet_turb) setQuantity(self.form.inputk, self.obj.k) setQuantity(self.form.inputOmega, self.obj.omega) use_inlet_temp = self.obj.UseInletTemperatureValues self.form.checkUseInletValuesThermal.setChecked(use_inlet_temp) setQuantity(self.form.inputTemperature, self.obj.Temperature) # Add any inlets to the list for b in self.boundaries: if b.BoundaryType in ['inlet', 'open']: self.form.comboInlets.addItem(b.Label, b.Name) self.form.comboInlets.setCurrentIndex(self.form.comboInlets.findData(self.obj.Inlet)) self.updateUi()
def comboFluidChanged(self, index): setQuantity(self.form.inputVolumeFraction, self.alphas.get(self.getMaterialName(index), '0.0'))
def __init__(self, obj, physics_model, material_objs): self.selecting_direction = False self.obj = obj self.physics_model = physics_model self.turbModel = (physics_model.TurbulenceModel if physics_model.Turbulence == 'RANS' or physics_model.Turbulence == 'LES' else None) self.material_objs = material_objs # Store values which are changed on the fly for visual update self.ReferencesOrig = list(self.obj.References) self.BoundaryTypeOrig = str(self.obj.BoundaryType) self.BoundarySubTypeOrig = str(self.obj.BoundarySubType) self.alphas = {} ui_path = os.path.join(os.path.dirname(__file__), "TaskPanelCfdFluidBoundary.ui") self.form = FreeCADGui.PySideUic.loadUi(ui_path) self.form.buttonDirection.setCheckable(True) # Annoyingly can't find a way to set ID's for button group from .ui file... self.form.buttonGroupPorous.setId(self.form.radioButtonPorousCoeff, 0) self.form.buttonGroupPorous.setId(self.form.radioButtonPorousScreen, 1) self.form.comboBoundaryType.addItems(CfdFluidBoundary.BOUNDARY_NAMES) bi = indexOrDefault(CfdFluidBoundary.BOUNDARY_TYPES, self.obj.BoundaryType, 0) self.form.comboBoundaryType.currentIndexChanged.connect( self.comboBoundaryTypeChanged) self.form.comboBoundaryType.setCurrentIndex(bi) self.comboBoundaryTypeChanged() si = indexOrDefault(CfdFluidBoundary.SUBTYPES[bi], self.obj.BoundarySubType, 0) self.form.comboSubtype.currentIndexChanged.connect( self.comboSubtypeChanged) self.form.comboSubtype.setCurrentIndex(si) self.comboSubtypeChanged() cart = self.obj.VelocityIsCartesian self.form.radioButtonCart.setChecked(cart) self.form.radioButtonMagNormal.setChecked(not cart) setQuantity(self.form.inputCartX, self.obj.Ux) setQuantity(self.form.inputCartY, self.obj.Uy) setQuantity(self.form.inputCartZ, self.obj.Uz) setQuantity(self.form.inputVelocityMag, self.obj.VelocityMag) self.form.lineDirection.setText(self.obj.DirectionFace) self.form.checkReverse.setChecked(self.obj.ReverseNormal) setQuantity(self.form.inputPressure, self.obj.Pressure) setQuantity(self.form.inputSlipRatio, self.obj.SlipRatio) setQuantity(self.form.inputVolFlowRate, self.obj.VolFlowRate) setQuantity(self.form.inputMassFlowRate, self.obj.MassFlowRate) buttonId = indexOrDefault(CfdFluidBoundary.POROUS_METHODS, self.obj.PorousBaffleMethod, 0) selButton = self.form.buttonGroupPorous.button(buttonId) if selButton is not None: selButton.setChecked(True) setQuantity(self.form.inputPressureDropCoeff, self.obj.PressureDropCoeff) setQuantity(self.form.inputWireDiameter, self.obj.ScreenWireDiameter) setQuantity(self.form.inputSpacing, self.obj.ScreenSpacing) self.form.comboThermalBoundaryType.addItems( CfdFluidBoundary.THERMAL_BOUNDARY_NAMES) thi = indexOrDefault(CfdFluidBoundary.THERMAL_BOUNDARY_TYPES, self.obj.ThermalBoundaryType, 0) self.form.comboThermalBoundaryType.setCurrentIndex(thi) setQuantity(self.form.inputTemperature, self.obj.Temperature) setQuantity(self.form.inputHeatFlux, self.obj.HeatFlux) setQuantity(self.form.inputHeatTransferCoeff, self.obj.HeatTransferCoeff) if self.turbModel is not None: self.form.comboTurbulenceSpecification.addItems( CfdFluidBoundary.TURBULENT_INLET_SPEC[self.turbModel][0]) ti = indexOrDefault( CfdFluidBoundary.TURBULENT_INLET_SPEC[self.turbModel][1], self.obj.TurbulenceInletSpecification, 0) self.form.comboTurbulenceSpecification.setCurrentIndex(ti) # Add volume fraction fields self.alphas = self.obj.VolumeFractions if len(self.material_objs) > 1: mat_names = [] for m in self.material_objs: mat_names.append(m.Label) self.form.comboFluid.clear() self.form.comboFluid.addItems(mat_names[:-1]) self.comboFluidChanged(self.form.comboFluid.currentIndex()) else: self.form.comboFluid.clear() setQuantity(self.form.inputKineticEnergy, self.obj.TurbulentKineticEnergy) setQuantity(self.form.inputSpecificDissipationRate, self.obj.SpecificDissipationRate) setQuantity(self.form.inputIntensity, self.obj.TurbulenceIntensity) setQuantity(self.form.inputLengthScale, self.obj.TurbulenceLengthScale) self.form.radioButtonCart.toggled.connect(self.updateUI) self.form.radioButtonMagNormal.toggled.connect(self.updateUI) self.form.lineDirection.textChanged.connect(self.lineDirectionChanged) self.form.buttonDirection.clicked.connect(self.buttonDirectionClicked) self.form.buttonGroupPorous.buttonClicked.connect(self.updateUI) self.form.comboTurbulenceSpecification.currentIndexChanged.connect( self.updateUI) self.form.comboFluid.currentIndexChanged.connect( self.comboFluidChanged) self.form.inputVolumeFraction.valueChanged.connect( self.inputVolumeFractionChanged) self.form.comboThermalBoundaryType.currentIndexChanged.connect( self.updateUI) # Face list selection panel - modifies obj.References passed to it self.faceSelector = CfdFaceSelectWidget.CfdFaceSelectWidget( self.form.faceSelectWidget, self.obj, True, False) self.updateUI()
def comboFluidChanged(self): alphaName = self.form.comboFluid.currentText() if alphaName in self.alphas: setQuantity(self.form.inputVolumeFraction, self.alphas.get(alphaName, 0.0))
def comboAspectRatioChanged(self): i = self.form.comboAspectRatio.currentIndex() setQuantity(self.form.inputAspectRatio, CfdZone.ASPECT_RATIOS[i]) self.form.comboAspectRatio.setToolTip(CfdZone.ASPECT_RATIO_TIPS[i])
def eDone(self, index): e = [[ self.form.e1x.property('quantity').getValueAs('1').Value, self.form.e1y.property('quantity').getValueAs('1').Value, self.form.e1z.property('quantity').getValueAs('1').Value ], [ self.form.e2x.property('quantity').getValueAs('1').Value, self.form.e2y.property('quantity').getValueAs('1').Value, self.form.e2z.property('quantity').getValueAs('1').Value ], [ self.form.e3x.property('quantity').getValueAs('1').Value, self.form.e3y.property('quantity').getValueAs('1').Value, self.form.e3z.property('quantity').getValueAs('1').Value ]] for i in range(3): e[i] = CfdTools.normalise(e[i]) # Keep this one fixed. Make the other two orthogonal. The previous one edited gets to stay in its plane; the # one edited longest ago just gets recomputed if self.lastEVectorChanged == index: prevIndex = self.lastLastEVectorChanged else: prevIndex = self.lastEVectorChanged indexplus = (index + 1) % 3 indexminus = (index - 1) % 3 if indexplus == prevIndex: # indexminus must be the one changed longest ago e[indexminus] = numpy.cross(e[index], e[indexplus]) e[indexplus] = numpy.cross(e[indexminus], e[index]) else: e[indexplus] = numpy.cross(e[indexminus], e[index]) e[indexminus] = numpy.cross(e[index], e[indexplus]) e[indexplus] = CfdTools.normalise(e[indexplus]) e[indexminus] = CfdTools.normalise(e[indexminus]) setQuantity(self.form.e1x, str(e[0][0])) setQuantity(self.form.e1y, str(e[0][1])) setQuantity(self.form.e1z, str(e[0][2])) setQuantity(self.form.e2x, str(e[1][0])) setQuantity(self.form.e2y, str(e[1][1])) setQuantity(self.form.e2z, str(e[1][2])) setQuantity(self.form.e3x, str(e[2][0])) setQuantity(self.form.e3y, str(e[2][1])) setQuantity(self.form.e3z, str(e[2][2]))
def load(self): if self.obj.Name.startswith('PorousZone'): ci = indexOrDefault(CfdZone.POROUS_CORRELATIONS, self.obj.PorousCorrelation, 0) self.form.comboBoxCorrelation.setCurrentIndex(ci) setQuantity(self.form.dx, self.obj.D1) setQuantity(self.form.dy, self.obj.D2) setQuantity(self.form.dz, self.obj.D3) setQuantity(self.form.fx, self.obj.F1) setQuantity(self.form.fy, self.obj.F2) setQuantity(self.form.fz, self.obj.F3) e1 = self.obj.e1 setQuantity(self.form.e1x, str(e1[0])) setQuantity(self.form.e1y, str(e1[1])) setQuantity(self.form.e1z, str(e1[2])) e2 = self.obj.e2 setQuantity(self.form.e2x, str(e2[0])) setQuantity(self.form.e2y, str(e2[1])) setQuantity(self.form.e2z, str(e2[2])) e3 = self.obj.e3 setQuantity(self.form.e3x, str(e3[0])) setQuantity(self.form.e3y, str(e3[1])) setQuantity(self.form.e3z, str(e3[2])) setQuantity(self.form.inputOuterDiameter, self.obj.OuterDiameter) tubeAxis = self.obj.TubeAxis setQuantity(self.form.inputTubeAxisX, str(tubeAxis[0])) setQuantity(self.form.inputTubeAxisY, str(tubeAxis[1])) setQuantity(self.form.inputTubeAxisZ, str(tubeAxis[2])) setQuantity(self.form.inputTubeSpacing, self.obj.TubeSpacing) normalAxis = self.obj.SpacingDirection setQuantity(self.form.inputBundleLayerNormalX, str(normalAxis[0])) setQuantity(self.form.inputBundleLayerNormalY, str(normalAxis[1])) setQuantity(self.form.inputBundleLayerNormalZ, str(normalAxis[2])) setQuantity(self.form.inputAspectRatio, self.obj.AspectRatio) setQuantity(self.form.inputVelocityEstimate, self.obj.VelocityEstimate) elif self.obj.Name.startswith('InitialisationZone'): self.form.checkVelocity.setChecked(self.obj.VelocitySpecified) setQuantity(self.form.inputUx, self.obj.Ux) setQuantity(self.form.inputUy, self.obj.Uy) setQuantity(self.form.inputUz, self.obj.Uz) self.form.checkPressure.setChecked(self.obj.PressureSpecified) setQuantity(self.form.inputPressure, self.obj.Pressure) self.form.checkAlpha.setChecked(self.obj.VolumeFractionSpecified) self.alphas = self.obj.VolumeFractions
def load(self): potential_u = self.obj.PotentialFlow potential_p = self.obj.PotentialFlowP use_inlet_U = self.obj.UseInletUValues use_outlet_P = self.obj.UseOutletPValue if potential_u: self.form.radioButtonPotentialFlowU.toggle() elif use_inlet_U: self.form.radioButtonUseInletValuesU.toggle() else: self.form.radioButtonSpecifyValuesU.toggle() if potential_p: self.form.radioButtonPotentialFlowP.toggle() elif use_outlet_P: self.form.radioButtonUseInletValuesP.toggle() else: self.form.radioButtonSpecifyValuesP.toggle() setQuantity(self.form.Ux, self.obj.Ux) setQuantity(self.form.Uy, self.obj.Uy) setQuantity(self.form.Uz, self.obj.Uz) setQuantity(self.form.pressure, self.obj.Pressure) # Add volume fraction fields self.alphas = self.obj.VolumeFractions if self.physicsModel.Phase != 'Single': mat_names = [] for m in self.material_objs: mat_names.append(m.Label) self.form.comboFluid.clear() self.form.comboFluid.addItems(mat_names[:-1]) self.comboFluidChanged(self.form.comboFluid.currentIndex()) else: self.form.comboFluid.clear() use_inlet_turb = self.obj.UseInletTurbulenceValues self.form.checkUseInletValuesTurb.setChecked(use_inlet_turb) setQuantity(self.form.inputk, self.obj.k) setQuantity(self.form.inputOmega, self.obj.omega) use_inlet_temp = self.obj.UseInletTemperatureValue self.form.checkUseInletValuesThermal.setChecked(use_inlet_temp) setQuantity(self.form.inputTemperature, self.obj.Temperature) # Add any inlets to the lists for b in self.boundaries: if b.BoundaryType in ['inlet', 'open']: self.form.comboBoundaryU.addItem(b.Label, b.Name) self.form.comboBoundaryT.addItem(b.Label, b.Name) self.form.comboBoundaryTurb.addItem(b.Label, b.Name) if b.BoundaryType in ['outlet', 'open']: self.form.comboBoundaryP.addItem(b.Label, b.Name) if self.obj.BoundaryU is not None: self.form.comboBoundaryU.setCurrentIndex( self.form.comboBoundaryU.findData(self.obj.BoundaryU.Name)) if self.obj.BoundaryP is not None: self.form.comboBoundaryP.setCurrentIndex( self.form.comboBoundaryP.findData(self.obj.BoundaryP.Name)) if self.obj.BoundaryT is not None: self.form.comboBoundaryT.setCurrentIndex( self.form.comboBoundaryT.findData(self.obj.BoundaryT.Name)) if self.obj.BoundaryTurb is not None: self.form.comboBoundaryTurb.setCurrentIndex( self.form.comboBoundaryTurb.findData( self.obj.BoundaryTurb.Name)) self.updateUi()