@@ -32,45 +32,12 @@ EMSCRIPTEN_DECLARE_VAL_TYPE(ItemList);
3232EMSCRIPTEN_DECLARE_VAL_TYPE (DoubleList);
3333EMSCRIPTEN_DECLARE_VAL_TYPE (ResultAndItem);
3434
35-
36- // Helper function to convert a Point to a JavaScript object
37- emscripten::val pointToJSObject (const Point& point) {
38- emscripten::val obj = emscripten::val::object ();
39- obj.set (" x" , long { static_cast <long >(getX (point)) } );
40- obj.set (" y" , long { static_cast <long >(getY (point)) } );
41- return obj;
42- }
43-
4435ResultAndItem resultAndItems (const size_t result, const ItemList& items) {
4536 emscripten::val obj = emscripten::val::object ();
4637 obj.set (" result" , result);
4738 obj.set (" items" , items);
4839 return ResultAndItem { obj };
4940}
50- // Helper function to convert a vector of Points to a JavaScript array
51- emscripten::val pointVectorToJSArray (const std::vector<Point>& points) {
52- emscripten::val jsArray = emscripten::val::array ();
53- for (size_t i = 0 ; i < points.size (); ++i) {
54- jsArray.set (i, pointToJSObject (points[i]));
55- }
56- return jsArray;
57- }
58- // Helper function to convert JavaScript arrays to std::vector<Point>
59- std::vector<Point> jsArrayToPointVector (const emscripten::val& jsArray) {
60- std::vector<Point> vertices;
61- unsigned length = jsArray[" length" ].as <unsigned >();
62- vertices.reserve (length);
63-
64- for (unsigned i = 0 ; i < length; i++) {
65- emscripten::val jsPoint = jsArray[i];
66- // Use property access instead of method calls for better compatibility
67- long x = jsPoint[" x" ].as <long >();
68- long y = jsPoint[" y" ].as <long >();
69- vertices.emplace_back (x, y);
70- }
71-
72- return vertices;
73- }
7441
7542// Wrapper function for nest() to handle JavaScript arrays
7643ResultAndItem nestWrapper (const ItemList& jsItems, const Box& bin, double scaleFactor) {
@@ -162,14 +129,12 @@ EMSCRIPTEN_BINDINGS(libnest2d_js) {
162129 .field (" parallel" , &NfpConfig::parallel)
163130 ;
164131
165-
166132 // Item class
167133 class_<Item>(" Item" )
168134 .constructor <const PolygonImpl&>()
169- .class_function (" createFromVertices" , optional_override ([](const emscripten::val& jsVertices) -> Item {
170- std::vector<Point> vertices = jsArrayToPointVector (jsVertices);
135+ .class_function (" createFromVertices" , optional_override ([](const PointList& vertices) -> Item {
171136 PolygonImpl polygon;
172- polygon.Contour = vertices;
137+ polygon.Contour = emscripten::vecFromJSArray<Point>( vertices) ;
173138 return Item (polygon);
174139 }))
175140 .function (" binId" , select_overload<int () const >(&Item::binId))
@@ -189,7 +154,11 @@ EMSCRIPTEN_BINDINGS(libnest2d_js) {
189154 .function (" setPriority" , select_overload<void (int )>(&Item::priority))
190155 .function (" transformedShape" , optional_override ([](const Item& self) {
191156 const auto & poly = self.transformedShape ();
192- return pointVectorToJSArray (poly.Contour );
157+ emscripten::val shape = emscripten::val::array ();
158+ for (const auto & point : poly.Contour ) {
159+ shape.call <void >(" push" , point);
160+ }
161+ return PointList { shape };
193162 }));
194163
195164
0 commit comments