Allegro PCB Design SKILL Tutorial
Let us now look at a real, practical and useful skill utility that solves real world problem.
Copy the following code in a file called moveByRefdes.il and save it in the directory C:/cadence/setup/skill (or the directory that allegro.ilinit points to).
axlCmdRegister("moveByRefdes", 'moveByRefdes, ?cmdType "general")
defun( moveByRefdes (refdes)
let((sym, popup, alias_m, alias_r, ang, (dAng 0), dMir, mir, pt, mark, (continue t), event)
sym = car(axlSelectByName("SYMBOL", refdes))
if(sym then
popup = axlUIPopupDefine(nil '(
("Done", "axlDBTransactionCommit(mark), axlFinishEnterFun()")
("Oops", "axlDBTransactionOops(mark)")
("Cancel", "axlDBTransactionRollback(mark), axlCancelEnterFun()")
("MENU_SEPARATOR", nil)
("Mirror", "(moveByRefdes_mirror)")
("Rotate", "(moveByRefdes_rotate)")
))
axlUICmdPopupSet(popup)
alias_m = axlGetAlias("m")
alias_r = axlGetAlias("r")
axlShell("funckey m \"(moveByRefdes_mirror)\"")
axlShell("funckey r \"(moveByRefdes_rotate)\"")
mark = axlDBTransactionStart()
ang = round(sym ->rotation)
mir = sym ->isMirrored
axlDynamicsObject(sym, sym ->xy)
;Add rats:
foreach(pin, sym ->pins
pt = list(car(pin ->xy) - car(sym ->xy), cadr(pin ->xy) - cadr(sym ->xy))
foreach(ratPin, mapcar(lambda((objPair), car(remove(pin, objPair))), setof(objPair, _fpUtilGetNetRats(pin), member(pin, objPair)))
axlAddSimpleRbandDynamics(ratPin ->xy, "directline", ?origin pt, ?var_point pt ?color 'ratsnestColor)
)
)
while(continue
event = axlEnterEvent(list('PICK), nil, t)
caseq(event ->type
(PICK
sym = car(axlSelectByName("SYMBOL", refdes))
axlDBTransactionMark(mark)
axlClearSelSet()
axlDeleteObject(sym)
sym = car(axlDBCreateSymbol(refdes, event ->xySnap, mir, ang))
)
(DONE, continue = nil)
(CANCEL, continue = nil)
); caseq
); while continue
axlClearDynamics()
axlSetAlias("m", alias_m)
axlSetAlias("r", alias_r)
else axlMsgPut(list("Reference Designator %s not found", 3), refdes || "*** Not supplied ***")
);if sym
))
defun( moveByRefdes_mirror ()
mir = !mir, dMir = !dMir
ang = mod(-ang, 360), dAng = mod(-dAng, 360)
_axlSetDynamicsMirror(dMir), _axlSetDynamicsRotation(dAng)
)
defun( moveByRefdes_rotate ()
ang = mod(ang + if(mir, -90, 90), 360), dAng = mod(dAng + if(mir, -90, 90), 360)
_axlSetDynamicsRotation(dAng)
)
What does this skill code do
When the skill command is given ( with the reference designation), it will move the required component.
How to use it
To use is give the following command
MoveByRefdes R1
Where R1 is the reference designation of the component you wish to move.
Here is the youtube that shows the things in action