📄 omat.c
字号:
/*------------------------------------------------------------------------------*
* File Name: OMat.c *
* Creation: GJL 5/13/02 *
* Purpose: Origin C file implementing matrix related dialogs *
* Copyright (c) OriginLab Corp. 2002-2007 *
* All Rights Reserved *
* *
* Modification Log: *
*------------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////////
// Included header files
//////////////////////////////////////////////////////////////////////////////////
//
// System includes
#include <Origin.h> // Origin C constants
// Include needed Origin C utility functions
#include "App_Utils.h"
#include "Wks_Utils.h"
// Include definitions of OMat constants, non-localized strings, and function prototypes
#include "OMat.h"
////////////////////////////////////////////////////////////////////////////////////
/**
HLOC function to directly convert an Origin worksheet or Excel workbook range
selection to a matrix.
Example:
See the OnClickConvert function in OMatDlgDMC.c for a sample call.
Parameters:
trDMC=Input DirectMatConvert tree containing all dialog settings
Return:
Returns DMC_NO_ERROR on success and a DMC_ERROR code on failure.
*/
int ConvertWksToMatrixDirect(Tree& trDMC)
{
// *** Declare local variables ***
string strMsg, strWinName;
int iDataFormat, iReturn;
MatrixPage mpOut; // Newly created output matrix page
// *** Combine relevant checkbox items into bitwise variable ***
if( trDMC.xVariesAcrossCols.nVal == 1 )
iDataFormat=1 + 2*trDMC.xInRow1.nVal + 4*trDMC.yInCol1.nVal;
else
iDataFormat=0 + 2*trDMC.xInCol1.nVal + 4*trDMC.yInRow1.nVal;
// *** Create output matrix ***
strWinName = CreateWindow("Origin.OTM", CREATE_HIDDEN);
mpOut = Project.MatrixPages(strWinName);
// *** Call main function to convert worksheet/workbook selection range to matrix ***
iReturn = convert_wks_to_matrix_direct(trDMC.SelRange.strVal, iDataFormat, mpOut);
// *** Process iReturn error codes ***
switch( iReturn )
{
// Process Escape
case DMC_ESCAPE:
if( mpOut.IsValid() )
mpOut.Destroy();
return iReturn;
break;
// Process no error
case DMC_NO_ERROR:
mpOut.SetShow(); // Show matrix window
return iReturn;
break;
// Process input range specification error
case DMC_WKS_SEL_ERROR:
if( mpOut.IsValid() )
mpOut.Destroy();
strMsg = _L(DMC_WKS_SEL_ERROR_MSG);
strMsg.Write(WRITE_MESSAGE_BOX); // Else bad selection so give error message
return iReturn;
break;
// Process input worksheet/workbook and pre-output matrix errors
case DMC_INPUT_WKS_PAGE_ERROR:
case DMC_INPUT_ORIGIN_WKSHT_ERROR:
case DMC_INPUT_EXCEL_WKSHT_ERROR:
case DMC_UPDATE_ORIGIN_ERROR:
if( mpOut.IsValid() )
mpOut.Destroy();
strMsg = _L(DMC_INPUT_WKS_ERROR_MSG);
strMsg.Write(WRITE_MESSAGE_BOX);
return iReturn;
break;
// Process output matrix errors
case DMC_CPY_WKS_TO_MAT_ERROR:
case DMC_TRANSPOSE_MATRIX_ERROR:
case DMC_ATTACH_OUTPUT_MAT_ERROR:
case DMC_SUB_MAT_ERROR:
if( mpOut.IsValid() )
mpOut.Destroy();
strMsg = _L(DMC_OUTPUT_MAT_ERROR_MSG);
strMsg.Write(WRITE_MESSAGE_BOX);
return iReturn;
break;
}
// *** Process iReturn warning codes if any ***
if( iReturn & DMC_XMAP_WARNING )
{
strMsg = _L(DMC_XMAP_WARNING_MSG);
strMsg.Write(WRITE_MESSAGE_BOX);
}
if( iReturn & DMC_YMAP_WARNING )
{
strMsg = _L(DMC_YMAP_WARNING_MSG);
strMsg.Write(WRITE_MESSAGE_BOX);
}
// *** Show matrix window ***
mpOut.SetShow();
return DMC_NO_ERROR; // Reset error flag after warnings are made
}
/**
LLOC function to directly convert an Origin worksheet or Excel workbook range
selection to a matrix according to a bitwise data format description code.
Example:
See the ConvertWksToMatrixDirect function in OMat.c for a sample call.
Parameters:
strWksSelection=Input worksheet/workbook range selection string like "Worksheet_A[1]:B[7]" or
"[Book1]Sheet1!$A$1:$B$7"
iDataFormat=Bitwise data format description: Bit 0=1 X varies across columns or Bit 0=0 Y varies
across columns, Bit 1=1 First row contains X/Y values, Bit 2=1 First column contains X/Y values
mpOut=Output matrix page
Return:
Returns DMC_NO_ERROR and a valid matrix page on success or a DMC_ERROR code on failure.
*/
int convert_wks_to_matrix_direct(string strWksSelection, int iDataFormat, MatrixPage& mpOut)
{
string strWksName, strSheetName;
int iC1, iC2, iR1, iR2, ii, jj, iReturn;
double dDelta;
vector vXMap, vYMap;
WorksheetPage wpIn;
Worksheet wksIn;
PageBase pbActiveWindow;
matrix mTemp;
Matrix matOut;
MatrixLayer mlOut;
waitCursor wcCursor; // Put up a wait cursor and allow escape (on Esc key)
iReturn = DMC_NO_ERROR;
// *** Parse input worksheet/workbook range selection string ***
if( !wuParseWksSelection(strWksSelection, strWksName, strSheetName, iC1, iC2, iR1, iR2) )
return DMC_WKS_SEL_ERROR;
// *** Attach to input worksheet/workbook page containing selected data range ***
wpIn = Project.WorksheetPages(strWksName);
if( !wpIn.IsValid() )
return DMC_INPUT_WKS_PAGE_ERROR;
// *** Attach to Origin worksheet layer or Excel workbook sheet containing selected data range ***
if( strSheetName.IsEmpty() )
{
// If Origin worksheet...
wksIn = (Worksheet) wpIn.Layers(); // Get Origin worksheet object (by default)
if( !wksIn.IsValid() )
return DMC_INPUT_ORIGIN_WKSHT_ERROR;
}
else
{
// Else Excel workbook...
wksIn = (Worksheet) wpIn.Layers(strSheetName); // Get Excel workbook sheet object (by name)
if( !wksIn.IsValid() )
return DMC_INPUT_EXCEL_WKSHT_ERROR;
// Update Origin from Excel
if( !wksIn.UpdateOrigin() )
return DMC_UPDATE_ORIGIN_ERROR;
}
if( wcCursor.CheckEsc() )
return DMC_ESCAPE; // Quit if user hits Esc key
// *** Copy worksheet/workbook range to a temporary Origin C matrix ***
if( !mTemp.CopyFromWks(wksIn, iC1, iC2, iR1, iR2) )
return DMC_CPY_WKS_TO_MAT_ERROR;
if( wcCursor.CheckEsc() )
return DMC_ESCAPE; // Quit if user hits Esc key
// *** If Y varies across columns transpose matrix ***
if( !(iDataFormat & 1) )
if( !mTemp.Transpose() )
return DMC_TRANSPOSE_MATRIX_ERROR;
if( wcCursor.CheckEsc() )
return DMC_ESCAPE; // Quit if user hits Esc key
// *** Get X-column and Y-row maps into vectors ***
ii = 0; // Assume first row of matrix does not contain X Map
jj = 0; // Assume first column of matrix does not contain Y Map
if( iDataFormat & 2 )
{
// If first row of matrix contains X map...
ii = 1; // Set flag to remove row 0 with GetSubMatrix
mTemp.GetRow(vXMap, 0); // Copy first row of matrix into vector
}
if( iDataFormat & 4 )
{
// If first column of matrix contains Y map...
jj = 1; // Set flag to remove column 0 with GetSubMatrix
mTemp.GetColumn(vYMap, 0); // Copy first column of matrix into vector
}
if( wcCursor.CheckEsc() )
return DMC_ESCAPE; // Quit if user hits Esc key
// *** Get active internal Origin matrix layer, then attach to OriginC Matrix object ***
if( !mpOut.IsValid() )
return DMC_ATTACH_OUTPUT_MAT_ERROR;
mlOut = (MatrixLayer) mpOut.Layers();
if( !mlOut.IsValid() )
return DMC_ATTACH_OUTPUT_MAT_ERROR;
matOut.Attach(mlOut);
if( !matOut.IsValid() )
return DMC_ATTACH_OUTPUT_MAT_ERROR;
// *** Copy temporary matrix to output matrix removing XY data if needed ***
if( !mTemp.GetSubMatrix(matOut, jj, -1, ii, -1) )
return DMC_SUB_MAT_ERROR;
if( wcCursor.CheckEsc() )
return DMC_ESCAPE; // Quit if user hits Esc key
// *** Assign X-column map ***
matOut.SetXMin(1); // Assume a 1 to NumCols X-column map
matOut.SetXMax(matOut.GetNumCols());
if(ii)
{
// If first row of matrix contained X map...
if( wuVectorHasUniformSpacing(dDelta, vXMap, DMC_UNIFORM_SPACING_TOL, jj) )
{
// If X map has uniform spacing (within tolerance)...
matOut.SetXMin(vXMap[jj]); // If first column was Y map use jj=1 else use jj=0 as min X
matOut.SetXMax(vXMap[vXMap.GetSize() - 1]); // Always use last element as max X
}
else
iReturn += DMC_XMAP_WARNING;
}
if( wcCursor.CheckEsc() )
return DMC_ESCAPE; // Quit if user hits Esc key
// *** Assign Y-row map ***
matOut.SetYMin(1); // Assume 1 to NumRows Y-row map
matOut.SetYMax(matOut.GetNumRows());
if(jj)
{
// If first column of matrix contained Y map...
if( wuVectorHasUniformSpacing(dDelta, vYMap, DMC_UNIFORM_SPACING_TOL, ii) )
{
// If Y map has uniform spacing (within tolerance)...
matOut.SetYMin(vYMap[ii]); // If first row was X map use ii=1 else use ii=0 as min Y
matOut.SetYMax(vYMap[vYMap.GetSize() - 1]); // Always use last element as max Y
}
else
iReturn += DMC_YMAP_WARNING;
}
if( wcCursor.CheckEsc() )
return DMC_ESCAPE; // Quit if user hits Esc key
// *** Set page label and Show (activate) internal Origin matrix page ***
strWksSelection.TrimLeft();
strWksSelection.TrimRight();
mpOut.Label = _L(DMC_MATRIX_PAGE_LABEL) + strWksSelection; // Set matrix page label
LabTalk.Page.title=3; // Display both matrix name and label
return iReturn;
}
/**
Create and initialize a DirectMatConvert tree.
Return:
Returns a newly created DirectMatConvert tree.
*/
Tree CreateDirectMatConvertTree()
{
// *** Create tree and nodes ***
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -