我现在正在做的一个项目正好让我用到了很多关于Picture控件。这也是我第一个涉及到Picture控件的大项目,我从中也得到了很大的乐趣!
        因此,在本周的Nugget中,我会写一些我从中总结出的一些技巧和经验,希望对那些想用好Picture控件的各位有所帮助:

        首先,我发现,如果你不选择Picture控件右键菜单中的“Erase First”,那么整个图片会更新得更快。如果你需要在图片上改变什么,我会试图只是重画图片中必要的部分,而保留其余地方不变。因此,如果你是要处理一个很大的图片的话,那么你需要不选择Erase First这个选项。
        如果你需要重新绘制整个图片,你可以先擦除所有内容(否则新的画就会覆盖在老的画中)。你可以简单地使用Picture控件的Erase First属性,将“1”连于此,这样你就可以擦除内容一次,而不需要去改变真正的“Erase First”设定项。
·
       在我的项目中,我在Picture 控件中使用了很多拖拽的效果。有一个很聪明的方法是,当你点击与拖拽Picture控件中的对象时,我会利用“move”的这个行为,让它看上去真的像随 着鼠标光标移动,直到我放下这个对象。有两种方式可以解决这个问题……其中一种是在你移动对象时,主Picture控件中重新绘制图片。当然,第二种方法 看上去会运行得快得多……其实你可以有第二个Picture控件,是一个透明的Picture控件(边框也是透明)。然后在这个程序中,你可以在这个控件 中画需要移动的图案。然后,你根据鼠标的位置改变该控件的位置。这样也能达到同样的效果,结果显示这种方式比第一种方式要快得多,并且也很酷。
·
        在Picture Function函数板上有着许多函数和VI用来在一个Picture控件上绘制对象,比如Draw Point、Draw Line、Draw Rect等。我倒不经常用这些VI,作为替代,我会使用像Microsoft Paint这样的软件来画我会在Picture控件上用的物体的位图。在很多场合,我会使用Read from BMP File这个VI 来读取位图到LabVIEW,然后我会使用Unflatten Pixmap VI将它转换为2维数组。此时,我有一个2D数组常量,然后我可以通过使用Draw Unflattened Pixmap这个VI使用在我的程序框图中。这样,不需要画一堆复杂的绘画VI,我就有了一个2D数组常量,只有当我的对象图片出现变化时候才需要更新。
·
        上面这个规则的一个例外就是我会使用Get Text Rect和Draw Text in Rect这两个VI。该VI会让在Picture控件中添加文本以及定义图片中有文字的区域变得很容易,从而允许我做一些很Cool的事情,比如当这些文 字被点击,我可以显示一个之前隐藏的组合框,从而允许用户能够在我的Picture控件中编辑文本。
 
        好了,真的有点像意识流的写法,但我真诚希望这些要点将是各位希望通过使用Picture控件来实现很美观的LabVIEW界面的开发者们。在我开始这个项目之前,有人曾经告诉过我,你可以通过Picture控件在LabVIEW下做出任何酷的界面,我现在觉得他们说的挺对的。

 

        在我目前的某个项目开发过程中,我开发了一些自定义的探针(Probe)来帮助我的程序调试,然后我将这些Probe放在了NI Community网站上(附件中有)。

        这个带历史的探针可以允许你看到一条线上传递的各种值的变化历史,它适合所有的数值类型(除了U64和I64),以及字符串型、路径以及布尔类型等等。

         这个探针确实帮助了我,尤其是当我有一个已经运行了一段次数的For循环,而我需要看在每次For循环时传递的值时,这个探针可以帮助我调试这种情况。我也希望各位LabVIEW开发者也能用到这个工具。

 

       这是一个在LabVIEW 7.0版本时引入的叫作Automatic Error Handling的特性,它是VI的一个属性,允许你可以在程序框图中的节点返回错误时看到弹出的对话框,这样你也不用讲这些错误输出都连上。

       如果你只是 依靠这个特性来实现错误发生时的警报处理,那么你就需要改变你的做法了!我觉得这个特性只是帮助LabVIEW初学者不需要担忧错误处理方面的问题。

       但是 如果你正在读这个Nugget,那么你已经有了很多经验,也应该在你的VI中使用更有效的错误处理方式,这样你就不需要再依赖Automatic Error Handling了。看一下下面两个截屏:


        缺省情况下,LabVIEW会直接使能Tools>Options>Block Diagram>Enable automatic error handling in new Vis这 个选项。在你连接VI中所有的错误I/O终端来代替关掉这个选项。

        我强烈建议,你可以将Enable automatic error handling dialogs这个选项打开,因为虽然你的VI可能大都会用错误连接的方式,但是很多你从别人拿到的VI就不会做得那么好了。


        请记住,
Automatic Error Handling会在你的VI运行并且程序中任何节点出现错误但没有线连下去的时候弹出对话框。这种方式,会造成,如果你在运行一个非常苛刻的应用程序 时,突然冒出个对话框这种很致命的问题。这也是为什么我建议大家用错误连接的方式的主要原因。

 

        今天的小技巧是可以让你以更方便的方式实现下面的程序:

        从上面框图中你可以看到,这一个结构是Object通过它们的名字来指认。我们其实可以将这个代码变得更为易读(可能会更快),这一个方法就是使用Search 1D Array:

        但是以上两种方法其实本身还是线性的搜索方式,因此,下面的方式可能让整个搜索数据的速度达到最快:

       在这个技巧之前,我根本没有对Variant Attribute这个概念有过深入的了解。你可以保存每个数据对象作为一个空变量的不同属性。我这边说“空”变量是因为它的实际值和数据类型都是无关紧 要的。我们可以很纯粹地使用变量作为一个可以搜索它属性的数据存储方式。我并不是一个计算机语言学家,但是很显然,Variant Attribute是以红黑树算法进行保存的,因此可以让它的搜索算法速度达到log(n)级别,这样比之前线性的n搜索级别要快很多。

       因此下次如果你想创建一个字符串数组查看表(就像之前的两种传统方法一样)时,你可以试一下这个Variant Attribute方法。

 

待整理........

 

       我在很多LabVIEW 论坛中都看到人们在抱怨一个事实:Read from Spreadsheet File以及Write to Spreadsheet File这两个VI只能接受DBL数组作为输入。

       他们经常会讨论,如何可以修改这些VI从而让我们可以以字符串的类型进行输入(甚至于整型)。好的,在 LabVIEW 8.2之后,Read from Spreadsheet File与Write to Spreadsheet File这两个VI都为多态VI,并且可以接受DBL、I64以及字符串数组作为输入。
       当然,任何整型输入都需要用I64的格式,任何实型的输入都使用 DBL格式。希望这个新特性能够节省大家的时间,特别是对于字符串数据的输入。

 

        如果你是Windows LabVIEW的用户,那么有多少次你必须在一个文件对话框中导航一个文件夹位置?答案一定是很多次……不管你是打开一个新的VI,或者从LabVIEW UI中选择一个文件等等。
        我经常会希望我可以通过LabVIEW文件对话框让这个导航过程更快捷一点。好了,在LabVIEW 8.2中,就有这样一个新特性,可以帮你更快地进行文件导航。你可以讲下面的命令行放在你的INI文件中(LabVIEW 8.2以上版本有效):


MRUFolders=TRUE

        加了这个配置条目后,每次你在LabVIEW中的文件对话框中选择什么的时候,这些常用路径就会直接放在Windows文件对话框的左端让你直接点击,如下图:

        有了这个特性之后,你可以直接快捷点到你LabVIEW中最近的5个路径,试一下吧!

 

       嘿!LabVIEW 8.2的用户们!
       将下面这一行放在LabVIEW INI文件中:


Iluvlv20 = True

        让我们看一下谁会第一个发现这个设定是做什么的…… :)

PS. 还有另外一个INI设定: TwentyYears=True …… 这个会比较明显一点。


       还真有人试了试!


      那里来的生日蛋糕?

 

        这个技巧对于那些想同时运行LabVIEW的多个版本的开发者非常有用。

        在La bVIEW 8.0以后版本,你可以在你的LabVIEW INI文件中放置如下的一条指令:


showExePathInWindowTitle=True

        一旦在INI 文件中写了这条指令,那么每个你打开的VI的标题都会显示正运行的LabVIEW EXE文件的路径。比如,如果你在一个缺省安装路径中运行了LabVIEW 8.0,那么你的所有VI标题栏都会显示“LabVIEW 8.0/LabVIEW”。
          如果你在自定义位置(比如c:\lv80\lv80.exe)中安装了LabVIEW(我就是这么来安装的……),那么你的 VI标题栏会有“lv80/lv80”字样。
          需要注意的是这段信息追加在已有的标题栏内容之后。

 

       这次是一个比较晦涩的小技巧。
      
In Range and Coerce 函数(在LabVIEW 8.0以上版本的Functions > Programming > Comparison 函数板中)现在可以实现许多不同的数据类型的输入了。
       其中一个可接受的数据类型是路径,在LabVIEW 8.2之前,如果你只是输入两个路径,那么In Range and Coerce函数会一直返回False值。但是,在LabVIEW 8.2中,函数确实会对路径进行操作。它会检查路径字符串的ASCII码并且显示是否输入在指定的范围中,看一下下面的截图:


       你可以看到,“
c:\blah4.txt”的值被确定为“在范围内”,它在“c:\blah1.txt”和“c:\blah5.txt”之间。虽然我不知道什么时候会用到这个功能,但是有这个功能总比没有强。