Revision: 64363
http://sourceforge.net/p/brlcad/code/64363
Author: starseeker
Date: 2015-03-11 01:01:41 +0000 (Wed, 11 Mar 2015)
Log Message:
-----------
Some progress on reassembly, but not correct yet.
Modified Paths:
--------------
brlcad/trunk/src/libbrep/shape_recognition.cpp
brlcad/trunk/src/libbrep/shape_recognition.h
brlcad/trunk/src/librt/test_shape_recognition.cpp
Modified: brlcad/trunk/src/libbrep/shape_recognition.cpp
===================================================================
--- brlcad/trunk/src/libbrep/shape_recognition.cpp 2015-03-10 23:25:35 UTC
(rev 64362)
+++ brlcad/trunk/src/libbrep/shape_recognition.cpp 2015-03-11 01:01:41 UTC
(rev 64363)
@@ -159,19 +159,40 @@
}
}
+ return subbreps;
+}
+
+
+// assistant function for find_top_level_hierarchy
+void
+subbrep_assemble_boolean_tree(std::multimap<const char *, long *> *ps, struct
bu_ptbl *subbreps_tree, const struct subbrep_object_data *obj)
+{
+ std::pair <std::multimap<const char *, long *>::iterator,
std::multimap<const char *, long *>::iterator > ret;
+ ret = ps->equal_range(bu_vls_addr(obj->key));
+ for (std::multimap<const char *, long *>::iterator it = ret.first; it !=
ret.second; it++) {
+ const struct subbrep_object_data *sub_obj = (const struct
subbrep_object_data *)it->second;
+ bu_log(" sub_obj: %s\n", bu_vls_addr(sub_obj->key));
+ if (sub_obj) {
+ bu_ptbl_ins(subbreps_tree, (long *)sub_obj);
+ std::cout << "array len: " << BU_PTBL_LEN(subbreps_tree) << "\n";
+ subbrep_assemble_boolean_tree(ps, subbreps_tree, sub_obj);
+ }
+ }
+}
+
+// TODO - this approach is insufficient/incorrect. Need to assemble
subtracted subbreps into
+// combs and subtract those as a unit - this approach doesn't correctly
subtract everything
+// from objects that need the subtractions.
+struct bu_ptbl *
+find_top_level_hierarchy(struct bu_ptbl *subbreps)
+{
// Now that we have the subbreps (or their substructures) and their
boolean status we need to
- // construct the top level tree. Each object will be one of two things - a
top level
- // object unioned into the global comb, or a top level object subtracted
from one of the other
- // top level objects. We need to build a map of subtractions - for each
subtracted object,
- // find via its shared edges/faces the parent subbrep it is subtracted
from.
- //
+ // construct the top level tree.
+
struct bu_ptbl *subbreps_tree;
std::multimap<const char *, long *> ps;
- std::map<const char *, long *> parents;
for (unsigned int i = 0; i < BU_PTBL_LEN(subbreps); i++) {
struct subbrep_object_data *obj = (struct subbrep_object_data
*)BU_PTBL_GET(subbreps, i);
- if (BU_STR_EQUAL(bu_vls_addr(obj->key),
"25_26_27_28_29_30_31_32_33_171_419_420_421_422"))
- std::cout << "Considering " << bu_vls_addr(obj->key) << "\n";
if (obj->params->bool_op == '-') {
int found_parent = 0;
for (unsigned int j = 0; j < BU_PTBL_LEN(subbreps); j++) {
@@ -181,12 +202,6 @@
if (pobj->fol[l] == obj->fil[k]) {
found_parent = 1;
ps.insert(std::make_pair(bu_vls_addr(pobj->key),
(long *)obj));
- parents[bu_vls_addr(obj->key)] = (long *)pobj;
- if (BU_STR_EQUAL(bu_vls_addr(obj->key),
"25_26_27_28_29_30_31_32_33_171_419_420_421_422")){
- std::cout << "Found parent " <<
bu_vls_addr(pobj->key) << "\n";
- std::cout << "parent bool " <<
pobj->params->bool_op << "\n";
- std::cout << "urk - problem - a subtraction
from a subtraction probably means the two should be unioned into a comb and the
comb subtracted...\n";
- }
break;
}
if (found_parent) break;
@@ -205,20 +220,14 @@
for (unsigned int i = 0; i < BU_PTBL_LEN(subbreps); i++) {
struct subbrep_object_data *obj = (struct subbrep_object_data
*)BU_PTBL_GET(subbreps, i);
if (obj->params->bool_op == 'u') {
- std::pair <std::multimap<const char *, long *>::iterator,
std::multimap<const char *, long *>::iterator > ret;
- ret = ps.equal_range(bu_vls_addr(obj->key));
bu_ptbl_ins(subbreps_tree, (long *)obj);
- for (std::multimap<const char *, long *>::iterator it = ret.first;
it != ret.second; it++) {
- struct subbrep_object_data *sub_obj = (struct
subbrep_object_data *)it->second;
- bu_ptbl_ins(subbreps_tree, (long *)sub_obj);
- }
+ bu_log("obj: %s\n", bu_vls_addr(obj->key));
+ subbrep_assemble_boolean_tree(&ps, subbreps_tree, obj);
}
}
- bu_ptbl_free(subbreps);
return subbreps_tree;
}
-
void
set_filter_obj(const ON_Surface *surface, struct filter_obj *obj)
{
Modified: brlcad/trunk/src/libbrep/shape_recognition.h
===================================================================
--- brlcad/trunk/src/libbrep/shape_recognition.h 2015-03-10 23:25:35 UTC
(rev 64362)
+++ brlcad/trunk/src/libbrep/shape_recognition.h 2015-03-11 01:01:41 UTC
(rev 64363)
@@ -135,6 +135,7 @@
void subbrep_add_planar_face(struct subbrep_object_data *data, ON_Plane *pcyl,
ON_SimpleArray<const ON_BrepVertex *> *vert_loop, int neg_surf);
struct bu_ptbl *find_subbreps(const ON_Brep *brep);
+struct bu_ptbl *find_top_level_hierarchy(struct bu_ptbl *subbreps);
void print_subbrep_object(struct subbrep_object_data *data, const char
*offset);
volume_t subbrep_shape_recognize(struct subbrep_object_data *data);
Modified: brlcad/trunk/src/librt/test_shape_recognition.cpp
===================================================================
--- brlcad/trunk/src/librt/test_shape_recognition.cpp 2015-03-10 23:25:35 UTC
(rev 64362)
+++ brlcad/trunk/src/librt/test_shape_recognition.cpp 2015-03-11 01:01:41 UTC
(rev 64363)
@@ -20,6 +20,45 @@
#define ptout(p) p.x << " " << p.y << " " << p.z
void
+subbrep_obj_name(struct subbrep_object_data *data, struct bu_vls *name)
+{
+ if (!data || !name) return;
+ switch (data->type) {
+ case ARB6:
+ bu_vls_sprintf(name, "arb6_%s.s", bu_vls_addr(data->key));
+ return;
+ case ARB8:
+ bu_vls_sprintf(name, "arb8_%s.s", bu_vls_addr(data->key));
+ return;
+ case PLANAR_VOLUME:
+ bu_vls_sprintf(name, "bot_%s.s", bu_vls_addr(data->key));
+ return;
+ case CYLINDER:
+ bu_vls_sprintf(name, "rcc_%s.s", bu_vls_addr(data->key));
+ return;
+ case CONE:
+ bu_vls_sprintf(name, "trc_%s.s", bu_vls_addr(data->key));
+ return;
+ case SPHERE:
+ bu_vls_sprintf(name, "sph_%s.s", bu_vls_addr(data->key));
+ return;
+ case ELLIPSOID:
+ bu_vls_sprintf(name, "ell_%s.s", bu_vls_addr(data->key));
+ return;
+ case TORUS:
+ bu_vls_sprintf(name, "tor_%s.s", bu_vls_addr(data->key));
+ return;
+ case COMB:
+ bu_vls_sprintf(name, "comb_%s.c", bu_vls_addr(data->key));
+ return;
+ default:
+ bu_vls_sprintf(name, "brep_%s.s", bu_vls_addr(data->key));
+ break;
+ }
+}
+
+
+void
brep_to_bot(struct subbrep_object_data *data, struct rt_wdb *wdbp)
{
/* Triangulate faces and write out as a bot */
@@ -137,7 +176,7 @@
}
/* Make the bot, using the data key for a unique name */
- bu_vls_sprintf(&prim_name, "bot_%s.s", bu_vls_addr(data->key));
+ subbrep_obj_name(data, &prim_name);
if (mk_bot(wdbp, bu_vls_addr(&prim_name), RT_BOT_SOLID, RT_BOT_UNORIENTED,
0, data->brep->m_V.Count(), all_faces_cnt, (fastf_t *)all_verts, final_faces,
(fastf_t *)NULL, (struct bu_bitv *)NULL)) {
std::cout << "mk_bot failed for overall bot\n";
}
@@ -149,7 +188,7 @@
struct csg_object_params *params = data->params;
if (data->type == ARB6) {
struct bu_vls prim_name = BU_VLS_INIT_ZERO;
- bu_vls_sprintf(&prim_name, "arb6_%s.s", bu_vls_addr(data->key));
+ subbrep_obj_name(data, &prim_name);
mk_arb6(wdbp, bu_vls_addr(&prim_name), (const fastf_t *)params->p);
//std::cout << bu_vls_addr(&prim_name) << ": " << params->bool_op <<
"\n";
@@ -167,7 +206,7 @@
struct csg_object_params *params = data->params;
if (data->type == ARB8) {
struct bu_vls prim_name = BU_VLS_INIT_ZERO;
- bu_vls_sprintf(&prim_name, "arb8_%s.s", bu_vls_addr(data->key));
+ subbrep_obj_name(data, &prim_name);
mk_arb8(wdbp, bu_vls_addr(&prim_name), (const fastf_t *)params->p);
//std::cout << bu_vls_addr(&prim_name) << ": " << params->bool_op <<
"\n";
@@ -210,7 +249,7 @@
(void)brep_to_bot(data, wdbp);
struct csg_object_params *params = data->params;
struct bu_vls prim_name = BU_VLS_INIT_ZERO;
- bu_vls_sprintf(&prim_name, "bot_%s.s", bu_vls_addr(data->key));
+ subbrep_obj_name(data, &prim_name);
//std::cout << bu_vls_addr(&prim_name) << ": " << params->bool_op <<
"\n";
if (wcomb) (void)mk_addmember(bu_vls_addr(&prim_name), &((*wcomb).l),
NULL, db_str2op(&(params->bool_op)));
bu_vls_free(&prim_name);
@@ -226,7 +265,7 @@
struct csg_object_params *params = data->params;
if (data->type == CYLINDER) {
struct bu_vls prim_name = BU_VLS_INIT_ZERO;
- bu_vls_sprintf(&prim_name, "rcc_%s.s", bu_vls_addr(data->key));
+ subbrep_obj_name(data, &prim_name);
int ret = mk_rcc(wdbp, bu_vls_addr(&prim_name), params->origin,
params->hv, params->radius);
if (ret) {
@@ -246,7 +285,7 @@
struct csg_object_params *params = data->params;
if (data->type == CONE) {
struct bu_vls prim_name = BU_VLS_INIT_ZERO;
- bu_vls_sprintf(&prim_name, "trc_%s.s", bu_vls_addr(data->key));
+ subbrep_obj_name(data, &prim_name);
mk_cone(wdbp, bu_vls_addr(&prim_name), params->origin, params->hv,
params->height, params->radius, params->r2);
//std::cout << bu_vls_addr(&prim_name) << ": " << params->bool_op <<
"\n";
@@ -263,7 +302,7 @@
struct csg_object_params *params = data->params;
if (data->type == SPHERE) {
struct bu_vls prim_name = BU_VLS_INIT_ZERO;
- bu_vls_sprintf(&prim_name, "sphere_%s.s", bu_vls_addr(data->key));
+ subbrep_obj_name(data, &prim_name);
mk_sph(wdbp, bu_vls_addr(&prim_name), params->origin, params->radius);
//std::cout << bu_vls_addr(&prim_name) << ": " << params->bool_op <<
"\n";
@@ -274,7 +313,6 @@
return 0;
}
-
void
process_params(struct subbrep_object_data *data, struct rt_wdb *wdbp, struct
wmember *wcomb)
{
@@ -325,7 +363,7 @@
if (data->type == BREP) {
if (data->local_brep) {
struct bu_vls brep_name = BU_VLS_INIT_ZERO;
- bu_vls_sprintf(&brep_name, "brep_%s.s", bu_vls_addr(data->key));
+ subbrep_obj_name(data, &brep_name);
mk_brep(wdbp, bu_vls_addr(&brep_name), data->local_brep);
// TODO - almost certainly need to do more work to get correct
booleans
if (pcomb) (void)mk_addmember(bu_vls_addr(&brep_name), &(pcomb->l),
NULL, db_str2op(&(data->params->bool_op)));
@@ -338,7 +376,7 @@
struct wmember wcomb;
struct bu_vls comb_name = BU_VLS_INIT_ZERO;
struct bu_vls member_name = BU_VLS_INIT_ZERO;
- bu_vls_sprintf(&comb_name, "comb_%s.c", bu_vls_addr(data->key));
+ subbrep_obj_name(data, &comb_name);
BU_LIST_INIT(&wcomb.l);
if (data->planar_obj) {
//bu_log("%smake planar obj %s\n", bu_vls_addr(&spacer),
bu_vls_addr(data->key));
@@ -418,13 +456,35 @@
for (unsigned int i = 0; i < BU_PTBL_LEN(subbreps); i++){
struct subbrep_object_data *obj = (struct subbrep_object_data
*)BU_PTBL_GET(subbreps, i);
//print_subbrep_object(obj, "");
- // first, make the comb (or, if we have a brep, make that)
- (void)make_shapes(obj, wdbp, &pcomb, 0);
+ (void)make_shapes(obj, wdbp, NULL, 0);
+ //subbrep_object_free(obj);
+ //BU_PUT(obj, struct subbrep_object_data);
+ }
+
+ struct bu_ptbl *subbreps_tree = find_top_level_hierarchy(subbreps);
+ for (unsigned int i = 0; i < BU_PTBL_LEN(subbreps_tree); i++){
+ struct subbrep_object_data *obj = (struct subbrep_object_data
*)BU_PTBL_GET(subbreps_tree, i);
+ std::cout << "Key: " << bu_vls_addr(obj->key) << "\n";
+ struct bu_vls obj_name = BU_VLS_INIT_ZERO;
+ subbrep_obj_name(obj, &obj_name);
+ (void)mk_addmember(bu_vls_addr(&obj_name), &(pcomb.l), NULL,
db_str2op(&(obj->params->bool_op)));
+ }
+
+ // Free memory
+ for (unsigned int i = 0; i < BU_PTBL_LEN(subbreps); i++){
+ struct subbrep_object_data *obj = (struct subbrep_object_data
*)BU_PTBL_GET(subbreps, i);
+ for (unsigned int j = 0; j < BU_PTBL_LEN(obj->children); j++){
+ struct subbrep_object_data *cdata = (struct subbrep_object_data
*)BU_PTBL_GET(obj->children,j);
+ subbrep_object_free(cdata);
+ }
subbrep_object_free(obj);
BU_PUT(obj, struct subbrep_object_data);
}
+
bu_ptbl_free(subbreps);
+ bu_ptbl_free(subbreps_tree);
BU_PUT(subbreps, struct bu_ptbl);
+ BU_PUT(subbreps_tree, struct bu_ptbl);
// TODO - probably should be region
mk_lcomb(wdbp, bu_vls_addr(&comb_name), &pcomb, 0, NULL, NULL, NULL, 0);
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits