ExtrusionEntityCollection.xsp 3.5 KB

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