# *************************************************************************** # * Copyright (c) 2017 Markus Hovorka * # * Copyright (c) 2020 Bernd Hahnebach * # * Copyright (c) 2023 Uwe Stöhr * # * Copyright (c) 2024 Mario Passaglia * # * * # * This file is part of the FreeCAD CAx development system. * # * * # * This program is free software; you can redistribute it and/or modify * # * it under the terms of the GNU Lesser General Public License (LGPL) * # * as published by the Free Software Foundation; either version 2 of * # * the License, or (at your option) any later version. * # * for detail see the LICENCE text file. * # * * # * This program is distributed in the hope that it will be useful, * # * but WITHOUT ANY WARRANTY; without even the implied warranty of * # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * # * GNU Library General Public License for more details. * # * * # * You should have received a copy of the GNU Library General Public * # * License along with this program; if not, write to the Free Software * # * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * # * USA * # * * # *************************************************************************** __title__ = "FreeCAD FEM constraint electrostatic potential document object" __author__ = "Markus Hovorka, Bernd Hahnebach, Uwe Stöhr, Mario Passaglia" __url__ = "https://www.freecad.org" ## @package constraint_electrostaticpotential # \ingroup FEM # \brief constraint electrostatic potential object from FreeCAD import Base from . import base_fempythonobject _PropHelper = base_fempythonobject._PropHelper class ConstraintElectrostaticPotential(base_fempythonobject.BaseFemPythonObject): Type = "Fem::ConstraintElectrostaticPotential" def __init__(self, obj): super().__init__(obj) for prop in self._get_properties(): prop.add_to_object(obj) def _get_properties(self): prop = [] prop.append( _PropHelper( type="App::PropertyElectricPotential", name="Potential", group="Parameter", doc="Electric Potential", value="1 V", ) ) prop.append( _PropHelper( type="App::PropertyBool", name="PotentialEnabled", group="Parameter", doc="Enable electric potential", value=True, ) ) prop.append( _PropHelper( type="App::PropertyElectricPotential", name="AV_re", group="Electromagnetic Potential", doc="Real part of scalar potential", value="0 V", ) ) prop.append( _PropHelper( type="App::PropertyElectricPotential", name="AV_im", group="Electromagnetic Potential", doc="Imaginary part of scalar potential", value="0 V", ) ) prop.append( _PropHelper( type="App::PropertyElectromagneticPotential", name="AV_re_1", group="Electromagnetic Potential", doc="Real part of vector potential x-component", value="0 Wb/m", ) ) prop.append( _PropHelper( type="App::PropertyElectromagneticPotential", name="AV_re_2", group="Electromagnetic Potential", doc="Real part of vector potential y-component", value="0 Wb/m", ) ) prop.append( _PropHelper( type="App::PropertyElectromagneticPotential", name="AV_re_3", group="Electromagnetic Potential", doc="Real part of vector potential z-component", value="0 Wb/m", ) ) prop.append( _PropHelper( type="App::PropertyElectromagneticPotential", name="AV_im_1", group="Electromagnetic Potential", doc="Imaginary part of vector potential x-component", value="0 Wb/m", ) ) prop.append( _PropHelper( type="App::PropertyElectromagneticPotential", name="AV_im_2", group="Electromagnetic Potential", doc="Imaginary part of vector potential y-component", value="0 Wb/m", ) ) prop.append( _PropHelper( type="App::PropertyElectromagneticPotential", name="AV_im_3", group="Electromagnetic Potential", doc="Imaginary part of vector potential z-component", value="0 Wb/m", ) ) prop.append( _PropHelper( type="App::PropertySurfaceChargeDensity", name="ElectricFluxDensity", group="Parameter", doc="Electric displacement field D.\n" + "For interfaces, it represents the difference\n" + "between the normal component in the two media", value="0 C/m^2", ) ) prop.append( _PropHelper( type="App::PropertyEnumeration", name="BoundaryCondition", group="Parameter", doc="Set boundary condition type", value=["Dirichlet", "Neumann"], ) ) prop.append( _PropHelper( type="App::PropertyBool", name="EnableAV", group="Electromagnetic Potential", doc="Enable scalar potential boundary condition", value=False, ) ) prop.append( _PropHelper( type="App::PropertyBool", name="EnableAV_1", group="Electromagnetic Potential", doc="Enable vector potential x-component boundary condition", value=False, ) ) prop.append( _PropHelper( type="App::PropertyBool", name="EnableAV_2", group="Electromagnetic Potential", doc="Enable vector potential y-component boundary condition", value=False, ) ) prop.append( _PropHelper( type="App::PropertyBool", name="EnableAV_3", group="Electromagnetic Potential", doc="Enable vector potential z-component boundary condition", value=False, ) ) prop.append( _PropHelper( type="App::PropertyBool", name="PotentialConstant", group="Parameter", doc="", value=False, ) ) prop.append( _PropHelper( type="App::PropertyBool", name="FarField", group="Parameter", doc="Far field approximation assuming spherical symmetry", value=False, ) ) prop.append( _PropHelper( type="App::PropertyBool", name="ElectricForcecalculation", group="Parameter", doc="Electric force calculation", value=False, ) ) prop.append( _PropHelper( type="App::PropertyInteger", name="CapacitanceBody", group="Parameter", doc="Capacitance body", value=1, ) ) prop.append( _PropHelper( type="App::PropertyBool", name="CapacitanceBodyEnabled", group="Parameter", doc="Capacitance body enabled", value=False, ) ) prop.append( _PropHelper( type="App::PropertyMagneticFluxDensity", name="Magnetic_re_1", group="Magnetic Flux Density", doc="Real part of magnetic flux density x-component", value="0 Wb/m^2", ) ) prop.append( _PropHelper( type="App::PropertyMagneticFluxDensity", name="Magnetic_re_2", group="Magnetic Flux Density", doc="Real part of magnetic flux density y-component", value="0 Wb/m^2", ) ) prop.append( _PropHelper( type="App::PropertyMagneticFluxDensity", name="Magnetic_re_3", group="Magnetic Flux Density", doc="Real part of magnetic flux density z-component", value="0 Wb/m^2", ) ) prop.append( _PropHelper( type="App::PropertyMagneticFluxDensity", name="Magnetic_im_1", group="Magnetic Flux Density", doc="Imaginary part of magnetic flux density x-component", value="0 Wb/m^2", ) ) prop.append( _PropHelper( type="App::PropertyMagneticFluxDensity", name="Magnetic_im_2", group="Magnetic Flux Density", doc="Imaginary part of magnetic flux density y-component", value="0 Wb/m^2", ) ) prop.append( _PropHelper( type="App::PropertyMagneticFluxDensity", name="Magnetic_im_3", group="Magnetic Flux Density", doc="Imaginary part of magnetic flux density z-component", value="0 Wb/m^2", ) ) prop.append( _PropHelper( type="App::PropertyBool", name="EnableMagnetic_1", group="Magnetic Flux Density", doc="Enable magnetic flux density x-component boundary condition", value=False, ) ) prop.append( _PropHelper( type="App::PropertyBool", name="EnableMagnetic_2", group="Magnetic Flux Density", doc="Enable magnetic flux density y-component boundary condition", value=False, ) ) prop.append( _PropHelper( type="App::PropertyBool", name="EnableMagnetic_3", group="Magnetic Flux Density", doc="Enable magnetic flux density z-component boundary condition", value=False, ) ) return prop def onDocumentRestored(self, obj): # update old project with new properties for prop in self._get_properties(): try: obj.getPropertyByName(prop.name) except Base.PropertyError: prop.add_to_object(obj) # convert old potential float to Volt if prop.name == "Potential": prop.handle_change_type( obj, old_type="App::PropertyFloat", convert_old_value=lambda x: "{} V".format(1e6 * x), ) # fix unit for magnetic vector potential properties if prop.name in ("AV_re_1", "AV_re_2", "AV_re_3", "AV_im_1", "AV_im_2", "AV_im_3"): prop.handle_change_type( obj, old_type="App::PropertyElectricPotential", convert_old_value=lambda x: "{} Wb/m".format(x.getValueAs("V").Value), ) # enable electromagnetic properties from old properties try: obj.EnableAV_1 = not obj.getPropertyByName( "AV_re_1_Disabled" ) or not obj.getPropertyByName("AV_im_1_Disabled") obj.EnableAV_2 = not obj.getPropertyByName( "AV_re_2_Disabled" ) or not obj.getPropertyByName("AV_im_2_Disabled") obj.EnableAV_3 = not obj.getPropertyByName( "AV_re_3_Disabled" ) or not obj.getPropertyByName("AV_im_3_Disabled") obj.EnableAV = not obj.getPropertyByName("AV_re_Disabled") or not obj.getPropertyByName( "AV_im_Disabled" ) # remove old properties obj.setPropertyStatus("AV_re_1_Disabled", "-LockDynamic") obj.removeProperty("AV_re_1_Disabled") obj.setPropertyStatus("AV_re_2_Disabled", "-LockDynamic") obj.removeProperty("AV_re_2_Disabled") obj.setPropertyStatus("AV_re_3_Disabled", "-LockDynamic") obj.removeProperty("AV_re_3_Disabled") obj.setPropertyStatus("AV_im_1_Disabled", "-LockDynamic") obj.removeProperty("AV_im_1_Disabled") obj.setPropertyStatus("AV_im_2_Disabled", "-LockDynamic") obj.removeProperty("AV_im_2_Disabled") obj.setPropertyStatus("AV_im_3_Disabled", "-LockDynamic") obj.removeProperty("AV_im_3_Disabled") obj.setPropertyStatus("AV_re_Disabled", "-LockDynamic") obj.removeProperty("AV_re_Disabled") obj.setPropertyStatus("AV_im_Disabled", "-LockDynamic") obj.removeProperty("AV_im_Disabled") except Base.PropertyError: pass # set electric flux density from old surface charge density try: obj.ElectricFluxDensity = obj.getPropertyByName("SurfaceChargeDensity") obj.setPropertyStatus("SurfaceChargeDensity", "-LockDynamic") obj.removeProperty("SurfaceChargeDensity") except Base.PropertyError: pass # rename ElectricInfinity try: obj.FarField = obj.getPropertyByName("ElectricInfinity") obj.setPropertyStatus("ElectricInfinity", "-LockDynamic") obj.removeProperty("ElectricInfinity") except Base.PropertyError: pass