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

📄 labviewimport.c

📁 图像处理的压缩算法
💻 C
📖 第 1 页 / 共 3 页
字号:
		return BuildCallerTree( vsALLVIs );
	}
};
	
////////////////	end	TREE	LV	TREE	LV	TREE	////////////////
////////////////	end	TREE	LV	TREE	LV	TREE	////////////////


////////////////////////////////////////////////////////
// class LabViewImportDlg   
////////////////////////////////////////////////////////     
class LabViewImportDlg : public ResizeDialog
{
private:
	LabVIEW		m_LVTree;
	
public:
	//LabViewImportDlg(LabVIEW &LVTree) : ResizeDialog(IDD_LABVIEW_IMPORT, "ODlg")
	LabViewImportDlg() : ResizeDialog(IDD_LABVIEW_IMPORT, "ODlg")
	{
	}
	
	int	DoModalEx(HWND hParent)
	{
		InitMsgMap();// will be called from internal later
		int nRet = DoModal(hParent);
		return nRet;
	}

	BOOL	CreateEx(HWND hParent)
	{
		InitMsgMap();// will be called from internal later
		BOOL	bRet =  Create(hParent);
		return bRet;
	}
	
	void AttachLabVIEW(LabVIEW &LVTree)
	{
		m_LVTree = LVTree;
	}

protected:

///----------------- Message Map ----------------
EVENTS_BEGIN
	ON_INIT(OnInitDialog) 
	ON_DESTROY(OnDestroy)
	ON_SIZE(OnDlgResize)
	ON_OK(OnClose)
	ON_BN_CLICKED(IDC_LABVIEW_BTN_RUN_VI, OnRunVI)
	ON_BN_CLICKED(IDC_LABVIEW_BTN_IMPORT, OnImportAsMatrices)
	ON_BN_CLICKED(IDC_LABVIEW_BTN_IMPORT_WKS, OnImportAsSingleWks)

	//--- vsFlex related
	ON_GRID_SEL_CHANGE(IDC_LABVIEW_GRID_VI, OnTreeSelChange)
	ON_GRID_SEL_CHANGE(IDC_LABVIEW_GRID_CONTROL, OnListSelChange)
	ON_GRID_BEFORE_EDIT(IDC_LABVIEW_GRID_CONTROL, OnBeforeEditList)
	//---
EVENTS_END
///----------------------------------------------

	///////////////////////////////////////////////////////
	/// Event Handlers
	///////////////////////////////////////////////////////
	
	BOOL OnInitDialog() 
	{
		ResizeDialog::OnInitDialog();

		m_btnRunVI = GetItem( IDC_LABVIEW_BTN_RUN_VI );
		m_btnMat = GetItem( IDC_LABVIEW_BTN_IMPORT );
		m_btnWks = GetItem( IDC_LABVIEW_BTN_IMPORT_WKS );
		
		m_btnClose = GetItem(IDOK);


		m_cntrlVITree.Init(IDC_LABVIEW_GRID_VI, *this);
		m_cntrlVIList.Init(IDC_LABVIEW_GRID_CONTROL, *this);
		
		//m_cntrlVITree.SetTree(m_trVI);//see plotlistcontrol.h, otreeeditor
		
		//// save the group size so we can resize the whole dialog
		RECT r1;
		m_cntrlVITree.GetRect(r1);
		//m_nVITreeGroupHeight = r1.bottom;
		m_cntrlVIList.GetRect(r1);
		//m_nPlotListGroupHeight = GetDlgExtent() - r1.bottom;
		//m_nColListGroupHeight = RECT_HEIGHT(r1);
		////
		
		//resizeAllControls();
		
//////////////////////////////////////////////////////////////		
//////////////////////////////////////////////////////////////		
		
		m_cntrlVITree.Setup();
		m_cntrlVIList.Setup();
		
		m_cntrlVITree.Load(m_LVTree.GetTree());
	
		m_btnRunVI.Enable = FALSE;
		
		return TRUE;
//////////////////////////////////////////////////////////////		
//////////////////////////////////////////////////////////////		
	}
	
	BOOL OnDestroy(void)
	{
		return TRUE;
	}


	BOOL OnDlgResize(int nType, int cx, int cy)
	{
		RECT r1;
		GetControlClientRect(IDC_LABVIEW_GRID_VI, r1);
		
		StretchControlHeight(IDC_LABVIEW_GRID_VI, r1.left, r1.top, cy); // need to add to base class
		uint nCntrlsRight[] = {
			IDC_LABVIEW_BTN_RUN_VI,
			IDC_LABVIEW_BTN_IMPORT,
			IDC_LABVIEW_BTN_IMPORT_WKS,
			IDOK,
			0};
		ResizeMoveControlsRightBottom(IDC_LABVIEW_GRID_CONTROL, nCntrlsRight, NULL, cx, cy);
		return TRUE;
	}
	
	///DVT - IDOK in error is in dialog resource instead of IDCANCEL - change
	BOOL OnClose()
	{
		return TRUE;
	}
	
	BOOL OnRunVI(Control ctrl)
	{
		string	strVISel;
		m_cntrlVITree.GetSelectedCell(strVISel);
	
		//this button should have been disabled if not
		ASSERT( m_LVTree.IsTopmostVI(strVISel) );
		
		vector<int> vIDs;
		vector<string> vTypes;
		vector<string> vNames;
		vector<string> vValues;
		vector<USHORT> vVarTypes;
		if (!m_LVTree.GetVIControls( strVISel,  vIDs, vTypes, vNames, vValues, vVarTypes ) )
			return false;
		
		Object viOne;
		if ( !m_LVTree.GetVIObjectByName( strVISel, viOne ) )
			return false;
		
		UINT		nTotalNumber = vNames.GetSize();
		//Object	flxL = THE_LIST;
		for ( int i = 0; i < nTotalNumber; i++ )
		{
			string strName = vNames[i];
			//if ( strName.IsEmpty() )
			//	continue;
			
			string	strValue;
			if ( !m_cntrlVIList.FindAndGetCell( strName, strValue ) )
				continue;
	//////////////////////////////////////////////////////////////		
			
			_VARIANT val;
			bool bValOK(false);
	
			USHORT nvt = vVarTypes[i];
			if ( !(VT_ARRAY & nvt) )
			{
				switch (nvt)
				{
				case VT_BOOL:
					if ( 0 == strValue.CompareNoCase(DISPLAY_VARIANT_TRUE) )
					{
						bValOK = true;
						val = VARIANT_TRUE;
					}
					
					if ( 0 == strValue.CompareNoCase(DISPLAY_VARIANT_FALSE) )
					{
						bValOK = true;
						val = VARIANT_FALSE;
					}
					break;
				case VT_I2:
				case VT_I4:
				case VT_I1:
				case VT_UI1:
				case VT_UI4:
				case VT_INT:
				case VT_UINT:
					int nValue = atol(strValue);
					val = nValue;
					bValOK = true;
					break;
				case VT_R4:
				case VT_R8:
					double dValue = atof(strValue);
					val = dValue;
					bValOK = true;
					break;
				default:
					break;
				}
			}
			
			if ( bValOK )
				try
				{
					viOne.SetControlValue(vNames[i], val);
				}
				catch(int nErr)
				{
					//this will fail for indicators in LV 5.0 !!!
					//no way to distinguish controls from indicators form LV export file, 
					//so users must not Label their indicators if they want
					//RunVI to work (they can have Caption, will be ignored here)
				}
		}
		
		//have to be able to stop if VI start running continuously  
		try
		{
			viOne.Run(0);
		}
		catch(int nErr)
		{
		}
	//////////////////////////////////////////////////////////////		
		
		//refresh list
		return UpdateControlsDisplay( strVISel,  vIDs, vTypes, vNames, vValues, vVarTypes );
	}
	
	//CP's functions from MatlabImport
	//////////
	BOOL OnImportAsMatrices(Control ctrl)
	{
		string	asName;
		string	strResult;
		
		m_cntrlVIList.GetSelectedCell( asName );
		GetLabViewMatrices( asName, strResult );
		
		LV_DEBUG_STR( strResult );
		
		return TRUE;	//for now
	}
	//////////

	//////////////////////////////////////////////////////////////////////////////////////
	bool	GetLabViewMatrices( string &asName, string& strResult )
	{
		bool	bReplaceCurrent = false;
		
		bool bNew = false;
		MatrixLayer mlay(asName);
		
		if(!mlay || (!bReplaceCurrent && mlay))
		{
			if(mlay) // already existed
				mlay.Detach();
				
			if(!mlay.Create(NULL, CREATE_HIDDEN))
				return false;
			//mlay.Create();
			mlay.GetPage().Rename(asName);
			bNew = true;
		}
		
		Matrix<double> mm(mlay);
		if(!GetLVArrayAsMatrix(asName, mm) && bNew)
		{
			mlay.Destroy();
			strResult += asName + " ";
		}
	
		if(!strResult.IsEmpty())
		{
			strResult += ": matrix not found in LabView!";
			return FALSE;
		}
	
		//mlay.GetPage().LT_execute( LT_SHOW_WND );
		mlay.GetPage().SetShow();
	
		return TRUE;
	}
	//////////////////////////////////////////////////////////////////////////////////////

		
	BOOL OnImportAsSingleWks(Control ctrl)
	{
		string	asName;
		m_cntrlVIList.GetSelectedCell( asName );
		
		
		bool	bReplaceCurrent = false;
		bool	bWksCreated = false;
		
		Worksheet wksTemp;
		
		if(!wksTemp.IsValid())
		{
			///	DVT 8/20/03 SYNCHRONIZE_WITH_MATLAB_IMPORT
			//if(!wksTemp.Create(NULL, CREATE_HIDDEN))
			if(!wksTemp.Create())
			{
				///	DVT 4/11/03 REMOVE_TREE_UTILS_FROM_LVDLG
				//out_str("Creating worksheet failed");
				LV_DEBUG_STR("Creating worksheet failed");
				///	end REMOVE_TREE_UTILS_FROM_LVDLG
				return FALSE;
			}
			bWksCreated = true;
		}
		if(bWksCreated)
		{
			while(wksTemp.DeleteCol(0))	 // Remove all columns in worksheet
				;
		}
		
		int nNameCount = 0;
		
		///	DVT 4/10/03 QA70-3684 v7.0557 ORIGIN_AUTO_SERVER_SET_ARRAY_VAR_CRASH_FIX
		//use it for subVariants
		nNameCount += AddLabViewDoubleArray(wksTemp, asName, bReplaceCurrent);
		///	end ORIGIN_AUTO_SERVER_SET_ARRAY_VAR_CRASH_FIX
	
		if( nNameCount > 0 )
		{
			if( bWksCreated )
			{
				wksTemp.GetPage().Rename( LV_WKS_NAME );
				///	DVT 8/20/03 SYNCHRONIZE_WITH_MATLAB_IMPORT
				//wksTemp.GetPage().LT_execute( LT_SHOW_WND );
			}
			return TRUE;
		}
		
		wksTemp.Destroy();
		return FALSE;	
	}
	
	//////////////////////////////////////////////////////////////////////////////////////
	bool GetLVArrayAsMatrix( string &strName, Matrix &mm )
	{
		string	strVISel;
		m_cntrlVITree.GetSelectedCell(strVISel);
	
		Object viOne;
		if ( !m_LVTree.GetVIObjectByName( strVISel, viOne ) )
			return false;
		
		//////////////////////////////////////
		//_VARIANT val = viOne.GetControlValue( strName );
		_VARIANT val;
		try
		{
			val = viOne.GetControlValue( strName );
		}
		catch(int nErr)
		{
			return false;
		}
		
		USHORT nvt = val.vt;
		short nVarType = nvt;
		int	nLobyte = nvt & 0x00FF;
		
		//#
		LV_DEBUG_printf( "val.vt: %04x, lobyte %04x\n", nvt, nLobyte );
		
		if ( VT_ARRAY & nvt )
		{
			///	DVT	2/5/03 QA70-3725 v7.0498 ARRAY_VARIANT_FOR_LABVIEW_IMPORT
			mm.SetByArrayInVariant(val);
			return true;
		}
		return false;
	}
	/////////////////////////////////////////////////////
	
	//////////////////////////////////////////////////////////////////////////////////////
	int check_add_wks_col(Worksheet& wks, string strColName, int nSuffix, bool bReplaceCurrent)
	{
		if(nSuffix > 0)
			strColName += nSuffix;
		
		if(bReplaceCurrent)
		{
			Column cc = wks.Columns(strColName);
			if(cc)
				return cc.GetIndex();
		}
		
		return wks.AddCol(strColName);
	}
	
	
	// return number of cols added
	int AddLabViewDoubleArray(Worksheet& wks, string strMatLabVarName, bool bReplaceCurrent)
	{
		MatrixLayer mlTemp;
		if(!mlTemp.Create(NULL, CREATE_HIDDEN))
			return 0;
		
		Matrix<double> mm(mlTemp);
		int nAdded = 0;
		if(!GetLVArrayAsMatrix(strMatLabVarName, mm))
			goto add_wks_done;
		
		int nRows = mm.GetNumRows();
		int nCols = mm.GetNumCols();
		
		int nNewCol = check_add_wks_col(wks, strMatLabVarName, nAdded, bReplaceCurrent);
		
		if(nCols == 1)
		{
			Dataset aa(wks, nNewCol);
			mm.GetColumn(aa, nAdded++);
			goto add_wks_done;
		}
		else if (nRows == 1)
		{
			Dataset aa(wks, nNewCol);
			mm.GetRow(aa, nAdded++);
			goto add_wks_done;
		}
		
		do
		{
			Dataset aa(wks, nNewCol);
			mm.GetColumn(aa, nAdded);
			nAdded++;
			if(nAdded >= nCols)
				break;
			nNewCol = check_add_wks_col(wks, strMatLabVarName, nAdded, bReplaceCurrent);
		} while(1);
		
	
	add_wks_done:
		mlTemp.Destroy();
		return nAdded;
	}
	//////////////////////////////////////////////////////////////////////////////////////
	
	
	
	
	//// vsFlex events
	void OnTreeSelChange(Control flxControl)
	{
		m_cntrlVITree.OnSelChange(flxControl);
		
		//waitCursor	cr;			//ML
		string		strVI;
		if ( ! m_cntrlVITree.GetSelectedCell( strVI ) )
			return;
		
		if ( 1 == m_cntrlVITree.GetSelectedRow() )
		{
			ASSERT ( 0 == strVI.Compare( LV_TREE_ROOT_NODE_LABEL ) );
			m_cntrlVIList.Clear();
			m_btnRunVI.Enable = FALSE;
			return;			//return if selection is on the root ("All VIs")
		}
		
		vector<int>		vIDs;
		vector<string>	vTypes;
		vector<string>	vNames;
		vector<string>	vValues;
		vector<USHORT>	vVarTypes;	//not used here

		UpdateControlsDisplay( strVI,  vIDs, vTypes, vNames, vValues, vVarTypes );
		
		m_btnRunVI.Enable = m_LVTree.IsTopmostVI( strVI );
		
	}
	
	//void OnListSelChange(Control cntrl, long nRow, long nCol, BOOL* pCancel)
	void OnListSelChange( Control cntrl )
	{
		m_cntrlVIList.OnSelChange(cntrl);
		
		m_btnMat.Enable = m_cntrlVIList.IsImportEnabled();
		m_btnWks.Enable = m_cntrlVIList.IsImportEnabled();
	}
	
	void OnBeforeEditList(Control cntrl, long nRow, long nCol, BOOL* pCancel)
	{
		m_cntrlVIList.OnBeforeEditList(cntrl, nRow, nCol, pCancel);
	}
	

	
	///List update////////////////////	
	bool	UpdateControlsDisplay( string &strVISel, vector<int> &vIDs, vector<string> &vTypes, vector<string> &vNames, vector<string> &vValues, vector<USHORT> &vVarTypes )
	{
		if (!m_LVTree.GetVIControls( strVISel, vIDs, vTypes, vNames, vValues, vVarTypes ) )
			return false;
		
		return m_cntrlVIList.Update( vIDs, vTypes, vNames, vValues );
	}
	///////////////////////	
	
	
private:
	// main tables
	VITreeControl		m_cntrlVITree;
	VIListControl		m_cntrlVIList;
	
	/// other controls
	Button	m_btnRunVI;
	Button	m_btnMat;
	Button	m_btnWks;

	Button	m_btnClose;
};

////////////////////////////////////////////////////////
// end class LabViewImportDlg   
////////////////////////////////////////////////////////     
 
bool LabViewImport(LabVIEW &LVTree, HWND hWndParent = NULL)
{
	LabViewImportDlg	MyDlg;
	
	MyDlg.AttachLabVIEW(LVTree);
	
 	int nRet = MyDlg.DoModalEx(hWndParent);
 	return nRet == IDOK? true:false;
}

void LabViewWorkspaceImportDlg()
{
	LabVIEW				LVTree;
	
	if( LVTree.Build() )
	{
		LabViewImport( LVTree, GetWindow() );
	}
	else
		MessageBox(GetWindow(), _L("LabVIEW not available."), _L("LabVIEW Import Dialog"), MB_OK);

}
 	
void testLV()
{
	LabViewWorkspaceImportDlg();
}

⌨️ 快捷键说明

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