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

(1条)
默认 最新
评论 点赞
点赞 1 评论 1 收藏
关注