diff --git a/src/ansys/speos/core/opt_prop.py b/src/ansys/speos/core/opt_prop.py index efa698f3e..0132d67cc 100644 --- a/src/ansys/speos/core/opt_prop.py +++ b/src/ansys/speos/core/opt_prop.py @@ -169,7 +169,49 @@ def set_volume_opaque(self) -> OptProp: self._vop_template.opaque.SetInParent() return self - def set_volume_optic( + @property + def volume_optic( + self, + index: float = 1.5, + absorption: float = 0, + constringence: Optional[float] = None, + ) -> OptProp: + """ + Transparent colorless material without bulk scattering. + + Parameters + ---------- + index : float + Refractive index. + By default, ``1.5``. + absorption : float + Absorption coefficient value. mm-1. + By default, ``0``. + constringence : float, optional + Abbe number. + By default, ``None``, means no constringence. + + Returns + ------- + ansys.speos.core.opt_prop.OptProp + Optical property. + """ + if self._vop_template is None: + self._vop_template = ProtoVOPTemplate( + name=self._name + ".VOP", + description=self._sop_template.description, + metadata=self._sop_template.metadata, + ) + self._vop_template.optic.index = index + self._vop_template.optic.absorption = absorption + if constringence is not None: + self._vop_template.optic.constringence = constringence + else: + self._vop_template.optic.ClearField("constringence") + return self.volume_optic + + @volume_optic.setter + def volume_optic( self, index: float = 1.5, absorption: float = 0, @@ -207,7 +249,6 @@ def set_volume_optic( self._vop_template.optic.constringence = constringence else: self._vop_template.optic.ClearField("constringence") - return self # Deactivated due to a bug on SpeosRPC server side # def set_volume_nonhomogeneous( @@ -267,7 +308,10 @@ def set_volume_library(self, path: str) -> OptProp: self._vop_template.library.material_file_uri = path return self - def set_geometries( + @property + def geometries( + self, + ) -> List: self, geometries: Optional[List[Union[GeoRef, body.Body, face.Face, part.Part.SubPart]]] = None, ) -> OptProp: @@ -296,11 +340,46 @@ def set_geometries( else: msg = f"Type {type(gr)} is not supported as Optical property geometry input." raise TypeError(msg) + return self._material_instance.geometries.geo_paths self._material_instance.geometries.geo_paths[:] = [ gp.to_native_link() for gp in geo_paths ] return self + @geometries.setter + def geometries( + self, + geometries: Optional[List[Union[GeoRef, body.Body, face.Face, part.Part.SubPart]]] = None, + ) -> None: + """Select geometries on which the optical properties will be applied. + + Parameters + ---------- + geometries : List[ansys.speos.core.geo_ref.GeoRef], optional + List of geometries. Giving an empty list means "All geometries" + By default, ``None``, means "no geometry". + + Returns + ------- + ansys.speos.core.opt_prop.OptProp + Optical property. + """ + if geometries is None: + self._material_instance.ClearField("geometries") + else: + geo_paths = [] + for gr in geometries: + if isinstance(gr, GeoRef): + geo_paths.append(gr) + elif isinstance(gr, (face.Face, body.Body, part.Part.SubPart)): + geo_paths.append(gr.geo_path) + else: + msg = f"Type {type(gr)} is not supported as Optical property geometry input." + raise TypeError(msg) + self._material_instance.geometries.geo_paths[:] = [ + gp.to_native_link() for gp in geo_paths + ] + def _to_dict(self) -> dict: out_dict = {}