ZEMAX軟件技術應用教程專題:將二進制文件光源轉換為ASCII

本文解釋了如何將用于文件光源的二進制文件轉換為 ASCII 文本文件。文本輸出文件對于研究其中的光線數據很有用。一旦生成,文本輸出文件也可以用于文件光源當中。但是,建議盡可能使用二進制文件作為文件光源輸入,因為使用文本文件來表示光線數據時,光線追跡速度會慢上很多。

作者 Sanjay Gangadhara

下載

附件下載

簡介

文件光源物體可在非序列模式中用于直接指定一組光源光線的坐標、余弦、強度和波長。LED 和其他復雜的光源使用文件光源物體建模時最為精準。

OpticStudio支持兩種格式的文件光源物體:二進制文件和ASCII文件。二進制文件允許在較小文件中儲存大量的光線數據集,而ASCII文件允許用戶檢查文件的內容。將文件從二進制轉換為ASCII只需一段簡單的C代碼。此代碼對于理解OpticStudio中文件光源使用的二進制文件以及光束數據庫文件 (ZRD) 非常有用。

ZEMAX軟件技術應用教程專題:將二進制文件光源轉換為ASCII的圖1將二進制文件轉換為ASCII的源代碼

將二進制文件光源轉換為ASCII文本文件的應用程序 (SourceFileRead.exe) 可以在本文附件部分下載。該文件夾中還有用于生成應用程序的源代碼 (SourceFileRead.c)。

代碼相當簡單,首先它定義了用于存儲光線數據的二進制文件的結構:

/* Define the data structure for the file header information */
typedef struct
{
int Identifier;         // Will be set to 8675309 or 1010 for 
//  quick check of proper format
int NbrRays;            // The number of rays in the file
char Description[100];  // A text description of the source
float SourceFlux;       // The total flux in watts of this 
//  source
float RaySetFlux;       // The flux in watts represented by
//  this Ray Set
float Wavelength;       // The wavelength in μm, 0 if
//  a composite
float AzimuthBeg, AzimuthEnd;  // Angular range for ray set
// (Degrees)
float PolarBeg, PolarEnd;      // Angular range for ray set
// (Degrees)
long DimensionUnits;    // METERS=0, INCHES=1, CM=2, FEET=3,
//  MM=4
float LocX, LocY,LocZ;  // Coordinate Translation of the source
float RotX,RotY,RotZ;   // Source rotation (Radians)
float ScaleX, ScaleY, ScaleZ;  // Scale factor to expand/
//  contract source
float unused1, unused2, unused3, unused4;
int reserved1, reserved2, reserved3, reserved4;
} NSC_RAY_DATA_HEADER;

 

/* Define the data structure for the ray information */
typedef struct
{
float x, y, z;
float l, m, n;
float intensity;
} FLUX_ONLY;
typedef struct
{
float x, y, z;
 float l, m, n;
float flux, wavelength;
} SPECTRAL_COLOR;

注意,包含每根光線波長信息的文件(即光譜數據格式或 .SDF文件)和不包含波長信息的文件(即 .DAT文件)會使用不同的數據結構。

接下來對代碼進行主調用,并定義變量來存儲光線數據:

int main(void)
{
char filein[MAX_PATH_LENGTH];
char fileout[MAX_PATH_LENGTH];
char disp[MAX_PATH_LENGTH];
int i, file_ident, file_rays, file_format, file_type;
long file_dim;
float xr, yr, zr, lr, mr, nr, intr, wavr;
FILE *in, *out;
NSC_RAY_DATA_HEADER nscrdh;
FLUX_ONLY nscrdf;
SPECTRAL_COLOR nscrdc;

用戶接下來需要輸入二進制輸入文件和ASCII的輸出文件的名稱:

/* Determine the file names to be read from and written to */
printf("Enter the name of the binary file to be converted (include full path): ");
gets(filein);
printf("Enter the name for the ASCII text file (include full path): ");
gets(fileout);

然后,打開輸入和輸出文件,以便分別對它們進行讀取和寫入(如果找不到輸入文件,程序將自動終止,并在ASCII輸出文件中報錯)。將二進制文件中的標題數據導入本地變量中,以驗證輸入文件的格式正確:

/* Read necessary header data into local variables &
confirm file format */
fread(&nscrdh,1,sizeof(NSC_RAY_DATA_HEADER),in);
file_ident = nscrdh.Identifier;
file_rays = nscrdh.NbrRays;
file_dim = nscrdh.DimensionUnits;
file_format = nscrdh.ray_format_type;
file_type = nscrdh.flux_type;
if ((file_ident == 1010) || (file_ident == 8675309))
{
sprintf(disp, "Valid file identifier \n");
fputs(disp, out);
}
else
{
sprintf(disp, "Incorrect file identifier");
fputs(disp, out);
goto fast_exit;
}
if ((file_format == 0) || (file_format == 2))
{
if (file_format == 0)
{
if ((file_type == 0) || (file_type == 1))
{
goto data_write;
}
else
{
sprintf(disp, "Incorrect flux type identifier");
fputs(disp, out);
goto fast_exit;
}
}
else
{
if (file_type != 0)
{
sprintf(disp, "Incorrect flux type identifier");
fputs(disp, out);
goto, fast_exit;
}
}
}
else
{
sprintf(disp, "Incorrect file format identifier");
fputs(disp, out);
fputs("\n", out);
sprintf(disp, "File format identifier = %i", file_format);
fputs(disp, out);
goto fast_exit;
}

最后,將標題數據寫入輸出文件,并結合輸入文件中每條光線的坐標、余弦、強度和波長數據(可選):

/* Write header, ray information into output file */
sprintf(disp, "%i %i \n", file_rays, file_dim, file_format, file_type);
fputs(disp, out);
if (file_format == 0)
{
for (i=0; i <= file_rays - 1; i++)
  {
fread(&nscrdf,1,sizeof(FLUX_ONLY),in);
xr = nscrdf.x;
yr = nscrdf.y;
zr = nscrdf.z;
lr = nscrdf.l;
mr = nscrdf.m;
nr = nscrdf.n;
intr = nscrdf.flux;
sprintf(disp, "%f %f %f %f %f %f %f \n",
xr, yr, zr, lr, mr, nr, intr);
fputs(disp, out);
}
}
else
{
for (i=0; i <= file_rays - 1; i++)
{
fread(&nscrdc,1,sizeof(SPECTRAL_COLOR),in);
xr = nscrdc.x;
yr = nscrdc.y;
zr = nscrdc.z;
lr = nscrdc.l;
mr = nscrdc.m;
nr = nscrdc.n;
intr = nscrdc.flux;
wavr = nscrdc.wavelength;
sprintf(disp, "%f %f %f %f %f %f %f %f \n",
xr, yr, zr, lr, mr, nr, intr, wavr);
fputs(disp, out);
}
}

輸出文本文件的格式與文件光源的ASCII文件格式匹配,如OpticStudio幫助文件“NSC光源”章節所述。

ZEMAX軟件技術應用教程專題:將二進制文件光源轉換為ASCII的圖2將二進制文件轉換為ASCII的應用程序

應用程序可以通過雙擊圖標啟動。打開程序后會出現一個窗口,提示用戶輸入二進制文件 (.DAT) 的文件名:

ZEMAX軟件技術應用教程專題:將二進制文件光源轉換為ASCII的圖3

如提示符中所示,文件名需要包含完整路徑。一旦提供了輸入文件,用戶將被提示鍵入ASCII輸出文件 (.txt) 的文件名:

ZEMAX軟件技術應用教程專題:將二進制文件光源轉換為ASCII的圖4

同樣,輸出文件名也需要包含完整的路徑。一旦輸入了對應文件名,程序就會開始生成輸出文件。程序運行需要一些時間,具體取決于原始輸入文件的大小。如前一節所示,輸出文本文件的格式與文件光源的 ASCII 文件格式相匹配,詳見OpticStudio幫助文件中名為“NSC 光源”的章節。因此,這個輸出文件也可以與文件光源物體一起使用(文件數據標題信息需要修改,比如二進制文件的名稱會包含在生成的 ASCII 文本文件的數據標題中,但是如果這個文本文件要用于OpticStudio內,就必須刪除所包含的文件名)。我們建議光線追跡時盡可能使用二進制文件,因為使用文本文件時系統運行的速度可能會較慢。

 

Ansys Zemax國內可靠代理商



  光研科技南京有限公司是國內可靠的光學軟件和儀器光電供應商,提供企業定制化上門培訓服務,承接各類光學設計項目,并有一系列自主編寫出版的光學設計書籍。公司擁有一支高素質、高水平、實戰經驗豐富的管理,銷售以及研發團隊,從成立到現在已經為廣大企業,研究所以及高校提供了很多優秀的產品和服務,是光電圈內值得信賴的企業。追光逐夢,研以致用!以用戶的需求為起點,為客戶提供有價值的光學產品和服務一直都是光研科技南京有限公司的宗旨。

 


  AnsysZemax光學軟件咨詢與訂購聯系方式

       聯系人:南京光研   徐保平

  手機號:15051861513

  微信號:13627124798

 

       您也可以掃一掃下面的二維碼直接咨詢

 

ZEMAX軟件技術應用教程專題:將二進制文件光源轉換為ASCII的圖5

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1
1