Revision: 76856
          http://sourceforge.net/p/brlcad/code/76856
Author:   starseeker
Date:     2020-08-20 02:07:59 +0000 (Thu, 20 Aug 2020)
Log Message:
-----------
Put the subtraction capability back in as well.

Modified Paths:
--------------
    brlcad/branches/analyze_cmd/src/libged/analyze/analyze.cpp

Modified: brlcad/branches/analyze_cmd/src/libged/analyze/analyze.cpp
===================================================================
--- brlcad/branches/analyze_cmd/src/libged/analyze/analyze.cpp  2020-08-20 
02:02:36 UTC (rev 76855)
+++ brlcad/branches/analyze_cmd/src/libged/analyze/analyze.cpp  2020-08-20 
02:07:59 UTC (rev 76856)
@@ -422,7 +422,7 @@
     struct directory *dp2 = db_lookup(gedp->ged_wdbp->dbip, argv[1], 
LOOKUP_NOISY);
     op_func_ptr of = _analyze_find_processor(gc, DB_OP_INTERSECT, 
dp1->d_minor_type, dp2->d_minor_type);
     if (!of) {
-       bu_vls_sprintf(gedp->ged_result_str, "Unsupported type paring\n");
+       bu_vls_sprintf(gedp->ged_result_str, "Unsupported type pairing\n");
        bu_vls_free(&oname);
        return GED_ERROR;
     }
@@ -443,7 +443,7 @@
            dp2 = db_lookup(gedp->ged_wdbp->dbip, n2, LOOKUP_NOISY);
            of = _analyze_find_processor(gc, DB_OP_INTERSECT, 
dp1->d_minor_type, dp2->d_minor_type);
            if (!of) {
-               bu_vls_sprintf(gedp->ged_result_str, "Unsupported type 
paring\n");
+               bu_vls_sprintf(gedp->ged_result_str, "Unsupported type 
pairing\n");
                clear_obj(gc->gedp, tmpname);
                clear_obj(gc->gedp, tmpname2);
                bu_vls_free(&oname);
@@ -472,7 +472,114 @@
     return GED_OK;
 }
 
+extern "C" int
+_analyze_cmd_subtract(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "analyze [options] subtract [-o out_obj] obj1 
obj2 <...>";
+    const char *purpose_string = "Intersect obj1 with obj2 and any subsequent 
objs";
+    if (_analyze_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return GED_OK;
+    }
 
+    struct _ged_analyze_info *gc = (struct _ged_analyze_info *)bs;
+    struct ged *gedp = gc->gedp;
+
+    argc--; argv++;
+    if (!argc) {
+       bu_vls_printf(gc->gedp->ged_result_str, "%s\n", usage_string);
+       return GED_ERROR;
+    }
+
+    GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
+    GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR);
+
+    /* initialize result */
+    bu_vls_trunc(gedp->ged_result_str, 0);
+
+    // See if we are going to output an object
+    int help = 0;
+    struct bu_vls oname = BU_VLS_INIT_ZERO;
+    struct bu_opt_desc d[3];
+    BU_OPT(d[0], "h", "help",    "",      NULL,        &help,  "Print help");
+    BU_OPT(d[1], "o", "output",  "name",  &bu_opt_vls, &oname, "Specify output 
object");
+    BU_OPT_NULL(d[2]);
+
+    int ac = bu_opt_parse(NULL, argc, argv, d);
+    if (help) {
+       bu_vls_printf(gc->gedp->ged_result_str, "%s\n", usage_string);
+       return GED_HELP;
+    }
+    if (ac < 2) {
+       bu_vls_printf(gc->gedp->ged_result_str, "%s\n", usage_string);
+       return GED_HELP;
+    }
+    argc = ac;
+
+    if (bu_vls_strlen(&oname)) {
+       struct directory *dp_out = db_lookup(gedp->ged_wdbp->dbip, 
bu_vls_cstr(&oname), LOOKUP_QUIET);
+       if (dp_out != RT_DIR_NULL) {
+           bu_vls_sprintf(gedp->ged_result_str, "specified output object %s 
already exists.\n", bu_vls_cstr(&oname));
+           bu_vls_free(&oname);
+           return GED_ERROR;
+       }
+    }
+
+    long ret = 0;
+    const char *tmpname = "___analyze_cmd_subtract_tmp_obj__";
+    struct directory *dp1 = db_lookup(gedp->ged_wdbp->dbip, argv[0], 
LOOKUP_NOISY);
+    struct directory *dp2 = db_lookup(gedp->ged_wdbp->dbip, argv[1], 
LOOKUP_NOISY);
+    op_func_ptr of = _analyze_find_processor(gc, DB_OP_SUBTRACT, 
dp1->d_minor_type, dp2->d_minor_type);
+    if (!of) {
+       bu_vls_sprintf(gedp->ged_result_str, "Unsupported type pairing\n");
+       bu_vls_free(&oname);
+       return GED_ERROR;
+    }
+    clear_obj(gc->gedp, tmpname);
+    ret = (*of)(tmpname, gc->gedp,  DB_OP_SUBTRACT, argv[0], argv[1]);
+    if (ret == -1) {
+       clear_obj(gc->gedp, tmpname);
+       bu_vls_free(&oname);
+       return GED_ERROR;
+    }
+
+    if (argc > 2) {
+       const char *tmpname2 = "___analyze_cmd_subtract_tmp_obj_2__";
+       for (int i = 2; i < argc; i++) {
+           const char *n1 = tmpname;
+           const char *n2 = argv[i];
+           dp1 = db_lookup(gedp->ged_wdbp->dbip, n1, LOOKUP_NOISY);
+           dp2 = db_lookup(gedp->ged_wdbp->dbip, n2, LOOKUP_NOISY);
+           of = _analyze_find_processor(gc, DB_OP_SUBTRACT, dp1->d_minor_type, 
dp2->d_minor_type);
+           if (!of) {
+               bu_vls_sprintf(gedp->ged_result_str, "Unsupported type 
pairing\n");
+               clear_obj(gc->gedp, tmpname);
+               clear_obj(gc->gedp, tmpname2);
+               bu_vls_free(&oname);
+               return GED_ERROR;
+           }
+           ret = (*of)(tmpname2, gc->gedp,  DB_OP_SUBTRACT, n1, n2);
+           mv_obj(gc->gedp, tmpname2, tmpname);
+           if (ret == -1) {
+               clear_obj(gc->gedp, tmpname);
+               clear_obj(gc->gedp, tmpname2);
+               bu_vls_free(&oname);
+               return GED_ERROR;
+           }
+       }
+    }
+
+    if (bu_vls_strlen(&oname)) {
+       mv_obj(gc->gedp, tmpname, bu_vls_cstr(&oname));
+    }
+
+    clear_obj(gc->gedp, tmpname);
+
+    bu_vls_sprintf(gedp->ged_result_str, "%ld\n", ret);
+    bu_vls_free(&oname);
+
+    return GED_OK;
+}
+
 extern "C" int
 _analyze_cmd_help(void *bs, int argc, const char **argv)
 {
@@ -522,8 +629,9 @@
 
 
 const struct bu_cmdtab _analyze_cmds[] = {
-      { "summarize",            _analyze_cmd_summarize},
-      { "intersect",            _analyze_cmd_intersect},
+      { "summarize",           _analyze_cmd_summarize},
+      { "intersect",           _analyze_cmd_intersect},
+      { "subtract",            _analyze_cmd_subtract},
       { (char *)NULL,      NULL}
   };
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to