use crate::{result::Result, BlError};
use std::fmt;
#[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)
}
}