雷竞技注册
技术文章

使用ULPs扩展EAGLE CAD工具:编写您的第一个用户语言程序

2017年6月22日经过Yahya Tawil.

在本教程中,您将学习如何在EAGLE CAD中编写您的第一个ULP,以向您的CAD工具添加新的功能。

在本教程中,您将学习如何在EAGLE CAD中编写您的第一个ULP,以向您的CAD工具添加新的功能。

用户语言程序(ULP)是一组针对EAGLE CAD用户的扩展,可以通过自动化的方式方便日常工作,也可以完成没有ULP的帮助无法完成的工作。例如,将图像导入PCB设计的唯一方法是使用import-bmp ULP命令。自动放置,导出BOM,以及在原理图中重新编号零件都是ULP可以帮助的常规工作。

从开发人员的角度来看,EAGLE ULP与C有许多相似之处——实际上,它是一种用于开发这些扩展的类似于C的语言。那么,为什么它是一门重要的编程语言呢?主要原因是开发自己的ULP来帮助自己和其他设计师.此外,ULPS主要由业余爱好者和工程师在他们的空闲时间编写,这通常意味着将来的维护或修订很少。

就我个人而言,我一直在使用ULP在PCB上生产倒(又名负)丝印。网上唯一可用的ULP,negasilk.(链接打开zip文件),可以执行我想要的工作,但与繁琐的步骤。因为这个ULP不能直接应用到我的设计中,所以我应该在一个新的PCB文件中运行它——复制输出,然后将其粘贴回原来的设计。了解ULP的基本知识帮助我改善这个过程,首先让自己和其他人更容易。

ulp的第一个看

EAGLE User Language可用于访问EAGLE数据结构并创建各种输出文件。

EAGLE中有三种主要类型的数据结构:lbr、sch和brd。我认为将它们称为对象更合理,因为这些数据结构有两种类型的成员:数据成员和循环成员。

数据成员存储数据,如文件名,网格单元和符号名称,而循环成员用于在相同对象类型的元素之间切换,如示意图中的零件的循环函数或库对象。循环的每个运行实例成员包含数据成员。

你困惑吗?别担心,下面的例子会让事情更清楚。示例ULP将获得每个部件名称并对部件进行计数。基本上,要开发一个ULP,您需要一个文本编辑器和一个具有ULP扩展名的文本文件。

字符串的名字,结果;int数= 0;原理图(S) {S部分(P){数字++;姓名+ = P.name;姓名+ = "、";} sprintf(result,"%d Parts, Names:%s",Number,Names);dlgMessageBox(结果,“+ OK”);}

运行前一个ULP的输出。

示意图(S)语句用于访问原理图的上下文,以分别访问原理图中的所有对象。S.,即原理图对象的标识符,执行之间的代码块{..}.原理图对象(UL_Schematic对象)具有自己的数据和循环成员,以访问其他对象(零件,纸张等)。

如我们所见,S.Parts(P)是负责为每个零件进行循环的方法P..

UL_Schematic对象的数据和循环成员。

在ULP手册中,您可以找到关于每个对象及其成员的广泛文档。我将用树形图来总结它们。

让我们退后一步;通常,ULP的结构包括声明变量,如果可用,则定义功能,最后是主要过程。没有必要放置主要功能(void main()),虽然我可以找到一些ULPs既有/没有主要功能。简单地说,函数和变量定义之后的任何语句都被认为是主函数。

让我们修改第一个示例,数一数该设计有多少张表以及每个表中有多少个部件。

字符串的名字,结果;int number = 0,sh_number = 0;示意图{s.sheets(sh){sh_number ++;sh.parts(p){number ++;姓名+ = P.name;姓名+ = "、";Sprintf(结果,“纸张#%d为%d零件,名称:%s”,sh_number,number,names);dlgMessageBox(结果,“+ OK”);number = 0;名称=“”; } }

让我们在树上遵循这个:

向编辑器传递命令

有两种方法可以将命令传递给EAGLE编辑器。

第一个选项是使用退出()函数。这是最前进的道路;它会终止ULP的执行,并将命令传递给编辑器。命令必须是这个内置函数的字符串参数。例如,退出(“R1”)将使EAGLE在终止ULP后执行此命令。

第二种选择是创建一个可以稍后执行的脚本文件。(在脚本。SRC文件)不是我们在本教程中感兴趣的,只要知道脚本基本上包含一组编辑器命令就足够了。

执行ULP后,将创建脚本文件,您可以使用脚本file_name;命令或从菜单栏中的脚本图标。通常,使用退出函数更常见。

要在操作中查看退出功能,我们将编写一个简单的程序,将当前日期添加到设计中作为第21层中的文本。

if (library || schematic) {dlgMessageBox("!从PCB编辑器中打开ULP);退出(1);}字符串月[]={“1”,“2”,“3”、“4月”,“可能”,“6”,“7”,“8月”,“9月”,10月,11月,12月”};Int t = time();字符串CMD,文本;CMD = "网格英寸;图层21;";CMD += "改变大小0.066;";CMD += "变化率15%;";CMD += "改变字体向量;"; sprintf(text,"TEXT '%d %s %d'",t2day(t),Months[t2month(t)],t2year(t)); CMD += text; exit(CMD);

让我们把代码分解一下。

if (library || schematic) {dlgMessageBox("!从PCB编辑器中打开ULP);退出(1);}

图书馆示意图是整数常量,如果当前编辑器窗口是库或原理图则返回1,否则返回0。

dlgMessageBox(”!从PCB编辑器中打开ULP);

这将带来一个带有消息的弹出窗口。我们将在ULP中的对话框简而言之。

出口(-1);

将终止ULP(错误情况)。

字符串月[] = {“1月”,“2月”,“MAR”,“APR”,“5月”,“6月”,“7月”,“8月”,“8月”,“9月”,“OCT”,“十四”,“十四”,“Dec”};Int t = time();字符串cmd,text;

这是变量声明。

时间()函数是一个内置函数,它以数字格式返回系统时间。

CMD = "网格英寸;图层21;";CMD += "改变大小0.066;";CMD += "变化率15%;";CMD += "改变字体向量;";

这些命令用于将网格单元设置为英寸,并更改文本大小,汇编和字体类型。您必须使用分号分隔命令。

sprintf(文本、“文本”% d % s % d ', t2day (t)个月(t2month (t)), t2year (t));

Sprintf.函数用于格式化数据字符串。

退出(CMD);

退出函数将CMD字符串传递到编辑器上并终止ULP执行。

EAGLE ULP中的对话框

ULP为对话提供了一组内置函数,作为用户语言程序的前端。

dlgDialog是任何其他对话框对象的基本容器。它执行由括号之间的块定义的对话框{..}.

作为介绍,我们将建立一个简单的对话框,该对话框由一个带有“Hello”标题的窗口和“确定”按钮。

int结果= dlgdialog(“hello”){dlglabel(“hello world”);dlgpushbutton(“确定”){dlgmessagebox(“!你按下OK!”,“OK”);dlgAccept ();}};

dlgDialog具有一个字符串参数来定义对话框标题。

dlgpushbutton.添加一个标题为OK while的按钮dlgmessagebox.显示一个带有OK按钮的简单消息框。最后,退出对话框dlgaccept.函数接受对话框内容(此处没有内容)并关闭它。

运行前一个ULP的输出。

笔记:一些特殊字符如+-都是用在文本对话框中做特定的工作。
'&'指定热键使焦点转到该对象/标签。
“+”按Enter键时选择选择按钮。
“- - -”当按下Esc键时使按钮被选中。

例子:

int结果= dlgmessagebox(“尝试按:”,“+进入”,“&O”,“ -  Esc”);切换(结果){案例0:DLGMESSAGEBOX(“您按下OK!”);休息;案例1:DLGMESSAGEBOX(“你按下O!”);休息;案例2:DLGMESSAGEBOX(“您按下ESC!”);休息;}

运行前一个ULP的输出。

其他对话框函数用于用户输入,如列表视图、单选按钮和数据字段输入。

在阅读了它们的用法说明后,您可以轻松地使用任何其他对话框功能。同时,在ULP手册中还可以找到许多其他的同类功能。

dlgListView

dlgListView用给定数组的内容定义一个多列列表视图。它有三个主要参数:第一个参数是一个字符串参数来定义listview的标题,第二个参数是一个字符串数组显示为列表项,第三个参数是一个整数,反映了指标选择的视图元素的数组。dlgListView可以包含当您双击元素时执行的代码块。

dlgradiobutton.

dlgradiobutton.定义具有给定文本的单选按钮。它有两个参数:第一个参数是使用一个字符串来定义按钮旁边的文本,第二个参数是一个整数,它反映使用dlggroup.函数。同一组中的所有单选按钮必须使用相同的选择变量。

dlgstringedit.

dlgstringedit.定义一个字符串输入字段。它有一个字符串参数来包含用户输入的值。注意:它的工作方式相同的dlgRealEdit和dlgIntEdit的工作。

让我们把上面的信息付诸行动。在下面的例子中,我们将研究dlgListViewdlgradiobutton.,dlgstringedit..

string Items[] = {"Item 1 ", "Item 2 ", "Item 3 "}, Item;int L_Selected =0,R_Selected=0;//初始选择“一个”int Result = dlgDialog(“项目”){dlgLabel(“选择一个:”);dlgHBoxLayout {dlgListView("Name\tDescription", Items, L_Selected) {dlgMessageBox("You have selected " + Items[L_Selected]);} dlgGroup("Items") {dlgRadioButton("&一个",R_Selected);dlgRadioButton("&Two", R_Selected) {dlgMessageBox("You have selected " + Items[L_Selected]);}} dlgVBoxLayout {dlgLabel(“输入&项目”);dlgStringEdit(项);dlgPushButton("OK") {dlgMessageBox("You have selected from ListView " + Items[L_Selected] + "。从单选按钮“+ Items[R_Selected] +”,并输入“+ Item); dlgAccept(); } } };

运行前一个ULP的输出。
dlgListView(“名字\ tDescription”、物品L_Selected)

如上图所示,列表视图有“Name”和“Description”标题,并显示元素项目数组中。所选项索引将存储在L_Selected.

如果您在列表的任何项上点击两次,代码块将被执行。

dlgGroup("Items") {dlgRadioButton("&一个",R_Selected);dlgRadioButton("&Two", R_Selected) {dlgMessageBox("You have selected " + Items[L_Selected]);}

单选按钮必须使用dlggroup.并共享相同的选择变量R_Selected.如果你点击单选按钮“Two”,你会看到一条消息,这是单选按钮如何执行代码的一个例子。

笔记:dlgHBoxLayoutdlgVBoxLayout分别用于水平和垂直排列版面。

锻炼

作为一个小型练习,您可以使用帧库中的可用框架来编写一个简单的ULP,以根据其尺寸使用帧库中的可用框架。我对您在本练习中使用它的框架进行了测量。您需要扫描绘图以了解其维度。

维密尔

为了解决这个问题,你将使用以下技巧:

  • 使用数据和循环成员获取计算绘图尺寸所需的数据的能力。
  • 使用EAGLE命令向设计中添加设备的能力。
  • 能够在ULP中使用对话框。

这是我ULP解决练习的小测试。

笔记:只是为了好玩,我在菜单栏上添加了一个图标。您可以通过在SCH: section中添加以下行来实现这一点。SCR文件位于安装目录的SRC文件夹中。

'[Frame .png] AddFrame: Run AddFrame.ulp;'\

源代码

AddFrame.zip

阅读更多

除了数据结构中的大量数据和循环成员外,ULP中还有许多其他的内置常量、变量、函数和语句。在阅读并理解本教程之后,您应该始终使用有良好文档说明的ULP手册作为参考,并扩展您的知识与ULP。

如果您想了解有关Eagle CAD的更多信息,请查看我们的系列:

1条评论
  • sunandir 2020年3月20日

    你好……
    如何为电路板制作ULP,只需按菜单中的图像图标,以便我们可以获得我们想要的ULP .......
    谢谢你吗?

    喜欢的。 回复