Add FEM Constraint Tutorial/pl: Difference between revisions

From FreeCAD Documentation
m (FuzzyBot moved page Add FEM constraint tutorial/pl to Add FEM Constraint Tutorial/pl without leaving a redirect: Part of translatable page "Add FEM constraint tutorial")
(Created page with "Moduł zapisujący zawiera metody dla wszystkich typów równań. W zależności od typu cechy analizy, należy zmodyfikować inne metody. Dla naszej prędkości przepływu musimy zmienić {{Incode|_handleFlowBndConditions(...)}}.")
 
(27 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<languages/>
<languages/>


{{TutorialInfo
{{TutorialInfo/pl
|Topic= Add FEM Constraint
|Topic= Dodawanie cech analiz MES
|Level=
|Level=
|Time=
|Time=
Line 10: Line 10:
}}
}}


== Introduction ==
<span id="Introduction"></span>
==Wprowadzenie==


In this tutorial we are going to add the flow velocity constraint to FreeCAD and implement support for the Elmer solver. Please make sure you have read and understood [[Extend_FEM_Module|Extend FEM Module]] before reading this tutorial.
W tym poradniku dodamy warunek brzegowy prędkości przepływu do FreeCAD i zaimplementujemy wsparcie dla solvera Elmer. Upewnij się, że przeczytałeś i zrozumiałeś stronę [[Extend_FEM_Module/pl|Rozszerzenie modułu MES]] przed przejściem do tego poradnika.


This tutorial only covers how to implement constraints in python. In contrast to solver and equations constraints follow the classic FEM module structure. That is, all modules of a constraint have there place in either the {{Incode|femobjects}} or {{Incode|femviewprovider}} package.
Ten poradnik omawia tylko implementację cech analizy w Python. W przeciwieństwie do solvera i równań, cechy analizy zgodne z klasyczną strukturą środowiska pracy MES. Oznacza to, że wszystkie moduły cechy analizy mają swoje miejsce w paczce {{Incode|femobjects}} lub {{Incode|femviewprovider}}.


== Summary ==
<span id="Summary"></span>
== Podsumowanie ==


# '''Utwórz obiekt dokumentu:''' Obiekt dokumentu, który znajduje się wewnątrz analizy i poprzez który cecha analizy może być sparametryzowana i zadana na brzegach.
# '''Create document object:''' The document object that resides inside the analysis and though which the constraint can be parametrized and attached to boundaries.
# '''Utwórz polecenie w GUI:''' Dodaj do środowiska pracy MES polecenie, które wstawia warunek brzegowy przepływu do aktywnej analizy.
# '''Create GUI command:''' Add a command to the FEM workbench that adds a flow constraint to the active analysis.
# '''Utwórz panel zadań:''' Panel zadań jest konieczny aby umożliwić użytkownikowi ustawianie brzegów, na których warunek brzegowy ma być zadany. Ułatwia również nieco wprowadzanie parametrów.
# '''Create a task panel:''' The task panel is necessary to allow the user to set the boundaries at which he wants to set the velocity constraint. It also makes entering the parameters a little more user friendly.
# '''Rozszerz kod zapisujący pliki dla solvera Elmer:''' Dodaj wsparcie dla nowej cechy analizy do Elmera poprzez rozszerzenie jego eksportera plików sif.
# '''Extend elmers writer:''' Add support for the new constraint to Elmer by extending its sif file exporter.


<span id="Create_document_object"></span>
== Create document object ==
== Utwórz obiekt dokumentu ==


W tym kroku zmodyfikujemy następujące pliki:
In this step we are going to modify the following files:
* {{FileName|src/Mod/Fem/CMakeLists.txt}}
* {{FileName|src/Mod/Fem/CMakeLists.txt}}
* {{FileName|src/Mod/Fem/App/CMakeLists.txt}}
* {{FileName|src/Mod/Fem/App/CMakeLists.txt}}
* {{FileName|src/Mod/Fem/ObjectsFem.py}}
* {{FileName|src/Mod/Fem/ObjectsFem.py}}


I dodamy te pliki:
And add the following files:
* {{FileName|src/Mod/Fem/femobjects/constraint_flowvelocity.py}}
* {{FileName|src/Mod/Fem/femobjects/constraint_flowvelocity.py}}
* {{FileName|src/Mod/Fem/femviewprovider/view_constraint_flowvelocity.py}}
* {{FileName|src/Mod/Fem/femviewprovider/view_constraint_flowvelocity.py}}


A document proxy and a view proxy are required for the new constraint. Those reside in separate modules. The document proxy in femobjects and the view proxy in femviewprovider. Just copy the modules from an existing constraint e.g.:
Proxy dokumentu i proxy widoku wymagane dla nowej cechy analizy. Znajdują się one w osobnych modułach. Proxy dokumentu jest w femobjects a proxy widoku w femviewprovider. Po prostu skopiuj moduły z istniejącej cechy analizy, np.:
* {{FileName|femobjects/constraint_selfweight.py}}
* {{FileName|femobjects/constraint_selfweight.py}}
* {{FileName|femviewprovider/view_constraint_selfweight.py}}
* {{FileName|femviewprovider/view_constraint_selfweight.py}}


Popraw zmienną Type i właściwości tak jak potrzebujesz. Proxy dokumentu warunku brzegowego przepływu wygląda następująco:
Adjust the Type variable and the properties to your needs. The document proxy of the flow constraint looks like the following:


{{Code|code=
{{Code|code=
Line 68: Line 71:
}}
}}


Moduł zawierający proxy widoku może wydawać się nieco bardziej skomplikowany. Ale póki co po prostu dodaj ścieżkę ikony. Wrócimy do tego pliku w dalszych krokach poradnika.
The module containing the view proxy might look a little more complicated. But for now just adjust the icon path. We are going to come back to this file in later steps of the tutorial.


{{Code|code=
{{Code|code=
Line 76: Line 79:
}}
}}


Add the two new modules to the build system like described in [https://www.freecadweb.org/wiki/Extend_FEM_Module Extend FEM Module]. Locate the correct list by searching for constraint modules.
Dodaj dwa nowe moduły do systemu budowania, tak jak to opisano na stronie [https://www.freecadweb.org/wiki/Extend_FEM_Module/pl Rozszerzenie modułu MES]. Zlokalizuj poprawną listę poprzez poszukanie modułów cech analizy.


As all objects of the FEM workbench the velocity constraint must be registered in {{Incode|ObjectsFem.py}}. The following method adds a velocity constraint to the active document. This method will be used by the GUI command to add the constraint. It must be inserted somewhere in {{Incode|ObjectsFem.py}}.
Jak wszystkie obiekty środowiska pracy MES, warunek brzegowy prędkości musi być zarejestrowany {{Incode|ObjectsFem.py}}. Następująca metoda dodaje ten warunek brzegowy do aktywnego dokumentu. Ta metoda będzie używana przez polecenie w GUI do dodawania warunku brzegowego. Musi być wprowadzona gdzieś w {{Incode|ObjectsFem.py}}.


{{Code|code=
{{Code|code=
Line 91: Line 94:
}}
}}


<span id="Create_GUI_command"></span>
== Create GUI command ==
== Utwórz polecenie w GUI ==


W tym kroku zmodyfikujemy następujące pliki:
In this step we are going to modify the following files:
* {{FileName|src/Mod/Fem/CMakeLists.txt}}
* {{FileName|src/Mod/Fem/CMakeLists.txt}}
* {{FileName|src/Mod/Fem/App/CMakeLists.txt}}
* {{FileName|src/Mod/Fem/App/CMakeLists.txt}}
* {{FileName|src/Mod/Fem/Gui/Workbench.cpp}}
* {{FileName|src/Mod/Fem/Gui/Workbench.cpp}}


I dodamy ten nowy plik:
And add the following new file:
* {{FileName|src/Mod/Fem/femobjects/constraint_flowvelocity.py}}
* {{FileName|src/Mod/Fem/femobjects/constraint_flowvelocity.py}}


The command allows the user to actually add the constraint to the active analysis. Just copy a command from an existing constraint. Commands reside in the {{Incode|femviewprovider}} package. Adjust the resources attribute and the make method called in Activated to your needs. Also use a different command id in the addCommand call on the bottom of the module. The following class is the command class of the velocity constraint.
To polecenie pozwala użytkownikowi faktycznie dodać cechę do aktywnej analizy. Po prostu skopiuj polecenie z istniejącej cechy. Polecenia w paczce {{Incode|femviewprovider}}. Dostosuj cechy resources i make method wywoływane w Activated do swoich potrzeb. Użyj też innego id polecenia w addCommand call na dole modułu. Następująca klasa jest klasą polecenia warunku brzegowego prędkości przepływu.


{{Code|code=
{{Code|code=
Line 129: Line 133:
}}
}}


Add the new command file to the build system as decripted in [https://www.freecadweb.org/wiki/Extend_FEM_Module Extend FEM Module]. Locate the correct list be searching for existing command modules.
Dodaj plik nowego polecenia do systemu budowania zgodnie z opisem na stronie [https://www.freecadweb.org/wiki/Extend_FEM_Module/pl Rozszerzenie modułu MES]. Zlokalizuj poprawną listę poprzez poszukanie modułów istniejących poleceń.


Put the command into Gui/Workbench.cpp to add it to the toolbar and menu. Search for an existing constraint of the same category as the new one (e.g. Flow) copy-paste it and adjust the command id. This should be done two times. Once for the menu and again for the toolbar.
Umieść polecenie w Gui/Workbench.cpp aby dodać je do paska narzędzi i menu. Poszukaj istniejących cech analizy tej samej kategorii jak nowa (np. Przepływ), skopiuj i wklej a następnie dostosuj id polecenia. Należy to zrobić dwukrotnie. Raz dla menu i raz dla paska narzędzi.


<span id="Create_a_task_panel"></span>
== Create a task panel ==
== Utwórz pasek zadań ==


W tym kroku zmodyfikujemy następujący plik:
In this step we are going to modify the following file:
* {{FileName|src/Mod/Fem/femviewprovider/view_constraint_flowvelocity.py}}
* {{FileName|src/Mod/Fem/femviewprovider/view_constraint_flowvelocity.py}}


Obiekty cech analizy we FreeCAD zyskują znacznie na panelach zadań. Panele te mogą korzystać z lepszych widgetów danych wejściowych, które eksponują jednostkę wprowadzanych wartości. Warunek brzegowy prędkości przepływu nawet wymaga użycia panelu zadań, ponieważ jest to jedyny sposób wskazania ścian, na które warunek ma być nałożony.
In FreeCAD constraint objects benefit greatly from task panels. Task panels can make use of more powerful input widgets which expose the unit of entered values directely to the user. The velocity constraint even requires the use of a task panel since a task panel is the only way of specifieing the face(s) on which the constraint shall be applied.


Lokalizacja modułu, w którym zaimplementowane są panele zadań nie jest jednoznaczna. Dla warunku brzegowego prędkości przepływu po prostu umieścimy panel zadań w tym samym module co proxy widoku. Panel zadań jest dosyć złożony. Korzysta z FemSolectionWidgets.BoundarySelector(). To widget qt, który pozwala użytkownikowi wybrać brzegi, na które cecha analizy ma być nałożona. Oprócz tego widgetu, generuje też inny poprzez załadowanie pliku ui specjalnie utworzonego dla warunku brzegowego prędkości przepływu. Ten widget pozwala określić wektor prędkości przepływu.
The location of the module in which task panels are implemented is not strictely defined. For the velocity constraint we are just going to put the task panel in the same module we put the view proxy. The task panel is quite complicated. It makes use of the FemSolectionWidgets.BoundarySelector(). Thats a qt widget which allows the user to select the boundaries on which the constraint shall be applied. In addition to this widget it generates another one by loading a ui file specifically created for the velocity constraint. Via this widget the velocity vector can be specified.


Most of the time is should be sufficient to just copy this class, use a suitable ui file (instead of TaskPanelFemFlowVelocity.ui) and adjust _initParamWidget() as well as _applyWidgetChanges(). If the new constraint requires bodies as references instead of boundaries just replace the BoundarySelector object with the SolidSelector.
W większości przypadków powinno wystarczyć po prostu skopiowanie tej klasy, użycie odpowiedniego pliku ui (zamiast TaskPanelFemFlowVelocity.ui) i dostosowanie _initParamWidget() oraz _applyWidgetChanges(). Jeśli nowa cecha analizy wymaga brył zamiast brzegów jako odniesień to po prostu zamień obiekt BoundarySelector na SolidSelector.


{{Code|code=
{{Code|code=
Line 229: Line 234:
}}
}}


Proxy widoku musi być rozszerzone aby wspierać panel zadań, który właśnie zaimplementowaliśmy. Następujące rozszerzone proxy widoku otwiera panel zadań gdy użytkownik kliknie dwukrotnie na obiekcie cechy analizy w widoku drzewa.
The view proxy must be extended to support the task panel we just implemented. The following extended view proxy opens the task panel when the user makes a double click on the constraint object in the tree view.


{{Code|code=
{{Code|code=
Line 251: Line 256:
}}
}}


<span id="Extend_Elmer&#039;s_writer"></span>
== Extend Elmer's writer ==
== Rozszerz kod zapisujący pliki dla solvera Elmer ==


W tym kroku zmodyfikujemy następujący plik:
In this step we are going to modify the following file:
* {{FileName|src/Mod/Fem/femsolver/elmer/writer.py}}
* {{FileName|src/Mod/Fem/femsolver/elmer/writer.py}}


The writer module contains methods for all equation types. Depending on the type of the constraint, boundary condition, initial condition or body force one has to modify different methods. For our flow velocity we have to adjust {{Incode|_handleFlowBndConditions(...)}}.
Moduł zapisujący zawiera metody dla wszystkich typów równań. W zależności od typu cechy analizy, należy zmodyfikować inne metody. Dla naszej prędkości przepływu musimy zmienić {{Incode|_handleFlowBndConditions(...)}}.


{{Code|code=
{{Code|code=

Latest revision as of 16:30, 12 January 2024

Ćwiczenie
Temat
Dodawanie cech analiz MES
Poziom trudności
Czas wykonania
Autorzy
M42kus
Wersja FreeCAD
Pliki z przykładami
Zobacz również
-

Wprowadzenie

W tym poradniku dodamy warunek brzegowy prędkości przepływu do FreeCAD i zaimplementujemy wsparcie dla solvera Elmer. Upewnij się, że przeczytałeś i zrozumiałeś stronę Rozszerzenie modułu MES przed przejściem do tego poradnika.

Ten poradnik omawia tylko implementację cech analizy w Python. W przeciwieństwie do solvera i równań, cechy analizy są zgodne z klasyczną strukturą środowiska pracy MES. Oznacza to, że wszystkie moduły cechy analizy mają swoje miejsce w paczce femobjects lub femviewprovider.

Podsumowanie

  1. Utwórz obiekt dokumentu: Obiekt dokumentu, który znajduje się wewnątrz analizy i poprzez który cecha analizy może być sparametryzowana i zadana na brzegach.
  2. Utwórz polecenie w GUI: Dodaj do środowiska pracy MES polecenie, które wstawia warunek brzegowy przepływu do aktywnej analizy.
  3. Utwórz panel zadań: Panel zadań jest konieczny aby umożliwić użytkownikowi ustawianie brzegów, na których warunek brzegowy ma być zadany. Ułatwia również nieco wprowadzanie parametrów.
  4. Rozszerz kod zapisujący pliki dla solvera Elmer: Dodaj wsparcie dla nowej cechy analizy do Elmera poprzez rozszerzenie jego eksportera plików sif.

Utwórz obiekt dokumentu

W tym kroku zmodyfikujemy następujące pliki:

  • src/Mod/Fem/CMakeLists.txt
  • src/Mod/Fem/App/CMakeLists.txt
  • src/Mod/Fem/ObjectsFem.py

I dodamy te pliki:

  • src/Mod/Fem/femobjects/constraint_flowvelocity.py
  • src/Mod/Fem/femviewprovider/view_constraint_flowvelocity.py

Proxy dokumentu i proxy widoku są wymagane dla nowej cechy analizy. Znajdują się one w osobnych modułach. Proxy dokumentu jest w femobjects a proxy widoku w femviewprovider. Po prostu skopiuj moduły z istniejącej cechy analizy, np.:

  • femobjects/constraint_selfweight.py
  • femviewprovider/view_constraint_selfweight.py

Popraw zmienną Type i właściwości tak jak potrzebujesz. Proxy dokumentu warunku brzegowego przepływu wygląda następująco:

class Proxy(FemConstraint.Proxy):
    Type = "Fem::ConstraintFlowVelocity"
    def __init__(self, obj):
        super(Proxy, self).__init__(obj)
        obj.addProperty(
            "App::PropertyFloat", "VelocityX",
            "Parameter", "Body heat flux")
        obj.addProperty(
            "App::PropertyBool", "VelocityXEnabled",
            "Parameter", "Body heat flux")
        obj.addProperty(
            "App::PropertyFloat", "VelocityY",
            "Parameter", "Body heat flux")
        obj.addProperty(
            "App::PropertyBool", "VelocityYEnabled",
            "Parameter", "Body heat flux")
        obj.addProperty(
            "App::PropertyFloat", "VelocityZ",
            "Parameter", "Body heat flux")
        obj.addProperty(
            "App::PropertyBool", "VelocityZEnabled",
            "Parameter", "Body heat flux")
        obj.addProperty(
            "App::PropertyBool", "NormalToBoundary",
            "Parameter", "Body heat flux")

Moduł zawierający proxy widoku może wydawać się nieco bardziej skomplikowany. Ale póki co po prostu dodaj ścieżkę ikony. Wrócimy do tego pliku w dalszych krokach poradnika.

class ViewProxy(FemConstraint.ViewProxy):
    def getIcon(self):
        return ":/icons/fem-constraint-flow-velocity.svg"

Dodaj dwa nowe moduły do systemu budowania, tak jak to opisano na stronie Rozszerzenie modułu MES. Zlokalizuj poprawną listę poprzez poszukanie modułów cech analizy.

Jak wszystkie obiekty środowiska pracy MES, warunek brzegowy prędkości musi być zarejestrowany ObjectsFem.py. Następująca metoda dodaje ten warunek brzegowy do aktywnego dokumentu. Ta metoda będzie używana przez polecenie w GUI do dodawania warunku brzegowego. Musi być wprowadzona gdzieś w ObjectsFem.py.

def makeConstraintFlowVelocity(name="FlowVelocity"):
    obj = FreeCAD.ActiveDocument.addObject("Fem::ConstraintPython", name)
    import femobjects.constraint_flowvelocity
    femobjects.constraint_flowvelocity.Proxy(obj)
    if FreeCAD.GuiUp:
        import femviewprovider.view_constraint_flowvelocity
        femviewprovider.view_constraint_flowvelocity.ViewProxy(obj.ViewObject)
    return obj

Utwórz polecenie w GUI

W tym kroku zmodyfikujemy następujące pliki:

  • src/Mod/Fem/CMakeLists.txt
  • src/Mod/Fem/App/CMakeLists.txt
  • src/Mod/Fem/Gui/Workbench.cpp

I dodamy ten nowy plik:

  • src/Mod/Fem/femobjects/constraint_flowvelocity.py

To polecenie pozwala użytkownikowi faktycznie dodać cechę do aktywnej analizy. Po prostu skopiuj polecenie z istniejącej cechy. Polecenia są w paczce femviewprovider. Dostosuj cechy resources i make method wywoływane w Activated do swoich potrzeb. Użyj też innego id polecenia w addCommand call na dole modułu. Następująca klasa jest klasą polecenia warunku brzegowego prędkości przepływu.

class Command(FemCommands.FemCommands):

    def __init__(self):
        super(Command, self).__init__()
        self.resources = {
            'Pixmap': 'fem-constraint-flow-velocity',
            'MenuText': QtCore.QT_TRANSLATE_NOOP(
                "FEM_ConstraintFlowVelocity",
                "Constraint Velocity"),
            'ToolTip': QtCore.QT_TRANSLATE_NOOP(
                "FEM_ConstraintFlowVelocity",
                "Creates a FEM constraint body heat flux")}
        self.is_active = 'with_analysis'

    def Activated(self):
        App.ActiveDocument.openTransaction(
            "Create FemConstraintFlowVelocity")
        Gui.addModule("ObjectsFem")
        Gui.doCommand(
            "FemGui.getActiveAnalysis().Member += "
            "[ObjectsFem.makeConstraintFlowVelocity()]")

Gui.addCommand('FEM_AddConstraintFlowVelocity', Command())

Dodaj plik nowego polecenia do systemu budowania zgodnie z opisem na stronie Rozszerzenie modułu MES. Zlokalizuj poprawną listę poprzez poszukanie modułów istniejących poleceń.

Umieść polecenie w Gui/Workbench.cpp aby dodać je do paska narzędzi i menu. Poszukaj istniejących cech analizy tej samej kategorii jak nowa (np. Przepływ), skopiuj i wklej a następnie dostosuj id polecenia. Należy to zrobić dwukrotnie. Raz dla menu i raz dla paska narzędzi.

Utwórz pasek zadań

W tym kroku zmodyfikujemy następujący plik:

  • src/Mod/Fem/femviewprovider/view_constraint_flowvelocity.py

Obiekty cech analizy we FreeCAD zyskują znacznie na panelach zadań. Panele te mogą korzystać z lepszych widgetów danych wejściowych, które eksponują jednostkę wprowadzanych wartości. Warunek brzegowy prędkości przepływu nawet wymaga użycia panelu zadań, ponieważ jest to jedyny sposób wskazania ścian, na które warunek ma być nałożony.

Lokalizacja modułu, w którym zaimplementowane są panele zadań nie jest jednoznaczna. Dla warunku brzegowego prędkości przepływu po prostu umieścimy panel zadań w tym samym module co proxy widoku. Panel zadań jest dosyć złożony. Korzysta z FemSolectionWidgets.BoundarySelector(). To widget qt, który pozwala użytkownikowi wybrać brzegi, na które cecha analizy ma być nałożona. Oprócz tego widgetu, generuje też inny poprzez załadowanie pliku ui specjalnie utworzonego dla warunku brzegowego prędkości przepływu. Ten widget pozwala określić wektor prędkości przepływu.

W większości przypadków powinno wystarczyć po prostu skopiowanie tej klasy, użycie odpowiedniego pliku ui (zamiast TaskPanelFemFlowVelocity.ui) i dostosowanie _initParamWidget() oraz _applyWidgetChanges(). Jeśli nowa cecha analizy wymaga brył zamiast brzegów jako odniesień to po prostu zamień obiekt BoundarySelector na SolidSelector.

class _TaskPanel(object):

    def __init__(self, obj):
        self._obj = obj
        self._refWidget = FemSelectionWidgets.BoundarySelector()
        # self._refWidget = FemSelectionWidgets.SolidSelector()
        self._refWidget.setReferences(obj.References)
        self._paramWidget = Gui.PySideUic.loadUi(
            App.getHomePath() + "Mod/Fem/femviewprovider/TaskPanelFemFlowVelocity.ui")
        self._initParamWidget()
        self.form = [self._refWidget, self._paramWidget]
        analysis = FemMisc.findAnalysisOfMember(obj)
        self._mesh = FemMisc.getSingleMember(analysis, "Fem::FemMeshObject")
        self._part = self._mesh.Part if self._mesh is not None else None
        self._partVisible = None
        self._meshVisible = None

    def open(self):
        if self._mesh is not None and self._part is not None:
            self._meshVisible = self._mesh.ViewObject.isVisible()
            self._partVisible = self._part.ViewObject.isVisible()
            self._mesh.ViewObject.hide()
            self._part.ViewObject.show()

    def reject(self):
        self._restoreVisibility()
        return True

    def accept(self):
        if self._obj.References != self._refWidget.references():
            self._obj.References = self._refWidget.references()
        self._applyWidgetChanges()
        self._obj.Document.recompute()
        self._restoreVisibility()
        return True

    def _restoreVisibility(self):
        if self._mesh is not None and self._part is not None:
            if self._meshVisible:
                self._mesh.ViewObject.show()
            else:
                self._mesh.ViewObject.hide()
            if self._partVisible:
                self._part.ViewObject.show()
            else:
                self._part.ViewObject.hide()

    def _initParamWidget(self):
        unit = "m/s"
        self._paramWidget.velocityXTxt.setText(
            str(self._obj.VelocityX) + unit)
        self._paramWidget.velocityYTxt.setText(
            str(self._obj.VelocityY) + unit)
        self._paramWidget.velocityZTxt.setText(
            str(self._obj.VelocityZ) + unit)
        self._paramWidget.velocityXBox.setChecked(
            not self._obj.VelocityXEnabled)
        self._paramWidget.velocityYBox.setChecked(
            not self._obj.VelocityYEnabled)
        self._paramWidget.velocityZBox.setChecked(
            not self._obj.VelocityZEnabled)
        self._paramWidget.normalBox.setChecked(
            self._obj.NormalToBoundary)

    def _applyWidgetChanges(self):
        unit = "m/s"
        self._obj.VelocityXEnabled = \
            not self._paramWidget.velocityXBox.isChecked()
        if self._obj.VelocityXEnabled:
            quantity = Units.Quantity(self._paramWidget.velocityXTxt.text())
            self._obj.VelocityX = float(quantity.getValueAs(unit))
        self._obj.VelocityYEnabled = \
            not self._paramWidget.velocityYBox.isChecked()
        if self._obj.VelocityYEnabled:
            quantity = Units.Quantity(self._paramWidget.velocityYTxt.text())
            self._obj.VelocityY = float(quantity.getValueAs(unit))
        self._obj.VelocityZEnabled = \
            not self._paramWidget.velocityZBox.isChecked()
        if self._obj.VelocityZEnabled:
            quantity = Units.Quantity(self._paramWidget.velocityZTxt.text())
            self._obj.VelocityZ = float(quantity.getValueAs(unit))
        self._obj.NormalToBoundary = self._paramWidget.normalBox.isChecked()

Proxy widoku musi być rozszerzone aby wspierać panel zadań, który właśnie zaimplementowaliśmy. Następujące rozszerzone proxy widoku otwiera panel zadań gdy użytkownik kliknie dwukrotnie na obiekcie cechy analizy w widoku drzewa.

class ViewProxy(FemConstraint.ViewProxy):

    def getIcon(self):
        return ":/icons/fem-constraint-flow-velocity.svg"

    def setEdit(self, vobj, mode=0):
        task = _TaskPanel(vobj.Object)
        Gui.Control.showDialog(task)

    def unsetEdit(self, vobj, mode=0):
        Gui.Control.closeDialog()

    def doubleClicked(self, vobj):
        if Gui.Control.activeDialog():
            Gui.Control.closeDialog()
        Gui.ActiveDocument.setEdit(vobj.Object.Name)
        return True

Rozszerz kod zapisujący pliki dla solvera Elmer

W tym kroku zmodyfikujemy następujący plik:

  • src/Mod/Fem/femsolver/elmer/writer.py

Moduł zapisujący zawiera metody dla wszystkich typów równań. W zależności od typu cechy analizy, należy zmodyfikować inne metody. Dla naszej prędkości przepływu musimy zmienić _handleFlowBndConditions(...).

def _handleFlowBndConditions(self):
    for obj in self._getMember("Fem::ConstraintFlowVelocity"):
        if obj.References:
            for name in obj.References[0][1]:
                if obj.VelocityXEnabled:
                    velocity = getFromUi(obj.VelocityX, "m/s", "L/T")
                    self._boundary(name, "Velocity 1", velocity)
                if obj.VelocityYEnabled:
                    velocity = getFromUi(obj.VelocityY, "m/s", "L/T")
                    self._boundary(name, "Velocity 2", velocity)
                if obj.VelocityZEnabled:
                    velocity = getFromUi(obj.VelocityZ, "m/s", "L/T")
                    self._boundary(name, "Velocity 3", velocity)
                if obj.NormalToBoundary:
                    self._boundary(name, "Normal-Tangential Velocity", True)
            self._handled(obj)