Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions bindings/javascript/embind/binding_common.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#include <stack>
#include "binding_common.h"
#include "bits.h"

emscripten::val char_array_to_js_object(char* utf8) {
emscripten::val str_obj = emscripten::val::object();
Expand Down Expand Up @@ -181,6 +183,30 @@ emscripten::val dwg_ptr_to_signed_char_array(signed char* array, size_t size) {
return emscripten::val::null();
}

emscripten::val dwg_ptr_to_wchar_string_array(BITCODE_TU* array, size_t size) {
emscripten::val jsArray = emscripten::val::array();
for (size_t i = 0; i < size; ++i) {
BITCODE_TU wstr = (BITCODE_TU)array[i];
if (wstr) {
char *utf8 = bit_convert_TU(wstr);
if (wstr && !utf8) {
jsArray.call<void>("push", emscripten::val::null());
} else {
jsArray.call<void>("push", std::string(utf8));
free(utf8);
}
} else {
jsArray.call<void>("push", emscripten::val::null());
}
}
return jsArray;
}

emscripten::val dwg_ptr_to_wchar_string_array_wrapper(uintptr_t array_ptr, size_t size) {
BITCODE_TU* array = reinterpret_cast<BITCODE_TU*>(array_ptr);
return dwg_ptr_to_wchar_string_array(array, size);
}

emscripten::val dwg_ptr_to_unsigned_char_array_wrapper(uintptr_t array_ptr, size_t size) {
unsigned char* array = reinterpret_cast<unsigned char*>(array_ptr);
emscripten::val jsArray = emscripten::val::array();
Expand Down Expand Up @@ -489,6 +515,7 @@ emscripten::val dwg_ptr_to_mline_vertex_array_wrapper(uintptr_t array_ptr, size_
EMSCRIPTEN_BINDINGS(libredwg_array) {
DEFINE_FUNC(dwg_ptr_to_object_ref_array);
DEFINE_FUNC(dwg_ptr_to_object_ref_ptr_array);
DEFINE_FUNC(dwg_ptr_to_wchar_string_array);
DEFINE_FUNC(dwg_ptr_to_unsigned_char_array);
DEFINE_FUNC(dwg_ptr_to_signed_char_array);
DEFINE_FUNC(dwg_ptr_to_uint16_t_array);
Expand Down Expand Up @@ -720,6 +747,19 @@ emscripten::val dwg_object_entity_get_ownerhandle_object_wrapper(Dwg_Object_Enti
return object_ref_to_js_object(ownerhandle);
}

uintptr_t dwg_object_entity_get_xdicobjhandle_wrapper(Dwg_Object_Entity_Ptr ent_ptr) {
Dwg_Object_Entity* ent = reinterpret_cast<Dwg_Object_Entity*>(ent_ptr);
int error = 0;
return reinterpret_cast<uintptr_t>(dwg_ent_get_xdicobjhandle(ent, &error));
}

emscripten::val dwg_object_entity_get_xdicobjhandle_object_wrapper(Dwg_Object_Entity_Ptr ent_ptr) {
Dwg_Object_Entity* ent = reinterpret_cast<Dwg_Object_Entity*>(ent_ptr);
int error = 0;
Dwg_Object_Ref* xdicobjhandle = dwg_ent_get_xdicobjhandle(ent, &error);
return object_ref_to_js_object(xdicobjhandle);
}

uintptr_t dwg_object_entity_get_handle_wrapper(Dwg_Object_Entity_Ptr ent_ptr) {
Dwg_Object_Entity* ent = reinterpret_cast<Dwg_Object_Entity*>(ent_ptr);
int error = 0;
Expand Down Expand Up @@ -850,12 +890,108 @@ uintptr_t dwg_object_entity_get_reactors_wrapper(Dwg_Object_Entity_Ptr ent_ptr)
return reinterpret_cast<uintptr_t>(dwg_ent_get_reactors(ent, &error));
}

emscripten::val dwg_object_entity_get_xdata_wrapper(Dwg_Object_Entity_Ptr ent_ptr) {
Dwg_Object_Entity* ent = reinterpret_cast<Dwg_Object_Entity*>(ent_ptr);

emscripten::val result = emscripten::val::array();
for (int i = 0; i < ent->num_eed; i++) {
Dwg_Eed *eed = &ent->eed[i];
emscripten::val eed_obj = emscripten::val::object();

// name of APPID
Dwg_Object *appid = dwg_resolve_handle(ent->dwg, eed->handle.value);
if (appid && appid->fixedtype == DWG_TYPE_APPID) {
char *utf8 = bit_convert_TU((BITCODE_TU)appid->tio.object->tio.APPID->name);
eed_obj.set("appName", std::string(utf8));
} else {
eed_obj.set("appName", std::string("ACAD"));
}

emscripten::val entries_obj = emscripten::val::array();
std::stack<emscripten::val> stack;
stack.push(entries_obj);
for (int j = 0; j < eed->size; j++) {
Dwg_Eed_Data *data = &eed->data[j];
const int code = data->code + 1000;

emscripten::val entry_obj = emscripten::val::object();
entry_obj.set("code", code);
switch (data->code) {
case 0: {
if (!data->u.eed_0.length)
entry_obj.set("value", std::string(""));
else if (data->u.eed_0.is_tu)
entry_obj.set("value", std::string(bit_convert_TU(data->u.eed_0_r2007.string)));
else
entry_obj.set("value", std::string(data->u.eed_0.string));
break;
}
case 2:
if (data->u.eed_2.close) {
if (!stack.empty()) {
stack.pop();
}
if (stack.size() >= 1) {
entries_obj = stack.top();
}
} else {
entries_obj = emscripten::val::array();
stack.push(entries_obj);
}
break;
case 3:
entry_obj.set("value", data->u.eed_3.layer);
break;
case 4:
entry_obj.set("value", dwg_ptr_to_unsigned_char_array(data->u.eed_4.data, data->u.eed_4.length));
break;
case 5:
entry_obj.set("value", data->u.eed_5.entity);
break; // not in DXF
case 10:
case 11:
case 12:
case 13:
case 14:
case 15: {
emscripten::val point_obj = emscripten::val::object();
point_obj.set("x", data->u.eed_10.point.x);
point_obj.set("y", data->u.eed_10.point.y);
point_obj.set("z", data->u.eed_10.point.z);
entry_obj.set("value", point_obj);
break;
}
case 40:
case 41:
case 42:
entry_obj.set("value", data->u.eed_40.real);
break;
case 70:
entry_obj.set("value", data->u.eed_70.rs);
break;
case 71:
entry_obj.set("value", data->u.eed_71.rl);
break;
default:
entry_obj.set("value", 0);
}
entries_obj.call<void>("push", entry_obj);
}

eed_obj.set("value", entries_obj);
result.call<void>("push", eed_obj);
}
return result;
}

/**
* Methods to access fields of Dwg_Object_Entity
*/
EMSCRIPTEN_BINDINGS(libredwg_dwg_object_entity) {
DEFINE_FUNC(dwg_object_entity_get_ownerhandle);
DEFINE_FUNC(dwg_object_entity_get_ownerhandle_object);
DEFINE_FUNC(dwg_object_entity_get_xdicobjhandle);
DEFINE_FUNC(dwg_object_entity_get_xdicobjhandle_object);
DEFINE_FUNC(dwg_object_entity_get_handle);
DEFINE_FUNC(dwg_object_entity_get_handle_object);
DEFINE_FUNC(dwg_object_entity_get_layer_object_ref);
Expand All @@ -874,6 +1010,7 @@ EMSCRIPTEN_BINDINGS(libredwg_dwg_object_entity) {
DEFINE_FUNC(dwg_object_entity_has_edge_visualstyle);
DEFINE_FUNC(dwg_object_entity_get_num_reactors);
DEFINE_FUNC(dwg_object_entity_get_reactors);
DEFINE_FUNC(dwg_object_entity_get_xdata);
}

/***********************************************************************/
Expand Down
4 changes: 3 additions & 1 deletion bindings/javascript/embind/binding_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,6 @@ emscripten::val dwg_ptr_to_signed_char_array(signed char* array, size_t size);

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

emscripten::val dwg_ptr_to_object_ref_ptr_array(BITCODE_H* array, size_t size);
emscripten::val dwg_ptr_to_object_ref_ptr_array(BITCODE_H* array, size_t size);

emscripten::val dwg_ptr_to_wchar_string_array(BITCODE_TU* array, size_t size);
23 changes: 22 additions & 1 deletion bindings/javascript/embind/binding_ent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ emscripten::val dwg_entity_polyline_3d_get_vertices_wrapper(Dwg_Object_Ptr obj_p
return result;
}

EMSCRIPTEN_BINDINGS(libredwg_dwg_object_ref) {
EMSCRIPTEN_BINDINGS(libredwg_dwg_entity) {
DEFINE_FUNC(dwg_entity_owner);
DEFINE_FUNC(dwg_entity_polyline_2d_get_numpoints);
DEFINE_FUNC(dwg_entity_polyline_2d_get_points);
Expand All @@ -336,4 +336,25 @@ EMSCRIPTEN_BINDINGS(libredwg_dwg_object_ref) {
DEFINE_FUNC(dwg_entity_polyline_3d_get_points);
DEFINE_FUNC(dwg_entity_polyline_3d_get_vertices);
DEFINE_FUNC(dwg_entity_block_header_get_preview);
}

emscripten::val dwg_object_dictionary_get_texts_wrapper(Dwg_Object_Ptr obj_ptr) {
Dwg_Object* obj = reinterpret_cast<Dwg_Object*>(obj_ptr);
if (obj && obj->fixedtype == DWG_TYPE_DICTIONARY) {
Dwg_Object_DICTIONARY* dict = obj->tio.object->tio.DICTIONARY;
emscripten::val result = emscripten::val::object();
result.set("success", true);
result.set("data", dwg_ptr_to_wchar_string_array((BITCODE_TU*)dict->texts, dict->numitems));
return result;
} else {
emscripten::val result = emscripten::val::object();
result.set("success", false);
result.set("message", std::string("Failed to get the number of points!"));
result.set("data", emscripten::val::array());
return result;
}
}

EMSCRIPTEN_BINDINGS(libredwg_dwg_object) {
DEFINE_FUNC(dwg_object_dictionary_get_texts);
}
2 changes: 1 addition & 1 deletion bindings/javascript/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"description": "A DWG/DXF JavaScript parser based on libredwg",
"license": "GPL-2.0-only",
"private": false,
"version": "0.6.4",
"version": "0.6.5",
"author": "MLight Lee <mlight.lee@outlook.com>",
"type": "module",
"repository": {
Expand Down
Loading
Loading