1.3.1 Images and Plots Live Update
Sending Data to a Matrix and See Image Live Update
C#
The following code assume a form with the following objects:
- a button named "Init" to connect to Origin
- a combo list named "combDelayTime" with values of 300,500,700,1000
- a button named "StartStop"
- a label text named "msgOutBox"
- a Timer object named "timer1"
- You first click the Init button and the StartStop button will enabled and Origin will run and show the single matrix in View Image mode.
- You can then click Start to see the image update with the delay time specified.
using System.Windows.Forms;
using Origin;//to allow using MatrixObject etc with Origin.
namespace Realtime_Send_Matrix_View_Image
{
public partial class Form1 : Form
{
const int NUM_ROWS = 480;
const int NUM_COLS = 640;
object Default = System.Type.Missing;
private Origin.ApplicationSI m_app;
private MatrixPage m_mpg;
private MatrixSheet m_msht;
private MatrixObject m_mObj;
private bool m_bStarted = false;
private int m_nSendCount = 0;
public Form1()
{
InitializeComponent();
timer1.Interval = Convert.ToInt32(comboDelayTime.Text);
timer1.Enabled = false;
StartStop.Enabled = false;// enable after init
}
private void Init_Click(object sender, EventArgs e)
{
m_app = new Origin.ApplicationSI();
m_app.NewProject();
m_app.Visible = MAINWND_VISIBLE.MAINWND_SHOW;
m_mpg = m_app.MatrixPages.Add(Default, Default);
m_msht = m_mpg.Layers[0] as MatrixSheet;
m_msht.Cols = NUM_COLS;
m_msht.Rows = NUM_ROWS;
m_mObj = m_msht.MatrixObjects.Add();
m_mObj.DataFormat = COLDATAFORMAT.DF_USHORT; // unsign short
//set to view matrix as image, this has to be done by LabTalk for now, until we add the
//proper COM method in next SR
m_msht.Execute("matrix -ii");
StartStop.Enabled = true;
Init.Enabled = false;//once init, we will not need to execute this again
}
private void StartStop_Click(object sender, EventArgs e)
{
if (!m_bStarted)
{
StartStop.Text = "Stop";
this.timer1.Enabled = true;
m_bStarted = true;
}
else
{
StartStop.Text = "Start";
this.timer1.Enabled = false;
m_bStarted = false;
}
}
private void comboDelayTime_SelectedIndexChanged(object sender, EventArgs e)
{
timer1.Interval = Convert.ToInt32(comboDelayTime.Text);
}
private void timer1_Tick(object sender, EventArgs e)
{
if (m_mObj != null)
{
//send over full range values
int nMax = (NUM_ROWS - 1) + (NUM_COLS - 1);
ushort[,] usData = new ushort[NUM_ROWS, NUM_COLS];
int nn = m_nSendCount++;
for (int nr = 0; nr < NUM_ROWS; nr++)
{
for (int nc = 0; nc < NUM_COLS; nc++)
{
int kk = nc + nr;
int even = nn % 2; // every other time will flip the matrix
if(even == 1)
kk = nMax - kk;
usData[nr, nc] = (ushort)kk;
}
}
m_mObj.SetData(usData, 0, 0);
//for now, need to use LabTalk to specify the Z range of the image to be drawn, Z1 and Z2 are LabTalk variables for the given
//matrix object to control the Z range to showing the image. Execute for matrixObject is not supported so use matrix sheet
//is good enough to affect the active MatrixObject
m_msht.Execute("Z1=0;Z2=" + nMax.ToString());
msgOutBox.Text = nn.ToString() + ". sending...";
}
else
msgOutBox.Text = "m_mObj is null";
}
}
}
VC++
The following code assumes an existing dialog containing three buttons : IDC_BUTTON_Connect, IDC_BUTTON_Disconnect, IDC_BUTTON_SendData; a checkbox IDC_CHECK_AutoUpdate and a combobox of IDC_COMBO_AutoUpdate. Code assumes that you have added Origin COM to your project correctly.
- When run the code, first you can click Connect button to launch an Origin instance, click SendData button to send data manually.
- When Origin is connected, check auto updating checkbox will enable auto updating data to Origin. Image on Matrixsheet will flip at an interval of some value specified by the combobox.
Main code in Dialog class are as follows:
void CSentDataToMatrixDlg::OnBnClickedCheckAutoupdate()
{
UpdateData();
KillTimer(1);//Stop in case already started
if( this->m_checkAutoUpdate.GetCheck() )
{
CString strText;
GetDlgItem(IDC_COMBO_AutoUpdate)->GetWindowText(strText);
wchar_t* p = strText.GetBuffer(strText.GetLength());
UINT nElapse;
swscanf_s(p, L"%d", &nElapse);
SetTimer(1, nElapse, NULL);
}
else
KillTimer(1);
}
void CSentDataToMatrixDlg::OnBnClickedButtonConnect()
{
connect();
}
// connect to Origin
bool CSentDataToMatrixDlg::connect(void)
{
CoInitialize(NULL);
disconnect(); //disconnect in case connected
this->m_pIOApp.CreateInstance(__uuidof(Application));
m_pIOApp->PutVisible(Origin::MAINWND_SHOW_BRING_TO_FRONT);
const int nMatrixPageType = 5;
const int nVisible = 2;
m_pIOApp->CreatePage( nMatrixPageType, "Data", "", nVisible);
m_pMatrixPage = m_pIOApp->GetActivePage();
m_pMatrixSheet = m_pMatrixPage->GetLayers()->Add();
m_pMatrixSheet->Activate();
if( m_pMatrixSheet )
{
m_pMatrixSheet->PutCols(NUM_COLS);
m_pMatrixSheet->PutRows(NUM_ROWS);
m_pMatrixObject = m_pMatrixSheet->GetMatrixObjects()->Add();
m_pMatrixObject->Activate();
m_pMatrixObject->DataFormat = Origin::COLDATAFORMAT::DF_USHORT;
//set to view matrix as image, this has to be done by LabTalk for now, until we add the
//proper COM method in next SR
m_pMatrixSheet->Execute("matrix -ii");
}
if( m_pIOApp != NULL )
{
GetDlgItem(IDC_BUTTON_SendData)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_Disconnect)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_Connect)->EnableWindow(false);
m_bConnected = true;
}
return true;
}
// disconnect
void CSentDataToMatrixDlg::disconnect(void)
{
if( m_bConnected )
{
KillTimer(1); //Stop auto sending
this->m_checkAutoUpdate.SetCheck(0);
GetDlgItem(IDC_BUTTON_SendData)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_Disconnect)->EnableWindow(false);
GetDlgItem(IDC_BUTTON_Connect)->EnableWindow(true);
m_bConnected = false;
m_pIOApp->Exit();
m_pIOApp = NULL;
}
}
void CSentDataToMatrixDlg::OnBnClickedButtonDisconnect()
{
disconnect();
}
// send data to Origin
bool CSentDataToMatrixDlg::sendData(void)
{
if( m_pMatrixObject )
{
USHORT MAX = NUM_ROWS + NUM_COLS;
COleSafeArray csarr;
DWORD bounds[] = {NUM_ROWS, NUM_COLS};
csarr.Create(VT_UI2, 2, bounds);//create a safe array of two dimesion of unsigned int type
long index[2];
for( int ii = 0; ii < NUM_ROWS; ii++ )
{
for( int jj = 0; jj < NUM_COLS; jj++ )
{
USHORT usData = ii + jj;
if( m_bFlip ) // every other time will flip the matrix
usData = MAX - usData;
index[0] = ii;
index[1] = jj;
csarr.PutElement(index, &usData);
}
}
m_bFlip = !m_bFlip;
m_pMatrixObject->SetData(csarr, 0, 0);
//for now, need to use LabTalk to specify the Z range of the image to be drawn, Z1 and Z2 are LabTalk variables for the given
//matrix object to control the Z range to showing the image. Execute for matrixObject is not supported so use matrix sheet
//is good enough to affect the active MatrixObject
CString strCmd("Z1=0;Z2=" + MAX);
_bstr_t _bstrCmd(strCmd);
m_pMatrixSheet->Execute(_bstrCmd);
}
return true;
}
void CSentDataToMatrixDlg::OnBnClickedButtonSenddata()
{
if( m_bConnected )
sendData();
}
void CSentDataToMatrixDlg::OnTimer(UINT_PTR nIDEvent)
{
if ( m_bConnected )
sendData();
CDialog::OnTimer(nIDEvent);
}
void CSentDataToMatrixDlg::OnCbnSelchangeComboAutoupdate()
{
OnBnClickedCheckAutoupdate(); //Just want to update timer interval
}
VB
The following code assume existing a form with following controls:
- a button named ButtonConnect to connect Origin
- a button named ButtonDisconnect to disconnect Origin
- a button named ButotnSendData to send data manually
- a checkbox named CheckBoxAutoUpdate to allow auto updating.
- a combobox named ComboBoxAutoUpdate to set intervlas for auto updating
- When run the code, first you can click Connect button to launch an Origin instance, click SendData button to send data manually.
- When Origin is connected, check auto updating checkbox will enable auto updating data to Origin. Image on Matrixsheet will flip at an interval of some value specified by the combobox.
Code assumes you've added Oringin COM objects to your project correctly:
Public Class Form1
Dim OriginApp As IOApplication
Dim msht As MatrixSheet
Dim mobj As MatrixObject
Dim NUM_COLS As Integer
Dim NUM_ROWS As Integer
Dim STATUS As Integer
Const MATRIXPAGETYPE = 5
Const SHOW_WND = 2
Private Sub ButtonConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonConnect.Click
OriginApp = GetObject("", "Origin.Application")
OriginApp.Visible = MAINWND_VISIBLE.MAINWND_SHOW_BRING_TO_FRONT
OriginApp.CreatePage(MATRIXPAGETYPE, "", "", SHOW_WND)
msht = OriginApp.FindMatrixSheet("")
msht.Cols = NUM_COLS
msht.Rows = NUM_ROWS
msht.MatrixObjects.Add()
mobj = msht.MatrixObjects.Item(0)
mobj.DataFormat = COLDATAFORMAT.DF_USHORT
msht.Execute("matrix -ii") 'Currently have to use labtalk command to force Matrix as Image view
ButtonConnect.Enabled = False
ButtonDisconnect.Enabled = True
ButtonSendData.Enabled = True
CheckBoxAutoUpdate.Enabled = True
End Sub
Private Sub ButtonDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDisconnect.Click
ButtonConnect.Enabled = True
ButtonDisconnect.Enabled = False
ButtonSendData.Enabled = False
CheckBoxAutoUpdate.Enabled = False
CheckBoxAutoUpdate.Checked = False
mytimer.Enabled = False
OriginApp.Exit()
OriginApp = Nothing
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ComboBoxAutoUpdate.SelectedIndex = 0
NUM_COLS = 500
NUM_ROWS = 500
End Sub
Private Sub mytimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mytimer.Tick
If (CheckBoxAutoUpdate.Checked) Then
sendData()
End If
End Sub
Private Sub sendData()
Dim ii As Integer
Dim jj As Integer
Dim MAX As UShort
MAX = NUM_COLS + NUM_ROWS
Dim data(0 To NUM_ROWS - 1, 0 To NUM_COLS - 1) As UShort
For ii = 0 To NUM_ROWS - 1
For jj = 0 To NUM_COLS - 1
data(ii, jj) = Convert.ToUInt16(ii + jj)
If STATUS = 0 Then
data(ii, jj) = MAX - Convert.ToUInt16(data(ii, jj))
End If
Next
Next
If STATUS = 0 Then
STATUS = 1
Else
STATUS = 0
End If
mobj.SetData(data, 0, 0)
'for now, need to use LabTalk to specify the Z range of the image to be drawn, Z1 and Z2 are LabTalk variables for the given
'matrix object to control the Z range to showing the image. Execute for matrixObject is not supported so use matrix sheet
'is good enough to affect the active MatrixObject
msht.Execute("Z1=0;Z2=" + MAX.ToString)
End Sub
Private Sub ButtonSendData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSendData.Click
sendData()
End Sub
Private Sub CheckBoxAutoUpdate_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBoxAutoUpdate.CheckedChanged
If (CheckBoxAutoUpdate.Checked) Then
mytimer.Enabled = True
Else
mytimer.Enabled = False
End If
End Sub
Private Sub ComboBoxAutoUpdate_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxAutoUpdate.SelectedIndexChanged
mytimer.Interval = Convert.ToInt32(ComboBoxAutoUpdate.SelectedItem.ToString)
End Sub
End Class
|