%module{Slic3r::XS}; %{ #include #include "libslic3r/Print.hpp" %} %name{Slic3r::Print::Region} class PrintRegion { // owned by Print, no constructor/destructor Ref config() %code%{ RETVAL = &THIS->config(); %}; }; %name{Slic3r::Print::Object} class PrintObject { // owned by Print, no constructor/destructor Ref print(); Ref model_object(); Ref config() %code%{ RETVAL = &THIS->config(); %}; Clone bounding_box(); size_t layer_count(); Ref get_layer(int idx); void slice(); }; %name{Slic3r::Print} class Print { Print(); ~Print(); Ref model() %code%{ RETVAL = const_cast(&THIS->model()); %}; Ref config() %code%{ RETVAL = const_cast(static_cast(&THIS->config())); %}; Ref skirt() %code%{ RETVAL = const_cast(&THIS->skirt()); %}; Ref brim() %code%{ RETVAL = const_cast(&THIS->brim()); %}; double total_used_filament() %code%{ RETVAL = THIS->print_statistics().total_used_filament; %}; double total_extruded_volume() %code%{ RETVAL = THIS->print_statistics().total_extruded_volume; %}; double total_weight() %code%{ RETVAL = THIS->print_statistics().total_weight; %}; double total_cost() %code%{ RETVAL = THIS->print_statistics().total_cost; %}; double total_wipe_tower_cost() %code%{ RETVAL = THIS->print_statistics().total_wipe_tower_cost; %}; double total_wipe_tower_filament() %code%{ RETVAL = THIS->print_statistics().total_wipe_tower_filament; %}; int wipe_tower_number_of_toolchanges() %code%{ RETVAL = THIS->wipe_tower_data().number_of_toolchanges; %}; PrintObjectPtrs* objects() %code%{ RETVAL = const_cast(&THIS->objects_mutable()); %}; Ref get_object(int idx) %code%{ RETVAL = THIS->objects_mutable()[idx]; %}; size_t object_count() %code%{ RETVAL = THIS->objects().size(); %}; PrintRegionPtrs* regions() %code%{ RETVAL = const_cast(&THIS->print_regions_mutable()); %}; void auto_assign_extruders(ModelObject* model_object); std::string output_filepath(std::string path = "") %code%{ try { RETVAL = THIS->output_filepath(path); } catch (std::exception& e) { croak("%s\n", e.what()); } %}; bool apply(Model *model, DynamicPrintConfig* config) %code%{ // Touching every config as the Perl bindings does not correctly export ModelConfig, // therefore the configs have often invalid timestamps. for (auto obj : model->objects) { obj->config.touch(); for (auto vol : obj->volumes) vol->config.touch(); } for (auto mat : model->materials) mat.second->config.touch(); RETVAL = THIS->apply(*model, *config); %}; std::vector extruders() const; int validate() %code%{ std::string err = THIS->validate(); if (! err.empty()) croak("Configuration is not valid: %s\n", err.c_str()); RETVAL = 1; %}; void set_status_silent(); void process() %code%{ try { THIS->process(); } catch (std::exception& e) { croak("%s\n", e.what()); } %}; void export_gcode(char *path_template) %code%{ try { THIS->export_gcode(path_template, nullptr); } catch (std::exception& e) { croak("%s\n", e.what()); } %}; };