层层剥开Allegro skill–快速抓取并写入Allegro软件呕血创作,转载注明

文章目录

  • 前言
  • 一、临时调用skill
  • 二、Allegro软件自启动调用skill
  • 三、菜单栏显示skill
  • 四、菜单栏可下拉显示skill集
  • 总结

前言

Allegro skill对于大部分常用Allegro绘制PCB的工程师来说,是一个比较神秘的存在,但是见到有人利用skill大大提高了效率,非常羡慕,希望拥有。
今天呢,我就为大家层层剥开Allegro skill之谜,四步秒懂该怎么利用该高级语言提高PCB设计效率。
本文已利用快捷键快速抓取网络丝印为例讲解,授人以鱼不如授人以渔,本文起到一个抛砖引玉的作用,如要深入,还需慢慢摸索。
高端操作,来咯!!

一、临时调用skill

1.首先,建立文本,写入以下代码,

代码如下,请自取:

axlCmdRegister("CNS" 'dbCreateNetSilk
				?cmdType "interactive"
				?doneCmd '_dbCreateNetSilkDone
				?cancelCmd '_dbCreateNetSilkCancel
)

procedure(dbCreateNetSilk()
(let (addr)
	_dbCreateNetSilkFinish = nil
    
    ;创建FORM
	addr = "./CreateNetSilk.form"
	_dbCreatCreateNetSilkForm(addr)   
    fm_crtn = axlMiniStatusLoad((gensym) addr `_dbCreateNetSilkCallback t)	
	when(isFile(addr) errset(deleteFile(addr)))
    
    axlSetActiveLayer("BOARD GEOMETRY/SILKSCREEN_TOP")
    axlFormSetField(fm_crtn "mirror" nil)
    axlFormSetField(fm_crtn "angle" "0")
    axlFormSetField(fm_crtn "text_block" "2")
    axlFormSetField(fm_crtn "text_justification" "left")
    

	axlUIPopupSet(axlUIPopupDefine(nil 
				'(("Done" _dbCreateNetSilkDone)
				  ("Oops" _dbCreateNetSilkOops)
				  ("Cancel" _dbCreateNetSilkCancel)
	)))
    axlControlRaise('options)	
    axlClearSelSet()
    axlSetFindFilter(?enabled `("NOALL" "PINS" "VIAS" "SHAPES" "CLINESEGS") ?onButtons `("PINS" "VIAS" "SHAPES" "CLINESEGS"))
	mk_crtn = axlDBTransactionStart()
    while( !_dbCreateNetSilkFinish
        when(axlSingleSelectPoint()
            axlDBTransactionMark(mk_crtn)
            _dbCreateNetSilk(axlLastPick(nil) axlGetSelSet())
        )
	)
    axlUIPopupSet(nil)
))

procedure(_dbCreateNetSilk(pt item)
(let (id layer mir ang blk jst myorient ret ptStrOri ptPlace )
    
    axlClearSelSet()
    id = car(item)
    layer = axlGetActiveLayer()
    mir = case(axlFormGetField(fm_crtn "mirror")  ("1" t) ("0" nil))
    ang = atof(axlFormGetField(fm_crtn "angle"))
    blk = axlFormGetField(fm_crtn "text_block")
    jst = axlFormGetField(fm_crtn "text_justification")
    myorient = make_axlTextOrientation(?textBlock blk ?rotation ang ?mirrored mir ?justify jst)
    if(id->net->name != "" && id->net->name != nil then
        ret = caar(axlDBCreateText(id->net->name pt myorient layer nil))
        axlVisibleLayer(layer t)	
        axlVisibleUpdate(nil)		
       
        axlEraseObject(ret)	
        ptStrOri = axlDBAltOrigin('center ret)
        axlDynamicsObject(ret ptStrOri)	
        _dbCreateNetSilkStage = nil
        when(ptPlace = axlEnterPoint(?prompts `("Please click to select the point to place"))	
            _dbCreateNetSilkStage = t
            axlTransformObject(ret ?move axlMXYSub(ptPlace ptStrOri))	
        )
        axlClearDynamics()	
        axlUIWRedraw(nil)
    else
        printf("315370302347303373316252277325243241
")
    )
))

(defun _dbCreateNetSilkCallback (fm_crtn)
(prog ()
	case(fm_crtn->curField
		("subclass"
			t
		)
	)
	return()
))

defun(_dbCreatCreateNetSilkForm (addr)
(let (file)
	file = outfile(addr)
	
	fprintf(file "FILE_TYPE=FORM_DEFN VERSION=2
")
	fprintf(file "FORM AUTOGREYTEXT
")
	fprintf(file "FIXED
")
	fprintf(file "PORT 55 20
")			
	fprintf(file "HEADER "CreateNetSilk"
")
	fprintf(file "
")

    fprintf(file "POPUP <rotate>"0""0.000","45""45.000","90""90.000","135""135.000",
"180""180.000","225""225.000","270""270.000","315""315.000".
")
    fprintf(file "POPUP <justification>"Left""left","Right""right","Center""center".
")

	fprintf(file "TILE
")
	fprintf(file "
")
	
    fprintf(file "TEXT "Active Class and Subclass:"
")
    fprintf(file "TLOC 1 1
")
    fprintf(file "ENDTEXT
")
    
    fprintf(file "FIELD class
")
    fprintf(file "FLOC 5 3
")
    fprintf(file "ENUMSET 19
")
    fprintf(file "OPTIONS prettyprint
")
    fprintf(file "POP "class"
")
    fprintf(file "ENDFIELD
")

    fprintf(file "FIELD subcolor
")
    fprintf(file "FLOC 2 6
")
    fprintf(file "COLOR 2 1
")
    fprintf(file "OPTIONS colorchooser
")
    fprintf(file "ENDFIELD
")

    fprintf(file "FIELD subclass
")
    fprintf(file "FLOC 5 6
")
    fprintf(file "ENUMSET 19
")
    fprintf(file "OPTIONS prettyprint ownerdrawn
")
    fprintf(file "POP "subclass"
")
    fprintf(file "ENDFIELD
")

    fprintf(file "FIELD mirror
")
    fprintf(file "FLOC 2 9
")
    fprintf(file "CHECKLIST "Mirror"
")
    fprintf(file "ENDFIELD
")

    fprintf(file "TEXT "Rotate:"
")
    fprintf(file "TLOC 5 11
")
    fprintf(file "ENDTEXT
")
    
    fprintf(file "FIELD angle
")
    fprintf(file "FLOC 18 11
")
    fprintf(file "REALFILLIN 6 7
")
    fprintf(file "POP "rotate"
")
    fprintf(file "DECIMAL 3
")
    fprintf(file "ENDFIELD
")

    fprintf(file "TEXT "Text block:"
")
    fprintf(file "TLOC 5 13
")
    fprintf(file "ENDTEXT
")
    
    fprintf(file "FIELD text_block
")
    fprintf(file "FLOC 18 13
")
    fprintf(file "INTSLIDEBAR 7 7
")
    fprintf(file "MIN 1
")
    fprintf(file "MAX 64
")
    fprintf(file "ENDFIELD
")

    fprintf(file "TEXT "Text just:"
")
    fprintf(file "TLOC 5 15
")
    fprintf(file "ENDTEXT
")

    fprintf(file "FIELD text_justification
")
    fprintf(file "FLOC 18 15
")
    fprintf(file "ENUMSET 8
")
    fprintf(file "POP "justification"
")
    fprintf(file "ENDFIELD 
")
    
	fprintf(file "
")
	
	fprintf(file "ENDTILE
")
	fprintf(file "
")
	
	fprintf(file "ENDFORM
")

	close(file)
))

procedure( _dbCreateNetSilkDone()
    _dbCreateNetSilkFinish = t
	axlDBTransactionCommit(mk_crtn)
	axlFinishEnterFun()
)

procedure( _dbCreateNetSilkCancel()
	_dbCreateNetSilkFinish = t
    axlDBTransactionRollback(mk_crtn)
	axlCancelEnterFun()
)

procedure( _dbCreateNetSilkOops()
    when(!_dbCreateNetSilkStage
        axlClearDynamics()	
        axlCancelEnterFun()
    )
    axlDBTransactionOops(mk_crtn)
)

2.将文本名字及后缀改为create_net_silk.il,保存;
3.将该文件放入当前使用PCB目录下;
4.Allegro软件Command命令栏输入:skill load(“create_net_silk.il”);
5.Allegro软件Command命令栏输入:CNS;
请添加图片描述
6.Option栏选择需要的层及字体大小;
请添加图片描述
7.绘制面板点击需要添加文本的网络,放置合适位置即可
请添加图片描述
8.看到这么多代码,第一眼就蒙了,硬件写代码,是不是太难了?答案是肯定的,但只要功夫深,铁棒磨成针,当然了,重点来了,网络还是有很多资源可以借鉴的!!!

二、Allegro软件自启动调用skill

很多人要问了,只要每次都要放到PCB目录下,每次都需要加载,是不是太麻烦了。很好,既然软件开放了二次开发功能,肯定是不会这么呆滞的。下面我们来介绍软件自动启skill的方法。
1.找到Allegro安装路路:.Cadence_SPB_XXsharelocalpcbskill,找到allegro.ilinit文件,已文本形式打开。如果没有该文件,就新建文本,修改文件名及后缀即可;
2.输入代码:load(“create_net_silk.il”);
请添加图片描述

3.将create_net_silk.il文件放置相同目录下;
在这里插入图片描述

4.重启Allegro,直接输入CNS即可调用该skill了。

三、菜单栏显示skill

肯定又有人会问,Allegro这么多快捷键,再增加这些skill的,记不住呀。下面,废话不多说,直接来介绍高级操作,菜单栏显示skill。
1.找到Allegro安装路径:.Cadence_SPB_XXsharepcb extcuimenus,找到allegro.men文件,以文本形式打开;
2.在最后一个END之前输入以下代码:MENUITEM “create net silk”, “CNS”;
在这里插入图片描述
4.重启Allegro,直接输入CNS即可调用该skill了。

四、菜单栏可下拉显示skill集

肯定有人会问,如果skill过多,那菜单栏不是密密麻麻一片,看不清。下面就来介绍压轴的方式

1.找到Allegro安装路径:.Cadence_SPB_XXsharepcb extcuimenus,找到allegro.men文件,以文本形式打开;
2.在最后一个END之前输入以下代码

      POPUP "ZhangZandZhang"
      BEGIN
         MENUITEM "create net silk",              "CNS"
         MENUITEM "ZZZ",              "xxx"
      END

在这里插入图片描述
3.重启Allegro,在菜单栏ZhangZandZhang下拉就可以看到create net silk和ZZZ两个命令了,当然,想多写点也是没有关系的,只要能方便操作。
4.内容是层层递进的,不懂得还需要从头开始看。


总结

如果你看到这里了,就送各位工程师一句话:路漫漫其修远兮,吾将上下而求索。
如果对本文有疑问的地方,可以留言或者私信我!