blr 0.1.0

Rust interface for Blender
Documentation
use crate::{result::Result, BlError};
use std::fmt;

/// Wrapper around <https://docs.blender.org/api/latest/bpy_types_enum_items/object_modifier_type_items.html>
#[repr(u8)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ModifierType {
    Armature,
    Array,
    Bevel,
    Boolean,
    Build,
    Cast,
    Cloth,
    Collision,
    CorrectiveSmooth,
    Curve,
    DataTransfer,
    Decimate,
    Displace,
    DynamicPaint,
    EdgeSplit,
    Explode,
    Fluid,
    Hook,
    Laplaciandeform,
    Laplaciansmooth,
    Lattice,
    Mask,
    MeshCache,
    MeshDeform,
    MeshSequenceCache,
    MeshToVolume,
    Mirror,
    Multires,
    Nodes,
    NormalEdit,
    Ocean,
    ParticleInstance,
    ParticleSystem,
    Remesh,
    Screw,
    Shrinkwrap,
    SimpleDeform,
    Skin,
    Smooth,
    SoftBody,
    Solidify,
    Subsurf,
    Surface,
    SurfaceDeform,
    Triangulate,
    UvProject,
    UvWarp,
    VertexWeightEdit,
    VertexWeightMix,
    VertexWeightProximity,
    VolumeDisplace,
    VolumeToMesh,
    Warp,
    Wave,
    WeightedNormal,
    Weld,
    Wireframe,
}

impl TryFrom<&str> for ModifierType {
    type Error = BlError;

    fn try_from(s: &str) -> Result<Self> {
        Ok(match s {
            "ARMATURE" => Self::Armature,
            "ARRAY" => Self::Array,
            "BEVEL" => Self::Bevel,
            "BOOLEAN" => Self::Boolean,
            "BUILD" => Self::Build,
            "CAST" => Self::Cast,
            "CLOTH" => Self::Cloth,
            "COLLISION" => Self::Collision,
            "CORRECTIVE_SMOOTH" => Self::CorrectiveSmooth,
            "CURVE" => Self::Curve,
            "DATA_TRANSFER" => Self::DataTransfer,
            "DECIMATE" => Self::Decimate,
            "DISPLACE" => Self::Displace,
            "DYNAMIC_PAINT" => Self::DynamicPaint,
            "EDGE_SPLIT" => Self::EdgeSplit,
            "EXPLODE" => Self::Explode,
            "FLUID" => Self::Fluid,
            "HOOK" => Self::Hook,
            "LAPLACIANDEFORM" => Self::Laplaciandeform,
            "LAPLACIANSMOOTH" => Self::Laplaciansmooth,
            "LATTICE" => Self::Lattice,
            "MASK" => Self::Mask,
            "MESH_CACHE" => Self::MeshCache,
            "MESH_DEFORM" => Self::MeshDeform,
            "MESH_SEQUENCE_CACHE" => Self::MeshSequenceCache,
            "MESH_TO_VOLUME" => Self::MeshToVolume,
            "MIRROR" => Self::Mirror,
            "MULTIRES" => Self::Multires,
            "NODES" => Self::Nodes,
            "NORMAL_EDIT" => Self::NormalEdit,
            "OCEAN" => Self::Ocean,
            "PARTICLE_INSTANCE" => Self::ParticleInstance,
            "PARTICLE_SYSTEM" => Self::ParticleSystem,
            "REMESH" => Self::Remesh,
            "SCREW" => Self::Screw,
            "SHRINKWRAP" => Self::Shrinkwrap,
            "SIMPLE_DEFORM" => Self::SimpleDeform,
            "SKIN" => Self::Skin,
            "SMOOTH" => Self::Smooth,
            "SOFT_BODY" => Self::SoftBody,
            "SOLIDIFY" => Self::Solidify,
            "SUBSURF" => Self::Subsurf,
            "SURFACE_DEFORM" => Self::SurfaceDeform,
            "SURFACE" => Self::Surface,
            "TRIANGULATE" => Self::Triangulate,
            "UV_PROJECT" => Self::UvProject,
            "UV_WARP" => Self::UvWarp,
            "VERTEX_WEIGHT_EDIT" => Self::VertexWeightEdit,
            "VERTEX_WEIGHT_MIX" => Self::VertexWeightMix,
            "VERTEX_WEIGHT_PROXIMITY" => Self::VertexWeightProximity,
            "VOLUME_DISPLACE" => Self::VolumeDisplace,
            "VOLUME_TO_MESH" => Self::VolumeToMesh,
            "WARP" => Self::Warp,
            "WAVE" => Self::Wave,
            "WEIGHTED_NORMAL" => Self::WeightedNormal,
            "WELD" => Self::Weld,
            "WIREFRAME" => Self::Wireframe,
            _ => Err(BlError::ValueError(format!(
                "Unknown object modifier type: {s}"
            )))?,
        })
    }
}

impl fmt::Display for ModifierType {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Self::Armature => write!(f, "ARMATURE"),
            Self::Array => write!(f, "ARRAY"),
            Self::Bevel => write!(f, "BEVEL"),
            Self::Boolean => write!(f, "BOOLEAN"),
            Self::Build => write!(f, "BUILD"),
            Self::Cast => write!(f, "CAST"),
            Self::Cloth => write!(f, "CLOTH"),
            Self::Collision => write!(f, "COLLISION"),
            Self::CorrectiveSmooth => write!(f, "CORRECTIVE_SMOOTH"),
            Self::Curve => write!(f, "CURVE"),
            Self::DataTransfer => write!(f, "DATA_TRANSFER"),
            Self::Decimate => write!(f, "DECIMATE"),
            Self::Displace => write!(f, "DISPLACE"),
            Self::DynamicPaint => write!(f, "DYNAMIC_PAINT"),
            Self::EdgeSplit => write!(f, "EDGE_SPLIT"),
            Self::Explode => write!(f, "EXPLODE"),
            Self::Fluid => write!(f, "FLUID"),
            Self::Hook => write!(f, "HOOK"),
            Self::Laplaciandeform => write!(f, "LAPLACIANDEFORM"),
            Self::Laplaciansmooth => write!(f, "LAPLACIANSMOOTH"),
            Self::Lattice => write!(f, "LATTICE"),
            Self::Mask => write!(f, "MASK"),
            Self::MeshCache => write!(f, "MESH_CACHE"),
            Self::MeshDeform => write!(f, "MESH_DEFORM"),
            Self::MeshSequenceCache => write!(f, "MESH_SEQUENCE_CACHE"),
            Self::MeshToVolume => write!(f, "MESH_TO_VOLUME"),
            Self::Mirror => write!(f, "MIRROR"),
            Self::Multires => write!(f, "MULTIRES"),
            Self::Nodes => write!(f, "NODES"),
            Self::NormalEdit => write!(f, "NORMAL_EDIT"),
            Self::Ocean => write!(f, "OCEAN"),
            Self::ParticleInstance => write!(f, "PARTICLE_INSTANCE"),
            Self::ParticleSystem => write!(f, "PARTICLE_SYSTEM"),
            Self::Remesh => write!(f, "REMESH"),
            Self::Screw => write!(f, "SCREW"),
            Self::Shrinkwrap => write!(f, "SHRINKWRAP"),
            Self::SimpleDeform => write!(f, "SIMPLE_DEFORM"),
            Self::Skin => write!(f, "SKIN"),
            Self::Smooth => write!(f, "SMOOTH"),
            Self::SoftBody => write!(f, "SOFT_BODY"),
            Self::Solidify => write!(f, "SOLIDIFY"),
            Self::Subsurf => write!(f, "SUBSURF"),
            Self::Surface => write!(f, "SURFACE"),
            Self::SurfaceDeform => write!(f, "SURFACE_DEFORM"),
            Self::Triangulate => write!(f, "TRIANGULATE"),
            Self::UvProject => write!(f, "UV_PROJECT"),
            Self::UvWarp => write!(f, "UV_WARP"),
            Self::VertexWeightEdit => write!(f, "VERTEX_WEIGHT_EDIT"),
            Self::VertexWeightMix => write!(f, "VERTEX_WEIGHT_MIX"),
            Self::VertexWeightProximity => write!(f, "VERTEX_WEIGHT_PROXIMITY"),
            Self::VolumeDisplace => write!(f, "VOLUME_DISPLACE"),
            Self::VolumeToMesh => write!(f, "VOLUME_TO_MESH"),
            Self::Warp => write!(f, "WARP"),
            Self::Wave => write!(f, "WAVE"),
            Self::WeightedNormal => write!(f, "WEIGHTED_NORMAL"),
            Self::Weld => write!(f, "WELD"),
            Self::Wireframe => write!(f, "WIREFRAME"),
        }
    }
}

impl pyo3::FromPyObject<'_> for ModifierType {
    fn extract(value: &pyo3::PyAny) -> pyo3::PyResult<Self> {
        Ok(value.str()?.to_str()?.try_into()?)
    }
}

impl pyo3::ToPyObject for ModifierType {
    fn to_object(&self, py: pyo3::Python<'_>) -> pyo3::PyObject {
        self.to_string().to_object(py)
    }
}