Revision: 41497
          http://brlcad.svn.sourceforge.net/brlcad/?rev=41497&view=rev
Author:   bob1961
Date:     2010-12-03 18:22:32 +0000 (Fri, 03 Dec 2010)

Log Message:
-----------
Added a -a option to showmats for getting only the Accumulated matrix of the 
specified path.

Modified Paths:
--------------
    brlcad/trunk/src/libged/showmats.c

Modified: brlcad/trunk/src/libged/showmats.c
===================================================================
--- brlcad/trunk/src/libged/showmats.c  2010-12-02 23:00:43 UTC (rev 41496)
+++ brlcad/trunk/src/libged/showmats.c  2010-12-03 18:22:32 UTC (rev 41497)
@@ -40,43 +40,58 @@
     mat_t      smd_mat;
 };
 
-static void Do_showmats(struct db_i            *dbip,
-                       struct rt_comb_internal *comb,
-                       union tree              *comb_leaf,
-                       genptr_t                user_ptr1,
-                       genptr_t                user_ptr2,
-                       genptr_t                user_ptr3);
-
-int
-ged_showmats(struct ged *gedp, int argc, const char *argv[])
+static void
+Do_showmats(struct db_i                        *dbip,
+           struct rt_comb_internal     *comb,
+           union tree                  *comb_leaf,
+           genptr_t                    user_ptr1,
+           genptr_t                    user_ptr2,
+           genptr_t                    user_ptr3)
 {
-    struct showmats_data sm_data;
-    char *parent;
-    struct directory *dp;
-    int max_count=1;
-    static const char *usage = "path";
+    struct showmats_data *smdp;
+    int aflag;
+    char obuf[1024];
 
-    GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
-    GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR);
+    RT_CK_DBI(dbip);
+    RT_CK_TREE(comb_leaf);
 
-    /* initialize result */
-    bu_vls_trunc(&gedp->ged_result_str, 0);
+    smdp = (struct showmats_data *)user_ptr1;
+    aflag = *((int *)user_ptr2);
 
-    /* must be wanting help */
-    if (argc == 1) {
-       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
-       return GED_HELP;
+    if (strcmp(comb_leaf->tr_l.tl_name, smdp->smd_child))
+       return;
+
+    smdp->smd_count++;
+    if (!aflag) {
+       if (smdp->smd_count > 1) {
+           bu_vls_printf(&smdp->smd_gedp->ged_result_str, "\n\tOccurrence 
#%d:\n", smdp->smd_count);
+       }
+
+       bn_mat_print_guts("", comb_leaf->tr_l.tl_mat, obuf, 1024);
+       bu_vls_printf(&smdp->smd_gedp->ged_result_str, "%s", obuf);
     }
 
-    if (argc != 2) {
-       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
-       return GED_ERROR;
+    if (smdp->smd_count == 1) {
+       mat_t tmp_mat;
+       if (comb_leaf->tr_l.tl_mat) {
+           bn_mat_mul(tmp_mat, smdp->smd_mat, comb_leaf->tr_l.tl_mat);
+           MAT_COPY(smdp->smd_mat, tmp_mat);
+       }
     }
+}
 
+static int
+Run_showmats(struct ged *gedp, char *path, int aflag)
+{
+    struct showmats_data sm_data;
+    char *parent;
+    struct directory *dp;
+    int max_count=1;
+
     sm_data.smd_gedp = gedp;
     MAT_IDN(sm_data.smd_mat);
 
-    parent = strtok((char *)argv[1], "/");
+    parent = strtok((char *)path, "/");
     while ((sm_data.smd_child = strtok((char *)NULL, "/")) != NULL) {
        struct rt_db_internal   intern;
        struct rt_comb_internal *comb;
@@ -84,10 +99,12 @@
        if ((dp = db_lookup(gedp->ged_wdbp->dbip, parent, LOOKUP_NOISY)) == 
DIR_NULL)
            return TCL_ERROR;
 
-       bu_vls_printf(&gedp->ged_result_str, "%s\n", parent);
+       if (!aflag)
+           bu_vls_printf(&gedp->ged_result_str, "%s\n", parent);
 
        if (!(dp->d_flags & DIR_COMB)) {
-           bu_vls_printf(&gedp->ged_result_str, "\tThis is not a 
combination\n");
+           if (!aflag)
+               bu_vls_printf(&gedp->ged_result_str, "\tThis is not a 
combination\n");
            break;
        }
 
@@ -101,7 +118,7 @@
 
        if (comb->tree)
            db_tree_funcleaf(gedp->ged_wdbp->dbip, comb, comb->tree, 
Do_showmats,
-                            (genptr_t)&sm_data, (genptr_t)NULL, 
(genptr_t)NULL);
+                            (genptr_t)&sm_data, (genptr_t)&aflag, 
(genptr_t)NULL);
        rt_db_free_internal(&intern);
 
        if (!sm_data.smd_count) {
@@ -113,57 +130,56 @@
 
        parent = sm_data.smd_child;
     }
-    bu_vls_printf(&gedp->ged_result_str, "%s\n", parent);
 
-    if (max_count > 1)
-       bu_vls_printf(&gedp->ged_result_str, "\nAccumulated matrix (using first 
occurrence of each object):\n");
-    else
-       bu_vls_printf(&gedp->ged_result_str, "\nAccumulated matrix:\n");
-
-    {
+    if (!aflag) {
        char obuf[1024];
 
+       bu_vls_printf(&gedp->ged_result_str, "%s\n", parent);
+
+       if (max_count > 1)
+           bu_vls_printf(&gedp->ged_result_str, "\nAccumulated matrix (using 
first occurrence of each object):\n");
+       else
+           bu_vls_printf(&gedp->ged_result_str, "\nAccumulated matrix:\n");
+
        bn_mat_print_guts("", sm_data.smd_mat, obuf, 1024);
        bu_vls_printf(&gedp->ged_result_str, "%s", obuf);
+    } else {
+       int i;
+
+       for (i=0; i<16; ++i)
+           bu_vls_printf(&gedp->ged_result_str, " %lf", sm_data.smd_mat[i]);
     }
 
     return GED_OK;
 }
 
-static void
-Do_showmats(struct db_i                        *dbip,
-           struct rt_comb_internal     *comb,
-           union tree                  *comb_leaf,
-           genptr_t                    user_ptr1,
-           genptr_t                    user_ptr2,
-           genptr_t                    user_ptr3)
+int
+ged_showmats(struct ged *gedp, int argc, const char *argv[])
 {
-    struct showmats_data *smdp;
-    char obuf[1024];
+    int aflag = 0;
+    static const char *usage = "path";
 
-    RT_CK_DBI(dbip);
-    RT_CK_TREE(comb_leaf);
+    GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
+    GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR);
 
-    smdp = (struct showmats_data *)user_ptr1;
+    /* initialize result */
+    bu_vls_trunc(&gedp->ged_result_str, 0);
 
-    if (strcmp(comb_leaf->tr_l.tl_name, smdp->smd_child))
-       return;
+    /* must be wanting help */
+    if (argc == 1) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return GED_HELP;
+    }
 
-    smdp->smd_count++;
-    if (smdp->smd_count > 1) {
-       bu_vls_printf(&smdp->smd_gedp->ged_result_str, "\n\tOccurrence #%d:\n", 
smdp->smd_count);
+    if (argc == 3 && argv[1][0] == '-' && argv[1][1] == 'a' && argv[1][2] == 
'\0') {
+       aflag = 1;
+       ++argv;
+    } else if (argc != 2) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return GED_ERROR;
     }
 
-    bn_mat_print_guts("", comb_leaf->tr_l.tl_mat, obuf, 1024);
-    bu_vls_printf(&smdp->smd_gedp->ged_result_str, "%s", obuf);
-
-    if (smdp->smd_count == 1) {
-       mat_t tmp_mat;
-       if (comb_leaf->tr_l.tl_mat) {
-           bn_mat_mul(tmp_mat, smdp->smd_mat, comb_leaf->tr_l.tl_mat);
-           MAT_COPY(smdp->smd_mat, tmp_mat);
-       }
-    }
+    return Run_showmats(gedp, argv[1], aflag);
 }
 
 


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

------------------------------------------------------------------------------
Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to