Extract the data of contour lines in the contour plot.
int ExtractContourData(vector& vX, vector& vY, vector<int>& vCounts, vector& vLevels)
If success, return the number of levels, otherwise return 0.
EX1
This example shows how to use this method to extract contour lines from a contour plot, and then put the data to a worksheet. Also, the function ocmath_d_polygon_area is used to calculate the area of the extracted contour lines.
// To run this example, import the data "<Origin Installation Directory>\Samples // \Matrix Conversion and Gridding\3D XYZ.dat" first. Then set column C as Z column // and highlight it to make a contour graph by selecting menu "Plot: Contour: XYZ Contour". // Activate this graph. #include <ocmath.h> // need to include this header file for using ocmath_d_polygon_area void DataPlot_ExtractContourData_ex1() { GraphLayer gl = Project.ActiveLayer(); // get the active graph if(!gl) { out_str("Get no graph!"); return; } DataPlot dp = gl.DataPlots(0); // get the data plot vector vX, vY, vLevels; vector<int> vCounts; int nRet = dp.ExtractContourData(vX, vY, vCounts, vLevels); // extract contour data of the plot // if success, put contour data to worksheet if(nRet>0) { WorksheetPage wp; // create workbook wp.Create(); Worksheet wks = wp.Layers(0); // get worksheet if(!wks) { out_str("Get no worksheet!"); return; } // loop all levels for(int iLevel=0; iLevel<vLevels.GetSize(); iLevel++) { vector vOutputX, vOutputY; int nSize = vCounts[iLevel]; vOutputX.SetSize(nSize); vOutputY.SetSize(nSize); // get specific level data if(get_specific_level(iLevel, vX, vY, vCounts, vLevels, vOutputX, vOutputY, nSize)) { // calculate area, use fabs function to avoid negative area double dArea = fabs(ocmath_d_polygon_area(vOutputX, vOutputY, nSize)); // set data to worksheet set_specific_level_to_worksheet(wks, vOutputX, vOutputY, vLevels, iLevel, dArea); } } } } // get data of specific level from the extracted contour data // iLevel: int, specific level // vInputXs, vInputYs: vector, the extracted contour data // vCounts: vector, nubmer of points in each level // vLevels: vector, Z values of each level // vOutputX, vOutputY: vector&, data of the specific level // nSize: int, number of data in the specific level bool get_specific_level(int iLevel, vector vInputXs, vector vInputYs, vector vCounts, vector vLevels, vector& vOutputX, vector& vOutputY, int nSize) { if(iLevel>=vLevels.GetSize() || iLevel<0) // invalid level index, return false { out_str("Invalid iLevel!"); return false; } int nBeginIndex = 0; // begin index of the specific level in the extracted contour data if(iLevel != 0) // set begin index according to the specific level { for(int iCount=0; iCount<iLevel; iCount++) nBeginIndex = nBeginIndex + vCounts[iCount]; } for(int iIndex=0; iIndex<nSize; iIndex++) // get data of the specific level { vOutputX[iIndex] = vInputXs[nBeginIndex+iIndex]; vOutputY[iIndex] = vInputYs[nBeginIndex+iIndex]; } return true; } // set the data of specific level to worksheet, including data points, Z values of the levels, and areas // wks: Worksheet, data will be put to this worksheet // vX, vY: vector, data points of specific level // vLevels: vector, Z values of all levels // iLevel: int, the specific level index // dArea: double, the area of the specific level void set_specific_level_to_worksheet(Worksheet wks, vector vX, vector vY, vector vLevels, int iLevel, double dArea) { // add two columns for spcific level data int nColX = wks.AddCol(); int nColY = wks.AddCol(); bool bLabel = false; // use for checking whether exist Z-Level & Area label Grid grid; // grid of the worksheet grid.Attach(wks); vector<string> vsLabelNames; if(grid.GetUserDefinedLabelNames(vsLabelNames)) // get all user-defined label names { for(int iName=0; iName<vsLabelNames.GetSize(); iName++) { // if exist Z-Level or Area label if(0 == vsLabelNames[iName].CompareNoCase("Z-Level") || 0 == vsLabelNames[iName].CompareNoCase("Area")) { bLabel = true; break; } } } if(!bLabel) // not exist Z-Level and Area label, create them { vector<int> vnTypes = {RCLT_UDL, RCLT_UDL+1}; grid.SetShowLabels(vnTypes); vector<string> vsLabel = {"Z-Level", "Area"}; grid.SetUserDefinedLabelNames(vsLabel); } // set data to created two columns XYRange xyDr; xyDr.Add(wks, nColX, "X"); xyDr.Add(wks, nColY, "Y"); xyDr.SetData(&vY, &vX); Column colX = wks.Columns(nColX); // X column Column colY = wks.Columns(nColY); // Y column colX.SetType(OKDATAOBJ_DESIGNATION_X); // set type to X colX.SetExtendedLabel((string)vLevels[iLevel], RCLT_UDL); // set Z-Level value colX.SetExtendedLabel((string)dArea, RCLT_UDL+1); // set area colY.SetExtendedLabel((string)vLevels[iLevel], RCLT_UDL); // set Z-Level value colY.SetExtendedLabel((string)dArea, RCLT_UDL+1); // set area }
origin.h