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