【お知らせ】この部分は英語原文のみでの提供となります。何卒ご了承ください。
2.2.4.8.5 DataPlot::ExtractContourData
Contents
Description
Extract the data of contour lines in the contour plot.
Syntax
int ExtractContourData(vector& vX, vector& vY, vector<int>& vCounts, vector& vLevels)
Parameters
- vX
- [output] X values of the extracted contour data.
- vY
- [output] Y values of the extracted contour data.
- vCounts
- [output] the number of the extracted contour data points for each level.
- vLevels
- [output] the value of each level.
Return
If success, return the number of levels, otherwise return 0.
Examples
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 }
Remark
See Also
Header to Include
origin.h