Add multiple dataplots onto graphlayer
int AddPlots( TreeNode & tr, DWORD dwOptions = 0 )
total number of data plots in the layer
EX1
// Keep a graph window is active with at least two plots and run "GraphLayer_AddPlots_ex1 1 1" void GraphLayer_AddPlots_ex1(int nPlot, bool bRegroup = false) { GraphLayer gl = Project.ActiveLayer(); if(!gl) return; Tree tr; bool bWasGroup = gl.UngroupPlots(); gl.GetLayerContents(tr, GETLC_DATAPLOTS | GETLC_NO_LIMITS); if(dataplots_move_row_to_bottom_top(tr.FirstNode, nPlot)) { gl.AddPlots(tr.FirstNode, ADDPLOTSFROMTREE_EDIT | ADDPLOTSFROMTREE_IMPLICIT_STYLEHOLDERS); if(bWasGroup && bRegroup) gl.GroupPlots(0); gl.LT_execute("legend -s");// this will force the legend to update gl.GetPage().Refresh(); } } static bool dataplots_move_row_to_bottom_top(TreeNode& tr, int nRow, bool bMoveToTopOfTree = true) { Tree trTemp; TreeNode tr1stPlot;// for the case of bMoveToTopOfTree int nCount = 0; string strName; string strPrefix; foreach(TreeNode trNode in tr.Children) { strName = trNode.tagName; int nIndex = string_to_prefix_end_number(strPrefix.GetBuffer(MAXLINE), strName); strPrefix.ReleaseBuffer(); if(strPrefix.CompareNoCase("DataPlot") != 0) continue; if(!tr1stPlot) tr1stPlot = trNode;// remember 1st DataPlot node for insert later // top level if(nRow == nCount) { trTemp = trNode; // make copy tr.RemoveChild(trNode); break; } nCount++; } if(trTemp) { if(!bMoveToTopOfTree) // bottom of tree, then top of plot list tr.AddNode(trTemp.Clone()); else // move to bottom of plot list, which means top of the tree { if(!tr1stPlot) { out_str("No data plot in layer, nothing to move"); return false; } TreeNode tr1 = tr.InsertNode(tr1stPlot, "Junk");// tagName does not matter, will be replaced later tr1.Replace(trTemp.Clone()); } return true; } return false; }
Update the layer contents with a tree which has been properly constructed, maybe from GetLayerContents
A graph layer has both DataPlots and StyleHolders. When ADDPLOTSFROMTREE_EDIT is used to update the contents of a layer, the supplied tree is
interpreted to contain complete info on the layer, so that removal of a data plot can be achieved by deleting the corresponding tree node in the
layer contents tree obtained from a call to GetLayerContents. If GetLayerContents was called without the GETLC_STYLE_HOLDERS bit, the resulting
tree will not have any style holder, and thus the AddPlots call with ADDPLOTSFROMTREE_EDIT would naturally remove all the style holders in the layer
as they are not present in the tree. To prevent this from happening, you need to add the ADDPLOTSFROMTREE_IMPLICIT_STYLEHOLDERS to the AddPlots call.
origin.h