📄 labviewimport.c
字号:
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 + -