Skip to content

Commit a5dbabe

Browse files
authored
feat: support parsing appid table and dictionary, spatial filter objects (#3)
1 parent d221935 commit a5dbabe

17 files changed

Lines changed: 487 additions & 10 deletions

File tree

bindings/javascript/embind/binding_common.cpp

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
#include <stack>
12
#include "binding_common.h"
3+
#include "bits.h"
24

35
emscripten::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+
184210
emscripten::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_
489515
EMSCRIPTEN_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+
723763
uintptr_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
*/
856990
EMSCRIPTEN_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
/***********************************************************************/

bindings/javascript/embind/binding_common.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,6 @@ emscripten::val dwg_ptr_to_signed_char_array(signed char* array, size_t size);
4545

4646
emscripten::val dwg_ptr_to_object_ref_array(BITCODE_H* array, size_t size);
4747

48-
emscripten::val dwg_ptr_to_object_ref_ptr_array(BITCODE_H* array, size_t size);
48+
emscripten::val dwg_ptr_to_object_ref_ptr_array(BITCODE_H* array, size_t size);
49+
50+
emscripten::val dwg_ptr_to_wchar_string_array(BITCODE_TU* array, size_t size);

bindings/javascript/embind/binding_ent.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ emscripten::val dwg_entity_polyline_3d_get_vertices_wrapper(Dwg_Object_Ptr obj_p
327327
return result;
328328
}
329329

330-
EMSCRIPTEN_BINDINGS(libredwg_dwg_object_ref) {
330+
EMSCRIPTEN_BINDINGS(libredwg_dwg_entity) {
331331
DEFINE_FUNC(dwg_entity_owner);
332332
DEFINE_FUNC(dwg_entity_polyline_2d_get_numpoints);
333333
DEFINE_FUNC(dwg_entity_polyline_2d_get_points);
@@ -336,4 +336,25 @@ EMSCRIPTEN_BINDINGS(libredwg_dwg_object_ref) {
336336
DEFINE_FUNC(dwg_entity_polyline_3d_get_points);
337337
DEFINE_FUNC(dwg_entity_polyline_3d_get_vertices);
338338
DEFINE_FUNC(dwg_entity_block_header_get_preview);
339+
}
340+
341+
emscripten::val dwg_object_dictionary_get_texts_wrapper(Dwg_Object_Ptr obj_ptr) {
342+
Dwg_Object* obj = reinterpret_cast<Dwg_Object*>(obj_ptr);
343+
if (obj && obj->fixedtype == DWG_TYPE_DICTIONARY) {
344+
Dwg_Object_DICTIONARY* dict = obj->tio.object->tio.DICTIONARY;
345+
emscripten::val result = emscripten::val::object();
346+
result.set("success", true);
347+
result.set("data", dwg_ptr_to_wchar_string_array((BITCODE_TU*)dict->texts, dict->numitems));
348+
return result;
349+
} else {
350+
emscripten::val result = emscripten::val::object();
351+
result.set("success", false);
352+
result.set("message", std::string("Failed to get the number of points!"));
353+
result.set("data", emscripten::val::array());
354+
return result;
355+
}
356+
}
357+
358+
EMSCRIPTEN_BINDINGS(libredwg_dwg_object) {
359+
DEFINE_FUNC(dwg_object_dictionary_get_texts);
339360
}

bindings/javascript/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"description": "A DWG/DXF JavaScript parser based on libredwg",
44
"license": "GPL-2.0-only",
55
"private": false,
6-
"version": "0.6.4",
6+
"version": "0.6.5",
77
"author": "MLight Lee <mlight.lee@outlook.com>",
88
"type": "module",
99
"repository": {

0 commit comments

Comments
 (0)