Hi, all,
Have to say, scale a Ternary Plot is a necessary fuction Origin should have provided.
After days of working on Origin C, now I have made the draft framework, which can run properly according to my usage.
Would like to share it with you and any improvement, debug, etc. are appreciated.
Copy and paste the following codes, complie it and call it by type
main in the script window.
Before you play it, you should have either a ternary plot or a worksheet contains 3 columns set as X Y Z.
_________________________________________________
#include <Origin.h>
#include <GetNBox.h>
bool myDialogOnChangeEvent(TreeNode& tr, int nRow, int nType, Dialog& Dlg);
bool ApplyOnClick(TreeNode& tr);
void main();
void ChangeScale(TreeNode& tr);
bool bScaled=FALSE, bXModi1=FALSE, bYModi1=FALSE, bZModi1=FALSE, bWksready=FALSE;
bool bXModi2=FALSE, bYModi2=FALSE, bZModi2=FALSE;
double dXInc=0.1,dX_from,dX_to,dY_from,dY_to,dZ_from,dZ_to,dYInc=0.1,dZInc=0.1;
double dX_from1,dY_from1,dZ_from1, dDivFactor;
Dataset dsO,dsC;
string strWindowName;
int iPageType;
Worksheet wks;
PageBase pb;
WorksheetPage wp;
GraphPage gp;
GraphLayer gl;
void main()
{
bXModi1=false;
bXModi2=false;
bYModi1=false;
bYModi2=false;
bZModi1=false;
bZModi2=false;
GETN_TREE(tr)
GETN_OPTION_GRIDLINE(flexGridRaisedVert)
GETN_BEGIN_BRANCH(X_axis,"X Axis")
GETN_OPTION_COLOR_LABEL(RGB(180,20,180))
GETN_OPTION_BRANCH(GETNBRANCH_OPEN | GETNBRANCH_KEEP_SIZE_ON_COLLAPSE)
GETN_STR(X_Title,"X Axis Title", "X")
GETN_OPTION_COLOR_LABEL(RGB(128,0,128))
GETN_NUM(X_From,"From:",0)
GETN_OPTION_COLOR_LABEL(RGB(128,0,128))
GETN_NUM(X_To, "To:", 100)
GETN_OPTION_COLOR_LABEL(RGB(128,0,128))
GETN_NUM(X_MajT, "Major Ticks:", 11)
GETN_OPTION_COLOR_LABEL(RGB(128,0,128))
GETN_NUM(X_MinT, "Minor Ticks:", 1)
GETN_OPTION_COLOR_LABEL(RGB(128,0,128))
GETN_END_BRANCH(X_axis)
GETN_BEGIN_BRANCH(Y_axis,"Y Axis")
GETN_OPTION_COLOR_LABEL(RGB(20,180,180))
GETN_OPTION_BRANCH(GETNBRANCH_OPEN | GETNBRANCH_KEEP_SIZE_ON_COLLAPSE)
GETN_STR(Y_Title,"Y Axis Title", "Y")
GETN_OPTION_COLOR_LABEL(RGB(0,128,128))
GETN_NUM(Y_From,"From:",0)
GETN_OPTION_COLOR_LABEL(RGB(0,128,128))
GETN_NUM(Y_To, "To:", 100)
GETN_OPTION_COLOR_LABEL(RGB(0,128,128))
GETN_NUM(Y_MajT, "Major Ticks:", 11)
GETN_OPTION_COLOR_LABEL(RGB(0,128,128))
GETN_NUM(Y_MinT, "Minor Ticks:", 1)
GETN_OPTION_COLOR_LABEL(RGB(0,128,128))
GETN_END_BRANCH(Y_axis)
GETN_BEGIN_BRANCH(Z_axis,"Z Axis")
GETN_OPTION_COLOR_LABEL(RGB(10,10,180))
GETN_OPTION_BRANCH(GETNBRANCH_OPEN | GETNBRANCH_KEEP_SIZE_ON_COLLAPSE)
GETN_STR(Z_Title,"Z Axis Title", "Z")
GETN_OPTION_COLOR_LABEL(COLOR_NAVY)
GETN_NUM(Z_From,"From:",0)
GETN_OPTION_COLOR_LABEL(COLOR_NAVY)
GETN_NUM(Z_To, "To:", 100)
GETN_OPTION_COLOR_LABEL(COLOR_NAVY)
GETN_NUM(Z_MajT, "Major Ticks:", 11)
GETN_OPTION_COLOR_LABEL(COLOR_NAVY)
GETN_NUM(Z_MinT, "Minor Ticks:", 1)
GETN_OPTION_COLOR_LABEL(COLOR_NAVY)
GETN_END_BRANCH(Z_axis)
GETN_BEGIN_BRANCH(MiscSet,"Misc Items (for all axis)")
GETN_OPTION_COLOR_LABEL(RGB(60,60,20))
GETN_OPTION_BRANCH(GETNBRANCH_OPEN | GETNBRANCH_KEEP_SIZE_ON_COLLAPSE)
GETN_CHECK(AxisCorner,"Axis Title at Corner",false)
GETN_OPTION_COLOR_LABEL(RGB(100,100,20))
GETN_STR(TickPrefix, "Tick Prefix", "")
GETN_OPTION_COLOR_LABEL(RGB(100,100,20))
GETN_STR(TickSuffix, "Tick Surfix", "")
GETN_OPTION_COLOR_LABEL(RGB(100,100,20))
GETN_NUM(DivFactor,"Divided by Factor", 1)
GETN_OPTION_COLOR_LABEL(RGB(100,100,20))
GETN_END_BRANCH(MiscSet)
pb = Project.Pages();
iPageType = pb.GetType();
if( iPageType != EXIST_WKS&&iPageType != EXIST_PLOT )
{
MessageBox( NULL, "Oh, please, are you sure you want sacle this?",
NULL , MB_OK|MB_ICONSTOP);
return ;
}
if ( iPageType == EXIST_WKS)
{
wp = (WorksheetPage) pb;
if( !wp.IsValid())
{
MessageBox( NULL, "WorksheetPage Error", NULL , MB_OK|MB_ICONSTOP);
return ;
}
wks = (Worksheet) wp.Layers(0);
if( !wks.IsValid() )
{
MessageBox( NULL, "Worksheet Error", NULL , MB_OK|MB_ICONSTOP);
return ;
}
strWindowName=wks.GetPage().GetName();
if(wks.GetNumCols()<3)
{
MessageBox( NULL, "At least 3 columns are needed.",NULL, MB_OK|MB_ICONSTOP);
return;
}
if(wks.GetNumCols()!=9&&wks.GetNumCols()>3)
{
if( MessageBox( GetWindow(), "Some columns will be cleared. Are you sure?",
"Warning!" , MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2 ) == IDNO )
return;
}
bWksready=(wks.GetNumCols()==9)*(wks.Columns(2).GetType()==5)*
(wks.Columns(5).GetType()==5)*(wks.Columns(8).GetType()==1);
while(wks.DeleteCol(6));
while(wks.GetNumCols()<9)wks.AddCol();
wks.SetColDesignations("XYZXYZNNN");
if(!bWksready){
dsO.Attach(wks,0);
dsC.Attach(wks,3);
dsC=dsO;
dsO.Detach();
dsC.Detach();
dsO.Attach(wks,1);
dsC.Attach(wks,4);
dsC=dsO;
dsO.Detach();
dsC.Detach();
dsO.Attach(wks,2);
dsC.Attach(wks,5);
dsC=dsO;
dsO.Detach();
dsC.Detach();
}
LT_execute("work -s 1 0 3 0");
LT_execute("work -p 245 ternary");
tr.X_axis.X_Title.strVal=LabTalk.xb.text$;
tr.Y_axis.Y_Title.strVal=LabTalk.yr.text$;
tr.Z_axis.Z_Title.strVal=LabTalk.zf.text$;
LabTalk.layer.x.label.pt=LabTalk.layer.y2.label.pt;
}
pb = Project.Pages();
gp = (GraphPage) pb;
if( !gp.IsValid() )
{
MessageBox( NULL, "GraphPage Error", NULL , MB_OK|MB_ICONSTOP);
return ;
}
gl = (GraphLayer) gp.Layers(0);
if(gl.GetCoordinateType() == FRAME_COOR_TERNARY)
{
GraphObject go=gl.GraphObjects("myX");
if(!go.IsValid()){
LT_execute("lab -p 105 105 -j 2 -n myX \\p118(X)");
LT_execute("myX.show=0");
LT_execute("lab -p 41 0 -j 0 -n myY \\p118(Y)");
LT_execute("myY.show=0");
LT_execute("lab -p (-10) 105 -j 2 -n myZ \\p118(Z)");
LT_execute("myZ.show=0");
}
go=gl.GraphObjects("Applied");
if(go.IsValid()){
DataPlot dpTemp=gl.DataPlots(0);
strWindowName=dpTemp.GetDatasetName();
strWindowName=strWindowName.GetToken(0,'_');
wp = Project.WorksheetPages(strWindowName);
wks = (Worksheet) wp.Layers(0);
if((wks.GetNumCols()==9)*(wks.Columns(2).GetType()==5)*
(wks.Columns(5).GetType()==5)*(wks.Columns(8).GetType()==1))
{
Column colTemp;
int iTemp;
double dTemp;
colTemp=wks.Columns(6);
iTemp=colTemp.GetUpperIndex();
dTemp=wks.Cell(0,8)+wks.Cell(0,7)+wks.Cell(iTemp,6);
dTemp=1.0/dTemp;
tr.X_axis.X_from.dVal=wks.Cell(0,6)*dTemp*100;
tr.X_axis.X_to.dVal=wks.Cell(iTemp,6)*dTemp*100;
tr.X_axis.X_MajT.nVal=iTemp+1;
tr.X_axis.X_MinT.nVal=LabTalk.layer.x.minorTicks;
colTemp=wks.Columns(7);
iTemp=colTemp.GetUpperIndex();
tr.Y_axis.Y_from.dVal=wks.Cell(0,7)*dTemp*100;
tr.Y_axis.Y_to.dVal=wks.Cell(iTemp,7)*dTemp*100;
tr.Y_axis.Y_MajT.nVal=iTemp+1;
tr.Y_axis.Y_MinT.nVal=LabTalk.layer.y.minorTicks;
colTemp=wks.Columns(8);
iTemp=colTemp.GetUpperIndex();
tr.Z_axis.Z_from.dVal=wks.Cell(0,8)*dTemp*100;
tr.Z_axis.Z_to.dVal=wks.Cell(iTemp,8)*dTemp*100;
tr.Z_axis.Z_MajT.nVal=iTemp+1;
tr.Z_axis.Z_MinT.nVal=LabTalk.layer.z.minorTicks;
tr.MiscSet.TickPrefix.strVal=LabTalk.layer.x.label.pre$;
tr.MiscSet.TickSuffix.strVal=LabTalk.layer.x.label.suf$;
tr.MiscSet.DivFactor.dVal=dTemp;
tr.MiscSet.AxisCorner.nVal=LabTalk.myX.show;
}
}
if(LabTalk.myX.show){
tr.X_axis.X_Title.strVal=LabTalk.myX.text$;
tr.Y_axis.Y_Title.strVal=LabTalk.myY.text$;
tr.Z_axis.Z_Title.strVal=LabTalk.myZ.text$;
}
else {
tr.X_axis.X_Title.strVal=LabTalk.xb.text$;
tr.Y_axis.Y_Title.strVal=LabTalk.yr.text$;
tr.Z_axis.Z_Title.strVal=LabTalk.zf.text$;
}
}
else
{MessageBox( NULL, "This is not a ternary plot.",NULL, MB_OK|MB_ICONSTOP);
return;
}
if( GetNBox(tr, "Scale the Ternary Plot", "Please specify the correct range [0-100]",
ApplyOnClick, myDialogOnChangeEvent)) ApplyOnClick(tr);
}
bool ApplyOnClick(TreeNode& tr)
{
LT_execute("lab -n Applied OK");
LT_execute("Applied.show=0");
dX_from=tr.X_axis.X_from.dVal;
dX_to=tr.X_axis.X_to.dVal;
dY_from=tr.Y_axis.Y_from.dVal;
dY_to=tr.Y_axis.Y_to.dVal;
dZ_from=tr.Z_axis.Z_from.dVal;
dZ_to=tr.Z_axis.Z_to.dVal;
dX_from1=dX_from+dZ_from+dY_to;
dY_from1=dY_from+dZ_from+dX_to;
double dTemp=dX_from+dY_from+dZ_to;
if(round(abs(dX_from1-dTemp),0)!=0||round(abs(dY_from1-dTemp),0)!=0
||round(abs(dX_from1-dY_from1),0)!=0){
MessageBox( NULL, "Please input correct values.", NULL , MB_OK|MB_ICONQUESTION);
bXModi1=false;
bXModi2=false;
bYModi1=false;
bYModi2=false;
bZModi1=false;
bZModi2=false;
return false;
}
foreach(DataPlot dp in gl.DataPlots)
{
strWindowName=dp.GetDatasetName();
strWindowName=strWindowName.GetToken(0,'_');
wp = Project.WorksheetPages(strWindowName);
wks = (Worksheet) wp.Layers(0);
if( !wks.IsValid() ) {
MessageBox( NULL, "WorksheetPage Error", NULL , MB_OK|MB_ICONSTOP);
return false;
}
if(wks.Columns(0).GetType()!=3||wks.Columns(1).GetType()!=0||wks.Columns(2).GetType()!=5)
{
MessageBox( NULL, "Types of first 3 columns should be X Y Z.",
NULL, MB_OK|MB_ICONSTOP);
return false;
}
if(wks.GetNumCols()!=9&&wks.GetNumCols()>3)
{
if( MessageBox( GetWindow(), "Some columns will be cleared. Are you sure?",
"Warning!" , MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2 ) == IDNO )
{
return false;
}
}
bWksready=(wks.GetNumCols()==9)*(wks.Columns(2).GetType()==5)*
(wks.Columns(5).GetType()==5)*(wks.Columns(8).GetType()==1);
while(wks.DeleteCol(6));
while(wks.GetNumCols()<9)wks.AddCol();
wks.SetColDesignations("XYZXYZNNN");
if(!bWksready){
dsO.Attach(wks,0);
dsC.Attach(wks,3);
dsC=dsO;
dsO.Detach();
dsC.Detach();
dsO.Attach(wks,1);
dsC.Attach(wks,4);
dsC=dsO;
dsO.Detach();
dsC.Detach();
dsO.Attach(wks,2);
dsC.Attach(wks,5);
dsC=dsO;
dsO.Detach();
dsC.Detach();
}
ChangeScale(tr);
}
return true
}
void ChangeScale(TreeNode& tr)
{
int iCount;
Column col;
string strTemp;
dDivFactor=tr.MiscSet.DivFactor.dVal;
if(dDivFactor<=0.0)dDivFactor=1.0;
double dTemp=dX_from+dY_from+dZ_to;
dX_from=dX_from/dTemp;
dX_to=dX_to/dTemp;
dY_from=dY_from/dTemp;
dY_to=dY_to/dTemp;
dZ_from=dZ_from/dTemp;
dZ_to=dZ_to/dTemp;
if(tr.X_axis.X_MajT.nVal<2) tr.X_axis.X_MajT.nVal=2;
if(tr.Y_axis.Y_MajT.nVal<2) tr.Y_axis.Y_MajT.nVal=2;
if(tr.Z_axis.Z_MajT.nVal<2) tr.Z_axis.Z_MajT.nVal=2;
dXInc=(dX_to-dX_from)/(tr.X_axis.X_MajT.nVal-1);
dYInc=(dY_to-dY_from)/(tr.Y_axis.Y_MajT.nVal-1);
dZInc=(dZ_to-dZ_from)/(tr.Z_axis.Z_MajT.nVal-1);
for(iCount=0;iCount<tr.X_axis.X_MajT.nVal;iCount++)
wks.SetCell(iCount,6,(dX_from+dXInc*iCount)/dDivFactor);
for(iCount=0;iCount<tr.Y_axis.Y_MajT.nVal;iCount++)
wks.SetCell(iCount,7,(dY_from+dYInc*iCount)/dDivFactor);
for(iCount=0;iCount<tr.Z_axis.Z_MajT.nVal;iCount++)
wks.SetCell(iCount,8,(dZ_from+dZInc*iCount)/dDivFactor);
dTemp=wks.Cell(0,3)+wks.Cell(0,4)+wks.Cell(0,5);
dsO.Attach(wks,3);
dsC.Attach(wks,0);
dsC=(dsO-dX_from*dTemp)/(dX_to-dX_from);
dsO.Detach();
dsC.Detach();
dsO.Attach(wks,4);
dsC.Attach(wks,1);
dsC=(dsO-dY_from*dTemp)/(dY_to-dY_from);
dsO.Detach();
dsC.Detach();
dsO.Attach(wks,5);
dsC.Attach(wks,2);
dsC=(dsO-dZ_from*dTemp)/(dZ_to-dZ_from);
dsO.Detach();
dsC.Detach();
col = wks.Columns(6);
strTemp.Format("%s_%s",strWindowName,col.GetName());
LabTalk.layer.x.label.dataset$=strTemp;
LabTalk.layer.x.label.type=8;
LabTalk.layer.x.inc=1.0/(tr.X_axis.X_MajT.nVal-1);
LabTalk.layer.x.minorTicks=tr.X_axis.X_MinT.nVal;
LabTalk.layer.x.label.pre$=tr.MiscSet.TickPrefix.strVal;
LabTalk.layer.x.label.suf$=tr.MiscSet.TickSuffix.strVal;
LabTalk.layer.x.label.pt=LabTalk.layer.y2.label.pt;
if(!tr.MiscSet.AxisCorner.nVal){
strTemp.Format("lab -xb \"%s\"",tr.X_axis.X_Title.strVal);
LT_execute("xb.show=1");
LT_execute("myX.show=0");
}
else {
strTemp.Format("lab -n myX \"%s\"",tr.X_axis.X_Title.strVal);
LT_execute("xb.show=0");
LT_execute("myX.show=1");
}
LT_execute(strTemp);
col = wks.Columns(7);
strTemp.Format("%s_%s",strWindowName,col.GetName());
LabTalk.layer.y2.label.dataset$=strTemp;
LabTalk.layer.y2.label.type=8;
LabTalk.layer.y2.inc=1.0/(tr.Y_axis.Y_MajT.nVal-1);
LabTalk.layer.y2.minorTicks=tr.Y_axis.Y_MinT.nVal;
LabTalk.layer.y2.label.pre$=tr.MiscSet.TickPrefix.strVal;
LabTalk.layer.y2.label.suf$=tr.MiscSet.TickSuffix.strVal;
if(!tr.MiscSet.AxisCorner.nVal){
strTemp.Format("lab -yr \"%s\"",tr.Y_axis.Y_Title.strVal);
LT_execute("yr.show=1");
LT_execute("myY.show=0");
}
else {
strTemp.Format("lab -n myY \"%s\"",tr.Y_axis.Y_Title.strVal);
LT_execute("yr.show=0");
LT_execute("myY.show=1");
}
LT_execute(strTemp);
col = wks.Columns(8);
strTemp.Format("%s_%s",strWindowName,col.GetName());
LabTalk.layer.z.label.dataset$=strTemp;
LabTalk.layer.z.label.type=8;
LabTalk.layer.z.inc=1.0/(tr.Z_axis.Z_MajT.nVal-1);
LabTalk.layer.z.minorTicks=tr.Z_axis.Z_MinT.nVal;
LabTalk.layer.z.label.pre$=tr.MiscSet.TickPrefix.strVal;
LabTalk.layer.z.label.suf$=tr.MiscSet.TickSuffix.strVal;
if(!tr.MiscSet.AxisCorner.nVal){
strTemp.Format("lab -zf \"%s\"",tr.Z_axis.Z_Title.strVal);
LT_execute("zf.show=1");
LT_execute("myZ.show=0");
}
else{
strTemp.Format("lab -n myZ \"%s\"",tr.Z_axis.Z_Title.strVal);
LT_execute("zf.show=0");
LT_execute("myZ.show=1");
}
LT_execute(strTemp);
bXModi1=false;
bXModi2=false;
bYModi1=false;
bYModi2=false;
bZModi1=false;
bZModi2=false;
}
bool myDialogOnChangeEvent(TreeNode& tr, int nRow, int nType, Dialog& Dlg)
{
if(nType != TRGP_DOUBLE||nRow==-1)
return false;
if(nRow==2) bXModi1=true;
if(nRow==3) bXModi2=true;
if(nRow==8) bYModi1=true;
if(nRow==9) bYModi2=true;
if(nRow==14)bZModi1=true;
if(nRow==15)bZModi2=true;
if(bXModi1*bXModi2*bYModi1*bYModi2*!(bZModi1*bZModi2)){
dX_from=tr.X_axis.X_from.dVal;
dX_to=tr.X_axis.X_to.dVal;
dY_from=tr.Y_axis.Y_from.dVal;
dY_to=tr.Y_axis.Y_to.dVal;
dZ_from=100.0-dX_from-dY_to;
dZ_from1=100.0-dX_to-dY_from;
dZ_to=100.0-dX_from-dY_from;
if(dZ_from<0||dZ_to<0||round(abs(dZ_from1-dZ_from),0)!=0) {
MessageBox( NULL, "Please input correct values.", NULL , MB_OK|MB_ICONQUESTION);
bXModi1=false;
bXModi2=false;
bYModi1=false;
bYModi2=false;
bZModi1=false;
bZModi2=false;
return false;
}
tr.Z_axis.Z_from.dVal=dZ_from;
tr.Z_axis.Z_to.dVal=dZ_to;
bXModi1=false;
bXModi2=false;
bYModi1=false;
bYModi2=false;
bZModi1=false;
bZModi2=false;
return true;
}
if(bXModi1*bXModi2*bZModi1*bZModi2*!(bYModi1*bYModi2)){
dX_from=tr.X_axis.X_from.dVal;
dX_to=tr.X_axis.X_to.dVal;
dZ_from=tr.Z_axis.Z_from.dVal;
dZ_to=tr.Z_axis.Z_to.dVal;
dY_from=100.0-dX_from-dZ_to;
dY_from1=100.0-dZ_from-dX_to;
dY_to=100.0-dX_from-dZ_from;
if(dY_from<0||dY_to<0||round(abs(dY_from1-dY_from),0)!=0) {
MessageBox( NULL, "Please input correct values.", NULL , MB_OK|MB_ICONQUESTION);
bXModi1=false;
bXModi2=false;
bYModi1=false;
bYModi2=false;
bZModi1=false;
bZModi2=false;
return false;
}
tr.Y_axis.Y_from.dVal=dY_from;
tr.Y_axis.Y_to.dVal=dY_to;
bXModi1=false;
bXModi2=false;
bYModi1=false;
bYModi2=false;
bZModi1=false;
bZModi2=false;
return true;
}
if(bYModi1*bYModi2*bZModi1*bZModi2*!(bXModi1*bXModi2)){
dY_from=tr.Y_axis.Y_from.dVal;
dY_to=tr.Y_axis.Y_to.dVal;
dZ_from=tr.Z_axis.Z_from.dVal;
dZ_to=tr.Z_axis.Z_to.dVal;
dX_from=100.0-dY_from-dZ_to;
dX_from1=100.0-dZ_from-dY_to;
dX_to=100.0-dY_from-dZ_from;
if(dX_from<0||dX_to<0||round(abs(dX_from1-dX_from),0)!=0) {
MessageBox( NULL, "Please input correct values.", NULL , MB_OK|MB_ICONQUESTION);
bXModi1=false;
bXModi2=false;
bYModi1=false;
bYModi2=false;
bZModi1=false;
bZModi2=false;
return false;
}
tr.X_axis.X_from.dVal=dX_from;
tr.X_axis.X_to.dVal=dX_to;
bXModi1=false;
bXModi2=false;
bYModi1=false;
bYModi2=false;
bZModi1=false;
bZModi2=false;
return true;
}
return false;
}