1+ #include < stack>
12#include " binding_common.h"
3+ #include " bits.h"
24
35emscripten::val char_array_to_js_object (char * utf8) {
46 emscripten::val str_obj = emscripten::val::object ();
@@ -181,6 +183,30 @@ emscripten::val dwg_ptr_to_signed_char_array(signed char* array, size_t size) {
181183 return emscripten::val::null ();
182184}
183185
186+ emscripten::val dwg_ptr_to_wchar_string_array (BITCODE_TU* array, size_t size) {
187+ emscripten::val jsArray = emscripten::val::array ();
188+ for (size_t i = 0 ; i < size; ++i) {
189+ BITCODE_TU wstr = (BITCODE_TU)array[i];
190+ if (wstr) {
191+ char *utf8 = bit_convert_TU (wstr);
192+ if (wstr && !utf8) {
193+ jsArray.call <void >(" push" , emscripten::val::null ());
194+ } else {
195+ jsArray.call <void >(" push" , std::string (utf8));
196+ free (utf8);
197+ }
198+ } else {
199+ jsArray.call <void >(" push" , emscripten::val::null ());
200+ }
201+ }
202+ return jsArray;
203+ }
204+
205+ emscripten::val dwg_ptr_to_wchar_string_array_wrapper (uintptr_t array_ptr, size_t size) {
206+ BITCODE_TU* array = reinterpret_cast <BITCODE_TU*>(array_ptr);
207+ return dwg_ptr_to_wchar_string_array (array, size);
208+ }
209+
184210emscripten::val dwg_ptr_to_unsigned_char_array_wrapper (uintptr_t array_ptr, size_t size) {
185211 unsigned char * array = reinterpret_cast <unsigned char *>(array_ptr);
186212 emscripten::val jsArray = emscripten::val::array ();
@@ -489,6 +515,7 @@ emscripten::val dwg_ptr_to_mline_vertex_array_wrapper(uintptr_t array_ptr, size_
489515EMSCRIPTEN_BINDINGS (libredwg_array) {
490516 DEFINE_FUNC (dwg_ptr_to_object_ref_array);
491517 DEFINE_FUNC (dwg_ptr_to_object_ref_ptr_array);
518+ DEFINE_FUNC (dwg_ptr_to_wchar_string_array);
492519 DEFINE_FUNC (dwg_ptr_to_unsigned_char_array);
493520 DEFINE_FUNC (dwg_ptr_to_signed_char_array);
494521 DEFINE_FUNC (dwg_ptr_to_uint16_t_array);
@@ -720,6 +747,19 @@ emscripten::val dwg_object_entity_get_ownerhandle_object_wrapper(Dwg_Object_Enti
720747 return object_ref_to_js_object (ownerhandle);
721748}
722749
750+ uintptr_t dwg_object_entity_get_xdicobjhandle_wrapper (Dwg_Object_Entity_Ptr ent_ptr) {
751+ Dwg_Object_Entity* ent = reinterpret_cast <Dwg_Object_Entity*>(ent_ptr);
752+ int error = 0 ;
753+ return reinterpret_cast <uintptr_t >(dwg_ent_get_xdicobjhandle (ent, &error));
754+ }
755+
756+ emscripten::val dwg_object_entity_get_xdicobjhandle_object_wrapper (Dwg_Object_Entity_Ptr ent_ptr) {
757+ Dwg_Object_Entity* ent = reinterpret_cast <Dwg_Object_Entity*>(ent_ptr);
758+ int error = 0 ;
759+ Dwg_Object_Ref* xdicobjhandle = dwg_ent_get_xdicobjhandle (ent, &error);
760+ return object_ref_to_js_object (xdicobjhandle);
761+ }
762+
723763uintptr_t dwg_object_entity_get_handle_wrapper (Dwg_Object_Entity_Ptr ent_ptr) {
724764 Dwg_Object_Entity* ent = reinterpret_cast <Dwg_Object_Entity*>(ent_ptr);
725765 int error = 0 ;
@@ -850,12 +890,108 @@ uintptr_t dwg_object_entity_get_reactors_wrapper(Dwg_Object_Entity_Ptr ent_ptr)
850890 return reinterpret_cast <uintptr_t >(dwg_ent_get_reactors (ent, &error));
851891}
852892
893+ emscripten::val dwg_object_entity_get_xdata_wrapper (Dwg_Object_Entity_Ptr ent_ptr) {
894+ Dwg_Object_Entity* ent = reinterpret_cast <Dwg_Object_Entity*>(ent_ptr);
895+
896+ emscripten::val result = emscripten::val::array ();
897+ for (int i = 0 ; i < ent->num_eed ; i++) {
898+ Dwg_Eed *eed = &ent->eed [i];
899+ emscripten::val eed_obj = emscripten::val::object ();
900+
901+ // name of APPID
902+ Dwg_Object *appid = dwg_resolve_handle (ent->dwg , eed->handle .value );
903+ if (appid && appid->fixedtype == DWG_TYPE_APPID) {
904+ char *utf8 = bit_convert_TU ((BITCODE_TU)appid->tio .object ->tio .APPID ->name );
905+ eed_obj.set (" appName" , std::string (utf8));
906+ } else {
907+ eed_obj.set (" appName" , std::string (" ACAD" ));
908+ }
909+
910+ emscripten::val entries_obj = emscripten::val::array ();
911+ std::stack<emscripten::val> stack;
912+ stack.push (entries_obj);
913+ for (int j = 0 ; j < eed->size ; j++) {
914+ Dwg_Eed_Data *data = &eed->data [j];
915+ const int code = data->code + 1000 ;
916+
917+ emscripten::val entry_obj = emscripten::val::object ();
918+ entry_obj.set (" code" , code);
919+ switch (data->code ) {
920+ case 0 : {
921+ if (!data->u .eed_0 .length )
922+ entry_obj.set (" value" , std::string (" " ));
923+ else if (data->u .eed_0 .is_tu )
924+ entry_obj.set (" value" , std::string (bit_convert_TU (data->u .eed_0_r2007 .string )));
925+ else
926+ entry_obj.set (" value" , std::string (data->u .eed_0 .string ));
927+ break ;
928+ }
929+ case 2 :
930+ if (data->u .eed_2 .close ) {
931+ if (!stack.empty ()) {
932+ stack.pop ();
933+ }
934+ if (stack.size () >= 1 ) {
935+ entries_obj = stack.top ();
936+ }
937+ } else {
938+ entries_obj = emscripten::val::array ();
939+ stack.push (entries_obj);
940+ }
941+ break ;
942+ case 3 :
943+ entry_obj.set (" value" , data->u .eed_3 .layer );
944+ break ;
945+ case 4 :
946+ entry_obj.set (" value" , dwg_ptr_to_unsigned_char_array (data->u .eed_4 .data , data->u .eed_4 .length ));
947+ break ;
948+ case 5 :
949+ entry_obj.set (" value" , data->u .eed_5 .entity );
950+ break ; // not in DXF
951+ case 10 :
952+ case 11 :
953+ case 12 :
954+ case 13 :
955+ case 14 :
956+ case 15 : {
957+ emscripten::val point_obj = emscripten::val::object ();
958+ point_obj.set (" x" , data->u .eed_10 .point .x );
959+ point_obj.set (" y" , data->u .eed_10 .point .y );
960+ point_obj.set (" z" , data->u .eed_10 .point .z );
961+ entry_obj.set (" value" , point_obj);
962+ break ;
963+ }
964+ case 40 :
965+ case 41 :
966+ case 42 :
967+ entry_obj.set (" value" , data->u .eed_40 .real );
968+ break ;
969+ case 70 :
970+ entry_obj.set (" value" , data->u .eed_70 .rs );
971+ break ;
972+ case 71 :
973+ entry_obj.set (" value" , data->u .eed_71 .rl );
974+ break ;
975+ default :
976+ entry_obj.set (" value" , 0 );
977+ }
978+ entries_obj.call <void >(" push" , entry_obj);
979+ }
980+
981+ eed_obj.set (" value" , entries_obj);
982+ result.call <void >(" push" , eed_obj);
983+ }
984+ return result;
985+ }
986+
853987/* *
854988 * Methods to access fields of Dwg_Object_Entity
855989 */
856990EMSCRIPTEN_BINDINGS (libredwg_dwg_object_entity) {
857991 DEFINE_FUNC (dwg_object_entity_get_ownerhandle);
858992 DEFINE_FUNC (dwg_object_entity_get_ownerhandle_object);
993+ DEFINE_FUNC (dwg_object_entity_get_xdicobjhandle);
994+ DEFINE_FUNC (dwg_object_entity_get_xdicobjhandle_object);
859995 DEFINE_FUNC (dwg_object_entity_get_handle);
860996 DEFINE_FUNC (dwg_object_entity_get_handle_object);
861997 DEFINE_FUNC (dwg_object_entity_get_layer_object_ref);
@@ -874,6 +1010,7 @@ EMSCRIPTEN_BINDINGS(libredwg_dwg_object_entity) {
8741010 DEFINE_FUNC (dwg_object_entity_has_edge_visualstyle);
8751011 DEFINE_FUNC (dwg_object_entity_get_num_reactors);
8761012 DEFINE_FUNC (dwg_object_entity_get_reactors);
1013+ DEFINE_FUNC (dwg_object_entity_get_xdata);
8771014}
8781015
8791016/* **********************************************************************/
0 commit comments