/*====================================================================*\ FILE : TestExport.c PURPOSE : Test and demo for ProPartTessellate.. functions. HISTORY.. DATE BUILD AUTHOR MODIFICATIONS 01-Nov-99 I-03-20 akh $$1 Created 04-Nov-99 I-03-20 akh $$2 Include ProModelitem.h, ProMessage.h \*====================================================================*/ /*--------------------------------------------------------------------*\ Pro/Toolkit includes \*--------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "TestError.h" #include "UtilMenu.h" #include "UtilMessage.h" #include "UtilString.h" #include "UtilMath.h" #include "UtilTypes.h" #define EXPORT_MN_SETUP 01 #define EXPORT_MN_WIREFRAME 11 #define EXPORT_MN_RENDER 12 #define EXPORT_MN_DUMP 13 #define EXPORT_MN_ANGLE 21 #define EXPORT_MN_CHORD 22 #define EXPORT_MN_QUILT 23 #define EXPORT_MN_OPT 24 #define EXPORT_MN_ASSM 33 #define EXPORT_MN_SEL_PART 34 typedef struct pro_test_export_data { ProMdl mdl; double chord_ht; double angle_cntrl; ProBoolean include_quilts; ProCharLine file_name; int file_format; ProBoolean optimization; } ProTestExportData; /*=================================================================*\ FUNCTION : ProTestExportVertexIsEq() PURPOSE : Compare two vectors. \*=================================================================*/ int ProTestExportVertexIsEq(ProVector v1, ProVector v2) { if((v1 == NULL)||(v2 == NULL)) return(-1); if((fabs(v1[0]-v2[0])=0) return(n); } error = ProArrayObjectAdd((ProArray*)v_arr, PRO_VALUE_UNUSED, 1, &v); TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestExportVertexAdd()", error, error != PRO_TK_NO_ERROR); if(error!=PRO_TK_NO_ERROR) return(-1); error = ProArraySizeGet((ProArray)*v_arr, &n); TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestExportVertexAdd()", error, error != PRO_TK_NO_ERROR); if(error!=PRO_TK_NO_ERROR) return(-1); (*v_arr)[n-1][0] =v[0]; (*v_arr)[n-1][1] =v[1]; (*v_arr)[n-1][2] =v[2]; return(n-1); } /*=================================================================*\ FUNCTION : ProTestExportCollectAllTringles() PURPOSE : Collect all triangles into the single array \*=================================================================*/ ProError ProTestExportCollectAllTringles(ProSurfaceTessellationData *data, ProTriangle **trn, ProVector **ver, ProBoolean opt) { ProError error, err = PRO_TK_NO_ERROR; int i, n_trn = 0, k, j; int SurfCount=0; if(data == NULL) return(PRO_TK_BAD_INPUTS); if(*trn == NULL) { error = ProArrayAlloc(0, sizeof(ProTriangle),1,(ProArray*)trn); TEST_CALL_REPORT ("ProArrayAlloc()", "ProTestExportCollectAllTringles()", error, error != PRO_TK_NO_ERROR); if(error!=PRO_TK_NO_ERROR) return(error); } error = ProArraySizeGet((ProArray)data, &SurfCount); TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestExportCollectAllTringles()", error, error != PRO_TK_NO_ERROR); if((error != PRO_TK_NO_ERROR)||(SurfCount<=0)) return(PRO_TK_BAD_INPUTS); for(i=0; imdl), data->chord_ht, data->angle_cntrl, data->include_quilts, &tes_data); TEST_CALL_REPORT ("ProPartTessellate()", "ProTestExportTo()", error, error != PRO_TK_NO_ERROR); if (error!=PRO_TK_NO_ERROR) return(error); error = ProMdlNameGet(data->mdl, w_name); TEST_CALL_REPORT ("ProMdlNameGet()", "ProTestExportTo()", error, error != PRO_TK_NO_ERROR); ProWstringToString(c_name, w_name); switch(data->file_format) { case EXPORT_MN_WIREFRAME: sprintf(data->file_name,"%s.%s",c_name,"obj"); break; case EXPORT_MN_RENDER: sprintf(data->file_name,"%s.%s",c_name,"slp"); break; case EXPORT_MN_DUMP: sprintf(data->file_name,"%s.%s",c_name,"dump"); break; } if ((fp = fopen(data->file_name, "w")) == NULL) { printf("Cannot open output file\n"); return (PRO_TK_GENERAL_ERROR); } switch (data->file_format) { case EXPORT_MN_WIREFRAME: error = ProTestExportToWireFrame(fp, tes_data, data->optimization); break; case EXPORT_MN_RENDER: error = ProTestExportToRender(fp, tes_data, ProWstringToString(c_name, w_name)); break; case EXPORT_MN_DUMP: error = ProTestExportToDUMP(fp,tes_data); break; } error = ProPartTessellationFree(&tes_data); TEST_CALL_REPORT ("ProPartTessellationFree()", "ProTestExportTo()", error, error != PRO_TK_NO_ERROR); fclose(fp); return(error); } /*=================================================================*\ FUNCTION : ProTestExportTo() PURPOSE : Export part tessellation data to the file \*=================================================================*/ ProError ProTestExportTo(ProTestExportData *data) { ProError error; ProSurfaceTessellationData *tes_data = NULL; ProName w_name; ProCharLine c_name; ProMdlType mdl_type; FILE *fp; int n, n_sel,i; ProSelection *sel; ProModelitem part_item; static ProUtilMenuButtons TkMenu[] ={ {"ExportAsm", -1, TEST_CALL_PRO_MENU_DELETE}, {"-As assembly", EXPORT_MN_ASSM, 0}, {"-Selected parts", EXPORT_MN_SEL_PART,0}, {"-Quit", -1, TEST_CALL_PRO_MENU_DELETE}, {"", -1, 0}}; if(data == NULL) return(PRO_TK_BAD_INPUTS); error = ProMdlTypeGet(data->mdl, &mdl_type); TEST_CALL_REPORT ("ProMdlTypeGet()", "ProTestExportTo()", error, error != PRO_TK_NO_ERROR); switch(mdl_type) { case PRO_MDL_ASSEMBLY: error = ProUtilMenuIntValueSelect(TkMenu, &n); if((error!=PRO_TK_NO_ERROR)||(n<0)) return(PRO_TK_NO_ERROR); if (n == EXPORT_MN_SEL_PART) { error = ProSelect("part",PRO_VALUE_UNUSED, NULL, NULL, NULL, NULL, &sel, &n_sel); TEST_CALL_REPORT ("ProSelect()", "ProTestExportTo()", error, error != PRO_TK_NO_ERROR); if((error!=PRO_TK_NO_ERROR)||(n_sel<=0)) return(PRO_TK_E_NOT_FOUND); for(i=0; imdl)); TEST_CALL_REPORT ("ProModelitemMdlGet()", "ProTestExportTo()", error, error != PRO_TK_NO_ERROR); if (error != PRO_TK_NO_ERROR) continue; error = ProTestExportModelTo(data); } } else { error = ProTestExportModelTo(data); } break; case PRO_MDL_PART: error = ProTestExportModelTo(data); break; default: return(PRO_TK_BAD_INPUTS); } return(error); } /*=================================================================*\ FUNCTION : ProTestExportSetup() PURPOSE : Setup tesselation parameters \*=================================================================*/ ProError ProTestExportSetup(ProTestExportData *data) { int n; ProError error; static ProUtilMenuButtons TkMenu[] ={ {"ExpSetup", -1, TEST_CALL_PRO_MENU_DELETE}, {"-Chord height", EXPORT_MN_CHORD, 0}, {"-Angle control", EXPORT_MN_ANGLE, 0}, {"-Quilt", EXPORT_MN_QUILT, 0}, {"-Optimization", EXPORT_MN_OPT, 0}, {"-Quit", -1, TEST_CALL_PRO_MENU_DELETE}, {"", -1,0}}; error = ProUtilMenuIntValueSelect(TkMenu, &n); if((error!=PRO_TK_NO_ERROR)||(n<0)) return(PRO_TK_NO_ERROR); switch(n) { case EXPORT_MN_CHORD: ProUtilMsgPrint("gen", "TEST %0s", "The maximum allowable chord height(>0):"); error = ProMessageDoubleRead(NULL, &(data->chord_ht)); break; case EXPORT_MN_ANGLE: ProUtilMsgPrint("gen", "TEST %0s", "The angle control (between 0.0 and 1.0):"); error = ProMessageDoubleRead(NULL, &(data->angle_cntrl)); break; case EXPORT_MN_QUILT: ProUtilMsgPrint("gen", "TEST %0s", "Include quilt surfaces or not(Y/N):"); data->include_quilts = (ProUtilYesnoGet("Yes") == 1); break; case EXPORT_MN_OPT: ProUtilMsgPrint("gen", "TEST %0s", "Enable optimization(Y/N):"); data->optimization = (ProUtilYesnoGet("Yes") == 1); break; } ProTestExportSetup(data); return(PRO_TK_NO_ERROR); } /*=================================================================*\ FUNCTION : ProTestExportMainMenu() PURPOSE : Create "TkModify" menu \*=================================================================*/ ProError ProTestExportMainMenu(ProMdl mdl) { int n; ProError error; static ProUtilMenuButtons TkMenu[] ={ {"ExportGeom", -1, TEST_CALL_PRO_MENU_DELETE}, {"-WireFrame", EXPORT_MN_WIREFRAME, 0}, {"-Render", EXPORT_MN_RENDER, 0}, {"-Dump", EXPORT_MN_DUMP, 0}, {"-Setup", EXPORT_MN_SETUP, 0}, {"-Quit",-1, TEST_CALL_PRO_MENU_DELETE}, {"", -1,0}}; static ProTestExportData data; static FirstCall =0; if (mdl == NULL) { error = ProMdlCurrentGet(&mdl); TEST_CALL_REPORT ("ProMdlCurrentGet()", "ProTestExportMainMenu()", error, error != PRO_TK_NO_ERROR); if(error != PRO_TK_NO_ERROR) return(error); } /*--------------------------------------------------------------------*\ Initialization default data \*--------------------------------------------------------------------*/ if(FirstCall == 0) { data.chord_ht = 0.1; data.angle_cntrl = 0.5; data.include_quilts = PRO_B_FALSE; data.optimization = PRO_B_FALSE; FirstCall++; } /*--------------------------------------------------------------------*\ Show "ExportGeom" menu \*--------------------------------------------------------------------*/ do { error = ProUtilMenuIntValueSelect(TkMenu, &n); if((error!=PRO_TK_NO_ERROR)||(n<0)) return(PRO_TK_NO_ERROR); data.mdl = mdl; switch(n) { case EXPORT_MN_WIREFRAME: case EXPORT_MN_RENDER: case EXPORT_MN_DUMP: data.file_format = n; error = ProTestExportTo(&data); break; case EXPORT_MN_SETUP: error = ProTestExportSetup(&data); break; } } while(1); }