📄 zarraytrace.cpp
字号:
case 6: MyRayData[elem_num].n = (double)*(float *)mxGetData(dval); break;
case 7: MyRayData[elem_num].opd = (double)*(float *)mxGetData(dval); break;
case 8: MyRayData[elem_num].intensity = (double)*(float *)mxGetData(dval); break;
case 9: MyRayData[elem_num].Exr = (double)*(float *)mxGetData(dval); break;
case 10: MyRayData[elem_num].Exi = (double)*(float *)mxGetData(dval); break;
case 11: MyRayData[elem_num].Eyr = (double)*(float *)mxGetData(dval); break;
case 12: MyRayData[elem_num].Eyi = (double)*(float *)mxGetData(dval); break;
case 13: MyRayData[elem_num].Exr = (double)*(float *)mxGetData(dval); break;
case 14: MyRayData[elem_num].Ezi = (double)*(float *)mxGetData(dval); break;
case 15: MyRayData[elem_num].wave = (int)*(float *)mxGetPr(dval); break;
case 16: MyRayData[elem_num].error = (int)*(float *)mxGetPr(dval); break;
case 17: MyRayData[elem_num].vigcode = (int)*(float *)mxGetPr(dval); break;
case 18: MyRayData[elem_num].want_opd = (int)*(float *)mxGetPr(dval); break;
} break;
case mxINT8_CLASS : // The data is a char
// mexPrintf("%i\n", *(char *)mxGetData(dval)); //debug
switch (FieldIndex)
{
case 1: MyRayData[elem_num].x = (double)*(char *)mxGetData(dval); break;
case 2: MyRayData[elem_num].y = (double)*(char *)mxGetData(dval); break;
case 3: MyRayData[elem_num].z = (double)*(char *)mxGetData(dval); break;
case 4: MyRayData[elem_num].l = (double)*(char *)mxGetData(dval); break;
case 5: MyRayData[elem_num].m = (double)*(char *)mxGetData(dval); break;
case 6: MyRayData[elem_num].n = (double)*(char *)mxGetData(dval); break;
case 7: MyRayData[elem_num].opd = (double)*(char *)mxGetData(dval); break;
case 8: MyRayData[elem_num].intensity = (double)*(char *)mxGetData(dval); break;
case 9: MyRayData[elem_num].Exr = (double)*(char *)mxGetData(dval); break;
case 10: MyRayData[elem_num].Exi = (double)*(char *)mxGetData(dval); break;
case 11: MyRayData[elem_num].Eyr = (double)*(char *)mxGetData(dval); break;
case 12: MyRayData[elem_num].Eyi = (double)*(char *)mxGetData(dval); break;
case 13: MyRayData[elem_num].Exr = (double)*(char *)mxGetData(dval); break;
case 14: MyRayData[elem_num].Ezi = (double)*(char *)mxGetData(dval); break;
case 15: MyRayData[elem_num].wave = (int)*(char *)mxGetPr(dval); break;
case 16: MyRayData[elem_num].error = (int)*(char *)mxGetPr(dval); break;
case 17: MyRayData[elem_num].vigcode = (int)*(char *)mxGetPr(dval); break;
case 18: MyRayData[elem_num].want_opd = (int)*(char *)mxGetPr(dval); break;
} break;
case mxUINT8_CLASS : // The data is an unsigned char
// mexPrintf("%i\n", *(unsigned char *)mxGetData(dval)); //debug
switch (FieldIndex)
{
case 1: MyRayData[elem_num].x = (double)*(unsigned char *)mxGetData(dval); break;
case 2: MyRayData[elem_num].y = (double)*(unsigned char *)mxGetData(dval); break;
case 3: MyRayData[elem_num].z = (double)*(unsigned char *)mxGetData(dval); break;
case 4: MyRayData[elem_num].l = (double)*(unsigned char *)mxGetData(dval); break;
case 5: MyRayData[elem_num].m = (double)*(unsigned char *)mxGetData(dval); break;
case 6: MyRayData[elem_num].n = (double)*(unsigned char *)mxGetData(dval); break;
case 7: MyRayData[elem_num].opd = (double)*(unsigned char *)mxGetData(dval); break;
case 8: MyRayData[elem_num].intensity = (double)*(unsigned char *)mxGetData(dval); break;
case 9: MyRayData[elem_num].Exr = (double)*(unsigned char *)mxGetData(dval); break;
case 10: MyRayData[elem_num].Exi = (double)*(unsigned char *)mxGetData(dval); break;
case 11: MyRayData[elem_num].Eyr = (double)*(unsigned char *)mxGetData(dval); break;
case 12: MyRayData[elem_num].Eyi = (double)*(unsigned char *)mxGetData(dval); break;
case 13: MyRayData[elem_num].Exr = (double)*(unsigned char *)mxGetData(dval); break;
case 14: MyRayData[elem_num].Ezi = (double)*(unsigned char *)mxGetData(dval); break;
case 15: MyRayData[elem_num].wave = (int)*(unsigned char *)mxGetPr(dval); break;
case 16: MyRayData[elem_num].error = (int)*(unsigned char *)mxGetPr(dval); break;
case 17: MyRayData[elem_num].vigcode = (int)*(unsigned char *)mxGetPr(dval); break;
case 18: MyRayData[elem_num].want_opd = (int)*(unsigned char *)mxGetPr(dval); break;
} break;
case mxINT16_CLASS : // The data is a short
// mexPrintf("%i\n", *(short *)mxGetData(dval)); //debug
switch (FieldIndex)
{
case 1: MyRayData[elem_num].x = (double)*(short *)mxGetData(dval); break;
case 2: MyRayData[elem_num].y = (double)*(short *)mxGetData(dval); break;
case 3: MyRayData[elem_num].z = (double)*(short *)mxGetData(dval); break;
case 4: MyRayData[elem_num].l = (double)*(short *)mxGetData(dval); break;
case 5: MyRayData[elem_num].m = (double)*(short *)mxGetData(dval); break;
case 6: MyRayData[elem_num].n = (double)*(short *)mxGetData(dval); break;
case 7: MyRayData[elem_num].opd = (double)*(short *)mxGetData(dval); break;
case 8: MyRayData[elem_num].intensity = (double)*(short *)mxGetData(dval); break;
case 9: MyRayData[elem_num].Exr = (double)*(short *)mxGetData(dval); break;
case 10: MyRayData[elem_num].Exi = (double)*(short *)mxGetData(dval); break;
case 11: MyRayData[elem_num].Eyr = (double)*(short *)mxGetData(dval); break;
case 12: MyRayData[elem_num].Eyi = (double)*(short *)mxGetData(dval); break;
case 13: MyRayData[elem_num].Exr = (double)*(short *)mxGetData(dval); break;
case 14: MyRayData[elem_num].Ezi = (double)*(short *)mxGetData(dval); break;
case 15: MyRayData[elem_num].wave = (int)*(short *)mxGetPr(dval); break;
case 16: MyRayData[elem_num].error = (int)*(short *)mxGetPr(dval); break;
case 17: MyRayData[elem_num].vigcode = (int)*(short *)mxGetPr(dval); break;
case 18: MyRayData[elem_num].want_opd = (int)*(short *)mxGetPr(dval); break;
} break;
case mxUINT16_CLASS : // The data is an unsigned short
// mexPrintf("%i\n", *(unsigned short *)mxGetData(dval)); //debug
switch (FieldIndex)
{
case 1: MyRayData[elem_num].x = (double)*(unsigned short *)mxGetData(dval); break;
case 2: MyRayData[elem_num].y = (double)*(unsigned short *)mxGetData(dval); break;
case 3: MyRayData[elem_num].z = (double)*(unsigned short *)mxGetData(dval); break;
case 4: MyRayData[elem_num].l = (double)*(unsigned short *)mxGetData(dval); break;
case 5: MyRayData[elem_num].m = (double)*(unsigned short *)mxGetData(dval); break;
case 6: MyRayData[elem_num].n = (double)*(unsigned short *)mxGetData(dval); break;
case 7: MyRayData[elem_num].opd = (double)*(unsigned short *)mxGetData(dval); break;
case 8: MyRayData[elem_num].intensity = (double)*(unsigned short *)mxGetData(dval); break;
case 9: MyRayData[elem_num].Exr = (double)*(unsigned short *)mxGetData(dval); break;
case 10: MyRayData[elem_num].Exi = (double)*(unsigned short *)mxGetData(dval); break;
case 11: MyRayData[elem_num].Eyr = (double)*(unsigned short *)mxGetData(dval); break;
case 12: MyRayData[elem_num].Eyi = (double)*(unsigned short *)mxGetData(dval); break;
case 13: MyRayData[elem_num].Exr = (double)*(unsigned short *)mxGetData(dval); break;
case 14: MyRayData[elem_num].Ezi = (double)*(unsigned short *)mxGetData(dval); break;
case 15: MyRayData[elem_num].wave = (int)*(unsigned short *)mxGetPr(dval); break;
case 16: MyRayData[elem_num].error = (int)*(unsigned short *)mxGetPr(dval); break;
case 17: MyRayData[elem_num].vigcode = (int)*(unsigned short *)mxGetPr(dval); break;
case 18: MyRayData[elem_num].want_opd = (int)*(unsigned short *)mxGetPr(dval); break;
} break;
case mxINT32_CLASS : // The data is a regular int
// mexPrintf("%i\n", *(int *)mxGetData(dval)); //debug
switch (FieldIndex)
{
case 1: MyRayData[elem_num].x = (double)*(int *)mxGetData(dval); break;
case 2: MyRayData[elem_num].y = (double)*(int *)mxGetData(dval); break;
case 3: MyRayData[elem_num].z = (double)*(int *)mxGetData(dval); break;
case 4: MyRayData[elem_num].l = (double)*(int *)mxGetData(dval); break;
case 5: MyRayData[elem_num].m = (double)*(int *)mxGetData(dval); break;
case 6: MyRayData[elem_num].n = (double)*(int *)mxGetData(dval); break;
case 7: MyRayData[elem_num].opd = (double)*(int *)mxGetData(dval); break;
case 8: MyRayData[elem_num].intensity = (double)*(int *)mxGetData(dval); break;
case 9: MyRayData[elem_num].Exr = (double)*(int *)mxGetData(dval); break;
case 10: MyRayData[elem_num].Exi = (double)*(int *)mxGetData(dval); break;
case 11: MyRayData[elem_num].Eyr = (double)*(int *)mxGetData(dval); break;
case 12: MyRayData[elem_num].Eyi = (double)*(int *)mxGetData(dval); break;
case 13: MyRayData[elem_num].Exr = (double)*(int *)mxGetData(dval); break;
case 14: MyRayData[elem_num].Ezi = (double)*(int *)mxGetData(dval); break;
case 15: MyRayData[elem_num].wave = *(int *)mxGetPr(dval); break;
case 16: MyRayData[elem_num].error = *(int *)mxGetPr(dval); break;
case 17: MyRayData[elem_num].vigcode = *(int *)mxGetPr(dval); break;
case 18: MyRayData[elem_num].want_opd = *(int *)mxGetPr(dval); break;
} break;
case mxUINT32_CLASS : // The data is an unsigned int
// mexPrintf("%i\n", *(unsigned int *)mxGetData(dval)); //debug
switch (FieldIndex)
{
case 1: MyRayData[elem_num].x = (double)*(unsigned int *)mxGetData(dval); break;
case 2: MyRayData[elem_num].y = (double)*(unsigned int *)mxGetData(dval); break;
case 3: MyRayData[elem_num].z = (double)*(unsigned int *)mxGetData(dval); break;
case 4: MyRayData[elem_num].l = (double)*(unsigned int *)mxGetData(dval); break;
case 5: MyRayData[elem_num].m = (double)*(unsigned int *)mxGetData(dval); break;
case 6: MyRayData[elem_num].n = (double)*(unsigned int *)mxGetData(dval); break;
case 7: MyRayData[elem_num].opd = (double)*(unsigned int *)mxGetData(dval); break;
case 8: MyRayData[elem_num].intensity = (double)*(unsigned int *)mxGetData(dval); break;
case 9: MyRayData[elem_num].Exr = (double)*(unsigned int *)mxGetData(dval); break;
case 10: MyRayData[elem_num].Exi = (double)*(unsigned int *)mxGetData(dval); break;
case 11: MyRayData[elem_num].Eyr = (double)*(unsigned int *)mxGetData(dval); break;
case 12: MyRayData[elem_num].Eyi = (double)*(unsigned int *)mxGetData(dval); break;
case 13: MyRayData[elem_num].Exr = (double)*(unsigned int *)mxGetData(dval); break;
case 14: MyRayData[elem_num].Ezi = (double)*(unsigned int *)mxGetData(dval); break;
case 15: MyRayData[elem_num].wave = (int)*(unsigned int *)mxGetPr(dval); break;
case 16: MyRayData[elem_num].error = (int)*(unsigned int *)mxGetPr(dval); break;
case 17: MyRayData[elem_num].vigcode = (int)*(unsigned int *)mxGetPr(dval); break;
case 18: MyRayData[elem_num].want_opd = (int)*(unsigned int *)mxGetPr(dval); break;
} break;
}
}
else if (FieldIndex != 0) // We found a non-numeric value in one of the recognised fields - not kosher
{
mexPrintf("Fields named \"%s\" must be numeric.", FieldName);
mexErrMsgTxt("Aborted");
}
}
}
}
// OK ready to initiate DDE and stuff, we have the DDERAYDATA ready for business.
// But first, we have to take care of mode 5 subtleties....
if (mode==5) nelems = numrays + 1;
mexPrintf("Input structure populated.\n"); //debug
SendMessage (hwnd, WM_USER_INITIATE, 0, 0L);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
// return msg.wParam; // Presumably this is of no use in a DLL.
// mexPrintf("Creating output array..\n"); //debug
// Create the output array
plhs[0] = mxCreateStructMatrix(1, nelems, NUMFIELDS, FieldNames);
if (plhs[0] == NULL) mexPrintf("Pointer is NULL.\n"); //debug
nlhs = 1; // One output argument
mexPrintf("About to start populating ouput structure\n");
// Stuff the results back into a Matlab struct array
for (field_num=0; field_num<NUMFIELDS; field_num++) // Run through the fields in the struct and set the data from the retured array
{
strcpy(FieldName, mxGetFieldNameByNumber(plhs[0], field_num)); //debug
// mexPrintf("Field name %i is \"%s\"\n", field_num, FieldName); //debug
for (elem_num=0; elem_num<nelems; elem_num++) // Run through the elements
{
// dval = mxGetField(gprhs, elem_num, FieldName);
// if (dval == NULL) mexPrintf("Nothing, sorry\n"); //debug
switch (field_num)
{
case 0 : mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].x)); break;
case 1 : mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].y)); break;
case 2 : mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].z)); break;
case 3 : mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].l)); break;
case 4 : mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].m)); break;
case 5 : mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].n)); break;
case 6 : mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].opd)); break;
case 7 : mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].intensity)); break;
case 8 : mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].Exr)); break;
case 9 : mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].Exi)); break;
case 10: mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].Eyr)); break;
case 11: mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].Eyi)); break;
case 12: mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].Ezr)); break;
case 13: mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar(MyRayData[elem_num].Ezi)); break;
// The following is a compromise - would have preferred to return int32 values, but could not get that working
case 14: mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar((double)MyRayData[elem_num].wave)); break;
case 15: mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar((double)MyRayData[elem_num].error)); break;
case 16: mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar((double)MyRayData[elem_num].vigcode)); break;
case 17: mxSetField(plhs[0], elem_num, FieldName, mxCreateDoubleScalar((double)MyRayData[elem_num].want_opd)); break;
}
}
}
// Return the original MyRayData memory to free
// mexPrintf("Returning Memory..\n"); //debug
mxFree(MyRayData);
// BEEP(200,500); //debug
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
ATOM aApp, aTop, aItem;
DDEACK DdeAck;
DDEDATA *pDdeData;
GLOBALHANDLE hDdeData;
WORD wStatus;
UINT uiLow, uiHi;
switch (iMsg)
{
case WM_CREATE :
hwndServer = 0;
return 0;
case WM_USER_INITIATE :
/* find ZEMAX */
aApp = GlobalAddAtom ("ZEMAX");
aTop = GlobalAddAtom ("RayData");
SendMessage (HWND_BROADCAST, WM_DDE_INITIATE, (WPARAM) hwnd, MAKELONG (aApp, aTop));
/* delete the atoms */
GlobalDeleteAtom (aApp);
GlobalDeleteAtom (aTop);
/* If no response, terminate */
if (hwndServer == NULL)
{
// MessageBox (hwnd, "Cannot Communicate with ZEMAX.", "ZEMAX Inactive", MB_ICONEXCLAMATION | MB_OK);
DestroyWindow(hwnd);
mexErrMsgTxt("Unable to contact ZEMAX. Pleas ensure ZEMAX is executing.");
return 0;
}
hwndClient = hwnd;
UserFunction(); /* Here go off and do the DDE calls */
/* terminate the DDE connection */
PostMessage(hwndServer, WM_DDE_TERMINATE, (WPARAM) hwnd, 0L);
hwndServer = NULL;
/* now TERMINATE! */
DestroyWindow(hwnd);
return 0;
case WM_DDE_DATA :
/* here comes the data! */
// wParam -- sending window handle
// lParam -- DDEDATA memory handle & item atom
UnpackDDElParam(WM_DDE_DATA, lParam, &uiLow, &uiHi);
FreeDDElParam(WM_DDE_DATA, lParam);
hDdeData = (GLOBALHANDLE) uiLow;
pDdeData = (DDEDATA *) GlobalLock (hDdeData);
aItem = (ATOM) uiHi;
// Initialize DdeAck structure
DdeAck.bAppReturnCode = 0;
DdeAck.reserved = 0;
DdeAck.fBusy = FALSE;
DdeAck.fAck = FALSE;
// Check for matching format, put the data in the buffer
if (pDdeData->cfFormat == CF_TEXT)
{
/* get the data back into RD */
if (rdpGRD) memcpy(rdpGRD, (DDERAYDATA *) pDdeData->Value, (ngNumRays+1)*sizeof(DDERAYDATA));
else strcpy(szGlobalBuffer, (char *) pDdeData->Value);
}
GotData = 1;
GlobalDeleteAtom (aItem);
// Acknowledge if necessary
if (pDdeData->fAckReq == TRUE)
{
wStatus = *((WORD *) &DdeAck);
if (!PostMessage ((HWND) wParam, WM_DDE_ACK, (WPARAM) hwnd, PackDDElParam (WM_DDE_ACK, wStatus, aItem)))
{
if (hDdeData)
{
GlobalUnlock (hDdeData);
GlobalFree (hDdeData);
}
return 0;
}
}
// Clean up
GlobalUnlock (hDdeData);
if (pDdeData->fRelease == TRUE || DdeAck.fAck == FALSE) GlobalFree (hDdeData);
return 0;
case WM_DDE_ACK:
/* we are receiving an acknowledgement */
/* the only one we care about is in response to the WM_DDE_INITIATE; otherwise free just the memory */
if (hwndServer == NULL)
{
uiLow = (UINT) NULL;
uiHi = (UINT) NULL;
UnpackDDElParam(WM_DDE_ACK, lParam, &uiLow, &uiHi);
FreeDDElParam(WM_DDE_ACK, lParam);
hwndServer = (HWND) wParam;
if (uiLow) GlobalDeleteAtom((ATOM) uiLow);
if (uiHi) GlobalDeleteAtom((ATOM) uiHi);
}
else
{
HWND dummy;
uiLow = (UINT) NULL;
uiHi = (UINT) NULL;
UnpackDDElParam(WM_DDE_ACK, lParam, &uiLow, &uiHi);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -