FreeCAD / src /Mod /Fem /femobjects /constraint_electrostaticpotential.py
AbdulElahGwaith's picture
Upload folder using huggingface_hub
985c397 verified
# ***************************************************************************
# * Copyright (c) 2017 Markus Hovorka <m.hovorka@live.de> *
# * Copyright (c) 2020 Bernd Hahnebach <bernd@bimstatik.org> *
# * Copyright (c) 2023 Uwe Stöhr <uwestoehr@lyx.org> *
# * Copyright (c) 2024 Mario Passaglia <mpassaglia[at]cbc.uba.ar> *
# * *
# * 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