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

📄 wks_utils.c

📁 图像处理的压缩算法
💻 C
📖 第 1 页 / 共 4 页
字号:
		// str=="1:$B$7"
		ii = str.Find(':');              // Find : character
		if( ii < 0 )                     // If no : return error
			return FALSE;
		strRow = str.Left(ii);           // Get first row number (as string)
		iR1 = atoi( strRow ) - 1;        // Get first row number (as integer, subtract 1 for 0 based offset )
		strRow.Format( "%d", iR1 + 1 );  // Rebuild strRow (as string from integer) for check
		if( strRow.Compare( str.Left(ii) ) ) // If not same return error 
			return FALSE;
		str = str.Mid( ii + 1 );         // Strip off first row number and : character
		
		// str=="$B$7"
		ii = str.Find('$');              // Find third $ character		
		if( ii != 0 )                    // If $ is not next character return error
			return FALSE;
		str = str.Mid( ii + 1 );         // Strip off third $ character
		
		// str=="B$7"
		ii = str.Find('$');              // Find fourth $ character
		if( ii < 0 )                     // If no $ return error
			return FALSE;
		strCol = str.Left(ii);           // Get name of second column
		if( !wksSheet.Columns( strCol ).IsValid() ) // If second selected column is not valid return error
			return FALSE;
		iC2 = wksSheet.Columns( strCol ).GetIndex(); // Get column number of second selected column
		if( iC2 < 0 )                    // If column not valid return error
			return FALSE;
		str = str.Mid( ii + 1 );         // Strip off name of second column and fourth $ character
		
		// str=="7" - Remaining characters are second row number (as string)
		iR2 = atoi( str ) - 1;           // Get second row number (as integer, subtract 1 for 0 based offset)
		strRow.Format( "%d", iR2 + 1 );  // Rebuild strRow (as string from integer) for check
		if( strRow.Compare( str ) )      // If not same return error 
			return FALSE;
		
		// If column numbers are not in correct bounds return error
		if( iC1 < 0 || iC1 > iC2 || iC2 >= wksSheet.GetNumCols() )
			return FALSE;

		// If row numbers are not in correct bounds return error
		if( iR1	< 0 || iR1 > iR2 || iR2 >= wksSheet.GetNumRows() )
			return FALSE;
	}
	else                                 // Else first character not [ assume Origin worksheet format
	{
		Worksheet wksWorksheet;
		
		// str=="Worksheet_A[1]:B[7]"
		ii = str.Find('_');              // Find _ character
		if( ii < 0 )                     // If no _ return error
			return FALSE;		
		strWksName = str.Left(ii);       // Get Origin worksheet name
		wksWorksheet.Attach( strWksName );// Attach to worksheet 
		if( !wksWorksheet.IsValid() )    // If worksheet not valid return error
			return FALSE;		
		str = str.Mid( ii + 1 );         // Strip off worksheet name and _ character

		// str=="A[1]:B[7]"
		ii = str.Find('[');              // Find first [ character
		if( ii < 0 )                     // If no [ return error
			return FALSE;
		strCol = str.Left(ii);           // Get name of first column
		if( !wksWorksheet.Columns( strCol ).IsValid() ) // If first selected column is not valid return error  
			return FALSE;
		iC1 = wksWorksheet.Columns( strCol ).GetIndex(); // Get column number of first selected column
		if( iC1 < 0 )                    // If not valid return error
			return FALSE;
		str = str.Mid( ii + 1 );         // Strip off name of first column and first [ character
		
		// str=="1]:B[7]"		
		ii = str.Find(']');              // Find first ] character
		if( ii < 0 )                     // If no ] return error
			return FALSE;
		strRow = str.Left(ii);           // Get first row number (as string)
		iR1 = atoi( strRow ) - 1;        // Get first row number (as integer, subtract 1 for 0 based offset)
		strRow.Format( "%d", iR1 + 1 );  // Rebuild strRow (as string from integer) for check
		if( strRow.Compare( str.Left(ii) ) ) // If not same return error 
			return FALSE;
		str = str.Mid( ii + 1 );         // Strip off first row number and first ] character
		
		// str==":B[7]"		
		ii = str.Find(':');              // Find : character
		if( ii != 0 )                    // If : is not next character return error
			return FALSE;
		str = str.Mid( ii + 1 );         // Strip off : character

		// str=="B[7]"
		ii = str.Find('[');              // Find second [ character
		if( ii < 0 )                     // If no [ return error
			return FALSE;
		strCol = str.Left(ii);           // Get name of second column
		if( !wksWorksheet.Columns( strCol ).IsValid() ) // If second selected column is not valid return error
			return FALSE;
		iC2 = wksWorksheet.Columns( strCol ).GetIndex(); // Get column number of second selected column
		if( iC2 < 0 )                    // If not valid return error
			return FALSE;
		str = str.Mid( ii + 1 );         // Strip off name of second column and second [ character
		
		// str=="7]"
		ii = str.Find(']');              // Find second ] character
		if( ii < 0 )                     // If no ] return error
			return FALSE;
		strRow = str.Left(ii);           // Get second row number (as string)
		iR2 = atoi( strRow ) - 1;        // Get second row number (as integer, subtract 1 for 0 based offset)
		strRow.Format( "%d", iR2 + 1 );  // Rebuild strRow (as string from integer) for check
		if( strRow.Compare( str.Left(ii) ) )// If not same return error 
			return FALSE;
		str = str.Mid(ii);               // Strip off second row number
		
		// str=="]"
		if( str.Compare( "]" ) )         // If last character is not ] return error
			return FALSE;
		
		// If column numbers are not in correct bounds return error
		if( iC1 < 0 || iC1 > iC2 || iC2 >= wksWorksheet.GetNumCols() )
			return FALSE;
		
		// If row numbers are not in correct bounds return error	
		if( iR1	< 0 || iR1 > iR2 || iR2 >= wksWorksheet.GetNumRows() )
			return FALSE;
	}
	
	return TRUE;
}

/**
		Determine whether or not the specified elements of a vectorbase derived object are uniformly
		spaced.
	Example:
		See function omConvertWksToMatrixDirect in OMat.c for sample call.
	Parameters:
		dDelta=Output difference between elements if uniform spacing else 0.0
		vIn=Input vectorbase derived object
		dTol=Input relative tolerance between 0 and 1 (default is 0.05)
		i1=Input beginning 0 based index of vector to test (default is 0)
		i2=Input ending 0 based index of vector to test (default -1 tests to last element)
	Return:
		Returns TRUE and NANUM if only one element is tested, returns TRUE and the difference between the first
		two elements tested if the spacing is uniform, returns FALSE and the difference between the first two
		elements tested if the spacing is not uniform, or returns FALSE and NANUM if there is an error.
*/
BOOL VectorHasUniformSpacing( double& dDelta, vectorbase& vIn, double dTol, int i1, int i2 ) // dTol = 0.05, i1 = 0, i2 = -1
{
	int ii;
	double dDeltaLo, dDeltaHi, dDeltaCur;

	dDelta = NANUM;                             // Initialized value
	
	if( i2 == -1 )                              // If default i2 loop to end of vector
		i2 = vIn.GetSize() - 1;
	
	if( dTol < 0.0 || dTol > 1.0 )              // If relative tolerance is not between 0 and 1 return FALSE and NANUM
		return FALSE;
	
	if( i1 < 0 || i2 < i1  || i2 >= vIn.GetSize() ) // If vector indices are illogical return FALSE and NANUM
		return FALSE;

	if( i1 == i2 )                              // If only testing one element return TRUE and NANUM
		return TRUE;
	
	dDelta = vIn[i1] - vIn[ i1 + 1 ];           // Get delta between first two elements
	if( dDelta < 0 )                            // If dDelta is negative...
	{
		dDeltaLo = ( 1.0 + dTol ) * dDelta;     // Compute lower absolute dDelta from relative tolerance
		dDeltaHi = ( 1.0 - dTol ) * dDelta;     // Compute higher absolute dDelta from relative tolerance
	}
	else                                        // Else if dDelta is not negative...
	{
		dDeltaLo = ( 1.0 - dTol ) * dDelta;     // Compute lower absolute dDelta from relative tolerance
		dDeltaHi = ( 1.0 + dTol ) * dDelta;     // Compute higher absolute dDelta from relative tolerance
	}

	for( ii = i1 + 1; ii < i2; ii++ )           // For each element in specified range of vector...
	{
		dDeltaCur = vIn[ii] - vIn[ ii + 1 ];    // Get absolute delta between current and next element 
		if( dDeltaCur < dDeltaLo || dDeltaCur > dDeltaHi ) // If current absolute delta is not within tolerance... 
			return FALSE;                       // Elements of vector not uniformly spaced
	}
	
	return TRUE;                                // Elements of vector are uniformly spaced (within tolerance)
}

/**
	Rename the worksheet to the file name.
*/
BOOL RenameToFileName(Worksheet& wks, LPCSTR lpcszFileName)
{
	BOOL bRet = FALSE;
	string strNewName;
	
	//---- CPY 5/1/03
	//strNewName = GetFilename(lpcszFileName);
	//strNewName = GetFilenameWithoutExt(strNewName);
	strNewName = GetFileName(lpcszFileName, TRUE);
	//----
	if( strNewName.IsEmpty() )
		return bRet;
			
	Page page = wks.GetPage();
	if( page && page.IsValid() )
	{		
		page.Rename(strNewName);			// rename the worksheet	
		page.Label = lpcszFileName;			// set worksheet label		
		page.LT_execute("Page.title = 3");	// turn on both title and label
		bRet = TRUE;
	}
	
	return bRet;
}

/**
		Add the current worksheet/workbook sheet selection ranges to subnodes in the specified
		TreeNode.
	Example:
		See function call in StatisticsOn.c.
	Parameters:
		tr=Input TreeNode to which selection range subnodes will added
		bAppend=Input option to append new selection range subnodes (true) or to reset tree and
			add starting in first subnode (default false)
		bSelectAll=Input option to select entire worksheet/workbook sheet if there is no selection (true)
			or to return a no selection warning code if there is no selection (default false)
		bColWise=Input option to add row wise selections (false) or column wise selections (default true)
	Return:
		Returns WKS_UTILS_NO_ERROR on success and a WKS_UTILS warning or error code on failure.
*/
int AddWksSelectionsToTreeNode(TreeNode& tr, bool bAppend, bool bSelectAll, bool bColWise) // bAppend = false, bSelectAll = false, bColWise = true
{
	string strRange, strNodeName, strSelectedRanges;
	string strWksName, strSheetName;
	int ii, iRet, iBeginNodeNum, iNumRanges;
	int iC1, iC2, iR1, iR2; 
	TreeNode trSubNode;	// Must use TreeNode here since Tree is always a standalone copy

	if( tr )                                                                  // If TreeNode is valid...
	{
		if( bColWise )                                                         // If user wants column wise selection...
			iRet = GetNonContiguousWksSelection(strSelectedRanges, iNumRanges); // Get current selection range
		else                                                                   // Else user wants row wise selection...
			iRet = GetRowWiseWksSelection(strSelectedRanges, iNumRanges);      // Get current selection range
		
		if( iRet )                                                             // If no selection or bad selection...
		{
			if( bSelectAll && ( iRet == WKS_UTILS_NO_SEL_WARNING ) )           // If bSelectAll is true and no selection...
			{
				if( bColWise )                                                 // If user wants column wise selection... 
					iRet = GetNonContiguousWksSelection(strSelectedRanges, iNumRanges, TRUE); // Get entire worksheet/workbook as selection
				else                                                           // Else user wants row wise selection...
					iRet = GetRowWiseWksSelection(strSelectedRanges, iNumRanges, TRUE); // Get entire worksheet/workbook as selection
			}
	
			if( iRet )                                                         // Now if no selection or bad selection...
			{
				if( !bAppend )                                                 // If user is not appending...
				{
					tr.Reset();                                                // Reset node
					tr.Range1.Display.strVal = "";                             // Indicate no selection
					tr.Range1.C1.nVal = -1;
					tr.Wks.strVal = "";
				}
				return iRet;                                                   // Return warning or error code
			}
		}
	
		if( bAppend )                                                          // If user wants to append...
			iBeginNodeNum = tr.GetNodeCount() - 1;                             // Set begining node number - 1 for Wks node 
		else                                                                   // Else not appending...
		{
			tr.Reset();                                                        // Reset TreeNode
			iBeginNodeNum = 0;                                                 // Set begining node number to 0
		}
	
		for( ii = 0; ii < iNumRanges; ii++ )                                   // For each selected range...
		{
			strRange = strSelectedRanges.GetToken( ii, ',' );                  // Get range
			ParseWksSelection(strRange, strWksName, strSheetName, iC1, iC2, iR1, iR2); // Parse range into column and row indices
			strNodeName.Format("Range%d", ii + iBeginNodeNum + 1);             // Get subnode name
			//strNodeName.Format("%s%d", TREE_Range, ii + iBeginNodeNum);                 // Get subnode name
			trSubNode = tr.AddNode(strNodeName);                               // Add subnode to tree
			trSubNode.Display.strVal = strRange;                               // Assign display and index nodes
			trSubNode.C1.nVal = iC1;
			trSubNode.C2.nVal = iC2;
			trSubNode.R1.nVal = iR1;
			trSubNode.R2.nVal = iR2;
		}
		
		tr.Wks.strVal = strWksName;
	}
	else
		return WKS_UTILS_INVALID_TREENODE_ERROR;                               // Else TreeNode is invalid return error
	
	return WKS_UTILS_NO_ERROR;
}

/**
		Get the current worksheet/workbook sheet selection range and set the specified TreeNode
		with it. The selection range must be contained within a single worksheet/workbook column
		and the TreeNode must be passed by reference. Row ranges can optionally be shown or not
		be shown.
	Example:
		See function call in StatisticsOn.c.
	Parameters:
		tr=Input reference to TreeNode whose strVal is set
		bShowRows=Input option to show or not show row ranges, default is true (show row ranges)
	Return:
		Returns WKS_UTILS_NO_ERROR on success and a WKS_UTILS warning or error code on failure.
*/
int SetTreeNodeWithSingleColumnWksSelection(TreeNode& tr, bool bShowRows)
{
	string strSelectedRange;
	string strWksName, strSheetName;
	int iRet, iNumRanges;
	int iC1, iC2, iR1, iR2; 

	if( tr )                                                               // If TreeNode is valid...
	{
		tr.Reset();
		iRet = GetNonContiguousWksSelection(strSelectedRange, iNumRanges); // Get current selection range
		if( !iRet )                                                        // If selection exists...
		{
			if( iNumRanges == 1 )                                          // If selection range is in single column...
			{
				ParseWksSelection(strSelectedRange, strWksName, strSheetName, iC1, iC2, iR1, iR2); // Parse range into column and row indices
				if( bShowRows )
				{
					tr.Display.strVal = strSelectedRange;                  // Assign display range node
					tr.C1.nVal = iC1;                                      // Assign index nodes
					tr.C2.nVal = iC2;
					tr.R1.nVal = iR1;
					tr.R2.nVal = iR2;
				}
				else
				{
					tr.Display.strVal = GetSingleColumnRangeWithoutRows(strSelectedRange); // Assign display range node without rows
					tr.C1.nVal = iC1;                                      // Assign index nodes
					tr.C2.nVal = iC1;
					tr.R1.nVal = -1;
					tr.R2.nVal = -1;
				}
				tr.Parent().Wks.strVal = strWksName;
				return WKS_UTILS_NO_ERROR;
			}
			else                                                           // Else multiple columns return error
				iRet = WKS_UTILS_NO_SINGLE_COL_ERROR;
		}
		tr.Display.strVal = "";                                            // Indicate no selection

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -