ExtrusionEntityCollection.xsp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. %module{Slic3r::XS};
  2. %{
  3. #include <xsinit.h>
  4. #include "libslic3r/ExtrusionEntityCollection.hpp"
  5. %}
  6. %name{Slic3r::ExtrusionPath::Collection} class ExtrusionEntityCollection {
  7. %name{_new} ExtrusionEntityCollection();
  8. ~ExtrusionEntityCollection();
  9. Clone<ExtrusionEntityCollection> clone()
  10. %code{% RETVAL = THIS->clone(); %};
  11. void reverse();
  12. void clear()
  13. %code{% THIS->entities.clear(); %};
  14. ExtrusionEntityCollection* chained_path(bool no_reverse)
  15. %code{%
  16. RETVAL = new ExtrusionEntityCollection();
  17. THIS->chained_path(RETVAL, no_reverse);
  18. %};
  19. ExtrusionEntityCollection* chained_path_from(Point* start_near, bool no_reverse)
  20. %code{%
  21. RETVAL = new ExtrusionEntityCollection();
  22. THIS->chained_path_from(*start_near, RETVAL, no_reverse);
  23. %};
  24. ExtrusionEntityCollection* flatten_if_sortable()
  25. %code{%
  26. RETVAL = new ExtrusionEntityCollection();
  27. THIS->flatten_if_sortable(RETVAL);
  28. %};
  29. bool is_solid_infill()
  30. %code{% RETVAL = THIS->is_solid_infill(); %};
  31. Clone<Point> first_point();
  32. Clone<Point> last_point();
  33. int count()
  34. %code{% RETVAL = THIS->entities.size(); %};
  35. int items_count()
  36. %code{% RETVAL = THIS->items_count(); %};
  37. ExtrusionEntityCollection* flatten()
  38. %code{%
  39. RETVAL = new ExtrusionEntityCollection();
  40. THIS->flatten(RETVAL);
  41. %};
  42. double min_mm3_per_mm();
  43. bool empty()
  44. %code{% RETVAL = THIS->entities.empty(); %};
  45. std::vector<size_t> orig_indices()
  46. %code{% RETVAL = THIS->orig_indices; %};
  47. Polygons grow();
  48. %{
  49. SV*
  50. ExtrusionEntityCollection::arrayref()
  51. CODE:
  52. AV* av = newAV();
  53. av_fill(av, THIS->entities.size()-1);
  54. int i = 0;
  55. for (ExtrusionEntitiesPtr::iterator it = THIS->entities.begin(); it != THIS->entities.end(); ++it) {
  56. SV* sv = newSV(0);
  57. // return our item by reference
  58. if (ExtrusionPath* path = dynamic_cast<ExtrusionPath*>(*it)) {
  59. sv_setref_pv( sv, perl_class_name_ref(path), path );
  60. } else if (ExtrusionLoop* loop = dynamic_cast<ExtrusionLoop*>(*it)) {
  61. sv_setref_pv( sv, perl_class_name_ref(loop), loop );
  62. } else if (ExtrusionEntityCollection* collection = dynamic_cast<ExtrusionEntityCollection*>(*it)) {
  63. sv_setref_pv( sv, perl_class_name_ref(collection), collection );
  64. } else {
  65. croak("Unexpected type in ExtrusionEntityCollection");
  66. }
  67. av_store(av, i++, sv);
  68. }
  69. RETVAL = newRV_noinc((SV*)av);
  70. OUTPUT:
  71. RETVAL
  72. void
  73. ExtrusionEntityCollection::append(...)
  74. CODE:
  75. for (unsigned int i = 1; i < items; i++) {
  76. if(!sv_isobject( ST(i) ) || (SvTYPE(SvRV( ST(i) )) != SVt_PVMG)) {
  77. croak("Argument %d is not object", i);
  78. }
  79. ExtrusionEntity* entity = (ExtrusionEntity *)SvIV((SV*)SvRV( ST(i) ));
  80. // append COPIES
  81. if (ExtrusionPath* path = dynamic_cast<ExtrusionPath*>(entity)) {
  82. THIS->entities.push_back( new ExtrusionPath(*path) );
  83. } else if (ExtrusionLoop* loop = dynamic_cast<ExtrusionLoop*>(entity)) {
  84. THIS->entities.push_back( new ExtrusionLoop(*loop) );
  85. } else if(ExtrusionEntityCollection* collection = dynamic_cast<ExtrusionEntityCollection*>(entity)) {
  86. THIS->entities.push_back( collection->clone() );
  87. } else {
  88. croak("Argument %d is of unknown type", i);
  89. }
  90. }
  91. bool
  92. ExtrusionEntityCollection::no_sort(...)
  93. CODE:
  94. if (items > 1) {
  95. THIS->no_sort = SvTRUE(ST(1));
  96. }
  97. RETVAL = THIS->no_sort;
  98. OUTPUT:
  99. RETVAL
  100. ExtrusionEntityCollection*
  101. ExtrusionEntityCollection::chained_path_indices(bool no_reverse)
  102. CODE:
  103. RETVAL = new ExtrusionEntityCollection();
  104. THIS->chained_path(RETVAL, no_reverse, &RETVAL->orig_indices);
  105. OUTPUT:
  106. RETVAL
  107. %}
  108. };