Remove import function from std (#6241)
Signed-off-by: Nick Cameron <nrc@ncameron.org>
This commit is contained in:
		@ -11,9 +11,7 @@ pub use cache::{bust_cache, clear_mem_cache};
 | 
			
		||||
pub use cad_op::Operation;
 | 
			
		||||
pub use geometry::*;
 | 
			
		||||
pub use id_generator::IdGenerator;
 | 
			
		||||
pub(crate) use import::{
 | 
			
		||||
    import_foreign, send_to_engine as send_import_to_engine, PreImportedGeometry, ZOO_COORD_SYSTEM,
 | 
			
		||||
};
 | 
			
		||||
pub(crate) use import::PreImportedGeometry;
 | 
			
		||||
use indexmap::IndexMap;
 | 
			
		||||
pub use kcl_value::{KclObjectFields, KclValue};
 | 
			
		||||
use kcmc::{
 | 
			
		||||
 | 
			
		||||
@ -664,10 +664,6 @@ impl Args {
 | 
			
		||||
        FromArgs::from_args(self, 0)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub(crate) fn get_import_data(&self) -> Result<(String, Option<crate::std::import::ImportFormat>), KclError> {
 | 
			
		||||
        FromArgs::from_args(self, 0)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub(crate) fn get_sketch_data_and_optional_tag(
 | 
			
		||||
        &self,
 | 
			
		||||
    ) -> Result<(super::sketch::SketchData, Option<FaceTag>), KclError> {
 | 
			
		||||
@ -1077,35 +1073,6 @@ macro_rules! let_field_of {
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<'a> FromKclValue<'a> for crate::std::import::ImportFormat {
 | 
			
		||||
    fn from_kcl_val(arg: &'a KclValue) -> Option<Self> {
 | 
			
		||||
        let obj = arg.as_object()?;
 | 
			
		||||
        let_field_of!(obj, typ "format");
 | 
			
		||||
        match typ {
 | 
			
		||||
            "fbx" => Some(Self::Fbx {}),
 | 
			
		||||
            "gltf" => Some(Self::Gltf {}),
 | 
			
		||||
            "sldprt" => Some(Self::Sldprt {}),
 | 
			
		||||
            "step" => Some(Self::Step {}),
 | 
			
		||||
            "stl" => {
 | 
			
		||||
                let_field_of!(obj, coords?);
 | 
			
		||||
                let_field_of!(obj, units);
 | 
			
		||||
                Some(Self::Stl { coords, units })
 | 
			
		||||
            }
 | 
			
		||||
            "obj" => {
 | 
			
		||||
                let_field_of!(obj, coords?);
 | 
			
		||||
                let_field_of!(obj, units);
 | 
			
		||||
                Some(Self::Obj { coords, units })
 | 
			
		||||
            }
 | 
			
		||||
            "ply" => {
 | 
			
		||||
                let_field_of!(obj, coords?);
 | 
			
		||||
                let_field_of!(obj, units);
 | 
			
		||||
                Some(Self::Ply { coords, units })
 | 
			
		||||
            }
 | 
			
		||||
            _ => None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<'a> FromKclValue<'a> for super::sketch::AngledLineThatIntersectsData {
 | 
			
		||||
    fn from_kcl_val(arg: &'a KclValue) -> Option<Self> {
 | 
			
		||||
        let obj = arg.as_object()?;
 | 
			
		||||
 | 
			
		||||
@ -1,181 +0,0 @@
 | 
			
		||||
//! Standard library functions involved in importing files.
 | 
			
		||||
 | 
			
		||||
use anyhow::Result;
 | 
			
		||||
use kcl_derive_docs::stdlib;
 | 
			
		||||
use kcmc::{coord::System, format::InputFormat3d, units::UnitLength};
 | 
			
		||||
use kittycad_modeling_cmds as kcmc;
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    errors::{KclError, KclErrorDetails},
 | 
			
		||||
    execution::{import_foreign, send_import_to_engine, ExecState, ImportedGeometry, KclValue, ZOO_COORD_SYSTEM},
 | 
			
		||||
    std::Args,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// Import format specifier
 | 
			
		||||
#[derive(serde :: Serialize, serde :: Deserialize, PartialEq, Debug, Clone, schemars :: JsonSchema)]
 | 
			
		||||
#[cfg_attr(feature = "tabled", derive(tabled::Tabled))]
 | 
			
		||||
#[serde(tag = "format")]
 | 
			
		||||
pub enum ImportFormat {
 | 
			
		||||
    /// Autodesk Filmbox (FBX) format
 | 
			
		||||
    #[serde(rename = "fbx")]
 | 
			
		||||
    Fbx {},
 | 
			
		||||
    /// Binary glTF 2.0. We refer to this as glTF since that is how our customers refer to
 | 
			
		||||
    /// it, but this can also import binary glTF (glb).
 | 
			
		||||
    #[serde(rename = "gltf")]
 | 
			
		||||
    Gltf {},
 | 
			
		||||
    /// Wavefront OBJ format.
 | 
			
		||||
    #[serde(rename = "obj")]
 | 
			
		||||
    Obj {
 | 
			
		||||
        /// Co-ordinate system of input data.
 | 
			
		||||
        /// Defaults to the [KittyCAD co-ordinate system.
 | 
			
		||||
        coords: Option<System>,
 | 
			
		||||
        /// The units of the input data. This is very important for correct scaling and when
 | 
			
		||||
        /// calculating physics properties like mass, etc.
 | 
			
		||||
        /// Defaults to millimeters.
 | 
			
		||||
        units: UnitLength,
 | 
			
		||||
    },
 | 
			
		||||
    /// The PLY Polygon File Format.
 | 
			
		||||
    #[serde(rename = "ply")]
 | 
			
		||||
    Ply {
 | 
			
		||||
        /// Co-ordinate system of input data.
 | 
			
		||||
        /// Defaults to the [KittyCAD co-ordinate system.
 | 
			
		||||
        coords: Option<System>,
 | 
			
		||||
        /// The units of the input data. This is very important for correct scaling and when
 | 
			
		||||
        /// calculating physics properties like mass, etc.
 | 
			
		||||
        /// Defaults to millimeters.
 | 
			
		||||
        units: UnitLength,
 | 
			
		||||
    },
 | 
			
		||||
    /// SolidWorks part (SLDPRT) format.
 | 
			
		||||
    #[serde(rename = "sldprt")]
 | 
			
		||||
    Sldprt {},
 | 
			
		||||
    /// ISO 10303-21 (STEP) format.
 | 
			
		||||
    #[serde(rename = "step")]
 | 
			
		||||
    Step {},
 | 
			
		||||
    /// *ST**ereo**L**ithography format.
 | 
			
		||||
    #[serde(rename = "stl")]
 | 
			
		||||
    Stl {
 | 
			
		||||
        /// Co-ordinate system of input data.
 | 
			
		||||
        /// Defaults to the [KittyCAD co-ordinate system.
 | 
			
		||||
        coords: Option<System>,
 | 
			
		||||
        /// The units of the input data. This is very important for correct scaling and when
 | 
			
		||||
        /// calculating physics properties like mass, etc.
 | 
			
		||||
        /// Defaults to millimeters.
 | 
			
		||||
        units: UnitLength,
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<ImportFormat> for InputFormat3d {
 | 
			
		||||
    fn from(format: ImportFormat) -> Self {
 | 
			
		||||
        match format {
 | 
			
		||||
            ImportFormat::Fbx {} => InputFormat3d::Fbx(Default::default()),
 | 
			
		||||
            ImportFormat::Gltf {} => InputFormat3d::Gltf(Default::default()),
 | 
			
		||||
            ImportFormat::Obj { coords, units } => InputFormat3d::Obj(kcmc::format::obj::import::Options {
 | 
			
		||||
                coords: coords.unwrap_or(ZOO_COORD_SYSTEM),
 | 
			
		||||
                units,
 | 
			
		||||
            }),
 | 
			
		||||
            ImportFormat::Ply { coords, units } => InputFormat3d::Ply(kcmc::format::ply::import::Options {
 | 
			
		||||
                coords: coords.unwrap_or(ZOO_COORD_SYSTEM),
 | 
			
		||||
                units,
 | 
			
		||||
            }),
 | 
			
		||||
            ImportFormat::Sldprt {} => InputFormat3d::Sldprt(kcmc::format::sldprt::import::Options {
 | 
			
		||||
                split_closed_faces: false,
 | 
			
		||||
            }),
 | 
			
		||||
            ImportFormat::Step {} => InputFormat3d::Step(kcmc::format::step::import::Options {
 | 
			
		||||
                split_closed_faces: false,
 | 
			
		||||
            }),
 | 
			
		||||
            ImportFormat::Stl { coords, units } => InputFormat3d::Stl(kcmc::format::stl::import::Options {
 | 
			
		||||
                coords: coords.unwrap_or(ZOO_COORD_SYSTEM),
 | 
			
		||||
                units,
 | 
			
		||||
            }),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Import a CAD file.
 | 
			
		||||
/// For formats lacking unit data (STL, OBJ, PLY), the default import unit is millimeters.
 | 
			
		||||
/// Otherwise you can specify the unit by passing in the options parameter.
 | 
			
		||||
/// If you import a gltf file, we will try to find the bin file and import it as well.
 | 
			
		||||
///
 | 
			
		||||
/// Import paths are relative to the current project directory. This only works in the desktop app
 | 
			
		||||
/// not in browser.
 | 
			
		||||
pub async fn import(exec_state: &mut ExecState, args: Args) -> Result<KclValue, KclError> {
 | 
			
		||||
    let (file_path, options): (String, Option<ImportFormat>) = args.get_import_data()?;
 | 
			
		||||
 | 
			
		||||
    let imported_geometry = inner_import(file_path, options, exec_state, args).await?;
 | 
			
		||||
    Ok(KclValue::ImportedGeometry(imported_geometry))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Import a CAD file.
 | 
			
		||||
///
 | 
			
		||||
/// **DEPRECATED** Prefer to use import statements.
 | 
			
		||||
///
 | 
			
		||||
/// For formats lacking unit data (such as STL, OBJ, or PLY files), the default
 | 
			
		||||
/// unit of measurement is millimeters. Alternatively you may specify the unit
 | 
			
		||||
/// by passing your desired measurement unit in the options parameter. When
 | 
			
		||||
/// importing a GLTF file, the bin file will be imported as well. Import paths
 | 
			
		||||
/// are relative to the current project directory.
 | 
			
		||||
///
 | 
			
		||||
/// Note: The import command currently only works when using the native
 | 
			
		||||
/// Design Studio.
 | 
			
		||||
///
 | 
			
		||||
/// ```no_run
 | 
			
		||||
/// model = import("tests/inputs/cube.obj")
 | 
			
		||||
/// ```
 | 
			
		||||
///
 | 
			
		||||
/// ```no_run
 | 
			
		||||
/// model = import("tests/inputs/cube.obj", {format: "obj", units: "m"})
 | 
			
		||||
/// ```
 | 
			
		||||
///
 | 
			
		||||
/// ```no_run
 | 
			
		||||
/// model = import("tests/inputs/cube.gltf")
 | 
			
		||||
/// ```
 | 
			
		||||
///
 | 
			
		||||
/// ```no_run
 | 
			
		||||
/// model = import("tests/inputs/cube.sldprt")
 | 
			
		||||
/// ```
 | 
			
		||||
///
 | 
			
		||||
/// ```no_run
 | 
			
		||||
/// model = import("tests/inputs/cube.step")
 | 
			
		||||
/// ```
 | 
			
		||||
///
 | 
			
		||||
/// ```no_run
 | 
			
		||||
/// import height, buildSketch from 'common.kcl'
 | 
			
		||||
///
 | 
			
		||||
/// plane = 'XZ'
 | 
			
		||||
/// margin = 2
 | 
			
		||||
/// s1 = buildSketch(plane, [0, 0])
 | 
			
		||||
/// s2 = buildSketch(plane, [0, height() + margin])
 | 
			
		||||
/// ```
 | 
			
		||||
#[stdlib {
 | 
			
		||||
    name = "import",
 | 
			
		||||
    feature_tree_operation = true,
 | 
			
		||||
    deprecated = true,
 | 
			
		||||
    tags = [],
 | 
			
		||||
}]
 | 
			
		||||
async fn inner_import(
 | 
			
		||||
    file_path: String,
 | 
			
		||||
    options: Option<ImportFormat>,
 | 
			
		||||
    exec_state: &mut ExecState,
 | 
			
		||||
    args: Args,
 | 
			
		||||
) -> Result<ImportedGeometry, KclError> {
 | 
			
		||||
    if file_path.is_empty() {
 | 
			
		||||
        return Err(KclError::Semantic(KclErrorDetails {
 | 
			
		||||
            message: "No file path was provided.".to_string(),
 | 
			
		||||
            source_ranges: vec![args.source_range],
 | 
			
		||||
        }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let format = options.map(InputFormat3d::from);
 | 
			
		||||
    send_import_to_engine(
 | 
			
		||||
        import_foreign(
 | 
			
		||||
            std::path::Path::new(&file_path),
 | 
			
		||||
            format,
 | 
			
		||||
            exec_state,
 | 
			
		||||
            &args.ctx,
 | 
			
		||||
            args.source_range,
 | 
			
		||||
        )
 | 
			
		||||
        .await?,
 | 
			
		||||
        &args.ctx,
 | 
			
		||||
    )
 | 
			
		||||
    .await
 | 
			
		||||
}
 | 
			
		||||
@ -12,7 +12,6 @@ pub mod edge;
 | 
			
		||||
pub mod extrude;
 | 
			
		||||
pub mod fillet;
 | 
			
		||||
pub mod helix;
 | 
			
		||||
pub mod import;
 | 
			
		||||
pub mod loft;
 | 
			
		||||
pub mod math;
 | 
			
		||||
pub mod mirror;
 | 
			
		||||
@ -111,7 +110,6 @@ lazy_static! {
 | 
			
		||||
        Box::new(crate::std::sweep::Sweep),
 | 
			
		||||
        Box::new(crate::std::loft::Loft),
 | 
			
		||||
        Box::new(crate::std::planes::OffsetPlane),
 | 
			
		||||
        Box::new(crate::std::import::Import),
 | 
			
		||||
        Box::new(crate::std::math::Acos),
 | 
			
		||||
        Box::new(crate::std::math::Asin),
 | 
			
		||||
        Box::new(crate::std::math::Atan),
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user