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

📄 zarraytrace.cpp

📁 zemax与matlab调用程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						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 + -