⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 omat.c

📁 图像处理的压缩算法
💻 C
📖 第 1 页 / 共 2 页
字号:
/*------------------------------------------------------------------------------*
 * 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 + -