#include "SUMA_suma.h"
extern SUMA_CommonFields *SUMAg_CF;
static char s_ver[100];
static char * SUMA_ver2date(int ver)
{
int yy, mm, dd;
yy = ver/10000;
mm = (ver % 10000) / 100;
dd = ver % 100;
sprintf(s_ver,"%d_%d_%d", yy, mm, dd);
return(s_ver);
}
/*!
\brief Returns a string with the new additions and version information
\param ver (float) v (v > 0) for info on version v alone
0.0 just the latest version info
-1.0 for all versions
\param StampOnly (SUMA_Boolean) Want version number and time stamp only ?
\return s (char *) the string, yall have to free it with SUMA_free
\sa SUMA_New_Additions_perver
- To add a new version, you must add a case statement in SUMA_New_Additions_perver
AND add the version number in the beginning of SUMA_VERSION_VECTOR in SUMA_DataSets.h
*/
static int verv[] = { SUMA_VERSION_VECTOR };
char * SUMA_New_Additions (int ver, SUMA_Boolean StampOnly)
{
static char FuncName[]={"SUMA_New_Additions"};
char *s = NULL;
int i;
SUMA_STRING *SS = NULL;
SUMA_ENTRY;
SS = SUMA_StringAppend (NULL, NULL);
if (ver == 0) { /* just the latest */
s = SUMA_New_Additions_perver( verv[0], StampOnly);
if (s) {
SS = SUMA_StringAppend (SS, s); SUMA_free(s); s = NULL;
}
} else if (ver < 0) {
/* all history */
SS = SUMA_StringAppend (SS, "All Version Info:\n");
i = 0;
while (verv[i] > 0) {
s = SUMA_New_Additions_perver( verv[i], StampOnly);
if (s) {
SS = SUMA_StringAppend (SS, s); SUMA_free(s); s = NULL;
SS = SUMA_StringAppend (SS, "\n");
}
++i;
}
} else {
/* just for ver */
s = SUMA_New_Additions_perver( ver, StampOnly);
if (s) {
SS = SUMA_StringAppend (SS, s); SUMA_free(s); s = NULL;
}
}
/* add the CVS tag */
SS = SUMA_StringAppend_va (SS, "\nCVS tag:\n %s\n", SUMA_VERSION_LABEL);
/* add the compile date */
SS = SUMA_StringAppend_va (SS, "\nCompile Date:\n %s\n",__DATE__);
/* clean SS */
SS = SUMA_StringAppend (SS, NULL);
/* copy s pointer and free SS */
s = SS->s;
SUMA_free(SS);
SUMA_RETURN(s);
}
/*!
\brief Returns a string with version information
\param ver (float) Version number
\param StampOnly (SUMA_Boolean) if YUP
then return the time stamp of the version only)
\return s (char *) the string, yall have to free it with SUMA_free
\sa SUMA_New_Additions
- To add a new version, you must add a case statement in SUMA_New_Additions_perver
AND add the version number in the beginning of SUMA_VERSION_VECTOR in SUMA_DataSets.h
*/
char * SUMA_New_Additions_perver (int ver, SUMA_Boolean StampOnly)
{
static char FuncName[]={"SUMA_New_Additions_perver"};
char *s = NULL;
SUMA_STRING *SS = NULL;
SUMA_ENTRY;
SS = SUMA_StringAppend (NULL, NULL);
switch (ver) {
/* Must modify SUMA_VERSION_VECTOR in SUMA_DataSets.h when add a new case */
/*
case XX:
SS = SUMA_StringAppend_va(SS,
"++ SUMA version %s\n", SUMA_ver2date(ver)); if (StampOnly) break;
SS = SUMA_StringAppend(SS,
"New Programs:\n"
" + \n"
"Modifications:\n"
" + \n");
break;
*/
case 20060703:
SS = SUMA_StringAppend_va(SS,
"++ SUMA version %s\n", SUMA_ver2date(ver)); if (StampOnly) break;
SS = SUMA_StringAppend(SS,
"New Programs:\n"
" + SurfDsetInfo: Program to display surface dataset information.\n"
" + AnalyzeTrace: Program to analyze the output of -trace option.\n"
" + DriveSuma: Program to control SUMA from the command line\n"
" + imcat: Program to catenate images.\n"
"Modifications:\n"
" + SUMA:\n"
" o Addition of new Displayable Objects (DO)(ctrl+Alt+s)\n"
" o Allow replacement of pre-loaded DO and Dsets\n"
" o Support for .niml.dset as format for surface-based anlysis\n"
" o High resolution image saving with ctrl+r\n"
" + MapIcosahedron:\n"
" o Better handling of surface centers. \n"
);
break;
case 20041229:
SS = SUMA_StringAppend_va(SS,
"++ SUMA version %s\n", SUMA_ver2date(ver)); if (StampOnly) break;
SS = SUMA_StringAppend(SS,
"New Programs:\n"
" + SurfClust: Program to find clusters of activation\n"
" on the surface.\n"
" + IsoSurface: Program to create isosurfaces from AFNI volumes.\n"
" + ConvexHull: Program to create the convex hull of a set of\n"
" points.\n"
" + 3dSkullStrip: Program to remove the skull from anatomical \n"
" volumes.\n"
" + 3dCRUISEtoAFNI: Program to convert CRUISE volumes to AFNI\n"
" + 3dBRAIN_VOYAGERtoAFNI: Program to convert BrainVoyager .vmr\n"
" volumes to AFNI\n"
" + SurfMesh: Program to increase or decrease a mesh's density.\n"
" + SurfMask: Program to find the volume enclosed by a surface.\n"
" + SurfToSurf: Program to interpolate between non-isotopic surfaces.\n"
" + ROIgrow: Program to expand an ROI on the surface.\n"
"Modifications:\n"
" + SUMA:\n"
" o Slight modification to threshold scale.\n"
" o Added environment variable SUMA_ThresholdScalePower.\n"
" o Fixed a few kinks in the surface controller.\n"
" o Fixed ROI drawing trace on OSX.\n"
" o Added geodesic distance measurements in ROI drawing\n"
" controller.\n"
" o Suma can read surfaces specified on command line.\n"
" o Fixed bug reading AFNI generated niml files.\n"
" o Useful axis displayed with F2 key.\n"
" o Fixed bug with recursive function used to fill ROIs.\n"
" o Support for reading CRUISE surfaces in OpenDX format\n"
" o Support for reading BrainVoyager surfaces (.srf) format\n"
" o Mouse motion effect is modulated with Zoom level\n"
" o F8 toggles between orthographic and perspective viewing\n"
" o Fixed bug causing crash in SUMA_MixColorOverlays\n"
" + ConvertSurface:\n"
" o Option -make_consistent added to make the winding\n"
" of the mesh consistent. \n"
" o Option to project surface nodes to sphere\n"
" + SurfQual:\n"
" o Checks and warns about mesh's winding inconsistency.\n"
" + SurfSmooth:\n"
" o Added NN_geom, nearest neighbor interpolation option.\n"
" o Combined with -match_vol or -match_area, this geometry\n"
" smoothing mode can be used to inflate surfaces.\n"
" o New weighting for Taubin geometry filtering.\n"
" o Option for masking nodes to be filtered.\n"
" o New HEAT method for filtering data.\n"
" + SurfaceMetrics:\n"
" o Option -vol calculates the volume of the closed surface.\n"
" + SurfPatch:\n"
" o Option -vol to calculate the volume between two isotopic\n"
" surface patches.\n"
" + ROI2dataset:\n"
" o Option -pad_to_node and -pad_label to output datasets\n"
" containing full node listings.\n"
" + ConvertDset:\n"
" o Option -o_1dp was added to write 1D file data only,\n"
" without additional comments.\n"
" + SurfaceMetrics:\n"
" o Options for finding surface boundaries.\n"
" + 3dSkullStrip:\n"
" o Fixed bug on 64 bit machines.\n"
);
break;
case 20040610: /* used to be 25000 */
SS = SUMA_StringAppend_va(SS,
"++ SUMA version %s (used to be 2.500)\n", SUMA_ver2date(ver)); if (StampOnly) break;
SS = SUMA_StringAppend(SS,
"Modifications:\n"
" + SUMA's surface controller 'ctrl+s' has been\n"
" vastly improved. \n"
" Of note are the following features:\n"
" - interactive color mapping\n"
" - thresholding controls \n"
" - brightness modulation\n"
" - choice of colormaps\n"
" - coordinate bias (tres tres cool)\n"
" - info on current cross hair location\n"
" Use Bhelp button in the controller for detailed help.\n"
" + 3dVol2Surf can output NIML formatted datasets.\n"
" Options -first_node and -last_node can be used\n"
" to restrict the mapping to a subset of the nodes.\n"
" That is useful if your output file size exceeds 2GB.\n"
"Bug Fix:\n"
" + Fixed bug on Mac OS-X that cause all viewers to close\n"
" after pressing 'Yes' on the 'Close this viewer' prompt.\n"
);
break;
case 20040116: /* used to be 24800 */
SS = SUMA_StringAppend_va(SS,
"++ SUMA version %s (used to be 2.480)\n", SUMA_ver2date(ver)); if (StampOnly) break;
SS = SUMA_StringAppend(SS,
"New Programs:\n"
" + FS_readannot: Program to read FreeSurfer's\n"
" annotation files.\n"
" + SurfPatch: Program to create surface patches\n"
" from a set of nodes.\n"
" + SurfQual: Program to report defects in surfaces.\n"
" For the moment, works on spherical \n"
" surfaces only.\n"
"Modifications:\n"
" + Added affine transforms to ConvertSurface.\n"
" + Added datasets into SUMA's code (no interface).\n"
" + Added saving/loading of viewer settings.\n"
" + Beginning of multiple group support in SUMA.\n"
" + Redisplays of Surface Viewers due to X events\n"
" are no longer passed to the image recorder.\n" );
break;
case 20040106: /* used to be 24500 */
SS = SUMA_StringAppend_va(SS,
"++ SUMA version %s (used to be 2.450)\n", SUMA_ver2date(ver)); if (StampOnly) break;
SS = SUMA_StringAppend(SS,
"New Programs:\n"
" + inspec: Shows the contents of a spec file\n"
" + quickspec: Creates a minimal spec file for one\n"
" or a bunch of surfaces.\n"
" + SurfSmooth: Smoothes surface data or geometry\n"
" + SurfMeasures: Outputs various surface attributes \n"
" and measurements such as:\n"
" Thickness, Area, Volume, etc.\n"
"Modifications:\n"
" + Foreground color smoothing option (SUMA keyb. 8)\n"
" + No more MappingRef field in Spec files.\n"
" The field is broken up into a set of other\n"
" fields for more flexibility.\n"
" + Surface input to command-line programs is \n"
" now done via -spec files too.\n"
" + One-way communication with SUMA via niml.\n"
" Only available with SurfSmooth for the moment.\n"
" + Began, in good faith, to update the new version \n"
" information.\n");
break;
default:
SS = SUMA_StringAppend_va(SS, "++ %d? No such version, fool!\n", ver);
break;
}
/* clean SS */
SS = SUMA_StringAppend (SS, NULL);
/* copy s pointer and free SS */
s = SS->s;
SUMA_free(SS);
SUMA_RETURN(s);
}
/*!
\brief function called when help window is open
*/
void SUMA_Help_open (void *p)
{
static char FuncName[]={"SUMA_Help_open"};
SUMA_ENTRY;
/* nothing to do here */
SUMA_RETURNe;
}
/*!
\brief function called when help window is destroyed
*/
void SUMA_Help_destroyed (void *p)
{
static char FuncName[]={"SUMA_Help_destroyed"};
SUMA_ENTRY;
SUMAg_CF->X->Help_TextShell = NULL;
SUMA_RETURNe;
}
/*!
\brief function called when help window is open
*/
void SUMA_Help_Cmap_open (void *p)
{
static char FuncName[]={"SUMA_Help_Cmap_open"};
SUMA_ENTRY;
/* nothing to do here */
SUMA_RETURNe;
}
/*!
\brief function called when help window is destroyed
*/
void SUMA_Help_Cmap_destroyed (void *p)
{
static char FuncName[]={"SUMA_Help_Cmap_destroyed"};
SUMA_ENTRY;
SUMAg_CF->X->Help_Cmap_TextShell = NULL;
SUMA_RETURNe;
}
/*!
\brief function called when Message window is open
*/
void SUMA_Message_open (void *p)
{
static char FuncName[]={"SUMA_Message_open"};
SUMA_ENTRY;
/* nothing to do here */
SUMA_RETURNe;
}
/*!
\brief function called when Message window is destroyed
*/
void SUMA_Message_destroyed (void *p)
{
static char FuncName[]={"SUMA_Message_destroyed"};
SUMA_ENTRY;
SUMAg_CF->X->Log_TextShell = NULL;
SUMA_RETURNe;
}
char * SUMA_sources_Info(void)
{
static char FuncName[]={"SUMA_sources_Info"};
char *s = NULL;
SUMA_STRING *SS = NULL;
SUMA_ENTRY;
SS = SUMA_StringAppend (NULL, NULL);
SS = SUMA_StringAppend(SS,
"Parts of SUMA use functions from various sources.\n"
"Library sources:\n"
"----------------\n"
"* MarchingCubes:\n"
" The code for the heart of the program IsoSurface is a translation of:\n"
" Thomas Lewiner's C++ implementation of the algorithm in:\n"
" Efficient Implementation of Marching Cubes´ Cases with Topological Guarantees\n"
" by Thomas Lewiner, Hélio Lopes, Antônio Wilson Vieira and Geovan Tavares \n"
" in Journal of Graphics Tools. \n"
" http://www-sop.inria.fr/prisme/personnel/Thomas.Lewiner/JGT.pdf\n"
" Permission to use this translation in other programs must be obtained \n"
" from Mr. Lewiner.\n"
"\n"
"* 3d Edge Detection:\n"
" The code for 3dEdge detection is from the library 3DEdge \n"
" by Gregoire Malandain (gregoire.malandain@sophia.inria.fr)\n"
" References for the algorithms:\n"
" - Optimal edge detection using recursive filtering\n"
" R. Deriche, International Journal of Computer Vision,\n"
" pp 167-187, 1987.\n"
" - Recursive filtering and edge tracking: two primary tools\n"
" for 3-D edge detection, O. Monga, R. Deriche, G. Malandain\n"
" and J.-P. Cocquerez, Image and Vision Computing 4:9, \n"
" pp 203-214, August 1991.\n"
"\n"
"* QHull:\n"
" Qhull, Copyright (c) 1993-2001 \n"
" The National Science and Technology Research Center for \n"
" Computation and Visualization of Geometric Structures \n"
" (The Geometry Center) \n"
" University of Minnesota \n"
" 400 Lind Hall \n"
" 207 Church Street S.E. \n"
" Minneapolis, MN 55455 USA \n"
" \n"
" email: qhull@geom.umn.edu \n"
" \n"
" This software includes Qhull from The Geometry Center. Qhull is \n"
" copyrighted as noted above. Qhull is free software and may be obtained \n"
" via anonymous ftp from geom.umn.edu. It may be freely copied, modified, \n"
" and redistributed under the following conditions: \n"
" \n"
" 1. All copyright notices must remain intact in all files. \n"
" \n"
" 2. A copy of this text file must be distributed along with any copies \n"
" of Qhull that you redistribute; this includes copies that you have \n"
" modified, or copies of programs or other software products that \n"
" include Qhull. \n"
" \n"
" 3. If you modify Qhull, you must include a notice giving the \n"
" name of the person performing the modification, the date of \n"
" modification, and the reason for such modification. \n"
" \n"
" 4. When distributing modified versions of Qhull, or other software \n"
" products that include Qhull, you must provide notice that the original \n"
" source code may be obtained as noted above.\n"
" \n"
" 5. There is no warranty or other guarantee of fitness for Qhull, it is \n"
" provided solely ""as is"". Bug reports or fixes may be sent to \n"
" qhull_bug@geom.umn.edu; the authors may or may not act on them as \n"
" they desire.\n"
" \n"
"\n"
"* GLUT: Mark. J. Kilgard's code from the book 'Programming OpenGL for \n"
" the X Window System' (ISBN:0-201-48359-9) published by \n"
" Addison-Wesley.\n"
" NOTICE: This source code distribution contains source code contained\n"
" in the book 'Programming OpenGL for the X Window System' (ISBN:\n"
" 0-201-48359-9) published by Addison-Wesley. The programs and\n"
" associated files contained in the distribution were developed by Mark\n"
" J. Kilgard and are Copyright 1994, 1995, 1996 by Mark J. Kilgard\n"
" (unless otherwise noted). The programs are not in the public domain,\n"
" but they are freely distributable without licensing fees. These\n"
" programs are provided without guarantee or warrantee expressed or\n"
" implied.\n"
"\n"
"* PLY: A set of functions for reading/writing PLY polygon files by\n"
" Greg Turk.\n"
" Copyright (c) 1994 The Board of Trustees of The Leland Stanford\n"
" Junior University. All rights reserved. \n"
" \n"
" Permission to use, copy, modify and distribute this software and its \n"
" documentation for any purpose is hereby granted without fee, provided \n"
" that the above copyright notice and this permission notice appear in \n"
" all copies of this software and that you do not sell the software. \n"
" \n"
" THE SOFTWARE IS PROVIDED 'AS IS' AND WITHOUT WARRANTY OF ANY KIND, \n"
" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY \n"
" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. \n"
" \n"
"* SimpEnvelopes: A set of functions for simplifying triangular meshes by\n"
" Jonathan Cohen (cohenj@cs.unc.edu) and Amitabh Varshney\n"
" (varshney@cs.sunysb.edu).\n"
" Copyright 1995 The University of North Carolina at Chapel Hill.\n"
" All Rights Reserved.\n"
"\n"
" Permission to use, copy, modify and distribute this software and its\n"
" documentation for educational, research and non-profit purposes,\n"
" without fee, and without a written agreement is hereby granted,\n"
" provided that the above copyright notice and the following three\n"
" paragraphs appear in all copies.\n"
"\n"
" IN NO EVENT SHALL THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL BE\n"
" LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR\n"
" CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE\n"
" USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY\n"
" OF NORTH CAROLINA HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH\n"
" DAMAGES.\n"
"\n"
"\n"
" Permission to use, copy, modify and distribute this software and its\n"
" documentation for educational, research and non-profit purposes,\n"
" without fee, and without a written agreement is hereby granted,\n"
" provided that the above copyright notice and the following three\n"
" paragraphs appear in all copies.\n"
"\n"
" THE UNIVERSITY OF NORTH CAROLINA SPECIFICALLY DISCLAIM ANY\n"
" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n"
" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE\n"
" PROVIDED HEREUNDER IS ON AN 'AS IS' BASIS, AND THE UNIVERSITY OF\n"
" NORTH CAROLINA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT,\n"
" UPDATES, ENHANCEMENTS, OR MODIFICATIONS.\n"
"\n"
" The authors may be contacted via:\n"
"\n"
" US Mail: Jonathan Cohen Amitabh Varshney\n"
" Department of Computer Science Department of Computer Science \n"
" Sitterson Hall, CB #3175 State University of New York\n"
" University of N. Carolina Stony Brook, NY 11794-4400, USA \n"
" Chapel Hill, NC 27599-3175\n"
" \n"
" Phone: (919)962-1749 Phone: (516)632-8446 \n"
" \n"
" EMail: cohenj@cs.unc.edu varshney@cs.sunysb.edu\n"
"\n"
"Sample code sources:\n"
"--------------------\n"
"* 'Mastering Algorithms with C': a book by Kyle Loudon, \n"
" published by O'Reilly & Associates. \n"
" This code is under copyright and cannot be included in any other book, publication,\n"
" or educational product without permission from O'Reilly & Associates. No\n"
" warranty is attached; we cannot take responsibility for errors or fitness for\n"
" use.\n"
"\n"
"* 'C Language Algorithms for Digital Signal Processing': a book by \n"
" Bruce Kimball, Paul Embree and Bruce Kimble\n"
" published by Prentice Hall, 1991.\n"
"\n"
"* 'Motif Programming Manual': a book by Dan Heller and Paula Ferguson\n"
" published by O'Reilly & Associates, Inc. 1994\n"
" * Written by Dan Heller and Paula Ferguson.\n"
" * Copyright 1994, O'Reilly & Associates, Inc.\n"
" * Permission to use, copy, and modify this program without\n"
" * restriction is hereby granted, as long as this copyright\n"
" * notice appears in each copy of the program source code.\n"
" * This program is freely distributable without licensing fees and\n"
" * is provided without guarantee or warrantee expressed or implied.\n"
" * This program is -not- in the public domain.\n"
"\n"
"* 'http://astronomy.swin.edu.au/~pbourke': Paul Bourke's personal pages\n"
" on geometry and rendering .\n"
" Copyright notice on webpage: Copyright Paul Bourke or a third party \n"
" contributer where indicated. You may view this site and its contents \n"
" using your web browser. You may print or save an electronic copy of \n"
" parts of this web site for your own personal use. \n"
" Permission must be sought for any other use. \n"
"\n" );
SUMA_SS2S(SS,s);
SUMA_RETURN (s);
}
char * SUMA_help_Cmap_message_Info(SUMA_COLOR_MAP * ColMap)
{
static char FuncName[]={"SUMA_help_message_Info"};
char stmp[1000], *s = NULL;
SUMA_STRING *SS = NULL;
SUMA_ENTRY;
SS = SUMA_StringAppend (NULL, NULL);
s = SUMA_New_Additions (0, 1);
SS = SUMA_StringAppend (SS, s); SUMA_free(s); s = NULL;
SS = SUMA_StringAppend (SS,
"\nKeyboard Controls\n"
" r: record image of colormap.\n"
"\n"
" Ctrl+h: this help message\n"
"\n"
" Z: Zoom in.\n"
" Maximum zoom in shows 2 colors in the map\n"
" z: Zoom out.\n"
" Minimum zoom in shows all colors in the map\n"
"\n"
" Up/Down arrows: move colormap up/down.\n"
"\n"
" Home: Reset zoom and translation parameters\n"
"\n");
SS = SUMA_StringAppend (SS,
"\nCmap properties\n");
s = SUMA_ColorMapVec_Info(&ColMap, 1, 1);
SS = SUMA_StringAppend (SS, s); SUMA_free(s); s = NULL;
/* Add help for all controller options */
s = SUMA_Help_AllSurfCont();
SS = SUMA_StringAppend (SS, s); SUMA_free(s); s = NULL;
/* clean SS */
SS = SUMA_StringAppend (SS, NULL);
/* copy s pointer and free SS */
s = SS->s;
SUMA_free(SS);
SUMA_RETURN (s);
}
char * SUMA_help_message_Info(void)
{
static char FuncName[]={"SUMA_help_message_Info"};
char stmp[1000], *s = NULL;
SUMA_STRING *SS = NULL;
SUMA_ENTRY;
SS = SUMA_StringAppend (NULL, NULL);
s = SUMA_New_Additions (0, 1);
SS = SUMA_StringAppend (SS, s); SUMA_free(s); s = NULL;
SS = SUMA_StringAppend (SS,
"\nKeyboard Controls (substitute Alt with Apple key on MACs)\n");
SS = SUMA_StringAppend (SS,
" a: attenuation by background, toggle.\n\n");
SS = SUMA_StringAppend (SS,
" B: Backface/Frontface/Noface culling, toggle.\n");
SS = SUMA_StringAppend (SS,
" b: background color, toggle.\n\n");
if (SUMAg_CF->Dev) SS = SUMA_StringAppend_va (SS,
" Ctrl+C: Set screen-coordinate-based clipping planes\n"
" Alt+C: Set object-coordinate-based clipping planes\n"
" o Planes are defined by a string of the format:\n"
" NAME: a, b, c, d\n"
" Where NAME is a user-given short name,\n"
" a, b, c, and d define the plane's equation\n"
" aX + bY + cZ + d = 0\n"
" Example: A: 0, 0, 1, 0\n"
" o To delete a plane, just enter its name followed\n"
" by the ':' (e.g. 'A:')\n"
" o If you enter only two parameters after the name, \n"
" they are assumed to be the c and d parameters,\n"
" a and b are set to 0.\n"
" o You are allowed a maximum of %d planes\n"
"\n",
SUMA_MAX_N_CLIP_PLANES);
SS = SUMA_StringAppend (SS,
" c: load a node color file.\n\n");
SS = SUMA_StringAppend (SS,
" Ctrl+d: draw ROI controller.\n\n");
if (SUMAg_CF->Dev) SS = SUMA_StringAppend (SS,
" d: Show all DO objects in DOv.\n\n");
if (SUMAg_CF->Dev) SS = SUMA_StringAppend (SS,
" Ctrl+e: Look for OpenGL errors.\n\n");
SS = SUMA_StringAppend (SS,
" F: Flip light position between +z and -z.\n");
SS = SUMA_StringAppend (SS,
" f: functional overlay, toggle.\n\n");
SS = SUMA_StringAppend (SS,
" H: Highlight nodes inside a specified box.\n"
" Does not update other viewers\n"
" Paints into existing colors\n"
" Highlight is wiped out with new\n"
" colors.\n\n");
SS = SUMA_StringAppend (SS,
" h: NO LONGER USED.\n"
" Please use Ctrl+h instead.\n");
SS = SUMA_StringAppend (SS,
" Ctrl+h: help message\n\n");
SS = SUMA_StringAppend (SS,
" J: Set the selected FaceSet on Surface Object\n"
" in Focus. Does not update in other viewers\n"
" or in AFNI.\n");
SS = SUMA_StringAppend (SS,
" j: Set the cross hair to a certain node on \n"
" SO in Focus.\n"
" Does update in other viewers\n"
" if linked by index"
" and AFNI if connected\n");
SS = SUMA_StringAppend (SS,
" Ctrl+j: Set the cross hair's XYZ location. \n"
" Does update in other viewers\n"
" if linked by XYZ"
" and AFNI if connected\n");
SS = SUMA_StringAppend (SS,
" Alt+j: Set the Focus node. \n"
" Cross hair's XYZ remain unchanged.\n"
" Does not update in other viewers\n"
" or in AFNI\n\n");
SS = SUMA_StringAppend_va (SS,
" L: Light's XYZ coordinates.\n"
" Default setting is 0.0 0.0 %.1f \n", 1.0 * SUMA_INTITIAL_LIGHT0_SWITCH);
if (SUMAg_CF->Dev) SS = SUMA_StringAppend (SS,
" Ctrl+L: Dim all lights and colors by a factor of 0.8\n" );
SS = SUMA_StringAppend (SS,
" l: look at point\n");
SS = SUMA_StringAppend (SS,
" Alt+l: look at cross hair\n");
SS = SUMA_StringAppend (SS,
" Ctrl+l: Switch locking mode for all viewers \n"
" between: No Lock, Index Lock and \n"
" XYZ Lock. The switching is order is \n"
" based on the lock of the first viewer.\n\n");
SS = SUMA_StringAppend (SS,
" Alt+Ctrl+M: Dumps memory trace to file \n"
" called malldump.NNN where NNN\n"
" is the smallest number between\n"
" 001 and 999 that has not been used.\n");
SS = SUMA_StringAppend (SS,
" m: momentum, toggle\n\n");
if (SUMAg_CF->Dev) SS = SUMA_StringAppend (SS,
" n: bring a node to direct view (does not work AT ALL)\n");
SS = SUMA_StringAppend (SS,
" Ctrl+n: Open a new surface viewer window.\n\n");
SS = SUMA_StringAppend (SS,
" p: Viewer rendering mode \n"
" (Fill, Line, Points), switch.\n\n");
SS = SUMA_StringAppend (SS,
" r: record current image\n"
" in an a la AFNI image viewer.\n"
" Identical images are rejected.\n\n");
if (SUMAg_CF->Dev) SS = SUMA_StringAppend (SS,
" Alt+r: Set new center of rotation.\n"
" Enter nothing to go back to default.\n"
"\n");
SS = SUMA_StringAppend (SS,
" Ctrl+r: Increase the image oversampling factor.\n"
" By increasing this factor, you can create\n"
" images at a resolution higher than that \n"
" of the SUMA window. This is done by subdividing \n"
" the scene into NxN sections and rendering each\n"
" section separately. The NxN renderings are\n"
" saved in the image recorder. After you \n"
" save the images to disk, you can stitch them\n"
" using imcat (a la AFNI montage). \n"
" Note that each section is still rendered at\n"
" the resolution of the SUMA window. So the bigger\n"
" the window the more resolution per section.\n"
" However, you cannot exceed a certain limit\n"
" on the number of pixels in the final image.\n"
" This limitation is due to the graphics card\n"
" on your system. SUMA will take care not to exceed\n"
" this limit.\n");
SS = SUMA_StringAppend (SS,
" R: Toggle continuous recording \n"
" to an a la AFNI image viewer.\n"
" Identical images are rejected.\n\n");
SS = SUMA_StringAppend (SS,
" s: NO LONGER IN USE. \n"
" View the surface's structure contents.\n"
" Use:View->Surface Controller->More.\n");
SS = SUMA_StringAppend (SS,
" Ctrl+s: Open controller for \n"
" surface in Focus.\n");
SS = SUMA_StringAppend (SS,
" Ctrl+Alt+s: Input filename containing displayable objects.\n"
" Files are of 1D format with a necessary comment\n"
" at the top to indicate the type of objects in \n"
" the file.\n"
" Note 1: Repeatedly loading files with the same \n"
" name will replace currently loaded versions.\n"
" Note 2: Node-based (Types 3 and 4) objects\n"
" will follow a node when its coordinates change.\n"
" Type 1:Segments between (x0,y0,z0) and (x1,y1,z1) \n"
" 1st line must be '#segments' (without quotes),\n"
" or '#oriented_segments' (slower to render).\n"
" Remainder of file is N rows, each defining a \n"
" segment (or a vector) between two points.\n"
" Column content depends on the number of columns\n"
" in the file:\n"
" 6 cols: x0 y0 z0 x1 y1 z1\n"
" 7 cols: x0 y0 z0 x1 y1 z1 th\n"
" with th being line thickness\n"
" 10 cols: x0 y0 z0 x1 y1 z1 c0 c1 c2 c3\n"
" with c0..3 being the RGBA values\n"
" between 0 and 1.0\n"
" 11 cols: x0 y0 z0 x1 y1 z1 c0 c1 c2 c3 th\n"
" Type 2:Spheres centered at (ox, oy, oz) \n"
" 1st line must be '#spheres' (without quotes).\n"
" Remainder of file is N rows, each defining a \n"
" sphere.\n"
" Column content depends on the number of columns\n"
" in the file:\n"
" 3 cols: ox oy oz\n"
" 4 cols: ox oy oz rd\n"
" with rd being the radius of the sphere\n"
" 5 cols: ox oy oz rd st\n"
" with st being the style of the sphere's\n"
" rendering. Choose from:\n"
" 0: points\n"
" 1: Lines\n"
" 2: Filled\n"
" 7 cols: ox oy oz c0 c1 c2 c3 \n"
" with c0..3 being the RGBA values\n"
" between 0 and 1.0\n"
" 8 cols: ox oy oz c0 c1 c2 c3 rd\n"
" 9 cols: ox oy oz c0 c1 c2 c3 rd st\n"
" Type 3:Vectors (vx, vy, vz) at surface nodes \n"
" 1st line must be '#node-based_vectors' (without quotes)\n"
" or '#node-based_ball-vectors' (slower to render).\n"
" Remainder of file is N rows, each defining a \n"
" a vector at a particular node of the current surface.\n"
" Column content depends on the number of columns\n"
" in the file:\n"
" 3 cols: vx, vy, vz \n"
" node index 'n' is implicit equal to row index.\n"
" Vector 'v' is from coordinates of node 'n' to \n"
" coordinates of node 'n' + 'v'\n"
" 4 cols: n, vx, vy, vz \n"
" Here the node index 'n' is explicit. You can\n"
" have multiple vectors per node, one on \n"
" each row.\n"
" 5 cols: n, vx, vy, vz, gn\n"
" with gn being a vector gain factor\n"
" 8 cols: n, vx, vy, vz, c0 c1 c2 c3\n"
" with with c0..3 being the RGBA values\n"
" between 0 and 1.0\n"
" 9 cols: n, vx, vy, vz, c0 c1 c2 c3 gn\n"
" Type 4:Spheres centered at nodes n of the current surface\n"
" 1st line must be '#node-based_spheres' (without quotes).\n"
" Remainder of file is N rows, each defining a \n"
" sphere.\n"
" Column content depends on the number of columns\n"
" in the file, see Type 2 for more details:\n"
" 1 cols: n\n"
" 2 cols: n rd\n"
" 3 cols: n rd st\n"
" 5 cols: n c0 c1 c2 c3 \n"
" 6 cols: n c0 c1 c2 c3 rd\n"
" 7 cols: n c0 c1 c2 c3 rd st\n"
" Type 5:Planes defined with: ax + by + cz + d = 0.\n"
" 1st line must be '#planes' (without quotes).\n"
" Remainder of file is N rows, each defining a \n"
" plane.\n"
" Column content depends on the number of columns\n"
" in the file:\n"
" 7 cols: a b c d cx cy cz\n"
" with the plane's equation being:\n"
" ax + by + cz + d = 0\n"
" cx,cy,cz is the center of the plane's\n"
" representation. \n"
" Yes, d is not of much use here.\n"
" There are no node-based planes at the moment.\n"
" They are a little inefficient to reproduce with\n"
" each redraw. Complain if you need them.\n"
);
SS = SUMA_StringAppend (SS,
" Alt+s: Switch mouse buttons 1 and 3.\n\n");
if (SUMAg_CF->Dev) SS = SUMA_StringAppend (SS,
" S: Show all surface objects registered in DOv.\n\n");
SS = SUMA_StringAppend (SS,
" t: talk to AFNI, toggle.\n");
SS = SUMA_StringAppend (SS,
" Ctrl+t: Force a resend of \n"
" surfaces to AFNI.\n\n");
SS = SUMA_StringAppend (SS,
" T: Start listening for niml connections\n\n");
SS = SUMA_StringAppend (SS,
" Ctrl+u: Open SUMA controller.\n\n");
SS = SUMA_StringAppend (SS,
" v: NO LONGER IN USE. \n"
" View the viewer's structure contents.\n"
" Use: View->Viewer Controller->More.\n"
"\n");
SS = SUMA_StringAppend (SS,
" w: This option has been dropped.\n"
" Instead, use 'r' or 'R' recording options\n"
" or use a screen grab instead. \n"
" (like xv on unix systems, and grab on Macs.)\n");
SS = SUMA_StringAppend (SS,
" W: Write ascii files containing the NodeList,\n"
" the FaceSetList and the nodecolors of the \n"
" surface in focus.\n\n");
SS = SUMA_StringAppend (SS,
" Z/z: Zoom in/out\n\n");
SS = SUMA_StringAppend (SS,
" [: Show/Hide left hemisphere.\n"
" ]: Show/Hide right hemisphere.\n"
" Window title shows which \n"
" hemispheres are shown :LR:\n"
" :-R: :L-: or :--:\n\n");
SS = SUMA_StringAppend (SS,
" 8: Set the number of smoothing iterations\n"
" to be applied to the foreground colors.\n"
" This setting will be applied to all subsequent\n"
" color sets.\n");
SS = SUMA_StringAppend (SS,
" *: Smooth node colors by averaging with neighbors.\n"
" The smoothing is only applied to the current colors,\n"
" and will be not be applied to new color sets.\n\n");
if (SUMAg_CF->Dev) SS = SUMA_StringAppend (SS,
" @: Compute curvatures along principal directions \n"
" on the surface, results written to disk.\n\n");
if (SUMAg_CF->Dev) SS = SUMA_StringAppend (SS,
" (: Compute convexity of surface, \n"
" results written to disk.\n\n");
SS = SUMA_StringAppend (SS,
" ,/. (think </>): Switch to next/previous view state.\n\n");
SS = SUMA_StringAppend (SS,
" SPACE: Toggle between Mapping Reference and\n"
" Current view state.\n\n");
SS = SUMA_StringAppend (SS,
" L-R arrows: rotate about screen's Y axis\n");
SS = SUMA_StringAppend (SS,
" U-D arrows: rotate about screen's X axis\n");
SS = SUMA_StringAppend (SS,
" Shift+L-R arrows: translate about screen's \n"
" Y axis\n");
SS = SUMA_StringAppend (SS,
" Shift+U-D arrows: translate about screen's \n"
" X axis\n");
SS = SUMA_StringAppend (SS,
" Ctrl+L-R arrows: LR cardinal views\n");
SS = SUMA_StringAppend (SS,
" Ctrl+U-D arrows: IS cardinal views\n");
SS = SUMA_StringAppend (SS,
" Ctrl+Shift+U-D arrows: AP cardinal views\n\n");
SS = SUMA_StringAppend (SS,
" F1: screen axis (X-Red, Y-Green), toggle. \n");
SS = SUMA_StringAppend (SS,
" F2: surface axis (X-Red, Y-Green, Z-Blue), \n"
" switch. \n");
SS = SUMA_StringAppend (SS,
" F3: cross hair, toggle. \n");
SS = SUMA_StringAppend (SS,
" F4: node selection highlight, toggle. \n");
SS = SUMA_StringAppend (SS,
" F5: FaceSet selection highlight, toggle.\n");
SS = SUMA_StringAppend (SS,
" F6: Viewer background color, toggle.\n");
SS = SUMA_StringAppend (SS,
" F7: Switch between color mixing modes.\n"
" ORIG: Col = ( 1 - opacity ) * OldCol + opacity * NewCol \n"
" MOD1: Col = ( 1 - opacity ) * OldCol + NewCol \n");
SS = SUMA_StringAppend (SS,
" F8: Viewing mode (Perspective or Orthographic Projection), toggle.\n"
);
SS = SUMA_StringAppend (SS,
" F12: Time 20 scene renderings.\n\n");
SS = SUMA_StringAppend (SS,
" HOME: reset view to startup\n\n");
SS = SUMA_StringAppend (SS,
" ESCAPE: close the surface viewer window.\n");
SS = SUMA_StringAppend (SS,
" Shft+ESCAPE: close all surface viewer windows.\n\n");
SS = SUMA_StringAppend (SS,
" Mouse Controls:\n");
SS = SUMA_StringAppend (SS,
" Button 1-Motion: rotation as if you were using\n"
" a trackball.\n");
SS = SUMA_StringAppend (SS,
" Pure vertical motion is equivalent to using \n"
" the up/down arrow keys.\n");
SS = SUMA_StringAppend (SS,
" Pure horizontal motion is equivalent to using \n"
" the left/right arrow keys.\n");
SS = SUMA_StringAppend (SS,
" Of course, the advantage to using the mouse is \n"
" a continuous range of rotation angles and \n");
SS = SUMA_StringAppend (SS,
" simultaneous rotations about the screen's \n"
" X & Y axis.\n");
SS = SUMA_StringAppend (SS,
" This mode of rotation is similar to SGI's \n"
" ivview interface.\n");
SS = SUMA_StringAppend (SS,
" Button 2-Motion: translation\n");
SS = SUMA_StringAppend (SS,
" Button 1+2-Motion OR \n"
" Shift+Button2-Motion: \n"
" Zoom in/out\n");
SS = SUMA_StringAppend (SS,
" Button 3-Press: picking \n");
SS = SUMA_StringAppend (SS,
" shft+Button 3-Press: ROI drawing \n"
" (when in DrawROI mode)\n");
SS = SUMA_StringAppend (SS,
" \n");
SS = SUMA_StringAppend (SS,
" File Menu:\n"
" ->Save View: Save viewer's display settings.\n"
" ->Load View: Load and apply display settings.\n"
" ->Close: Close this viewer.\n"
" Exit SUMA if this is the only viewer.\n");
SS = SUMA_StringAppend (SS,
" View Menu:\n"
" ->SUMA Controller: Open SUMA controller interface.\n"
" ->Surface Controller: Open selected surface's \n"
" controller interface.\n"
" ->Viewer Controller: Open viewer's controller interface.\n"
" --------\n"
" ->Cross Hair: Toggle cross hair display.\n"
" ->Node in Focus: Toggle highlight of selected node.\n"
" ->Selected Faceset: Toggle highlight of selected faceset.\n");
SS = SUMA_StringAppend (SS,
" Tools Menu:\n"
" ->Draw ROI: Open Draw ROI controller.\n");
SS = SUMA_StringAppend (SS,
" Help Menu:\n"
" ->Usage: Opens window with this message.\n"
" ->Message Log: Opens window that will \n"
" contain errors and warnings\n"
" typically output to screen.\n"
" -------\n"
" ->SUMA Global: Output debugging information\n"
" about some of SUMA's global \n"
" structure's variables.\n"
" ->Viewer Struct: Output debugging info on \n"
" a viewer's structure.\n"
" ->Surface Struct: Output debugging info on\n"
" the selected surface's struct.\n"
" -------\n"
" ->InOut Notify: Turn on/off function in/out tracing.\n"
" ->MemTrace: Turn on memory tracing.\n"
" Once turned on, this can't be turned off.\n"
"\n");
SS = SUMA_StringAppend (SS,
" More help at \n"
" http://afni.nimh.nih.gov/ssc/ziad/SUMA/SUMA_doc.htm\n");
SS = SUMA_StringAppend (SS,
"\n");
/* add latest additions */
SS = SUMA_StringAppend (SS, "Current Version Info:\n");
s = SUMA_New_Additions (0, 0);
SS = SUMA_StringAppend (SS, s); SUMA_free(s); s = NULL;
/* clean SS */
SS = SUMA_StringAppend (SS, NULL);
/* copy s pointer and free SS */
s = SS->s;
SUMA_free(SS);
SUMA_RETURN (s);
}
/*!
Controls help message
*/
void SUMA_help_message(FILE *Out)
{
char *s=NULL;
static char FuncName[]={"SUMA_help_message"};
SUMA_ENTRY;
if (Out == NULL) {
Out = stdout;
}
s = SUMA_help_message_Info();
if (!s) {
fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_help_message_Info.\n", FuncName);
}else {
fprintf (Out, "%s\n", s);
SUMA_free(s);
}
SUMA_RETURNe;
}
char *SUMA_All_Programs(void )
{
char *s=NULL;
static char FuncName[]={"SUMA_All_Programs"};
SUMA_STRING *SS = NULL;
SUMA_ENTRY;
SS = SUMA_StringAppend (NULL, NULL);
SS = SUMA_StringAppend ( SS,
"+ List of programs in the SUMA package:\n"
" 3dCRUISEtoAFNI\n"
" 3dBRAIN_VOYAGERtoAFNI\n"
" 3dSkullStrip\n"
" 3dSurf2Vol\n"
" 3dSurfMask\n"
" 3dVol2Surf\n"
" AnalyzeTrace\n"
" CompareSurfaces\n"
" ConvertSurface\n"
" ConvexHull\n"
" CreateIcosahedron\n"
" DriveSuma\n"
" FSread_annot\n"
" inspec\n"
" IsoSurface\n"
" MakeColorMap\n"
" MapIcosahedron\n"
" quickspec\n"
" ROI2dataset\n"
" ROIgrow\n"
" ScaleToMap\n"
" SUMA_glxdino\n"
" SurfaceMetrics\n"
" SurfClust\n"
" SurfDsetInfo\n"
" SurfInfo\n"
" SurfMeasures\n"
" SurfMesh\n"
" SurfPatch\n"
" SurfQual\n"
" SurfSmooth\n"
" SurfToSurf\n"
);
/* clean SS */
SS = SUMA_StringAppend (SS, NULL);
/* copy s pointer and free SS */
s = SS->s;
SUMA_free(SS);
SUMA_RETURN(s);
}
/*!
SUMA version
*/
void SUMA_Version (FILE *Out)
{
static char FuncName[]={"SUMA_Version"};
char *s = NULL;
if (Out == NULL) {
Out = stdout;
}
s = SUMA_New_Additions (0, 0);
if (s) {
fprintf (Out, "\n %s\n", s);
SUMA_free(s);
} else {
fprintf (Out, "\n");
}
return;
}
/*!
Surface .. Volume relationships
*/
void SUMA_VolSurf_help (FILE *Out)
{
if (Out == NULL) {
Out = stdout;
}
fprintf (Out, "SUMA_VolSurf_help: This function is obsolete.\n");
return;
fprintf (Out, "\nVolume <--> Surface jeremiad:\n");
fprintf (Out, "-----------------------------\n");
fprintf (Out, "\tTo transform surface node coordinates to voxel coordinates a few parameters are required.\n");
fprintf (Out, "\tThose paramters vary depending on the type of surfaces used. Currently, SUMA supports \n");
fprintf (Out, "\tFreeSurfer and SureFit surfaces.\n");
fprintf (Out, "\nParent Volume (VolPar):\n");
fprintf (Out, "\tThe surface model is created from a high-resolution anatomical scan\n");
fprintf (Out, "\treferred to as Parent Volume (VolPar).\n");
fprintf (Out, "\tTo align the surface with data from a particular experiment, VolPar must\n");
fprintf (Out, "\tbe brought to alignment with the experiemt's data.\n");
fprintf (Out, "\tFor example, VolPar is aligned with data from experiment Day1 using:\n");
fprintf (Out, "\t3dvolreg -clipit -twopass -twodup -zpad 8 -rotcom -verbose \n");
fprintf (Out, "\t-base SPGR_Day1 -prefix VolPar_Day1 VolMast >>& VolParAlignLog\n");
fprintf (Out, "\twhere SPGR_Day1 is the high-resolution anatomical scan obtained in\n");
fprintf (Out, "\texperiment Day1 and VolPar_Day1 is VolPar aligned to SPGR_Day1.\n");
fprintf (Out, "\nSurface segmentation programs typically require the resolution of VolPar to\n");
fprintf (Out, "\tbe 1x1x1mm. Such volumes, especially for FreeSurfer are quite large and\n");
fprintf (Out, "\t3dvolreg might run out of memory. If that happens, you could resample \n");
fprintf (Out, "\tVolPar to a lower resolution such as 1.2x1.2x1.2mm, prior to registration. \n");
fprintf (Out, "\tNote that SPGR_Day1 must have the same resolution and number of slices as VolPar.\n");
fprintf (Out, "\n\t+FreeSurfer Parent Volume:\n");
fprintf (Out, "\tConstruct VolPar from the .COR images used to create the surface using:\n");
fprintf (Out, "\tto3d -prefix CW-cSurfParent-SPGR -xSLAB 127.5L-R -ySLAB 127.5S-I -zSLAB 127.5P-A COR-???\n");
fprintf (Out, "\tExample command line for a FreeSurfer suface with VolPar aligned to experiment ARzs:\n");
fprintf (Out, "\t./suma -vp CW-cSurfParent-SPGR_Reg2_ARzsspgrax_1mm_256pad_cor_RSP_down12+orig\\\n");
fprintf (Out, "\t -spec CW-FreeSurfer.SumaSpec\n");
fprintf (Out, "\n\t+SureFit Parent Volume:\n");
fprintf (Out, "\tVolPar is the anatomical 1x1x1 mm volume in the correct orientation (LPI) \n");
fprintf (Out, "\tthat is used by SureFit to create the surface. Typically, this volume has \n");
fprintf (Out, "\tthe .Orient string in its name unless it was in LPI orientation from the \n");
fprintf (Out, "\tstart. Because SureFit crops the volume before segmentation, it is also \n");
fprintf (Out, "\tnecessary to supply the .params file along with VolPar. The .params file is \n");
fprintf (Out, "\ttypically named something like: (anything here).L.full.sMRI.params for the \n");
fprintf (Out, "\tleft full hemisphere. Example command line for a SureFit surface with VolPar:\n");
fprintf (Out, "\t./suma -vp colin_short_Orient+orig. colin_short+orig.L.full.sMRI.params\\\n");
fprintf (Out, "\t -s_s colin.fiducial.coord colin.topo");
fprintf (Out, "\nor:\n");
fprintf (Out, "\t./suma -vp CW-cSurfParent-SPGR-AX_LPI+orig. -spec CW-SureFit.SumaSpec\n");
fprintf (Out, "\t\n");
return;
}
char * SUMA_Help_AllSurfCont ()
{
static char FuncName[]={"SUMA_Help_AllSurfCont"};
char *s = NULL;
SUMA_STRING *SS = NULL;
SUMA_ENTRY;
SS = SUMA_StringAppend (NULL, NULL);
SS = SUMA_StringAppend(SS,
"\n"
"\n"
"----------------------------\n"
"Help for Surface Controller:\n"
"----------------------------\n"
"The surface controller is for \n"
"controlling properties pertinent\n"
"to the surface selected (in focus).\n"
"The Surface Controller is launched\n"
"with 'ctrl+s' or \n"
" View-->Surface Controller .\n"
"\n"
);
SS = SUMA_StringAppend_va(SS,
"+ Surface Properties Block:\n"
"\n"
"++ more:\n%s\n"
"\n"
"++ RenderMode:\n%s\n"
"\n"
"++ Dsets:\n%s\n"
"\n",
SUMA_SurfContHelp_more, SUMA_SurfContHelp_RenderMode, SUMA_SurfContHelp_Dsets);
SS = SUMA_StringAppend_va(SS,
"+ Xhair Info Block:\n"
"\n"
"++ Xhr:\n%s\n"
"\n"
"++ Node:\n%s\n"
"\n"
"++ Tri:\n%s\n"
"\n"
"++ Node Values Table: %s\n"
"+++ Col. Intens\n%s\n"
"+++ Col. Thresh\n%s\n"
"+++ Col. Bright:\n%s\n"
"+++ Row Val:\n%s\n"
"\n"
"++ Node Label Table:\n"
"+++ Row Lbl:\n%s\n"
"\n",
SUMA_SurfContHelp_Xhr, SUMA_SurfContHelp_Node, SUMA_SurfContHelp_Tri,
SUMA_SurfContHelp_NodeValTblr0, SUMA_SurfContHelp_NodeValTblc1,
SUMA_SurfContHelp_NodeValTblc2, SUMA_SurfContHelp_NodeValTblc3,
SUMA_SurfContHelp_NodeValTblr0,
SUMA_SurfContHelp_NodeLabelTblr0);
SS = SUMA_StringAppend_va(SS,
"+ Dset Controls Block:\n"
"\n"
"++ Dset Info Table: \n"
"+++ Row Lbl:\n%s\n"
"+++ Row Par:\n%s\n"
"\n"
"++ Ord:\n%s\n"
"\n"
"++ Opa:\n%s\n"
"\n"
"++ Dim:\n%s\n"
"\n"
"++ view:\n%s\n"
"\n"
"++ Switch Dset:\n%s\n"
"\n",
SUMA_SurfContHelp_DsetLblTblr0, SUMA_SurfContHelp_DsetLblTblr1,
SUMA_SurfContHelp_DsetOrd, SUMA_SurfContHelp_DsetOpa, SUMA_SurfContHelp_DsetDim,
SUMA_SurfContHelp_DsetView, SUMA_SurfContHelp_DsetSwitch);
SS = SUMA_StringAppend_va(SS,
"++ Load Dset:\n%s\n"
"\n"
"++ Load Col:\n%s\n"
"\n",
SUMA_SurfContHelp_DsetLoad,
SUMA_SurfContHelp_DsetLoadCol);
SS = SUMA_StringAppend_va(SS,
"+ Dset Mapping Block:\n"
"\n"
"++ Mapping Data: \n"
"\n"
"+++ I\n%s\n"
"++++ v:\n%s\n"
"+++ T\n%s\n"
"++++ v\n%s\n"
"+++ B\n%s\n"
"++++ v\n%s\n"
"\n",
SUMA_SurfContHelp_SelInt, SUMA_SurfContHelp_SelIntTgl,
SUMA_SurfContHelp_SelThr, SUMA_SurfContHelp_SelThrTgl,
SUMA_SurfContHelp_SelBrt, SUMA_SurfContHelp_SelBrtTgl );
SS = SUMA_StringAppend_va(SS,
"++ Mapping Parameters Table:\n%s\n"
"+++ Col. Min\n%s\n"
"+++ Col. Max\n%s\n"
"+++ Row I\n%s\n"
"+++ Row B1\n%s\n"
"+++ Row B2\n%s\n"
"+++ Row C\n%s\n"
"\n",
SUMA_SurfContHelp_SetRngTbl_r0,
SUMA_SurfContHelp_SetRngTbl_c1, SUMA_SurfContHelp_SetRngTbl_c2,
SUMA_SurfContHelp_SetRngTbl_r1, SUMA_SurfContHelp_SetRngTbl_r2,
SUMA_SurfContHelp_SetRngTbl_r3, SUMA_SurfContHelp_SetRngTbl_r4);
SS = SUMA_StringAppend_va(SS,
"++ Col\n%s\n"
"\n"
"++ Bias\n%s\n"
"\n"
"Cmp\n%s\n"
"\n"
"New\n%s\n"
"\n"
"|T|\n%s\n"
"\n"
"sym I\n%s\n"
"\n"
"shw 0\n%s\n"
"\n",
SUMA_SurfContHelp_Col, SUMA_SurfContHelp_Bias, SUMA_SurfContHelp_Cmp,
SUMA_SurfContHelp_CmpNew, SUMA_SurfContHelp_AbsThr, SUMA_SurfContHelp_Isym,
SUMA_SurfContHelp_Shw0);
SS = SUMA_StringAppend_va(SS,
"++ Data Range Table:\n%s\n"
"\n"
"+++ Col Min\n%s\n"
"+++ Col Node\n%s\n"
"+++ Col Max\n%s\n"
"+++ Col Node\n%s\n"
"+++ Row I\n%s\n"
"+++ Row T\n%s\n"
"+++ Row B\n%s\n",
SUMA_SurfContHelp_RangeTbl_c0,
SUMA_SurfContHelp_RangeTbl_c1, SUMA_SurfContHelp_RangeTbl_c2,
SUMA_SurfContHelp_RangeTbl_c3, SUMA_SurfContHelp_RangeTbl_c4,
SUMA_SurfContHelp_RangeTbl_r1, SUMA_SurfContHelp_RangeTbl_r2,
SUMA_SurfContHelp_RangeTbl_r3);
SUMA_SS2S(SS, s);
SUMA_RETURN(s);
}
syntax highlighted by Code2HTML, v. 0.9.1