#ifndef slic3r_Model_hpp_ #define slic3r_Model_hpp_ #include #include "PrintConfig.hpp" #include "Layer.hpp" #include "Point.hpp" #include "TriangleMesh.hpp" #include #include #include #include namespace Slic3r { class ModelInstance; class ModelMaterial; class ModelObject; class ModelVolume; typedef std::string t_model_material_id; typedef std::string t_model_material_attribute; typedef std::map t_model_material_attributes; typedef std::map ModelMaterialMap; typedef std::vector ModelObjectPtrs; typedef std::vector ModelVolumePtrs; typedef std::vector ModelInstancePtrs; class Model { public: ModelMaterialMap materials; ModelObjectPtrs objects; Model(); Model(const Model &other); Model& operator= (Model other); void swap(Model &other); ~Model(); ModelObject* add_object(const std::string &input_file, const DynamicPrintConfig &config, const t_layer_height_ranges &layer_height_ranges, const Pointf &origin_translation); void delete_object(size_t idx); void clear_objects(); void delete_material(t_model_material_id material_id); void clear_materials(); ModelMaterial *set_material(t_model_material_id material_id); // void duplicate_objects_grid(unsigned int x, unsigned int y, coordf_t distance); // void duplicate_objects(size_t copies_num, coordf_t distance, const BoundingBox &bb); // void arrange_objects(coordf_t distance, const BoundingBox &bb); // void duplicate(size_t copies_num, coordf_t distance, const BoundingBox &bb); bool has_objects_with_no_instances() const; // void bounding_box(BoundingBox* bb) const; // void align_to_origin(); // void center_instances_around_point(const Pointf &point); // void translate(coordf_t x, coordf_t y, coordf_t z); // void mesh(TriangleMesh* mesh) const; // void split_meshes(); // std::string get_material_name(t_model_material_id material_id); private: void _arrange(const std::vector &sizes, coordf_t distance, const BoundingBox &bb) const; }; class ModelMaterial { public: Model* model; t_model_material_attributes attributes; DynamicPrintConfig config; ModelMaterial(Model *model); void apply(const t_model_material_attributes &attributes); }; class ModelObject { public: Model* model; std::string input_file; ModelInstancePtrs instances; ModelVolumePtrs volumes; DynamicPrintConfig config; t_layer_height_ranges layer_height_ranges; Pointf origin_translation; // these should be private but we need to expose them via XS until all methods are ported BoundingBoxf3 _bounding_box; bool _bounding_box_valid; ModelObject(Model *model, const std::string &input_file, const DynamicPrintConfig &config, const t_layer_height_ranges &layer_height_ranges, const Pointf &origin_translation); ModelObject(const ModelObject &other); ModelObject& operator= (ModelObject other); void swap(ModelObject &other); ~ModelObject(); ModelVolume* add_volume(const t_model_material_id &material_id, const TriangleMesh &mesh, bool modifier); void delete_volume(size_t idx); void clear_volumes(); ModelInstance *add_instance(double rotation=0, double scaling_factor = 1, Pointf offset = Pointf(0, 0)); void delete_instance(size_t idx); void delete_last_instance(); void clear_instances(); void invalidate_bounding_box(); void raw_mesh(TriangleMesh* mesh) const; void mesh(TriangleMesh* mesh) const; void instance_bounding_box(size_t instance_idx, BoundingBox* bb) const; void center_around_origin(); void translate(coordf_t x, coordf_t y, coordf_t z); size_t materials_count() const; void unique_materials(std::vector* materials) const; size_t facets_count() const; bool needed_repair() const; private: void update_bounding_box(); }; class ModelVolume { public: ModelObject* object; t_model_material_id material_id; TriangleMesh mesh; bool modifier; ModelVolume(ModelObject *object, const t_model_material_id &material_id, const TriangleMesh &mesh, bool modifier); }; class ModelInstance { public: ModelObject* object; double rotation; // around mesh center point double scaling_factor; Pointf offset; // in unscaled coordinates ModelInstance(ModelObject *object, double rotation, double scaling_factor, const Pointf &offset); void transform_mesh(TriangleMesh* mesh, bool dont_translate) const; void transform_polygon(Polygon* polygon) const; }; } #endif