/** * copy an object, recursively copying all of the object's contents * if it's a combination/region. */ static struct directory * copy_object(struct db_i *_dbip, struct resource *resp, struct clone_state *state) { struct directory *copy = (struct directory *)NULL; size_t i, j, idx; init_list(&obj_list, state->n_copies); /* do the actual copying */ copy = copy_tree(_dbip, state->src, resp, state); /* make sure it made what we hope/think it made */ if (!copy || !is_in_list(obj_list, state->src->d_namep)) return copy; /* display the cloned object(s) */ if (state->draw_obj) { const char *av[3] = {"e", NULL, NULL}; idx = index_in_list(obj_list, state->src->d_namep); for (i = 0; i < (state->n_copies > obj_list.name_size ? obj_list.name_size : state->n_copies); i++) { av[1] = bu_vls_addr(&obj_list.names[idx].dest[i]); /* draw does not use clientdata */ cmd_draw((ClientData)NULL, state->interp, 2, av); } if (state->autoview) { av[0] = "autoview"; cmd_autoview((ClientData)NULL, state->interp, 1, av); } } /* release our name allocations */ for (i = 0; i < obj_list.names_len; i++) { for (j = 0; j < obj_list.name_size; j++) bu_vls_free(&obj_list.names[i].dest[j]); bu_free((char **)obj_list.names[i].dest, "free dest"); } bu_free((struct name *)obj_list.names, "free names"); /* better safe than sorry */ obj_list.names = NULL; obj_list.name_size = obj_list.names_used = obj_list.names_len = 0; return copy; }
void command_parse(const u08 *cmd, u08 len) { u08 result = 0; switch(cmd[0]) { case 'c': result = cmd_color(cmd,len); break; case 'f': result = cmd_flags(cmd, len); break; case 'd': result = cmd_draw(cmd, len); break; case 'g': result = cmd_goto(cmd, len); break; case 'e': result = cmd_erase(cmd, len); break; case 's': /* do nothing - only return status */ result = CMD_OK; break; case 'q': result = cmd_query(cmd, len); break; case 'i': result = cmd_input(cmd, len); break; case 'p': result = cmd_picture(cmd, len); break; case 'y': result = cmd_display(cmd, len); break; default: result = CMD_UNKNOWN_ERR; break; } // report status back if(result != CMD_NO_REPLY) { cmd_status(result); } }
/* * * F _ A M T R A C K ( ) : adds track given "wheel" info * */ int f_amtrack(ClientData clientData, Tcl_Interp *interp, int argc, char **argv) { fastf_t fw[3], lw[3], iw[3], dw[3], tr[3]; char solname[12], regname[12], grpname[9], oper[3]; int i, j, memb[4]; char temp[4]; vect_t temp1, temp2; int item, mat, los; int arg; int edit_result; struct bu_list head; CHECK_DBI_NULL; CHECK_READ_ONLY; BU_LIST_INIT(&head); if (argc < 1 || 27 < argc) { struct bu_vls vls; bu_vls_init(&vls); bu_vls_printf(&vls, "help track"); Tcl_Eval(interp, bu_vls_addr(&vls)); bu_vls_free(&vls); return TCL_ERROR; } /* interupts */ if ( setjmp( jmp_env ) == 0 ) (void)signal( SIGINT, sig3); /* allow interupts */ else return TCL_OK; oper[0] = oper[2] = WMOP_INTERSECT; oper[1] = WMOP_SUBTRACT; arg = 1; /* get the roadwheel info */ if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter X of the FIRST roadwheel: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } fw[0] = atof( argv[arg] ) * local2base; ++arg; if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter X of the LAST roadwheel: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } lw[0] = atof( argv[arg] ) * local2base; ++arg; if ( fw[0] <= lw[0] ) { Tcl_AppendResult(interp, "First wheel after last wheel - STOP\n", (char *)NULL); edit_result = TCL_ERROR; goto end; } if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter Z of the roadwheels: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } fw[1] = lw[1] = atof( argv[arg] ) * local2base; ++arg; if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter radius of the roadwheels: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } fw[2] = lw[2] = atof( argv[arg] ) * local2base; ++arg; if ( fw[2] <= 0 ) { Tcl_AppendResult(interp, "Radius <= 0 - STOP\n", (char *)NULL); edit_result = TCL_ERROR; goto end; } if ( argc < arg+1 ) { /* get the drive wheel info */ Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter X of the drive (REAR) wheel: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } dw[0] = atof( argv[arg] ) * local2base; ++arg; if ( dw[0] >= lw[0] ) { Tcl_AppendResult(interp, "DRIVE wheel not in the rear - STOP \n", (char *)NULL); edit_result = TCL_ERROR; goto end; } if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter Z of the drive (REAR) wheel: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } dw[1] = atof( argv[arg] ) * local2base; ++arg; if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter radius of the drive (REAR) wheel: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } dw[2] = atof( argv[arg] ) * local2base; ++arg; if ( dw[2] <= 0 ) { Tcl_AppendResult(interp, "Radius <= 0 - STOP\n", (char *)NULL); edit_result = TCL_ERROR; goto end; } /* get the idler wheel info */ if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter X of the idler (FRONT) wheel: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } iw[0] = atof( argv[arg] ) * local2base; ++arg; if ( iw[0] <= fw[0] ) { Tcl_AppendResult(interp, "IDLER wheel not in the front - STOP \n", (char *)NULL); edit_result = TCL_ERROR; goto end; } if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter Z of the idler (FRONT) wheel: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } iw[1] = atof( argv[arg] ) * local2base; ++arg; if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter radius of the idler (FRONT) wheel: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } iw[2] = atof( argv[arg] ) * local2base; ++arg; if ( iw[2] <= 0 ) { Tcl_AppendResult(interp, "Radius <= 0 - STOP\n", (char *)NULL); edit_result = TCL_ERROR; goto end; } /* get track info */ if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter Y-MIN of the track: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } tr[2] = tr[0] = atof( argv[arg] ) * local2base; ++arg; if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter Y-MAX of the track: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } tr[1] = atof( argv[arg] ) * local2base; ++arg; if ( tr[0] == tr[1] ) { Tcl_AppendResult(interp, "MIN == MAX ... STOP\n", (char *)NULL); edit_result = TCL_ERROR; goto end; } if ( tr[0] > tr[1] ) { Tcl_AppendResult(interp, "MIN > MAX .... will switch\n", (char *)NULL); tr[1] = tr[0]; tr[0] = tr[2]; } if ( argc < arg+1 ) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter track thickness: ", (char *)NULL); edit_result = TCL_ERROR; goto end; } tr[2] = atof( argv[arg] ) * local2base; ++arg; if ( tr[2] <= 0 ) { Tcl_AppendResult(interp, "Track thickness <= 0 - STOP\n", (char *)NULL); edit_result = TCL_ERROR; goto end; } solname[0] = regname[0] = grpname[0] = 't'; solname[1] = regname[1] = grpname[1] = 'r'; solname[2] = regname[2] = grpname[2] = 'a'; solname[3] = regname[3] = grpname[3] = 'c'; solname[4] = regname[4] = grpname[4] = 'k'; solname[5] = regname[5] = '.'; solname[6] = 's'; regname[6] = 'r'; solname[7] = regname[7] = '.'; grpname[5] = solname[8] = regname[8] = '\0'; grpname[8] = solname[11] = regname[11] = '\0'; /* bu_log("\nX of first road wheel %10.4f\n", fw[0]); bu_log("X of last road wheel %10.4f\n", lw[0]); bu_log("Z of road wheels %10.4f\n", fw[1]); bu_log("radius of road wheels %10.4f\n", fw[2]); bu_log("\nX of drive wheel %10.4f\n", dw[0]); bu_log("Z of drive wheel %10.4f\n", dw[1]); bu_log("radius of drive wheel %10.4f\n", dw[2]); bu_log("\nX of idler wheel %10.4f\n", iw[0]); bu_log("Z of idler wheel %10.4f\n", iw[1]); bu_log("radius of idler wheel %10.4f\n", iw[2]); bu_log("\nY MIN of track %10.4f\n", tr[0]); bu_log("Y MAX of track %10.4f\n", tr[1]); bu_log("thickness of track %10.4f\n", tr[2]); */ /* Check for names to use: * 1. start with track.s.1->10 and track.r.1->10 * 2. if bad, increment count by 10 and try again */ tryagain: /* sent here to try next set of names */ for (i=0; i<11; i++) { crname(solname, i, sizeof(solname)); crname(regname, i, sizeof(regname)); if ( (db_lookup( dbip, solname, LOOKUP_QUIET) != DIR_NULL) || (db_lookup( dbip, regname, LOOKUP_QUIET) != DIR_NULL) ) { /* name already exists */ solname[8] = regname[8] = '\0'; if ( (Trackpos += 10) > 500 ) { Tcl_AppendResult(interp, "Track: naming error -- STOP\n", (char *)NULL); edit_result = TCL_ERROR; goto end; } goto tryagain; } solname[8] = regname[8] = '\0'; } /* no interupts */ (void)signal( SIGINT, SIG_IGN ); /* find the front track slope to the idler */ for (i=0; i<24; i++) sol.s_values[i] = 0.0; slope(fw, iw, tr); VMOVE(temp2, &sol.s_values[0]); crname(solname, 1, sizeof(solname)); bu_strlcpy(sol.s_name, solname, NAMESIZE+1); sol.s_type = ID_ARB8; if ( wrobj(solname, DIR_SOLID) ) return TCL_ERROR; solname[8] = '\0'; /* find track around idler */ for (i=0; i<24; i++) sol.s_values[i] = 0.0; sol.s_type = ID_TGC; trcurve(iw, tr); crname(solname, 2, sizeof(solname)); bu_strlcpy(sol.s_name, solname, NAMESIZE+1); if ( wrobj( solname, DIR_SOLID ) ) return TCL_ERROR; solname[8] = '\0'; /* idler dummy rcc */ sol.s_values[6] = iw[2]; sol.s_values[11] = iw[2]; VMOVE(&sol.s_values[12], &sol.s_values[6]); VMOVE(&sol.s_values[15], &sol.s_values[9]); crname(solname, 3, sizeof(solname)); bu_strlcpy(sol.s_name, solname, NAMESIZE+1); if ( wrobj( solname, DIR_SOLID ) ) return TCL_ERROR; solname[8] = '\0'; /* find idler track dummy arb8 */ for (i=0; i<24; i++) sol.s_values[i] = 0.0; crname(solname, 4, sizeof(solname)); bu_strlcpy(sol.s_name, solname, NAMESIZE+1); sol.s_type = ID_ARB8; crdummy(iw, tr, 1); if ( wrobj(solname, DIR_SOLID) ) return TCL_ERROR; solname[8] = '\0'; /* track slope to drive */ for (i=0; i<24; i++) sol.s_values[i] = 0.0; slope(lw, dw, tr); VMOVE(temp1, &sol.s_values[0]); crname(solname, 5, sizeof(solname)); bu_strlcpy(sol.s_name, solname, NAMESIZE+1); if (wrobj(solname, DIR_SOLID)) return TCL_ERROR; solname[8] = '\0'; /* track around drive */ for (i=0; i<24; i++) sol.s_values[i] = 0.0; sol.s_type = ID_TGC; trcurve(dw, tr); crname(solname, 6, sizeof(solname)); bu_strlcpy(sol.s_name, solname, NAMESIZE+1); if ( wrobj(solname, DIR_SOLID) ) return TCL_ERROR; solname[8] = '\0'; /* drive dummy rcc */ sol.s_values[6] = dw[2]; sol.s_values[11] = dw[2]; VMOVE(&sol.s_values[12], &sol.s_values[6]); VMOVE(&sol.s_values[15], &sol.s_values[9]); crname(solname, 7, sizeof(solname)); bu_strlcpy(sol.s_name, solname, NAMESIZE+1); if ( wrobj(solname, DIR_SOLID) ) return TCL_ERROR; solname[8] = '\0'; /* drive dummy arb8 */ for (i=0; i<24; i++) sol.s_name[i] = 0.0; crname(solname, 8, sizeof(solname)); bu_strlcpy(sol.s_name, solname, NAMESIZE+1); sol.s_type = ID_ARB8; crdummy(dw, tr, 2); if ( wrobj(solname, DIR_SOLID) ) return TCL_ERROR; solname[8] = '\0'; /* track bottom */ temp1[1] = temp2[1] = tr[0]; bottom(temp1, temp2, tr); crname(solname, 9, sizeof(solname)); bu_strlcpy(sol.s_name, solname, NAMESIZE+1); if ( wrobj(solname, DIR_SOLID) ) return TCL_ERROR; solname[8] = '\0'; /* track top */ temp1[0] = dw[0]; temp1[1] = temp2[1] = tr[0]; temp1[2] = dw[1] + dw[2]; temp2[0] = iw[0]; temp2[2] = iw[1] + iw[2]; top(temp1, temp2, tr); crname(solname, 10, sizeof(solname)); bu_strlcpy(sol.s_name, solname, NAMESIZE+1); if ( wrobj(solname, DIR_SOLID) ) return TCL_ERROR; solname[8] = '\0'; /* add the regions */ item = item_default; mat = mat_default; los = los_default; item_default = 500; mat_default = 1; los_default = 50; /* region 1 */ memb[0] = 1; memb[1] = 4; crname(regname, 1, sizeof(regname)); crregion(regname, oper, memb, 2, solname, sizeof(regname)); solname[8] = regname[8] = '\0'; /* region 2 */ crname(regname, 2, sizeof(regname)); memb[0] = 2; memb[1] = 3; memb[2] = 4; crregion(regname, oper, memb, 3, solname, sizeof(regname)); solname[8] = regname[8] = '\0'; /* region 5 */ crname(regname, 5, sizeof(regname)); memb[0] = 5; memb[1] = 8; crregion(regname, oper, memb, 2, solname, sizeof(regname)); solname[8] = regname[8] = '\0'; /* region 6 */ crname(regname, 6, sizeof(regname)); memb[0] = 6; memb[1] = 7; memb[2] = 8; crregion(regname, oper, memb, 3, solname, sizeof(regname)); solname[8] = regname[8] = '\0'; /* region 9 */ crname(regname, 9, sizeof(regname)); memb[0] = 9; memb[1] = 1; memb[2] = 5; oper[2] = WMOP_SUBTRACT; crregion(regname, oper, memb, 3, solname, sizeof(regname)); solname[8] = regname[8] = '\0'; /* region 10 */ crname(regname, 10, sizeof(regname)); memb[0] = 10; memb[1] = 4; memb[2] = 8; crregion(regname, oper, memb, 3, solname, sizeof(regname)); solname[8] = regname[8] = '\0'; /* group all the track regions */ j = 1; if ( (i = Trackpos / 10 + 1) > 9 ) j = 2; itoa(i, temp, j); bu_strlcat(grpname, temp, sizeof(grpname)); for (i=1; i<11; i++) { if ( i == 3 || i ==4 || i == 7 || i == 8 ) continue; regname[8] = '\0'; crname(regname, i, sizeof(regname)); if ( db_lookup( dbip, regname, LOOKUP_QUIET) == DIR_NULL ) { Tcl_AppendResult(interp, "group: ", grpname, " will skip member: ", regname, "\n", (char *)NULL); continue; } mk_addmember( regname, &head, NULL, WMOP_UNION ); } /* Add them all at once */ if ( mk_comb( wdbp, grpname, &head, 0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 1, 1 ) < 0 ) { Tcl_AppendResult(interp, "An error has occured while adding '", grpname, "' to the database.\n", (char *)NULL); } /* draw this track */ Tcl_AppendResult(interp, "The track regions are in group ", grpname, "\n", (char *)NULL); { const char *arglist[3]; arglist[0] = "e"; arglist[1] = grpname; arglist[2] = NULL; edit_result = cmd_draw( clientData, interp, 2, arglist ); } Trackpos += 10; item_default = item; mat_default = mat; los_default = los; grpname[5] = solname[8] = regname[8] = '\0'; return edit_result; end: (void)signal( SIGINT, SIG_IGN ); return edit_result; }
int f_eac(ClientData clientData, Tcl_Interp *interp, int argc, char **argv) { int j; int item; struct directory *dp; struct bu_vls v; int new_argc; int lim; CHECK_DBI_NULL; if (argc < 2) { struct bu_vls vls; bu_vls_init(&vls); bu_vls_printf(&vls, "help eac"); Tcl_Eval(interp, bu_vls_addr(&vls)); bu_vls_free(&vls); return TCL_ERROR; } bu_vls_init( &v ); if ( setjmp( jmp_env ) == 0 ) (void)signal( SIGINT, sig3); /* allow interupts */ else { bu_vls_free( &v ); return TCL_OK; } bu_vls_strcat( &v, "e" ); lim = 1; for ( j=1; j<argc; j++) { item = atoi( argv[j] ); if ( item < 1 ) continue; FOR_ALL_DIRECTORY_START(dp, dbip) { struct rt_db_internal intern; struct rt_comb_internal *comb; if ( !(dp->d_flags & DIR_REGION) ) continue; if ( rt_db_get_internal( &intern, dp, dbip, (fastf_t *)NULL, &rt_uniresource ) < 0 ) TCL_READ_ERR_return; comb = (struct rt_comb_internal *)intern.idb_ptr; if ( comb->region_id != 0 || comb->aircode != item ) { rt_comb_ifree( &intern, &rt_uniresource ); continue; } rt_comb_ifree( &intern, &rt_uniresource ); bu_vls_strcat( &v, " " ); bu_vls_strcat( &v, dp->d_namep ); lim++; } FOR_ALL_DIRECTORY_END; } if ( lim > 1 ) { int retval; const char **new_argv; new_argv = (char **)bu_calloc( lim+1, sizeof( char *), "f_eac: new_argv" ); new_argc = bu_argv_from_string( new_argv, lim, bu_vls_addr( &v ) ); retval = cmd_draw( clientData, interp, new_argc, new_argv ); bu_free( (genptr_t)new_argv, "f_eac: new_argv" ); bu_vls_free( &v ); (void)signal( SIGINT, SIG_IGN ); return retval; } else { bu_vls_free( &v ); (void)signal( SIGINT, SIG_IGN ); return TCL_OK; } }