📄 autosilkutils.il
字号:
defun( ASU_helpDisplay (@optional topic)
let((helpTxts)
helpTxts = '(
("Setup Tab")
("Spacing Constraints:")
("Text Spacing", "Spacing from each text string character to a solder mask object.")
("Faster Text Check", "Check using a bounding box around the whole \"word\" rather than each vectorised character.")
("Shape Spacing", "Spacing from a shape to a solder mask object.")
("Line Spacing", "Spacing from a line to a solder mask object. Can be quite slow.")
("Reference Text Locations", "Check that each reference designator is closest to its own parent symbol. Checks components of the same class only.")
("Note:", "These values are maintained between sessions\n")
("Solder Mask Objects to be Checked:")
("Pins", "Select this check box to check objects against solder mask pads on pins")
("Soldered Pads Only", "Select this check box to only check objects against solder mask pads on soldered pins."
"This will exclude pads on the non-soldered side of a leaded device.")
("Vias", "Select this check box to check objects against solder mask pads on vias")
("Shapes", "Select this check box to check objects against solder mask shapes")
("AutoSilk Layers Shapes Copying:")
("Check Spacings button", "Perform drc checks on the Soldermask objects selected in the above box")
("Copy button", "Copy BOARD GEOMETRY and/or PACKAGE GEOMETRY silkscreen shapes to the AutoSilk layers."
"Useful for pin 1 markers etc.")
("Check tab")
("Use Films:")
("Use Films to determince layers to check", "Selected by default if one or more films containing a silk layer is found")
("Use Silk Layers:")
("Auto suggested layer selection", "Selected based on existance of objects on these layers")
("Classes", "Only class/subclass combinations with spacing rules objects present are selectable")
("Subclasses", "Only one subclass, that has spacing rules objects present, is selectable")
("Check sides", "Only check the sides that have been selected")
("User Selection:")
("Class", "User selectable class")
("Subclass", "User selectable legal subclass for the selected class")
("Checking:")
("Check in Window button", "Start checking in the current window.")
("Check All button", "Start checking. This may take a several minutes on a large design")
("General:")
("View Log button", "View the list of DRCs created")
("Quit button", "Quit this utility")
("Help button", "Display this file")
("Support:")
("Feedback", "This utility is unsupported. However feedback is invited and appreciated.")
("Author", "Dave Elder, dave.elder@tait.co.nz")
)
AFn_displayHelpText("Silkscreen Utilities Help Information", helpTxts, topic)
))
defun( ASU_setChkClasses (form, classes @optional layersOnly)
let((objectsExist, subclassPrefix, objTypes, class, ticked, layers)
unless(layersOnly
when(classes, objectsExist = eval(stringToSymbol(car(classes))))
ASU_toggleField(form, "text", car(objectsExist))
ASU_toggleField(form, "textloc", car(objectsExist))
ASU_toggleField(form, "shapes", cadr(objectsExist))
ASU_toggleField(form, "lines", caddr(objectsExist))
)
foreach(chkClass, ASU_allChkClasses
axlFormSetField(form, chkClass, nil)
axlFormSetFieldEditable(form, chkClass, 0)
)
subclassPrefix = substring(car(classes), 5)
when(axlFormGetField(form, "text") || axlFormGetField(form, "textloc"), objTypes = cons("TEXT", objTypes))
when(axlFormGetField(form, "shapes"), objTypes = cons("SHAPES", objTypes))
when(axlFormGetField(form, "lines"), objTypes = cons("LINES", objTypes))
rexCompile(" ")
foreach(item, cdr(classes)
class = car(item), ticked = cadr(item)
layers = mapcar(lambda((side) strcat(class, "/", subclassPrefix, "_", side)) '("TOP", "BOTTOM"))
layers = setof(layer, layers, axlIsLayer(layer))
when(findTypeObjects(objTypes, ?layers layers)
class = rexReplace(class, "_", 0)
unless(axlFormGetField(form, "usefilms"), axlFormSetFieldEditable(form, class, 1))
and(ticked, member(class, ASU_tickedClasses), axlFormSetField(form, class, t))
)
)
ASU_tickedClasses = ASU_allChkClasses
))
defun( ASU_toggleField (form, field, flag)
if(flag
then when(eval(stringToSymbol(strcat("ASU_check", field))), axlFormSetField(form, field, t))
else axlFormSetField(form, field, nil)
)
)
defun( ASU_checkSpacings (@optional form, window, (txtSpacing, axlMKSConvert(10, "mils"))
shpSpacing, lineSpacing, (shpChk, t) (txtChk, t) (lineChk, t) (pinChk, t) (viaChk, t) (smShpChk, t) (solderedPadsOnlyChk, nil) (refdesLocChk t))
let((chkTypes, useFilms, (checkTop t), (checkBottom t), filmName, topLayers, bottomLayers, chkClassInfo
chkClasses, subclassPrefix, class, sides, ndrcs, chkLayer, userLayer, drcMsgs, visibleLayers)
unless(shpSpacing, shpSpacing = txtSpacing)
unless(lineSpacing, lineSpacing = shpSpacing)
chkTypes = setof(objType, list(list(shpChk, "SHAPES", shpSpacing), list(txtChk || refdesLocChk, "TEXT", txtSpacing), list(lineChk, "LINES", lineSpacing)), car(objType))
if(form then
useFilms = axlFormGetField(form, "usefilms")
checkTop = axlFormGetField(form, "checktop")
checkBottom = axlFormGetField(form, "checkbottom")
cond(
(useFilms
filmName = axlFormGetField(form, "TOPfilm")
when(filmName != "" && filmName != "0", topLayers = axlGetParam(strcat("artwork:", filmName)) ->groupMembers)
filmName = axlFormGetField(form, "BOTTOMfilm")
when(filmName != "" && filmName != "0", bottomLayers = axlGetParam(strcat("artwork:", filmName)) ->groupMembers)
)
(axlFormGetField(form, "useother")
userLayer = strcat(axlFormGetField(form, "userclass"), "/", axlFormGetField(form, "usersubclass"))
)
(axlFormGetField(form, "silkscreenlayer"), chkClassInfo = ASU_silkChkClasses)
(axlFormGetField(form, "autosilklayer"), chkClassInfo = ASU_autosilkChkClasses)
(axlFormGetField(form, "assemblylayer"), chkClassInfo = ASU_assyChkClasses)
)
else chkClassInfo = ASU_autosilkChkClasses
)
removeExternalDRCs()
ndrcs = axlDRCGetCount()
visibleLayers = axlVisibleGet()
cond(
(useFilms
drcMsgs = ASU_checkObjTypes(form, window, append(topLayers, bottomLayers), chkTypes, pinChk, viaChk, smShpChk, solderedPadsOnlyChk, refdesLocChk)
)
(userLayer, drcMsgs = ASU_checkObjTypes(form, window, userLayer, chkTypes, pinChk, viaChk, smShpChk, solderedPadsOnlyChk, refdesLocChk))
(t
when(checkBottom, sides = '("BOTTOM"))
when(checkTop, sides = cons("TOP", sides))
subclassPrefix = substring(car(chkClassInfo), 5), chkClasses = cdr(chkClassInfo)
foreach(item, chkClasses
class = car(item)
rexCompile(" ")
when((form && axlFormGetField(form, rexReplace(class, "_", 0))) || !form
foreach(side, sides
chkLayer = strcat(class, "/", subclassPrefix, "_" side)
drcMsgs = append(drcMsgs, ASU_checkObjTypes(form, window, chkLayer, chkTypes, pinChk, viaChk, smShpChk, solderedPadsOnlyChk, refdesLocChk))
)
)
)
)
)
axlVisibleSet(visibleLayers)
ndrcs = axlDRCGetCount() - ndrcs
if(form then axlFormMsg(form, "drcsFound", ndrcs) else axlUIConfirm(sprintf(nil, "%d DRCs found", ndrcs)))
ASU_drcMsgs = drcMsgs
unless(zerop(ndrcs), DRCbrowse_createForm())
))
defun( ASU_checkObjTypes (form, window, chkLayers, chkTypes, pinChk, viaChk, smShpChk, solderedPadsOnlyChk, refdesLocChk)
let((txtChk, side, smLayer, drcLayer, spacing, drcMsgs)
unless(listp(chkLayers), chkLayers = list(chkLayers))
if(window then defvar(ASU_window, axlWindowBoxGet()) else defvar(ASU_window))
txtChk = axlFormGetField(form, "text")
when(txtChk && axlFormGetField(form, "quickchk"), txtChk = "QUICK")
foreach(layer, chkLayers
unless(axlIsVisibleLayer(layer), axlVisibleLayer(layer, t))
side = ASU_getLayerSide(layer)
foreach(layerPrefix, '("BOARD GEOMETRY/SOLDERMASK_", "PACKAGE GEOMETRY/SOLDERMASK_")
smLayer = strcat(layerPrefix, side)
unless(axlIsVisibleLayer(smLayer), axlVisibleLayer(smLayer, t))
)
)
foreach(layer, chkLayers
drcLayer = strcat("DRC ERROR CLASS/", ASU_getLayerSide(layer))
foreach(objType, chkTypes
axlFormMsg(form, "chkProgress", lowerCase(layer), lowerCase(cadr(objType)))
foreach(obj, findTypeObjects(cadr(objType), ?layers layer, ?bbox ASU_window)
spacing = caddr(objType)
drcMsgs = append(drcMsgs, ASU_checkObj(obj, spacing, drcLayer, pinChk, viaChk, smShpChk, solderedPadsOnlyChk, txtChk, refdesLocChk))
)
)
)
drcMsgs
))
defun( ASU_copySilkShapesToAutoSilk (@optional form, spacing (shpChk, t) (pinChk, t) (viaChk, t) (smShpChk, t) (solderedPadsOnlyChk, t))
let((layers, ndrcs, class, drcLayer, layer, parent, poly, parentGroups, oShp, (nShps 0), drcMsgs)
unless(spacing, spacing = getUINumber("Spacing", axlMKSConvert(10, "mils"), 0))
when(spacing
removeExternalDRCs()
layers = '("MANUFACTURING/AUTOSILK_TOP" "MANUFACTURING/AUTOSILK_BOTTOM")
axlDeleteObject(findTypeObjects("SHAPES", ?layers layers, ?attrPairs list('fill t)))
ndrcs = axlDRCGetCount()
foreach(item, cdr(ASU_silkChkClasses)
class = car(item)
foreach(side, '("TOP", "BOTTOM")
drcLayer = strcat("DRC ERROR CLASS/", side)
layer = strcat("MANUFACTURING/AUTOSILK_", side)
foreach(shp, findTypeObjects("SHAPES", ?layers strcat(class, "/SILKSCREEN_", side), ?attrPairs list('fill t))
parent = shp ->parent, parentGroups = shp ->parentGroups
and(
poly = car(axlPolyFromDB(shp))
;Check that a shape does not already exist here: (as will happen with fixed shapes)
!setof(subShp, parent ->children
and(
(subShp ->layer == layer)
subShp ->objType == "shape"
axlPolyOperation(poly, car(axlPolyFromDB(subShp)), 'AND)
)
)
oShp = axlDBCreateOpenShape(poly, t, strcat("MANUFACTURING/AUTOSILK_", side), nil, parent)
shp = car(axlDBCreateCloseShape(oShp))
++nShps
foreach(grp, parentGroups, axlDBAddGroupObjects(grp, shp))
)
and(shp, shpChk
drcMsgs = append(drcMsgs, ASU_checkObj(shp, spacing, drcLayer, pinChk, viaChk, smShpChk, solderedPadsOnlyChk))
)
)
)
)
ndrcs = axlDRCGetCount() - ndrcs
if(shpChk then
ASU_drcMsgs = drcMsgs
if(form
then axlFormMsg(form, "drcsCreated", nShps, ndrcs)
else axlUIConfirm(sprintf(nil, "%d shapes copied. %d DRCs created", nShps, ndrcs))
)
unless(zerop(ndrcs), DRCbrowse_createForm())
else
if(form
then axlFormMsg(form, "shpsCopied", nShps)
else axlUIConfirm(sprintf(nil, "%d shapes copied. No checks performed", nShps))
)
)
)
nShps
))
defun( ASU_checkObj (obj, spacing, drcLayer, pinChk, viaChk, smShpChk @optional solderedPadsOnlyChk, txtChk, refdesLocChk)
let((precisionFactor, layer, side, objType, bbox, smObjTypes, smLayers, smObjs, text, tempShps, symb, class, tempShp1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -