/*************************** Coded by Am!t, Released August 31st 2005 Poly2Vista-0.3 Webpage:http://visservices.sdsc.edu/software/mel/poly2vista.php Bug-report to amit@sdsc.edu ***************************/ global proc warnFeedback_p2v(string $message) { $col=(0.65 +`rand 0.2`); string $showMessage="Warning: " + $message; print ("P2V_" + $showMessage + "\n"); text -e -vis 0 feedback_general; text -e -w 200 -al "center" -vis 1 -bgc 0.6 $col 0.6 -l $showMessage feedback_general; } global proc errorFeedback_p2v(string $message) { $col=(0.8 +`rand 0.2`); string $showMessage="Error: " + $message; print ("P2V_" + $showMessage + "\n"); text -e -vis 0 feedback_general; text -e -w 200 -al "center" -vis 1 -bgc $col 0.6 0.6 -l $showMessage feedback_general; } global proc sucessFeedback_p2v(string $message) { $col=(0.65 +`rand 0.2`); string $showMessage="Sucess: " + $message; print ("P2V_" + $showMessage + "\n"); text -e -vis 0 feedback_general; text -e -w 200 -al "center" -vis 1 -bgc 0.6 0.6 $col -l $showMessage feedback_general; } global proc openHelpPage_p2v() { string $url="http://visservices.sdsc.edu/software/mel/poly2vista.php"; showHelp -a $url; } global proc int check_sel() { if (size(`ls -sl`) )return 1; else errorFeedback_p2v("Nothing selected\nPlease select poly object(s)"); return 0; } //Convert an array to vector global proc vector toVect_p2v(float $array[]) {return <<$array[0],$array[1],$array[2]>>;} //Calculate average of a vector array global proc vector vectAverage_p2v(vector $array[]) { vector $return=<<0,0,0>>; for ($item in $array) $return+=$item; return $return/size($array); } global proc int saveClip_p2v( string $fileName, string $fileType ) { int $noOfFrames=`playbackOptions -q -maxTime`; //Sanity check for file exsistence if(!`gmatch $fileName "*.clp"`) {//Append ".clp" to filename entry only when not typed in $fileName=$fileName + ".clp"; //Ask for confirm overwrite when file exists int $exist=`filetest -f $fileName`; if($exist) { string $q=`confirmDialog -title "Confirm" -message "Replace existing file?" -button "Yes" -button "No" -defaultButton "Yes" -cancelButton "No" -dismissString "No"`; if($q!="Yes") return 0; //Return if chosen no or dismissed dailog box } } return writeClipFile_p2v($fileName); } global proc int writeClipFile_p2v(string $fileName) { //Create the clip file and write to it int $fileId=`fopen $fileName "w"`; //If file open fails provide error feedback to user if ($fileId==0) {errorFeedback_p2v("File could not be opened for writing"); return 0; } //Start Writing to file fprint $fileId "# Created by Poly2Vista \n"; //Get list of selected poly objects string $collection[]=`ls -flatten -sl `; for ($obj in $collection) { //Write Object name to file fprint $fileId ("\n# Object Name: " + $obj + " \n"); select -r $obj; int $outMode=`radioButtonGrp -q -select clipMode`; //Case for writing out one point and face normal if($outMode==1) { fprint $fileId "# Writing a vertex position and normal for every face\n"; PolySelectConvert 1; // change to face component mode string $selection[]=`ls -flatten -sl `; //get name of all faces int $i=0; for ($face in $selection) { select $face; //Get normal for face string $s[]=`polyInfo -fn $face`; string $nbuf[]; int $num=tokenize($s[0],$nbuf); // Compute the centroid of the face PolySelectConvert 3; // change to vertex component mode string $verts[]=`ls -sl -flatten`; //get name of all vertices vector $array[]; for ($vert in $verts) {$array[size($array)]=toVect_p2v(pointPosition($vert));} vector $result_vec; $result_vec=(vectAverage_p2v($array)); //Write to vertex and normal to file if($i == 0) fprint $fileId ("plane:" + $result_vec +" "+ $nbuf[2] +" "+ $nbuf[3] +" "+ $nbuf[4] + " \n"); else fprint $fileId ("subplane:" + $result_vec +" "+ $nbuf[2] +" "+ $nbuf[3] +" "+ $nbuf[4] + " \n"); //print $result_vec;print $nbuf;print "\n"; $i++; } } //Case for writing out three points on a plane if($outMode==2) { fprint $fileId "# Writing a 3 vertex positions for every face\n"; PolySelectConvert 1; // change to face component mode string $selection[]=`ls -flatten -sl `; //get name of all faces int $i=0; for ($face in $selection) { select $face; PolySelectConvert 3; // change to vertex component mode string $verts[]=`ls -sl -flatten`; //get name of all vertices vector $array[3]; int $i=0; for ($vert in $verts) {vector $v=toVect_p2v(pointPosition($vert)); $array[size($array)]=toVect_p2v(pointPosition($vert)); //print $v; print $n;print "\n"; //Write to vertex and normal to file if($i>2) break; $i++; } fprint $fileId ("Verts: " + $array[0] + " " + $array[1] + " " + $array[2] + " \n"); } } //Case for writing out all points and normals if($outMode==3) { fprint $fileId "# Writing all vertex positions and averaged vertex normals for every vertex\n"; PolySelectConvert 3; // change to vertex component mode string $verts[]=`ls -sl -flatten`; //get name of all vertices for ($vert in $verts) { //PolySelectConvert 3; // change to vertex component mode select $vert; vector $v=toVect_p2v(pointPosition($vert)); //Find all faces surrounding this vertex PolySelectConvert 1; // change to face component mode string $facelist[]=`ls -sl -flatten`; //print facelist; print $facelist; print "\n"; vector $array[]; for($face in $facelist) { //Get normal for each face select $face; string $s[]=`polyInfo -fn $face`; string $nbuf[]; int $num=tokenize($s[0],$nbuf); vector $fn= <>; //print $face; print $fn; print "\n"; $array[size($array)]=$fn; } vector $result_vec; $result_vec=`unit (vectAverage_p2v($array))`; //print $result_vec; //Write to vertex and normal to file fprint $fileId ($v + " " + $result_vec + " \n"); clear $array; select -cl; } } select -cl; } //Close clip file fflush $fileId; fclose $fileId; sucessFeedback_p2v("Clip File\n Succesfully Saved"); return 1; } global proc showMyWindow_p2v() { //Set Developing to false when releasing int $developing =false; if($developing && `window -exists poly2VistaWindow`) deleteUI poly2VistaWindow; if(!`window -exists poly2VistaWindow`) { window -title "Poly2Vista-0.3" -resizeToFitChildren 1 poly2VistaWindow; if (`columnLayout -exists "poly2Vista_layout"`) deleteUI "poly2Vista_layout"; //Create fresh layout columnLayout "poly2Vista_layout"; //Header //text -w 200 -l "Look Here For\nWarning/Error/Feedback MESSAGES" feedback_general; text -w 200 -l "Rollover buttons for tool tips\n" feedback_general; separator -style none -h 5; //Step 1 text -bgc 0.7 0.7 0.7 -w 200 -al "left" -fn "boldLabelFont" -l "Step 1: Select objects"; separator -style none -h 20; //Step 2 text -bgc 0.7 0.7 0.7 -w 200 -al "left" -fn "boldLabelFont" -l "Step 2: Choose output setup"; radioButtonGrp -numberOfRadioButtons 3 -columnWidth3 80 50 90 -annotation "Selects the Clip Setup" -labelArray3 "face(Vtx, N)" "3 Vtx" "Vtx, Ave_N" -on1 "sucessFeedback_p2v(\"Set output mode for\\nWriting a point and normal per face\");" -on2 "sucessFeedback_p2v(\"Set output mode for\\nWriting 3 points per face\");" -on3 "sucessFeedback_p2v(\"Set output mode for\\nWriting all vertices and averaged vertex normals \");" -select 1 clipMode; separator -style none -h 10; //Step 3 text -bgc 0.7 0.7 0.7 -w 200 -al "left" -fn "boldLabelFont" -l "Step 3: Save clip file"; rowColumnLayout -w 200 -cw 1 80 -cw 2 40 -cw 3 80 -numberOfColumns 3; //col 1 //Create save button for clip file button -vis 1 -l "Save Clip File" -annotation "Opens dialog box for saving file" //for portability use fileBrowser in mayainstall/scripts/others/fileBrowser.mel //fileBrowser inputs are action title filetype read/writemode (ie fileBrowser string string string int) -command "if(check_sel()) fileBrowser \"saveClip_p2v\" \"Save_File\" \"\" 1" saveButton; //Col 2 text -l ""; //Col 3 //text -fn "boldLabelFont" -w 200 -l "Rollover buttons for tool tips" -al "left"; button -l "HelpWebPage" -h 15 -annotation "Opens help page in web browser" -c "openHelpPage_p2v" help_button; setParent..;//Go back to Parent layout separator -style "in" -w 200 -h 15; text -w 200 -en 0 -l "Visualization Services" -al "center"; text -w 200 -en 0 -l "San Diego Supercomputer Center" -al "center"; separator -style "in" -w 200 -h 15; setParent..;//Go back to Parent layout select -cl; } showWindow poly2VistaWindow; } showMyWindow_p2v;