From 1c51a182f610bee72d5e67d956612871504586ab Mon Sep 17 00:00:00 2001 From: qingfengxia Date: Thu, 11 Aug 2016 23:32:16 +0100 Subject: [PATCH] bugfix: Taskview ui, typo, coding format for FluidBoundary --- .../Fem/App/FemConstraintFluidBoundary.cpp | 50 +- src/Mod/Fem/Gui/Command.cpp | 10 +- .../Gui/TaskFemConstraintFluidBoundary.cpp | 150 +++--- .../Fem/Gui/TaskFemConstraintFluidBoundary.h | 3 +- .../Fem/Gui/TaskFemConstraintFluidBoundary.ui | 453 +++++++++++------- 5 files changed, 390 insertions(+), 276 deletions(-) diff --git a/src/Mod/Fem/App/FemConstraintFluidBoundary.cpp b/src/Mod/Fem/App/FemConstraintFluidBoundary.cpp index bdfc74962..63dbcd3df 100644 --- a/src/Mod/Fem/App/FemConstraintFluidBoundary.cpp +++ b/src/Mod/Fem/App/FemConstraintFluidBoundary.cpp @@ -60,7 +60,7 @@ static const char* TurbulenceSpecificationHelpTexts[] = {"see Ansys fluet manual "or fully devloped internal flow, Turbulence intensity (0-1.0) 0.05 typical", NULL}; */ -//HTC value type, not sure it is supported in OpenFOAM +// HTC value type, not sure it is supported in OpenFOAM static const char* ThermalBoundaryTypes[] = {"fixedValue","zeroGradient", "fixedGradient", "mixed", "HTC","coupled", NULL}; /* only used in TaskPanel static const char* ThermalBoundaryHelpTexts[] = {"fixed Temperature [K]", "no heat transfer ()", "fixed value heat flux [W/m2]", @@ -69,26 +69,29 @@ static const char* ThermalBoundaryHelpTexts[] = {"fixed Temperature [K]", "no he ConstraintFluidBoundary::ConstraintFluidBoundary() { - // momemtum boundary: pressure and velocity + /// momemtum boundary: pressure and velocity ADD_PROPERTY_TYPE(BoundaryType,(1),"FluidBoundary",(App::PropertyType)(App::Prop_None), "Basic boundary type like inlet, wall, outlet,etc"); BoundaryType.setEnums(BoundaryTypes); ADD_PROPERTY_TYPE(Subtype,(1),"FluidBoundary",(App::PropertyType)(App::Prop_None), - "Subtype defines value type or more specific type"); + "Subtype defines more specific boudnary types"); Subtype.setEnums(WallSubtypes); ADD_PROPERTY_TYPE(BoundaryValue,(0.0),"FluidBoundary",(App::PropertyType)(App::Prop_None), - "Scaler value for the specific value subtype, like pressure, velocity"); + "Scaler value for the specific value subtype, like pressure, velocity magnitude"); + /// Direction should be allowed to edit in property editor, if no edge is available in CAD model ADD_PROPERTY_TYPE(Direction,(0),"FluidBoundary",(App::PropertyType)(App::Prop_None), - "Element giving vector direction of constraint"); - + "Vector direction of BoundaryValue"); + ADD_PROPERTY_TYPE(Reversed,(0),"FluidBoundary",(App::PropertyType)(App::Prop_ReadOnly|App::Prop_Output), + "To distinguish inlet (flow outward from solid) or outlet boundary condition"); + /// turbulence model setup for boundary ADD_PROPERTY_TYPE(TurbulenceSpecification,(1),"Turbulence",(App::PropertyType)(App::Prop_None), - "Turbulence boundary type"); - TurbulenceSpecification.setEnums(TurbulenceSpecifications); //Turbulence Specification Method + "Method to specify burbulence magnitude on the boundary"); + TurbulenceSpecification.setEnums(TurbulenceSpecifications); // Turbulence Specification Method ADD_PROPERTY_TYPE(TurbulentIntensityValue,(0.0),"Turbulence",(App::PropertyType)(App::Prop_None), "Scaler value for Turbulent intensity etc"); ADD_PROPERTY_TYPE(TurbulentLengthValue,(0.0),"Turbulence",(App::PropertyType)(App::Prop_None), "Scaler value for Turbulent length scale, hydraulic diameter etc"); - // consider the newly added Fem::ConstraintTemperature + /// consider using the newly added Fem::ConstraintTemperature, but it is too hard to export the settings ADD_PROPERTY_TYPE(ThermalBoundaryType,(1),"HeatTransfer",(App::PropertyType)(App::Prop_None), "Thermal boundary type"); ThermalBoundaryType.setEnums(ThermalBoundaryTypes); @@ -98,14 +101,13 @@ ConstraintFluidBoundary::ConstraintFluidBoundary() "Heat flux value for thermal boundary condition"); ADD_PROPERTY_TYPE(HTCoeffValue,(0.0),"HeatTransfer",(App::PropertyType)(App::Prop_None), "Heat transfer coefficient for convective boundary condition"); - // geometry rendering related properties - ADD_PROPERTY(Reversed,(0)); + /// geometry rendering related properties ADD_PROPERTY_TYPE(Points,(Base::Vector3d()),"FluidBoundary",App::PropertyType(App::Prop_ReadOnly|App::Prop_Output), "Points where arrows are drawn"); + Points.setValues(std::vector()); ADD_PROPERTY_TYPE(DirectionVector,(Base::Vector3d(0,0,1)),"FluidBoundary",App::PropertyType(App::Prop_ReadOnly|App::Prop_Output), "Direction of arrows"); naturalDirectionVector = Base::Vector3d(0,0,0); // by default use the null vector to indication an invalid value - Points.setValues(std::vector()); // property from: FemConstraintFixed object ADD_PROPERTY_TYPE(Normals,(Base::Vector3d()),"FluidBoundary",App::PropertyType(App::Prop_ReadOnly|App::Prop_Output), "Normals where symbols are drawn"); @@ -123,35 +125,29 @@ void ConstraintFluidBoundary::onChanged(const App::Property* prop) // because the NormalDirection has not been calculated yet Constraint::onChanged(prop); - if (prop == &BoundaryType) - { + if (prop == &BoundaryType) { std::string boundaryType = BoundaryType.getValueAsString(); - if (boundaryType == "wall") - { + if (boundaryType == "wall") { Subtype.setEnums(WallSubtypes); } - else if (boundaryType == "interface") - { + else if (boundaryType == "interface") { Subtype.setEnums(InterfaceSubtypes); } - else if (boundaryType == "freestream") - { + else if (boundaryType == "freestream") { Subtype.setEnums(FreestreamSubtypes); } - else if(boundaryType == "inlet") - { + else if(boundaryType == "inlet") { Subtype.setEnums(InletSubtypes); } - else if(boundaryType == "outlet") - { + else if(boundaryType == "outlet") { Subtype.setEnums(OutletSubtypes); } - else - { + else { Base::Console().Message(boundaryType.c_str()); Base::Console().Message(" Error: this boundaryType is not defined\n"); } - //need to trigger ViewProvider::updateData() for redraw in 3D view + Subtype.setValue(1); // must set a default (0 or 1) as freestream has only 2 subtypes + // need to trigger ViewProvider::updateData() for redraw in 3D view after this method } if (prop == &References) { diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index 36e8a5a99..de7da52c2 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -536,8 +536,8 @@ CmdFemConstraintFluidBoundary::CmdFemConstraintFluidBoundary() { sAppModule = "Fem"; sGroup = QT_TR_NOOP("Fem"); - sMenuText = QT_TR_NOOP("Create fluid condition condition"); - sToolTipText = QT_TR_NOOP("Create fluid boundary condition on face entity"); + sMenuText = QT_TR_NOOP("Create fluid boundary condition"); + sToolTipText = QT_TR_NOOP("Create fluid boundary condition on face entity for Computional Fluid Dynamics"); sWhatsThis = "Fem_ConstraintFluidBoundary"; sStatusTip = sToolTipText; sPixmap = "fem-constraint-fluid-boundary"; @@ -550,12 +550,12 @@ void CmdFemConstraintFluidBoundary::activated(int iMsg) if(getConstraintPrerequisits(&Analysis)) return; - std::string FeatName = getUniqueObjectName("ConstraintFluidBoundary"); + std::string FeatName = getUniqueObjectName("FluidBoundary"); - openCommand("Create fluid boundary condition on face geometry"); + openCommand("Create fluid boundary condition"); doCommand(Doc,"App.activeDocument().addObject(\"Fem::ConstraintFluidBoundary\",\"%s\")",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Scale = 1",FeatName.c_str()); //OvG: set initial scale to 1 - //BoundaryValue is already the default value + //BoundaryValue is already the default value, zero is acceptable doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]", Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.cpp b/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.cpp index d7fa5cd77..04bc49b97 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.cpp @@ -169,54 +169,55 @@ TaskFemConstraintFluidBoundary::TaskFemConstraintFluidBoundary(ViewProviderFemCo } pHeatTransfering = NULL; pTurbulenceModel = NULL; - if(pcSolver != NULL){ + if (pcSolver != NULL) { //if only it is CFD solver, otherwise exit by SIGSEGV error, detect getPropertyByName() != NULL - if(pcSolver->getPropertyByName("HeatTransfering")){ + if (pcSolver->getPropertyByName("HeatTransfering")) { pHeatTransfering = static_cast(pcSolver->getPropertyByName("HeatTransfering")); - if (pHeatTransfering->getValue()){ - ui->tabThermalBoundary->setVisible(true); + if (pHeatTransfering->getValue()) { + ui->tabThermalBoundary->setEnabled(true); initComboBox(ui->comboThermalBoundaryType, pcConstraint->ThermalBoundaryType.getEnumVector(), pcConstraint->ThermalBoundaryType.getValueAsString()); updateThermalBoundaryUI(); } - else{ - ui->tabThermalBoundary->setVisible(false); + else { + ui->tabThermalBoundary->setEnabled(false); //Base::Console().Message("retrieve solver property HeatTransfering as false\n"); } } - else{ - ui->tabThermalBoundary->setVisible(false); + else { + ui->tabThermalBoundary->setEnabled(false); } - if (pcSolver->getPropertyByName("TurbulenceModel")){ + if (pcSolver->getPropertyByName("TurbulenceModel")) { pTurbulenceModel = static_cast(pcSolver->getPropertyByName("TurbulenceModel")); if (pTurbulenceModel->getValueAsString() == std::string("laminar")){ - ui->tabTurbulenceBoundary->setVisible(false); + ui->tabTurbulenceBoundary->setEnabled(false); } - else{ - ui->tabTurbulenceBoundary->setVisible(true); - ui->groupTurbulence->setTitle(Base::Tools::fromStdString( + else { + ui->tabTurbulenceBoundary->setEnabled(true); + ui->labelTurbulenceSpecification->setText(Base::Tools::fromStdString( pTurbulenceModel->getValueAsString())); initComboBox(ui->comboTurbulenceSpecification, pcConstraint->TurbulenceSpecification.getEnumVector(), pcConstraint->TurbulenceSpecification.getValueAsString()); updateTurbulenceUI(); } } - else{ - ui->tabTurbulenceBoundary->setVisible(false); + else { + ui->tabTurbulenceBoundary->setEnabled(false); } } - else{ + else { Base::Console().Message("Warning: No solver object inside FemAnalysis object\n"); } ui->tabWidget->setTabText(0, tr("Basic")); ui->tabWidget->setTabText(1, tr("Turbulence")); ui->tabWidget->setTabText(2, tr("Thermal")); + ui->tabWidget->setCurrentIndex(0); ui->labelHelpText->setText(tr("select boundary type, faces and set value")); initComboBox(ui->comboBoundaryType, pcConstraint->BoundaryType.getEnumVector(), pcConstraint->BoundaryType.getValueAsString()); updateBoundaryTypeUI(); - updateSubtypeUI(); + //updateSubtypeUI(); // already called inside updateBoundaryTypeUI(); std::vector Objects = pcConstraint->References.getValues(); std::vector SubElements = pcConstraint->References.getSubValues(); @@ -224,7 +225,6 @@ TaskFemConstraintFluidBoundary::TaskFemConstraintFluidBoundary(ViewProviderFemCo QString dir; if (!dirStrings.empty()) dir = makeRefText(pcConstraint->Direction.getValue(), dirStrings.front()); - //bool reversed = pcConstraint->Reversed.getValue(); // Fill data into dialog elements double f = pcConstraint->BoundaryValue.getValue(); @@ -237,8 +237,7 @@ TaskFemConstraintFluidBoundary::TaskFemConstraintFluidBoundary(ViewProviderFemCo if (Objects.size() > 0) ui->listReferences->setCurrentRow(0, QItemSelectionModel::ClearAndSelect); ui->lineDirection->setText(dir.isEmpty() ? tr("") : dir); - //ui->checkReverse->setChecked(reversed); - ui->checkReverse->setVisible(false); // no need such UI for fluid boundary + ui->checkReverse->setVisible(false); // no need such UI for fluid boundary, set by cpp code only ui->listReferences->blockSignals(false); ui->buttonReference->blockSignals(false); @@ -255,44 +254,47 @@ void TaskFemConstraintFluidBoundary::updateBoundaryTypeUI() std::string boundaryType = pcConstraint->BoundaryType.getValueAsString(); // Update subtypes, any change here should be written back to FemConstraintFluidBoundary.cpp - if (boundaryType == "wall") - { - ui->tabBasicBoundary->setVisible(false); - //todo: hidden only for fixed wall + if (boundaryType == "wall") { + ui->labelBoundaryValue->setText(QString::fromUtf8("velocity (m/s)")); + ui->tabBasicBoundary->setEnabled(false); pcConstraint->Subtype.setEnums(WallSubtypes); } - else if (boundaryType == "interface") - { - ui->tabBasicBoundary->setVisible(false); + else if (boundaryType == "interface") { + ui->labelBoundaryValue->setText(QString::fromUtf8("value not needed")); + ui->tabBasicBoundary->setEnabled(false); pcConstraint->Subtype.setEnums(InterfaceSubtypes); } - else if (boundaryType == "freestream") - { + else if (boundaryType == "freestream") { + ui->tabBasicBoundary->setEnabled(false); + ui->labelBoundaryValue->setText(QString::fromUtf8("value not needed")); ui->tabBasicBoundary->setVisible(false); pcConstraint->Subtype.setEnums(FreestreamSubtypes); } - else if(boundaryType == "inlet") - { - ui->tabBasicBoundary->setVisible(true); - ui->labelSubtype->setText(QString::fromUtf8("valueType")); + else if (boundaryType == "inlet") { + ui->tabBasicBoundary->setEnabled(true); pcConstraint->Subtype.setEnums(InletSubtypes); + ui->labelBoundaryValue->setText(QString::fromUtf8("Pressure [Pa]")); // default to pressure pcConstraint->Reversed.setValue(true); // inlet must point into volume } - else if(boundaryType == "outlet") - { - ui->tabBasicBoundary->setVisible(true); - ui->labelSubtype->setText(QString::fromUtf8("valueType")); + else if (boundaryType == "outlet") { + ui->tabBasicBoundary->setEnabled(true); pcConstraint->Subtype.setEnums(OutletSubtypes); - pcConstraint->Reversed.setValue(false); // inlet must point outside + ui->labelBoundaryValue->setText(QString::fromUtf8("Pressure [Pa]")); + pcConstraint->Reversed.setValue(false); // outlet must point outward } - else - { + else { Base::Console().Message(boundaryType.c_str()); - Base::Console().Message("Error boundaryType is not defined\n"); + Base::Console().Message("Error: Fluid boundary type is not defined\n"); } - + //std::string subtypeLabel = boundaryType + std::string(" type"); + //ui->labelSubtype->setText(QString::fromUtf8(subtypeLabel)); // too long to show in UI + + //set subType to default one, the second one as in ConstraintFluidBoundary + ui->comboSubtype->setCurrentIndex(1); // each boundary type must have at least 2 subtypes std::vector subtypes = pcConstraint->Subtype.getEnumVector(); initComboBox(ui->comboSubtype, subtypes, pcConstraint->Subtype.getValueAsString()); + ui->tabWidget->setCurrentIndex(0); + updateSubtypeUI(); } @@ -302,26 +304,44 @@ void TaskFemConstraintFluidBoundary::updateSubtypeUI() Fem::ConstraintFluidBoundary* pcConstraint = static_cast(ConstraintView->getObject()); //* Subtype PropertyEnumeration is updated if BoundaryType is changed std::string boundaryType = pcConstraint->BoundaryType.getValueAsString(); + std::string subtype = Base::Tools::toStdString(ui->comboSubtype->currentText()); - if(boundaryType == "inlet" || boundaryType == "outlet") - { - std::string subtype = Base::Tools::toStdString(ui->comboSubtype->currentText()); - - if (subtype == "totalPressure" || subtype == "staticPressure") - { - ui->labelBoundaryValue->setText(QString::fromUtf8("pressure [Pa]")); //* tr() + if (boundaryType == "inlet" || boundaryType == "outlet") { + if (subtype == "totalPressure" || subtype == "staticPressure"){ + ui->labelBoundaryValue->setText(QString::fromUtf8("pressure [Pa]")); + ui->buttonDirection->setEnabled(false); } - else if (subtype == "uniformVelocity") - { + else if (subtype == "uniformVelocity") { ui->labelBoundaryValue->setText(QString::fromUtf8("velocity [m/s]")); + ui->buttonDirection->setEnabled(true); } - else if (subtype == "flowrate") - { + else if (subtype == "massFlowrate") { ui->labelBoundaryValue->setText(QString::fromUtf8("flowrate [kg/s]")); + ui->buttonDirection->setEnabled(false); } - else - { + else if (subtype == "volumetricFlowRate") { + ui->labelBoundaryValue->setText(QString::fromUtf8("flowrate [m3/s]")); + ui->buttonDirection->setEnabled(false); + } + else { ui->labelBoundaryValue->setText(QString::fromUtf8("unspecific")); + ui->buttonDirection->setEnabled(false); + } + } + if (boundaryType == "wall") { + if (subtype == "moving") { + ui->labelBoundaryValue->setText(QString::fromUtf8("moving speed (m/s)")); + ui->tabBasicBoundary->setEnabled(true); + ui->buttonDirection->setEnabled(false); // moving speed must be parallel to wall + } + else if (subtype == "slip") { + ui->labelBoundaryValue->setText(QString::fromUtf8("slip speed (m/s)")); + ui->tabBasicBoundary->setEnabled(true); + ui->buttonDirection->setEnabled(false); + } + else { + ui->labelBoundaryValue->setText(QString::fromUtf8("unspecific")); + ui->tabBasicBoundary->setEnabled(false); } } @@ -350,7 +370,8 @@ void TaskFemConstraintFluidBoundary::updateSelectionUI() return; } - /** not needed for fluid boundary, as it must be Face + /** not needed for fluid boundary, as it must be Face for 3D part, + * Edge type boundary is needed for 2D CFD, but it is not supported yet std::string ref = ui->listReferences->item(0)->text().toStdString(); int pos = ref.find_last_of(":"); if (ref.substr(pos+1, 6) == "Vertex") @@ -450,8 +471,10 @@ void TaskFemConstraintFluidBoundary::onBoundaryTypeChanged(void) Fem::ConstraintFluidBoundary* pcConstraint = static_cast(ConstraintView->getObject()); pcConstraint->BoundaryType.setValue(ui->comboBoundaryType->currentIndex()); updateBoundaryTypeUI(); - //ConstraintView->updateData(&pcConstraint->BoundaryType); //force a 3D redraw - //however, there is a bug of cube normal is not correct in redraw, close task panel , redraw is correct + ConstraintView->updateData(&pcConstraint->BoundaryType); //force a 3D redraw + // bug: cube normal is not correct in redraw, redraw is correct only after close task panel + // see note of If ConstraintView->updateData(): the arrows are not oriented correctly initially + // because the NormalDirection has not been calculated yet } void TaskFemConstraintFluidBoundary::onSubtypeChanged(void) @@ -461,7 +484,10 @@ void TaskFemConstraintFluidBoundary::onSubtypeChanged(void) updateSubtypeUI(); } - +void TaskFemConstraintFluidBoundary::onBoundaryValueChanged(double) +{ + //left empty for future extension +} void TaskFemConstraintFluidBoundary::onTurbulenceSpecificationChanged(void) { Fem::ConstraintFluidBoundary* pcConstraint = static_cast(ConstraintView->getObject()); @@ -687,19 +713,19 @@ bool TaskDlgFemConstraintFluidBoundary::accept() pcSolver = static_cast(*it); } } - if(pcSolver){ + if (pcSolver) { App::PropertyBool* pHeatTransfering = NULL; App::PropertyEnumeration* pTurbulenceModel = NULL; pHeatTransfering = static_cast(pcSolver->getPropertyByName("HeatTransfering")); pTurbulenceModel = static_cast(pcSolver->getPropertyByName("TurbulenceModel")); - if(pHeatTransfering && pHeatTransfering->getValue()){ + if (pHeatTransfering && pHeatTransfering->getValue()) { Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.ThermalBoundaryType = '%s'",name.c_str(), boundary->getThermalBoundaryType().c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.TemperatureValue = %f",name.c_str(), boundary->getTemperatureValue()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.HeatFluxValue = %f",name.c_str(), boundary->getHeatFluxValue()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.HTCoeffValue = %f",name.c_str(), boundary->getHTCoeffValue()); } - if(pTurbulenceModel && std::string(pTurbulenceModel->getValueAsString()) != "laminar"){ + if (pTurbulenceModel && std::string(pTurbulenceModel->getValueAsString()) != "laminar") { //update turbulence and thermal boundary settings, only if those models are activated Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.TurbulenceSpecification = '%s'",name.c_str(), boundary->getTurbulenceSpecification().c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.TurbulentIntensityValue = %f",name.c_str(), boundary->getTurbulentIntensityValue()); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.h b/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.h index 45ebd3419..61f02efe2 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.h +++ b/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.h @@ -75,11 +75,12 @@ public: private Q_SLOTS: void onBoundaryTypeChanged(void); void onSubtypeChanged(void); + void onBoundaryValueChanged(double); void onTurbulenceSpecificationChanged(void); void onThermalBoundaryTypeChanged(void); void onReferenceDeleted(void); void onButtonDirection(const bool pressed = true); - void onCheckReverse(bool); + void onCheckReverse(bool); // consider remove this slot as the UI is hiden protected: virtual void changeEvent(QEvent *e); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.ui b/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.ui index 18f27440a..9a3414bef 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.ui +++ b/src/Mod/Fem/Gui/TaskFemConstraintFluidBoundary.ui @@ -6,8 +6,8 @@ 0 0 - 280 - 475 + 292 + 477 @@ -15,7 +15,7 @@ - + @@ -96,7 +96,7 @@ - HelpText + Help text true @@ -109,7 +109,7 @@ true - 2 + 0 @@ -118,176 +118,239 @@ Tab 1 - - - true - - - - 10 - 90 - 148 - 22 - - - - Reverse direction - - - - - - 10 - 10 - 241 - 71 - - - - - - - true - - - - 100 - 0 - - - - Value [Unit] - - - - - - - true - - - -99999.000000000000000 - - - 99999.000000000000000 - - - 0.000000000000000 - - - - - - - Direction - - - - - - - - 0 - 0 - - - - - 75 - 0 - - - - - 0 - 0 - - - - - - + + + + + true + + + + 50 + 0 + + + + Value [Unit] + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + true + + + + 0 + 0 + + + + + 80 + 0 + + + + -99999.000000000000000 + + + 99999.000000000000000 + + + 0.000000000000000 + + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Direction + + + + + + + + 0 + 0 + + + + + 75 + 0 + + + + + 16777215 + 16777215 + + + + + 0 + 0 + + + + + + + + + + true + + + + 160 + 0 + + + + + 200 + 16777215 + + + + Reverse direction + + + + + + + Qt::Vertical + + + + 20 + 7 + + + + + Page - - - true - - - - 0 - 0 - 261 - 151 - - - - - 0 - 0 - - - - - 0 - 100 - - - - Turbulence specification - - - false - - - false - - - - - - - 0 - 0 - - - - - - - - - - Intensity - - - - - - - - - - - - - - Length [m] - - - - - - - - - - comboTurbulenceSpecification - - + + + + + Turbulence specification + + + + + + + + 0 + 0 + + + + true + + + + + + + + + Intensity + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + + + + + + + + + Length [m] + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + + + + @@ -296,6 +359,9 @@ + + QFormLayout::AllNonFixedFieldsGrow + @@ -304,7 +370,14 @@ - + + + + 0 + 0 + + + @@ -315,6 +388,12 @@ + + + 0 + 0 + + -273.149999999999977 @@ -330,8 +409,21 @@ - - + + + + HT coeff + + + + + + + + 0 + 0 + + 0.000000000000000 @@ -343,15 +435,14 @@ - - - - HT coeff + + + + + 0 + 0 + - - - - 0.000000000000000