第七章图形硬拷贝输出本章概要在使用IDL的时候,如何以硬拷贝形式再现屏幕中的图形是最复杂,也是最难理解的问题。然而,这是大多数献身科学的人的需求,但很少有令人完全满意的方法来和同事共享科学结果。本章将集中于PostScript输出,因为PostScript是普遍接收的一种输出媒介,大部分使用IDL的程序员都能使用PostScript打印机。所有关于PostScript的内容同样适用于其它输出设备,比如HP绘图仪和PCL打印机。具体来说,将学习:1.如何选择硬拷贝输出设备2.如何配置硬拷贝输出设备3.如何将图形输出直接传送到打印机4.如何将图形输出传送到一个文件中5.如何为硬拷贝输出设备产生图形输出6.PostScript输出与显示器的输出有什么不同7.如何在PostScript页面上定位图形和图像8.如何产生能包含在其它文档中的图形输出9.如何编写能很容易地转化为硬拷贝输出的程序10.如何在PostScript种使用颜色选择图形硬拷贝输出设备与设置其它图形显示设备一样,在IDL中,仍然使用Set_plot命令来设置图形硬拷贝输出设备:Set_Plot,'option'其中的option是下列的任何一种,注意option总是一个字符串,因此要使用单引号括起来。与IDL其它大多数字符串不一样,option对大小写不敏感。CGM输出写入CGM(计算机图形元文件)格式的文件中,CGM也是一种独立于设备的文件格式,用于交换图形信息。CGM文件能以三种形式之一编码:(1)文本,(2)二进制数据,(3)NCAR二进制数据。HP输出以惠普图形语言(HP-GL)格式写入一个文件,它适用于各种各样的HP-GL笔式绘图仪。PCL输出以惠普打印机控制语言(PCL)格式写入一个文件,它适用于各式激光和喷墨打印机。PRINTER输出以任何适合于默认打印机的方式直接传送到该打印机。PS输出以PostScript格式写入一个文件中。Z输出被写入Z图形缓冲区。在打印完毕后,应再次使用Set_plot命令将输出设备改回为图形显示设备的类型,以下是一些常用的显示设备:WIN使用微软Windows或NT操作系统的个人计算机。MAC使用MacOS操作系统的计算机X使用XWindow系统的计算机。只有一种设备能成为当前图形设备,可以通过检查!D.Name系统变量来确定当前的设备是哪种,如下:IDLPrint,!D.Name注意,当设定设备名时,设备名对大小写不敏感,但当在代码中使用该名字时,就不一定不敏感了。存储在!D.Name系统变量中的图形设备名是以大写字母形式存储的。这在下面的字符串比较语句中尤为重要:IDLIF!D.NameEQ'PS'THENPrint,'UsingPostScript…'配置图形硬拷贝输出设备一旦选定了图形输出设备,所有设备具体的配置参数都用Device命令通过关键字来控制。Device命令可用的关键字主要取决于当前的设备。但打印设备(总是和默认的打印机相连)的设置也可以使用Dialog_PrinterSetup命令来设置(详见201页的“配置和使用打印设备”)。测定当前的设备配置使用Help命令,可以知道当前硬拷贝输出设备所设定的配置参数,如下:IDLHelp,/Device将能看到一系列的有关当前图形设备的当前设置参数及其参数值。这些信息可以用来配置设备。关于设备可用的颜色数,IDL使用的是哪种图形函数以及当前选择的硬件字体等等信息,都取决于所设定的当前设备是何种设备。注意,这些信息的显示随着每个硬拷贝输出选项的不同而不同。例如,键入下面这些命令来看PostScript输出设备缺省配置如何:IDLthisDevice=!D,NameIDLSet_Plot,'PS'IDLHelp,/DeviceIDLSet_Plot,thisDevice以下为Help命令的显示结果(在WindowsNT机器上):AvailableGraphicsDevices:CGMHPNULLPCLPRINTERPSWINZCurrentgraphicsdevice:PSFile:noneMode:Portrait,Non-Encapsulated,EPSIPreviewDisabled,ColorDisabledOffset(X,Y):(1.905,12.7)cm.,(0.75,5)in.Size(X,Y):(17.78,12.7)cm.,(7,5)in.ScaleFactor:1FontSize:12FontEncoding:AdobeStandardFont:HelveticaTrueTypeFont:default#bitsperimagepixel:4FontMapping:(!3)Helvetica(!4)Helvetica-Bold(!5)Helvetica-Narrow(!6)Helvetica-Narrow-BoldOblique(!7)Times-Roman(!8)Times-BoldItalic(!9)Symbol(!10)ZapfDingbats(!11)Courier(!12)Courier-Oblique(!13)Palatino-Roman(!14)Palatino-Italic(!15)Palatino-Bold(!16)Palatino-BoldItalic(!17)AvantGarde-Book(!18)NewCenturySchlbk-Roman(!19)NewCenturySchlbk-Bold(!20)Undefined-User-Font常用的Device命令关键字大部分输出设备能允许以下关键字被用于Device命令(Z设备例外)。以下为想要知道的关键字。对于某个特定输出设备所使用的其它关键字可以查阅IDL在线文档资料。例如,PS设备能接受将近50种不同的关键字。Close_Document这个关键字在刷新了输出缓冲区后关闭图形文档。它被用于从打印机中排出打印页(使用Printer设备时)。Close_File这个关键字在刷新了缓冲区之后关闭该图形输出文件。Filename图形输出设备如果是将输出写入一个文件时有一个缺省文件名。如果没有指定文件名时就使用该文件。一般情况下,该文件名为idl.option,option是所选择的硬拷贝输出设备类型。但也可以使用此关键字指定一个文件名来更改它。例如:IDLDevice,Filename='surface.eps'Inches如果设置了这个关键字,那么关键字XSize、YSize、XOffSet和YoffSet及其设置都被认为是以英寸为单位而不是以缺省的厘米为单位来给定的。IDLDevice,XSize=4.0,/Inches若要回到以厘米为单位来设定尺寸和偏移量,用:IDLDevice,Inches=0Landscape该关键字表示在纸的横向上输出。Portrait该关键字表示在纸的纵向上输出。这是缺省值。XOffSet该关键字确定输出的显示窗口的左下角在纸上的X方向上位置(在纵向模式下)。关于横向模式下的位置详见199页的“计算PostScript在横向模式下的偏移量”。XSize该关键字确定输出显示窗口在纸上的宽度。YOffSet该关键字确定输出的显示窗口的左下角在纸上的Y方向上位置(在纵向模式下)。关于横向模式下的位置详见199页的“计算PostScript在横向模式下的偏移量”。YSize该关键字确定输出显示窗口在纸上的高度。IDLDevice,XSize=4.0,YSize=7.0,/Inches注意一旦在图形输出设备上设定了某个关键字的值,该参数将一直有效,直到显式地更改它或退出IDL。XSize,YSize,XOffSet和YOffSet这些关键字一般是用于在输出页面上定位“图形窗口”。IDL命令使用图形窗口的方式和图形输出使用位于显示设备上的图形窗口的方式完全一样。详细细节参考184页的“显示设备与PostScript设备的相似之处”。创建PostScript文件当前的图形设备总是储存在系统变量!D.Name中,所有图形命令将指向它。因此,实际上,尤其在IDL的程序中,选择一个硬拷贝输出设备的代码一般都类似于下面这个例子,在这个例子中,先创建数据然后送到名为output.ps的一个PostScript文件中。注意,设备如何选择,如何配置,如何在图形命令写入文件后关闭。如果在关闭被打印机处理的文档时失败,它就不能将该页从打印机中排出,因为该文档缺乏PostScript的Showpage命令。该命令用于将该页排出。如果使用的是一台慢速打印机,这点就可不必关心。可以在打印机工作的时候,站起来喝一杯咖啡。IDLdata=LoadData(1)IDLthisDeivce=!D.NameIDLSet_Plot,‘PS’IDLDevice,Filename=’output.ps’,XSize=4,Ysize=4,$/Inches,Xoffset=2.25,Yoffset=3.5IDLPlot,dataIDLDevice,/Close_FileIDLSet_Plot,thisDevice将图形送到硬拷贝设备中对于制作硬拷贝输出的一般概念是,用Set_plot命令选择硬拷贝设备,,用Device命令并按要求设置该设备(或者在使用打印机的情况下,有时可用Dialog_PrinterSetup),执行和用于输出到显示设备相同的IDl命令。然而这些命令将输出到文件或打印机,而不是输出到显示设备上。当完成调用IDL的图形命令后,关闭输出文件或打印任务,并以便把文件传送指向所选择的打印机或绘图仪。如果是使用打印机,路由传送是自动完成的。(详见181页的“打印PostScript文件”的关于将IDL产生的PostScript文件传送到打印机的章节)。例如,要创建一个PostScript文件,可以键入如下命令:IDLthisDevice=!D.NameIDLSet_Plot,‘PS’IDLDevice,Filename=’plot.ps’,XSize=4,Ysize=4,$/Inches,Xoffset=2.25,Yoffset=3.5IDLPlot,LoadData(1)IDLDevice,/Close_File如果在UNIX机器上产生这个PostScript文件,可以调用一个简单的lpr命令来将文件导向打印机(或者,机器上任何的等效命令)。例如,从IDL中,可以键入这条命令:IDLSpawn,‘lprplot.ps’广义上讲,在显示设备上的输出和PostScript文件中的输出并非完全不同。(麻烦在于细节)。也就是说,Plot,Surface,Contour以及其它IDL图形命令无论是在显示设备上还是在PostScript文件中操作几乎一样。一方面,它们在如何进入文件这方面相似。例如,如果调用Plot或Surface命令,并且显示设备为当前工作的图形设备,当前窗口的内容将被擦除,建立一个新的图形显示。在PostScript设备为当前图形设备时,类似的情况也会发生。每个命令将擦除显示设备上的窗口,启动一个新的PostScript输出页面。相应地,每个图形命令,例如Oplot或XoutS,将在当前显示窗口中被执行,修改当前PostScript输出页面。例如,要显示一幅用XYOutS命令创建的带标题的图和一幅曲面图,可按如下键入:IDLPlot,LoadData(1),Position=[0.1,0.1,0.9,0.8]IDLXYOutS,0.5,0.9,’SimplePlot’,Align=05,/NormalIDLSurface,Dist(41)如果这些命令被用到PostScript设备上而不是显示设备,将得到有两页输出的一个文件。要将这些命令的结果送到一个PostScript文件,可以按如下键入命令:IDLthisDevice=!D.NameIDLSet_Plot,‘PS’IDLDevice,XSize=