Hi xgu,
I presume you are referring to the image plot that can be created from a matrix (menu item Plot->Image Plot with matrix active).
If so, you can use code such as posted below.
A few notes:
-> The image plot has 256 fixed levels.
-> Colors can be assigned arbitrary to these levels using any desired mapping/formula for R, G, B
-> Colors can also be read from a palette file
-> The colormap property can be read as a tree object in OC and then can be set back to the data plot to apply changes
-> Need to use appropriate offset constant to color to indicate to Origin how to interpret the color values - for this plot type, the constant is OCOLOR_RGB_FLAG_BIT - these constants are defined in OC_CONST.h
The code below is very similar to how one can set color map for contour plots, and an example of manipulating contour plots can be found at:
http://originlab.com/index.aspx?s=9&lm=71&pid=268
(see the Customize Contour Plot example under Graphing)
Hope this helps.
Easwar
OriginLab
void image_plot_set_colormap()
{
// Point to active graph layer
GraphLayer gly = Project.ActiveLayer();
if( !gly ) return;
// Check to ensure first plot in layer is a matrix image plot
StyleHolder sh = gly.StyleHolders(0);
if( sh.GetPlotId() != IDM_PLOT_MATRIX_IMAGE )
return;
DataPlot dp = gly.DataPlots(0);
if( !dp ) return;
// Get colormap
Tree tr;
dp.GetColormap(tr);
// The colormap for matrix image plot has 256 fixed levels
// Declare R, G, B vectors to hold color info
vector<uint> vecR(256), vecG(256), vecB(256);
// You can fill these vectors with any color scheme that you desire
// by directly assigning values to vector such as
// for(int i = 0; i < nLevels; i++)
//{
// vecR[i] = 256* i / nLevels; // linear in R
// vecG[i] = 256 * i^2 / nLevels^2; // power of 2 in G
// vecB[i] = 128 + 128 * sin(2 * Pi * i / nLevels) ; // sinusoidal in B
//}
// For this example, let us read the colors from a palette file instead
// In this example, let us read in a binary palette file that has 256 colors
// Origin ships with three palette files, one of which is rainbow
string strPaletteFile = GetAppPath(TRUE) + "Palettes\\Rainbow.PAL";
// Call function to read binary palette file
int iRet = read_palette(strPaletteFile, vecR, vecG, vecB);
if( iRet < 0 )
{
out_str("Error reading palette file!");
return;
}
if( iRet != 256 )
out_str("Palette file contained less than 256 colors!");
// Now that R, G, B vectors are ready, need to combine them into one vector to set
// colors for the colormap
vector<uint> vecColors(256);
for(int i = 0; i < 256; i++)
vecColors[i] = vecR[i] + 256 * vecG[i] + 65536 * vecB[i] + OCOLOR_RGB_FLAG_BIT;
// The constant OCOLOR_RGB_FLAG_BIT tells Origin to treat the color map in
// accordance with what is needed for the image plot coloring
// Now set the colormpa to the tree
tr.Details.Colors.nVals = vecColors;
// Set the dataplot using modified tree
dp.SetColormap(tr);
// Refresh graph page (may not be required)
gly.GetPage().Refresh();
}
/////////////////////////////////////////////////////////////////////////////////////
// This function reads the color map from a binary palette file - the format for the
// binary file is same as the Microsoft Palette file
//
static int read_palette(string strFileName, vector<uint>& vecR, vector<uint>& vecG, vector<uint>& vecB)
{
bool bRet;
int ierr;
file ff;
bRet = ff.Open(strFileName, file::modeRead);
if(!bRet) return -1;
// first read header information that includes some text
// plus information on file size etc.
int ijunk;
ierr = ff.Read(&ijunk,4); // read and discard "RIFF"
int isize;
ierr = ff.Read(&isize,4); // read file size
ierr = ff.Read(&ijunk,4); // read and discard "PAL "
ierr = ff.Read(&ijunk,4); // read and discard "data"
ierr = ff.Read(&isize,4); // read size
short nShort;
ierr = ff.Read(&nShort,2); // read short
short nCols;
ierr = ff.Read(&nCols,2); // read num colors
if (nCols < 2 | nCols > 256)
{
bRet = ff.Close();
return -1;
}
// now read icol entries of the color map
for (int ii=0; ii < nCols; ii++)
{
uint ivalue;
ierr = ff.Read(&ivalue,4);
vecB[ii] = (int) (ivalue / (256 * 256));
ivalue = ivalue - vecB[ii] * 256 * 256;
vecG[ii] = (int) (ivalue / 256);
vecR[ii] = ivalue - vecG[ii] * 256;
}
// close file
bRet = ff.Close();
if(!bRet) return -1;
return nCols;
}
Edited by - easwar on 06/14/2006 10:43:59 AM