%module{Slic3r::XS}; %{ #include #include "libslic3r/ExtrusionEntityCollection.hpp" %} %name{Slic3r::ExtrusionPath::Collection} class ExtrusionEntityCollection { %name{_new} ExtrusionEntityCollection(); ~ExtrusionEntityCollection(); Clone clone() %code{% RETVAL = (ExtrusionEntityCollection*)THIS->clone(); %}; void reverse(); void clear(); ExtrusionEntityCollection* chained_path(bool no_reverse, ExtrusionRole role = erMixed) %code{% if (no_reverse) croak("no_reverse must be false"); RETVAL = new ExtrusionEntityCollection(); *RETVAL = THIS->chained_path_from(THIS->entities.front()->first_point()); %}; ExtrusionEntityCollection* chained_path_from(Point* start_near, bool no_reverse, ExtrusionRole role = erMixed) %code{% if (no_reverse) croak("no_reverse must be false"); RETVAL = new ExtrusionEntityCollection(); *RETVAL = THIS->chained_path_from(*start_near, role); %}; Clone first_point(); Clone last_point(); int count() %code{% RETVAL = THIS->entities.size(); %}; int items_count() %code{% RETVAL = THIS->items_count(); %}; ExtrusionEntityCollection* flatten() %code{% RETVAL = new ExtrusionEntityCollection(); *RETVAL = THIS->flatten(); %}; double min_mm3_per_mm(); bool empty() %code{% RETVAL = THIS->entities.empty(); %}; Polygons polygons_covered_by_width(); Polygons polygons_covered_by_spacing(); %{ SV* ExtrusionEntityCollection::arrayref() CODE: AV* av = newAV(); av_fill(av, THIS->entities.size()-1); int i = 0; for (ExtrusionEntitiesPtr::iterator it = THIS->entities.begin(); it != THIS->entities.end(); ++it) { SV* sv = newSV(0); // return our item by reference if (ExtrusionPath* path = dynamic_cast(*it)) { sv_setref_pv( sv, perl_class_name_ref(path), path ); } else if (ExtrusionLoop* loop = dynamic_cast(*it)) { sv_setref_pv( sv, perl_class_name_ref(loop), loop ); } else if (ExtrusionEntityCollection* collection = dynamic_cast(*it)) { sv_setref_pv( sv, perl_class_name_ref(collection), collection ); } else { croak("Unexpected type in ExtrusionEntityCollection"); } av_store(av, i++, sv); } RETVAL = newRV_noinc((SV*)av); OUTPUT: RETVAL void ExtrusionEntityCollection::append(...) CODE: for (unsigned int i = 1; i < items; i++) { if(!sv_isobject( ST(i) ) || (SvTYPE(SvRV( ST(i) )) != SVt_PVMG)) { croak("Argument %d is not object", i); } ExtrusionEntity* entity = (ExtrusionEntity *)SvIV((SV*)SvRV( ST(i) )); // append COPIES if (ExtrusionPath* path = dynamic_cast(entity)) { THIS->entities.push_back( new ExtrusionPath(*path) ); } else if (ExtrusionLoop* loop = dynamic_cast(entity)) { THIS->entities.push_back( new ExtrusionLoop(*loop) ); } else if(ExtrusionEntityCollection* collection = dynamic_cast(entity)) { THIS->entities.push_back( collection->clone() ); } else { croak("Argument %d is of unknown type", i); } } bool ExtrusionEntityCollection::no_sort(...) CODE: if (items > 1) { THIS->no_sort = SvTRUE(ST(1)); } RETVAL = THIS->no_sort; OUTPUT: RETVAL %} };