Revision: 34059
          http://brlcad.svn.sourceforge.net/brlcad/?rev=34059&view=rev
Author:   bob1961
Date:     2009-03-19 20:06:35 +0000 (Thu, 19 Mar 2009)

Log Message:
-----------
Added ged_inside_internal() to libged and modified ged_inside() to call it. 
Mged also calls this when getting the inside of something being edited.

Modified Paths:
--------------
    brlcad/trunk/include/ged.h
    brlcad/trunk/src/libged/inside.c
    brlcad/trunk/src/mged/cmd.c
    brlcad/trunk/src/mged/cmd.h
    brlcad/trunk/src/mged/setup.c

Modified: brlcad/trunk/include/ged.h
===================================================================
--- brlcad/trunk/include/ged.h  2009-03-19 20:00:16 UTC (rev 34058)
+++ brlcad/trunk/include/ged.h  2009-03-19 20:06:35 UTC (rev 34059)
@@ -161,7 +161,7 @@
 /** add a new directory entry to the currently open database */
 #define GED_DB_DIRADD(_gedp, _dp, _name, _laddr, _len, _flags, _ptr, _ret) \
     if (((_dp) = db_diradd((_gedp)->ged_wdbp->dbip, (_name), (_laddr), (_len), 
(_flags), (_ptr))) == DIR_NULL) { \
-       bu_vls_printf(&(_gedp)->ged_result_str, "An error has occured while 
adding a new object to the database."); \
+       bu_vls_printf(&(_gedp)->ged_result_str, "An error has occurred while 
adding a new object to the database."); \
        return (_ret); \
     }
 
@@ -462,6 +462,15 @@
 GED_EXPORT BU_EXTERN(void ged_view_init,
                     (struct ged_view *gvp));
 
+/* defined in inside.c */
+GED_EXPORT BU_EXTERN(int ged_inside_internal,
+                    (struct ged *gedp,
+                     struct rt_db_internal *ip,
+                     int argc,
+                     char *argv[],
+                     int arg,
+                     char *o_name));
+
 /* defined in rt.c */
 GED_EXPORT BU_EXTERN(int ged_build_tops,
                     (struct ged        *gedp,

Modified: brlcad/trunk/src/libged/inside.c
===================================================================
--- brlcad/trunk/src/libged/inside.c    2009-03-19 20:00:16 UTC (rev 34058)
+++ brlcad/trunk/src/libged/inside.c    2009-03-19 20:06:35 UTC (rev 34059)
@@ -906,52 +906,26 @@
 }
 
 int
-ged_inside(struct ged *gedp, int argc, const char *argv[])
+ged_inside_internal(struct ged *gedp, struct rt_db_internal *ip, int argc, 
char *argv[], int arg, char *o_name)
 {
     register int i;
     struct directory   *dp;
-    struct directory   *outdp;
     int        cgtype;         /* cgtype ARB 4..8 */
     int        nface;
     fastf_t    thick[6];
     plane_t    planes[6];
-    struct rt_db_internal      intern;
     char       *newname;
-    int arg = 1;
-    static const char *usage = "out_prim in_prim th(s)";
-    void (*cur_sigint)();
 
-    GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR);
-    GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR);
-    GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR);
-
     /* initialize result */
     bu_vls_trunc(&gedp->ged_result_str, 0);
 
-    RT_INIT_DB_INTERNAL(&intern);
-
-    if ( argc < arg+1 ) {
-       bu_vls_printf(&gedp->ged_result_str, "Enter name of outside solid: ");
-       return BRLCAD_MORE_ARGS;
-    }
-    if ( (outdp = db_lookup( gedp->ged_wdbp->dbip,  argv[arg], LOOKUP_QUIET )) 
== DIR_NULL ) {
-       bu_vls_printf(&gedp->ged_result_str, "%s: %s not found", argv[0], 
argv[arg]);
-       return BRLCAD_ERROR;
-    }
-    ++arg;
-
-    if ( rt_db_get_internal( &intern, outdp, gedp->ged_wdbp->dbip, 
bn_mat_identity, &rt_uniresource ) < 0 ) {
-       bu_vls_printf(&gedp->ged_result_str, "Database read error, aborting");
-       return BRLCAD_ERROR;
-    }
-
-    if ( intern.idb_type == ID_ARB8 )  {
+    if (ip->idb_type == ID_ARB8) {
        /* find the comgeom arb type, & reorganize */
        int uvec[8], svec[11];
        struct bu_vls error_msg;
 
-       if ( rt_arb_get_cgtype( &cgtype, intern.idb_ptr, 
&gedp->ged_wdbp->wdb_tol, uvec, svec ) == 0 ) {
-           bu_vls_printf(&gedp->ged_result_str, "%s: BAD ARB\n", 
outdp->d_namep);
+       if (rt_arb_get_cgtype(&cgtype, ip->idb_ptr, &gedp->ged_wdbp->wdb_tol, 
uvec, svec) == 0) {
+           bu_vls_printf(&gedp->ged_result_str, "%s: BAD ARB\n", o_name);
            return BRLCAD_ERROR;
        }
 
@@ -959,25 +933,26 @@
         * any editing in the es_mat matrix or path to this solid.
         */
        bu_vls_init(&error_msg);
-       if (rt_arb_calc_planes(&error_msg, intern.idb_ptr, cgtype, planes, 
&gedp->ged_wdbp->wdb_tol) < 0)  {
-           bu_vls_printf(&gedp->ged_result_str, "%s\nrt_arb_calc_planes(%s): 
failed\n", bu_vls_addr(&error_msg), outdp->d_namep);
+       if (rt_arb_calc_planes(&error_msg, ip->idb_ptr, cgtype, planes, 
&gedp->ged_wdbp->wdb_tol) < 0)  {
+           bu_vls_printf(&gedp->ged_result_str, "%s\nrt_arb_calc_planes(%s): 
failed\n", bu_vls_addr(&error_msg), o_name);
            bu_vls_free(&error_msg);
            return BRLCAD_ERROR;
        }
        bu_vls_free(&error_msg);
     }
-    /* "intern" is now loaded with the outside solid data */
 
+    /* "ip" is loaded with the outside solid data */
+
     /* get the inside solid name */
-    if ( argc < arg+1 ) {
+    if (argc < arg+1) {
        bu_vls_printf(&gedp->ged_result_str, "Enter name of the inside solid: 
");
        return BRLCAD_MORE_ARGS;
     }
-    if ( db_lookup( gedp->ged_wdbp->dbip, argv[arg], LOOKUP_QUIET ) != 
DIR_NULL ) {
+    if (db_lookup( gedp->ged_wdbp->dbip, argv[arg], LOOKUP_QUIET ) != 
DIR_NULL) {
        bu_vls_printf(&gedp->ged_result_str, "%s: %s already exists.\n", 
argv[0], argv[arg]);
        return BRLCAD_ERROR;
     }
-    if ( gedp->ged_wdbp->dbip->dbi_version < 5 && (int)strlen(argv[arg]) > 
NAMESIZE )  {
+    if (gedp->ged_wdbp->dbip->dbi_version < 5 && (int)strlen(argv[arg]) > 
NAMESIZE)  {
        bu_vls_printf(&gedp->ged_result_str, "Database version 4 names are 
limited to %d characters\n", NAMESIZE);
        return BRLCAD_ERROR;
     }
@@ -985,17 +960,17 @@
     ++arg;
 
     /* get thicknesses and calculate parameters for newrec */
-    switch ( intern.idb_type )  {
+    switch (ip->idb_type)  {
 
        case ID_ARB8:
        {
            char **prompt;
            struct rt_arb_internal *arb =
-               (struct rt_arb_internal *)intern.idb_ptr;
+               (struct rt_arb_internal *)ip->idb_ptr;
 
            nface = 6;
 
-           switch ( cgtype ) {
+           switch (cgtype) {
                case 8:
                    prompt = p_arb8;
                    break;
@@ -1023,7 +998,7 @@
            }
 
            for (i=0; i<nface; i++) {
-               if ( argc < arg+1 ) {
+               if (argc < arg+1) {
                    bu_vls_printf(&gedp->ged_result_str, "%s", prompt[i]);
                    return BRLCAD_MORE_ARGS;
                }
@@ -1031,88 +1006,88 @@
                ++arg;
            }
 
-           if (arbin(gedp, &intern, thick, nface, cgtype, planes))
+           if (arbin(gedp, ip, thick, nface, cgtype, planes))
                return BRLCAD_ERROR;
            break;
        }
 
        case ID_TGC:
            for (i=0; i<3; i++) {
-               if ( argc < arg+1 ) {
+               if (argc < arg+1) {
                    bu_vls_printf(&gedp->ged_result_str, "%s", p_tgcin[i]);
                    return BRLCAD_MORE_ARGS;
                }
-               thick[i] = atof( argv[arg] ) * 
gedp->ged_wdbp->dbip->dbi_local2base;
+               thick[i] = atof(argv[arg]) * 
gedp->ged_wdbp->dbip->dbi_local2base;
                ++arg;
            }
 
-           if (tgcin(gedp, &intern, thick))
+           if (tgcin(gedp, ip, thick))
                return BRLCAD_ERROR;
            break;
 
        case ID_ELL:
-           if ( argc < arg+1 ) {
+           if (argc < arg+1) {
                bu_vls_printf(&gedp->ged_result_str, "Enter desired thickness: 
");
                return BRLCAD_MORE_ARGS;
            }
-           thick[0] = atof( argv[arg] ) * gedp->ged_wdbp->dbip->dbi_local2base;
+           thick[0] = atof(argv[arg]) * gedp->ged_wdbp->dbip->dbi_local2base;
            ++arg;
 
-           if (ellgin(gedp, &intern, thick))
+           if (ellgin(gedp, ip, thick))
                return BRLCAD_ERROR;
            break;
 
        case ID_TOR:
-           if ( argc < arg+1 ) {
+           if (argc < arg+1) {
                bu_vls_printf(&gedp->ged_result_str, "Enter desired thickness: 
");
                return BRLCAD_MORE_ARGS;
            }
-           thick[0] = atof( argv[arg] ) * gedp->ged_wdbp->dbip->dbi_local2base;
+           thick[0] = atof(argv[arg]) * gedp->ged_wdbp->dbip->dbi_local2base;
            ++arg;
 
-           if (torin(gedp, &intern, thick))
+           if (torin(gedp, ip, thick))
                return BRLCAD_ERROR;
            break;
 
        case ID_PARTICLE:
            for (i = 0; i < 1; i++) {
-               if ( argc < arg+1 ) {
+               if (argc < arg+1) {
                    bu_vls_printf(&gedp->ged_result_str, "%s", p_partin[i]);
                    return BRLCAD_MORE_ARGS;
                }
-               thick[i] = atof( argv[arg] ) * 
gedp->ged_wdbp->dbip->dbi_local2base;
+               thick[i] = atof(argv[arg]) * 
gedp->ged_wdbp->dbip->dbi_local2base;
                ++arg;
            }
 
-           if (partin(gedp, &intern, thick))
+           if (partin(gedp, ip, thick))
                return BRLCAD_ERROR;
            break;
 
        case ID_RPC:
            for (i = 0; i < 4; i++) {
-               if ( argc < arg+1 ) {
+               if (argc < arg+1) {
                    bu_vls_printf(&gedp->ged_result_str, "%s", p_rpcin[i]);
                    return BRLCAD_MORE_ARGS;
                }
-               thick[i] = atof( argv[arg] ) * 
gedp->ged_wdbp->dbip->dbi_local2base;
+               thick[i] = atof(argv[arg]) * 
gedp->ged_wdbp->dbip->dbi_local2base;
                ++arg;
            }
 
-           if (rpcin(gedp, &intern, thick))
+           if (rpcin(gedp, ip, thick))
                return BRLCAD_ERROR;
            break;
 
        case ID_RHC:
            for (i = 0; i < 4; i++) {
-               if ( argc < arg+1 ) {
+               if (argc < arg+1) {
                    bu_vls_printf(&gedp->ged_result_str, "%s", p_rhcin[i]);
                    return BRLCAD_MORE_ARGS;
                }
-               thick[i] = atof( argv[arg] ) * 
gedp->ged_wdbp->dbip->dbi_local2base;
+               thick[i] = atof(argv[arg]) * 
gedp->ged_wdbp->dbip->dbi_local2base;
                ++arg;
            }
 
-           if (rhcin(gedp, &intern, thick))
+           if (rhcin(gedp, ip, thick))
                return BRLCAD_ERROR;
            break;
 
@@ -1122,11 +1097,11 @@
                    bu_vls_printf(&gedp->ged_result_str, "%s", p_epain[i]);
                    return BRLCAD_MORE_ARGS;
                }
-               thick[i] = atof( argv[arg] ) * 
gedp->ged_wdbp->dbip->dbi_local2base;
+               thick[i] = atof(argv[arg]) * 
gedp->ged_wdbp->dbip->dbi_local2base;
                ++arg;
            }
 
-           if (epain(gedp, &intern, thick))
+           if (epain(gedp, ip, thick))
                return BRLCAD_ERROR;
            break;
 
@@ -1136,11 +1111,11 @@
                    bu_vls_printf(&gedp->ged_result_str, "%s", p_ehyin[i]);
                    return BRLCAD_MORE_ARGS;
                }
-               thick[i] = atof( argv[arg] ) * 
gedp->ged_wdbp->dbip->dbi_local2base;
+               thick[i] = atof(argv[arg]) * 
gedp->ged_wdbp->dbip->dbi_local2base;
                ++arg;
            }
 
-           if (ehyin(gedp, &intern, thick))
+           if (ehyin(gedp, ip, thick))
                return BRLCAD_ERROR;
            break;
 
@@ -1150,36 +1125,36 @@
                    bu_vls_printf(&gedp->ged_result_str, "%s", p_etoin[i]);
                    return BRLCAD_MORE_ARGS;
                }
-               thick[i] = atof( argv[arg] ) * 
gedp->ged_wdbp->dbip->dbi_local2base;
+               thick[i] = atof(argv[arg]) * 
gedp->ged_wdbp->dbip->dbi_local2base;
                ++arg;
            }
 
-           if (etoin(gedp, &intern, thick))
+           if (etoin(gedp, ip, thick))
                return BRLCAD_ERROR;
            break;
 
        case ID_NMG:
-           if ( argc < arg+1 ) {
+           if (argc < arg+1) {
                bu_vls_printf(&gedp->ged_result_str, "%s", p_nmgin);
                return BRLCAD_MORE_ARGS;
            }
-           thick[0] = atof( argv[arg] ) * gedp->ged_wdbp->dbip->dbi_local2base;
+           thick[0] = atof(argv[arg]) * gedp->ged_wdbp->dbip->dbi_local2base;
            ++arg;
-           if (nmgin(gedp,  &intern, thick[0]))
+           if (nmgin(gedp,  ip, thick[0]))
                return BRLCAD_ERROR;
            break;
 
        default:
-           bu_vls_printf(&gedp->ged_result_str, "Cannot find inside for '%s' 
solid\n", rt_functab[intern.idb_type].ft_name);
+           bu_vls_printf(&gedp->ged_result_str, "Cannot find inside for '%s' 
solid\n", rt_functab[ip->idb_type].ft_name);
            return BRLCAD_ERROR;
     }
 
     /* Add to in-core directory */
-    if ( (dp = db_diradd( gedp->ged_wdbp->dbip,  newname, -1, 0, DIR_SOLID, 
(genptr_t)&intern.idb_type )) == DIR_NULL )  {
+    if ((dp = db_diradd(gedp->ged_wdbp->dbip, newname, -1, 0, DIR_SOLID, 
(genptr_t)&ip->idb_type)) == DIR_NULL) {
        bu_vls_printf(&gedp->ged_result_str, "%s: Database alloc error, 
aborting\n", argv[0]);
        return BRLCAD_ERROR;
     }
-    if ( rt_db_put_internal( dp, gedp->ged_wdbp->dbip, &intern, 
&rt_uniresource ) < 0 ) {
+    if (rt_db_put_internal(dp, gedp->ged_wdbp->dbip, ip, &rt_uniresource) < 0) 
{
        bu_vls_printf(&gedp->ged_result_str, "%s: Database write error, 
aborting\n", argv[0]);
        return BRLCAD_ERROR;
     }
@@ -1187,8 +1162,43 @@
     return BRLCAD_OK;
 }
 
+int
+ged_inside(struct ged *gedp, int argc, const char *argv[])
+{
+    struct directory   *outdp;
+    struct rt_db_internal intern;
+    int arg = 1;
+    static const char *usage = "out_prim in_prim th(s)";
 
+    GED_CHECK_DATABASE_OPEN(gedp, BRLCAD_ERROR);
+    GED_CHECK_READ_ONLY(gedp, BRLCAD_ERROR);
+    GED_CHECK_ARGC_GT_0(gedp, argc, BRLCAD_ERROR);
 
+    /* initialize result */
+    bu_vls_trunc(&gedp->ged_result_str, 0);
+
+    RT_INIT_DB_INTERNAL(&intern);
+
+    if (argc < arg+1) {
+       bu_vls_printf(&gedp->ged_result_str, "Enter name of outside solid: ");
+       return BRLCAD_MORE_ARGS;
+    }
+    if ((outdp = db_lookup(gedp->ged_wdbp->dbip,  argv[arg], LOOKUP_QUIET)) == 
DIR_NULL) {
+       bu_vls_printf(&gedp->ged_result_str, "%s: %s not found", argv[0], 
argv[arg]);
+       return BRLCAD_ERROR;
+    }
+    ++arg;
+
+    if (rt_db_get_internal(&intern, outdp, gedp->ged_wdbp->dbip, 
bn_mat_identity, &rt_uniresource) < 0) {
+       bu_vls_printf(&gedp->ged_result_str, "Database read error, aborting");
+       return BRLCAD_ERROR;
+    }
+
+    return ged_inside_internal(gedp, &intern, argc, argv, arg, outdp->d_namep);
+}
+
+
+
 /*
  * Local Variables:
  * tab-width: 8

Modified: brlcad/trunk/src/mged/cmd.c
===================================================================
--- brlcad/trunk/src/mged/cmd.c 2009-03-19 20:00:16 UTC (rev 34058)
+++ brlcad/trunk/src/mged/cmd.c 2009-03-19 20:06:35 UTC (rev 34059)
@@ -359,7 +359,101 @@
     return TCL_OK;
 }
 
+
+extern struct rt_db_internal es_int;
+
 int
+cmd_ged_inside(ClientData clientData, Tcl_Interp *interp, int argc, const char 
*argv[])
+{
+    register struct directory *dp;
+    int ret;
+    int arg;
+    Tcl_DString ds;
+    const char *new_cmd[3];
+    struct rt_db_internal intern;
+    struct directory *outdp;
+
+    if (gedp == GED_NULL)
+       return TCL_OK;
+
+    if (setjmp(jmp_env) == 0)
+       (void)signal(SIGINT, sig3);  /* allow interrupts */
+    else
+       return TCL_OK;
+
+    RT_INIT_DB_INTERNAL(&intern);
+
+    if (state == ST_S_EDIT) {
+       /* solid edit mode */
+       /* apply es_mat editing to parameters */
+       transform_editing_solid(&intern, es_mat, &es_int, 0);
+       outdp = LAST_SOLID(illump);
+
+       if (argc < 2) {
+           Tcl_AppendResult(interp, "You are in Primitive Edit mode, using 
edited primitive as outside primitive: ", (char *)NULL);
+           add_solid_path_to_result(interp, illump);
+           Tcl_AppendResult(interp, "\n", (char *)NULL);
+       }
+
+       arg = 1;
+       ret = ged_inside_internal(gedp, &intern, argc, argv, arg, 
outdp->d_namep);
+    }  else if (state == ST_O_EDIT) {
+       mat_t newmat;
+
+       /* object edit mode */
+       if (illump->s_Eflag) {
+           Tcl_AppendResult(interp, "Cannot find inside of a processed (E'd) 
region\n",
+                            (char *)NULL);
+           (void)signal(SIGINT, SIG_IGN);
+           return TCL_ERROR;
+       }
+       /* use the solid at bottom of path (key solid) */
+       /* apply es_mat and modelchanges editing to parameters */
+       bn_mat_mul(newmat, modelchanges, es_mat);
+       transform_editing_solid(&intern, newmat, &es_int, 0);
+       outdp = LAST_SOLID(illump);
+
+       if (argc < 2) {
+           Tcl_AppendResult(interp, "You are in Object Edit mode, using key 
solid as outside solid: ", (char *)NULL);
+           add_solid_path_to_result(interp, illump);
+           Tcl_AppendResult(interp, "\n", (char *)NULL);
+       }
+
+       arg = 1;
+       ret = ged_inside_internal(gedp, &intern, argc, argv, arg, 
outdp->d_namep);
+    } else {
+       arg = 2;
+       ret = ged_inside(gedp, argc, (const char **)argv);
+    }
+
+    Tcl_DStringInit(&ds);
+    if (ret == BRLCAD_MORE_ARGS)
+       Tcl_DStringAppend(&ds, MORE_ARGS_STR, -1);
+    Tcl_DStringAppend(&ds, bu_vls_addr(&gedp->ged_result_str), -1);
+    Tcl_DStringResult(interp, &ds);
+
+    if (ret == BRLCAD_HELP) {
+       (void)signal(SIGINT, SIG_IGN);
+       return TCL_OK;
+    }
+
+    if (ret != BRLCAD_OK) {
+       (void)signal(SIGINT, SIG_IGN);
+       return TCL_ERROR;
+    }
+
+    /* draw the "inside" solid */
+    new_cmd[0] = "draw";
+    new_cmd[1] = argv[arg];
+    new_cmd[2] = (char *)NULL;
+    (void)cmd_draw(clientData, interp, 2, new_cmd);
+
+    (void)signal(SIGINT, SIG_IGN);
+
+    return TCL_OK;
+}
+
+int
 cmd_ged_more_wrapper(ClientData clientData, Tcl_Interp *interp, int argc, 
const char *argv[])
 {
     int ret;

Modified: brlcad/trunk/src/mged/cmd.h
===================================================================
--- brlcad/trunk/src/mged/cmd.h 2009-03-19 20:00:16 UTC (rev 34058)
+++ brlcad/trunk/src/mged/cmd.h 2009-03-19 20:06:35 UTC (rev 34059)
@@ -44,6 +44,7 @@
 BU_EXTERN(int cmd_ged_erase_wrapper, (ClientData clientData, Tcl_Interp 
*interp, int argc, const char *argv[]));
 BU_EXTERN(int cmd_ged_gqa, (ClientData clientData, Tcl_Interp *interp, int 
argc, const char *argv[]));
 BU_EXTERN(int cmd_ged_in, (ClientData clientData, Tcl_Interp *interp, int 
argc, const char *argv[]));
+BU_EXTERN(int cmd_ged_inside, (ClientData clientData, Tcl_Interp *interp, int 
argc, const char *argv[]));
 BU_EXTERN(int cmd_ged_more_wrapper, (ClientData clientData, Tcl_Interp 
*interp, int argc, const char *argv[]));
 BU_EXTERN(int cmd_ged_plain_wrapper, (ClientData clientData, Tcl_Interp 
*interp, int argc, const char *argv[]));
 BU_EXTERN(int cmd_ged_view_wrapper, (ClientData clientData, Tcl_Interp 
*interp, int argc, const char *argv[]));

Modified: brlcad/trunk/src/mged/setup.c
===================================================================
--- brlcad/trunk/src/mged/setup.c       2009-03-19 20:00:16 UTC (rev 34058)
+++ brlcad/trunk/src/mged/setup.c       2009-03-19 20:06:35 UTC (rev 34059)
@@ -165,7 +165,7 @@
     {"idents", cmd_ged_plain_wrapper, ged_tables},
     {"ill", f_ill, GED_FUNC_PTR_NULL},
     {"in", cmd_ged_in, ged_in},
-    {"inside", cmd_ged_more_wrapper, ged_inside},
+    {"inside", cmd_ged_inside, ged_inside},
     {"item", cmd_ged_plain_wrapper, ged_item},
     {"joint", f_joint, GED_FUNC_PTR_NULL},
     {"journal", f_journal, GED_FUNC_PTR_NULL},


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

------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to