⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autosilkutils.il

📁 skill语言在Cadence平台二次开发中大量使用
💻 IL
📖 第 1 页 / 共 5 页
字号:

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 + -