<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.cadence.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Allegro X Scripting - Skill - Recent Threads</title><link>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill</link><description>Allegro X Scripting - Skill</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Thu, 03 Sep 2026 08:48:45 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill" /><item><title>RE: Skill to open Custom Variables  Window in Allegro x 25.1 PCB Editor</title><link>https://community.cadence.com/thread/1409275?ContentTypeID=1</link><pubDate>Thu, 03 Sep 2026 08:48:45 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:eb935f12-1d2d-44ca-952e-85c76721785f</guid><dc:creator>MZ20250602835</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409275?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66274/skill-to-open-custom-variables-window-in-allegro-x-25-1-pcb-editor/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Dear All,&lt;/p&gt;
&lt;p&gt;i found the solution, i used&amp;nbsp;axlShellPost instead of&amp;nbsp;axlShell, such as&amp;nbsp;axlShellPost(&amp;quot;tbx customvar update&amp;quot;), there is no problem anymore.&lt;/p&gt;
&lt;p&gt;Best Regards&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Skill to open Custom Variables  Window in Allegro x 25.1 PCB Editor</title><link>https://community.cadence.com/thread/66274?ContentTypeID=0</link><pubDate>Wed, 19 Aug 2026 12:40:07 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:30cee9d2-12de-483f-b033-8602e28ab01e</guid><dc:creator>MZ20250602835</dc:creator><slash:comments>5</slash:comments><comments>https://community.cadence.com/thread/66274?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66274/skill-to-open-custom-variables-window-in-allegro-x-25-1-pcb-editor/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Dear all,&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;i can use Command tbx customvar update to open the custom variables window.&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:480px;max-width:640px;" alt=" " src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/pastedimage1787143332363v1.png" /&gt;&lt;/p&gt;
&lt;p&gt;I can also use axlShell(&amp;quot;tbx customvar update&amp;quot;) to open the same window but My current Problem is that:&lt;/p&gt;
&lt;p&gt;&lt;span&gt;after giving axlShell&lt;/span&gt;(&amp;quot;tbx customvar update&amp;quot;) I do not get the&amp;nbsp;&lt;span&gt;Skill &amp;gt; for the next skill&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Skill &amp;gt; axlShell(&amp;quot;tbx customvar update&amp;quot;)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Reading file &amp;quot;C:/Users/emp8124501/ECAD/projects/251_demo/output/251_demo/physical/customvar.cfg&amp;quot;&lt;/p&gt;
&lt;p&gt;Info: Reading custom variables from &amp;quot;C:/Users/emp8124501/ECAD/projects/251_demo/251_demo.cpm&amp;quot;&lt;/p&gt;
&lt;p&gt;It missing the&amp;nbsp;&lt;span&gt;Skill &amp;gt; after&amp;nbsp;Info: Reading custom variables from &amp;quot;C:/Users/emp8124501/ECAD/projects/251_demo/251_demo.cpm&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;May i ask how could i solve this issue or are there any other skill to use instead of&amp;nbsp;&lt;span&gt;axlShell&amp;nbsp;in allegro x pcb editor such as&amp;nbsp;&lt;/span&gt;axlCmd,&amp;nbsp;&lt;span style="font-family:inherit;"&gt;axlUIWExecuteCommand or&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:inherit;"&gt;axlDBCmd?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Many thanks&lt;/p&gt;
&lt;p&gt;Moyan&lt;/p&gt;</description></item><item><title>How to write a simple CMXL code that retrieves or edits data from Constraint Manager</title><link>https://community.cadence.com/thread/66295?ContentTypeID=0</link><pubDate>Sun, 30 Aug 2026 20:22:55 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:4255e892-a6f8-48c6-a01a-071b918c9eee</guid><dc:creator>JuanCR</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/66295?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66295/how-to-write-a-simple-cmxl-code-that-retrieves-or-edits-data-from-constraint-manager/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Imagine you&amp;nbsp;want to access some constraint values using SKILL. I know there are AXL functions available; However, what if you want to use&amp;nbsp;CMXL because it dives deeper into the Constraint Manager capabilities.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s show an example. Let&amp;#39;s&amp;nbsp;&lt;span&gt;set&amp;nbsp;static&amp;nbsp;phase values of a differential pair&amp;nbsp;configuration. This is how the code would look like:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;axlCMDBInit()&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;dsn = cmxlFindObject(ACNS_DESIGN);&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;when(dsn&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; cmxlDBSkillInit(dsn);&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; cset = cmxlFindObject(ACNS_ECSET, &amp;quot;DIFF&amp;quot;, dsn);&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; when(cset &lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; println(cmxlPutAttribute(cset &amp;quot;DIFFP_PHASE_TOL&amp;quot; ACNS_STRING list(&amp;quot;0.5&amp;quot;)))&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; println(car(cmxlGetAttribute(cset &amp;quot;DIFFP_PHASE_TOL&amp;quot; ACNS_STRING))); should return 0.5mm&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;cmxlDBSkillExit(dsn);&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Here&amp;#39;s a brief explanation of what each section is doing:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:385px;max-width:874px;" height="385" src="https://community.cadence.com/resized-image/__size/1748x770/__key/communityserver-discussions-components-files/137/pastedimage1788120954175v1.png" width="874" alt=" " /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;If the same logic is used with any other attribute name, you can construct the new code to edit a different constraint. Make sure you use the right Object type with cmxlFindObject. You can find all the object types and definitions at the end of the CMXL Reference Manual.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Feel free to ask any questions!&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Skill script for checking BGA pitch</title><link>https://community.cadence.com/thread/66279?ContentTypeID=0</link><pubDate>Fri, 21 Aug 2026 10:17:44 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:e2982056-b941-4937-836d-0845778b72c0</guid><dc:creator>SG20260713408</dc:creator><slash:comments>6</slash:comments><comments>https://community.cadence.com/thread/66279?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66279/skill-script-for-checking-bga-pitch/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;This is a skill for inspecting the pitch of BGAs on a board.&lt;/p&gt;
&lt;p&gt;If you know of a more concise and elegant code than this, please let me know. (SKILL++, OOP...)&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/*&lt;br /&gt;============================================================================================&lt;br /&gt;* Tool Name : min_pitch_bga (Enhanced Version)&lt;br /&gt;* Description : Automatically checks the minimum pitch of BGA components to prevent fine-pitch routing defects.&lt;br /&gt;* Features : &lt;br /&gt;* 1. Support multiple symbol filtering cases (Property, SymType)&lt;br /&gt;* 2. Performance Optimization: Auto-bounding box shrinkage for &lt;br /&gt;* high pin-count components to prevent computation lag.&lt;br /&gt;* 3. Auto-sorting and reporting with an interactive .log viewer.&lt;br /&gt;* Command : min_pitch_bga [Optional Pitch Value, default "0.5"]&lt;br /&gt;* To change the pitch value, simply apply the desired pitch value after the command. (min_pitch_bga 1.0 or min_pitch_bga 0.5 .......)&lt;br /&gt;============================================================================================&lt;br /&gt;*/&lt;/p&gt;
&lt;p&gt;axlCmdRegister(&amp;quot;min_pitch_bga&amp;quot; &amp;#39;min_pitch_bga ?cmdType &amp;quot;interactive&amp;quot;)&lt;/p&gt;
&lt;p&gt;procedure(min_pitch_bga(@optional (argu_bga_pitch &amp;quot;0.5&amp;quot;) &amp;quot;S&amp;quot;)&lt;/p&gt;
&lt;p&gt;let((min_bga_pitch symbols loop sym_pins_locs obj1 objPairs pitch_datas min_pitch_data&lt;/p&gt;
&lt;p&gt;pair_count var_x var_y delta_x delta_y refdes sym_xy layer sym_rot all_x_loc all_y_loc min_x min_y max_x max_y sym_pins total_results)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; min_bga_pitch = atof(argu_bga_pitch)&lt;/p&gt;
&lt;p&gt;when(min_bga_pitch&lt;/p&gt;
&lt;p&gt;;;========================================================================================&lt;/p&gt;
&lt;p&gt;;;Comment : Please select and use the case that fits the situation.&lt;/p&gt;
&lt;p&gt;;;Comment(Case1) : Use when a symbol(footprint) is given a property name(&amp;quot;DFA_DEV_CLASS&amp;quot;) and a property value(&amp;quot;bga&amp;quot;).&lt;/p&gt;
&lt;p&gt;;; Property values are entered by the user, so they are case-sensitive.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; symbols = foreach(mapcan item axlSelectByProperty(&amp;quot;symdef&amp;quot; &amp;quot;DFA_DEV_CLASS&amp;quot; &amp;quot;bga&amp;quot;) ~&amp;gt; instances item) ;; Use if applicable to Case 1&lt;/p&gt;
&lt;p&gt;;;symbols = foreach(mapcan item axlSelectByProperty(&amp;quot;symdef&amp;quot; &amp;quot;DFA_DEV_CLASS&amp;quot; &amp;quot;bg*&amp;quot; t) ~&amp;gt; instances item) ;; Use if applicable to Case 1&lt;/p&gt;
&lt;p&gt;;;symbols = foreach(mapcan item axlSelectByProperty(&amp;quot;symdef&amp;quot; &amp;quot;REF_PATTERN_NAME&amp;quot; &amp;quot;BGA*&amp;quot; t) ~&amp;gt; instances item) ;; Use if applicable to Case 1&lt;/p&gt;
&lt;p&gt;;;========================================================================================&lt;/p&gt;
&lt;p&gt;;; Comment(Case2) : The name given when generating the symbol(footprint).&lt;/p&gt;
&lt;p&gt;;; In other words, when the symbol name(footprint name) starts with &amp;quot;BGAXXXXXXXX_XXX_XXX&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; ;;symbols = axlSelectByName(&amp;quot;SYMTYPE&amp;quot; &amp;quot;BGA*&amp;quot; t) ;; Use if applicable to Case 2, Delete &amp;quot;;;&amp;quot; and use&lt;/p&gt;
&lt;p&gt;;;========================================================================================&lt;/p&gt;
&lt;p&gt;axlClearSelSet()&lt;/p&gt;
&lt;p&gt;if(symbols then&lt;/p&gt;
&lt;p&gt;foreach(symbol symbols&lt;/p&gt;
&lt;p&gt;loop = t&lt;/p&gt;
&lt;p&gt;sym_rot = nil&lt;/p&gt;
&lt;p&gt;sym_pins = nil&lt;/p&gt;
&lt;p&gt;sym_pins_locs = nil&lt;/p&gt;
&lt;p&gt;all_x_loc = nil&lt;/p&gt;
&lt;p&gt;all_y_loc = nil&lt;/p&gt;
&lt;p&gt;objPairs = nil&lt;/p&gt;
&lt;p&gt;pitch_datas = nil&lt;/p&gt;
&lt;p&gt;min_pitch_data = nil&lt;/p&gt;
&lt;p&gt;pair_count = nil&lt;/p&gt;
&lt;p&gt;var_x = nil&lt;/p&gt;
&lt;p&gt;var_y = nil&lt;/p&gt;
&lt;p&gt;delta_x = nil&lt;/p&gt;
&lt;p&gt;delta_y = nil&lt;/p&gt;
&lt;p&gt;sym_xy = symbol -&amp;gt; xy&lt;/p&gt;
&lt;p&gt;refdes = symbol -&amp;gt; refdes&lt;/p&gt;
&lt;p&gt;unless(refdes refdes = &amp;quot;No RefDes&amp;quot;)&lt;/p&gt;
&lt;p&gt;layer = if(symbol -&amp;gt; isMirrored then &amp;quot;BOTTOM&amp;quot; else &amp;quot;TOP&amp;quot;)&lt;/p&gt;
&lt;p&gt;sym_pins = setof(e symbol -&amp;gt; pins e -&amp;gt; number != &amp;quot;&amp;quot; || e -&amp;gt; isMech != t)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; when(sym_pins &amp;amp;&amp;amp; length(sym_pins) &amp;gt; 1&lt;/p&gt;
&lt;p&gt;sym_rot = symbol -&amp;gt; rotation&lt;/p&gt;
&lt;p&gt;if(axlGeoEqual(sym_rot 0.0) || axlGeoEqual(sym_rot 90.0) || axlGeoEqual(sym_rot 180.0) || axlGeoEqual(sym_rot 27.0) then&lt;/p&gt;
&lt;p&gt;sym_pins_locs = sym_pins ~&amp;gt; xy&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;foreach(sym_pin sym_pins&lt;/p&gt;
&lt;p&gt;sym_pin_xy = sym_pin -&amp;gt; xy&lt;/p&gt;
&lt;p&gt;rot_pin = axlGeoRotatePt(minus(sym_rot) car(sym_pin_xy):cadr(sym_pin_xy) car(sym_xy):cadr(sym_xy))&lt;/p&gt;
&lt;p&gt;sym_pins_locs = cons(rot_pin sym_pins_locs)&lt;br /&gt; &lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; all_x_loc = foreach(mapcar item sym_pins_locs car(item))&lt;/p&gt;
&lt;p&gt;all_y_loc = foreach(mapcar item sym_pins_locs cadr(item))&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; var_x = apply(&amp;#39;min all_x_loc)&lt;/p&gt;
&lt;p&gt;sym_x = apply(&amp;#39;max all_x_loc)&lt;/p&gt;
&lt;p&gt;var_y = apply(&amp;#39;min all_y_loc)&lt;/p&gt;
&lt;p&gt;sym_y = apply(&amp;#39;max all_y_loc)&lt;/p&gt;
&lt;p&gt;delta_x = abs(sym_x - var_x)&lt;/p&gt;
&lt;p&gt;delta_y = abs(sym_y - var_y)&lt;/p&gt;
&lt;p&gt;sym_xy = list((sym_x - (delta_x / 2)) (sym_y - (delta_y / 2)))&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; delta_x = delta_x / 30&lt;/p&gt;
&lt;p&gt;delta_y = delta_y / 30&lt;/p&gt;
&lt;p&gt;sym_pins_locs = setof(e sym_pins_locs axlIsPointInsideBox(e list(sym_xy list(var_x var_y))))&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; when(length(sym_pins_locs) &amp;gt; 1&lt;/p&gt;
&lt;p&gt;pair_count = (length(sym_pins_locs) * (length(sym_pins_locs) - 1)) / 2&lt;/p&gt;
&lt;p&gt;when(pair_count &amp;gt; 1500&lt;/p&gt;
&lt;p&gt;while(loop&lt;/p&gt;
&lt;p&gt;var_x = var_x + delta_x&lt;/p&gt;
&lt;p&gt;var_y = var_y + delta_y&lt;/p&gt;
&lt;p&gt;delta_x = (car(sym_xy) - var_x) / 30&lt;/p&gt;
&lt;p&gt;delta_y = (cadr(sym_xy) - var_y) / 30&lt;/p&gt;
&lt;p&gt;sym_pins_locs = setof(e sym_pins_locs axlIsPointInsideBox(e list(sym_xy list(var_x var_y))))&lt;/p&gt;
&lt;p&gt;pair_count = (length(sym_pins_locs) * (length(sym_pins_locs) - 1)) / 2&lt;/p&gt;
&lt;p&gt;when(pair_count &amp;lt; 1500 loop = nil)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;when(sym_pins_locs&lt;/p&gt;
&lt;p&gt;while(sym_pins_locs&lt;/p&gt;
&lt;p&gt;obj1 = car(sym_pins_locs)&lt;/p&gt;
&lt;p&gt;sym_pins_locs = cdr(sym_pins_locs)&lt;/p&gt;
&lt;p&gt;foreach(obj2 sym_pins_locs objPairs = cons(list(obj1, obj2), objPairs))&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;when(objPairs&lt;/p&gt;
&lt;p&gt;foreach(objPair objPairs&lt;/p&gt;
&lt;p&gt;pitch_datas = cons(axlDistance(car(objPair) cadr(objPair)) pitch_datas)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;min_pitch_data = car(sort(pitch_datas &amp;#39;lessp))&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;when(min_pitch_data&lt;/p&gt;
&lt;p&gt;when(min_pitch_data &amp;lt; min_bga_pitch&lt;/p&gt;
&lt;p&gt;axlHighlightObject(symbol)&lt;/p&gt;
&lt;p&gt;total_results = cons(list(layer refdes min_pitch_data symbol -&amp;gt; xy symbol -&amp;gt; name) total_results)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;total_results = reverse(sortcar(total_results &amp;#39;axlStrcmpAlpNum))&lt;/p&gt;
&lt;p&gt;MPB_Create_log_File(total_results min_bga_pitch)&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;printf(&amp;quot;###### BGA cannot be found. !! ######\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;procedure(MPB_Create_log_File(total_results min_bga_pitch)&lt;/p&gt;
&lt;p&gt;let((err_count Date Min_Pitch_BGA_Log_File)&lt;/p&gt;
&lt;p&gt;err_count = 0&lt;/p&gt;
&lt;p&gt;Date = (getCurrentTime)&lt;br /&gt; Date = parseString(Date &amp;quot; &amp;quot;)&lt;br /&gt; Date = strcat(nth(3 Date) &amp;quot; &amp;quot; nth(0 Date) &amp;quot; &amp;quot; nth(1 Date) &amp;quot; &amp;quot; nth(2 Date))&lt;/p&gt;
&lt;p&gt;Min_Pitch_BGA_Log_File = outfile(&amp;quot;./Min_Pitch_BGA.log&amp;quot; &amp;quot;w&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\nDATE : %s\n&amp;quot; Date)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\nTarGet Pitch : %f\n&amp;quot; min_bga_pitch)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\nSyntax : nIndex, Layer, RefDes, Pitch, Symbol_XY, Symbol_Name\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n=========================================================================\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;if(length(total_results) == 0 then&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n=========================================================================\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n Total Error Count = 0\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\nIndex, Layer, RefDes, Pitch, Symbol_XY, Symbol_Name\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;foreach(total_result total_results&lt;/p&gt;
&lt;p&gt;err_count = ++err_count&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n%d, %s, %s, %f, %L, %s\n&amp;quot; err_count nth(0 total_result) nth(1 total_result) nth(2 total_result) nth(3 total_result) nth(4 total_result))&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n=========================================================================\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n Total Error Count = %d.\n&amp;quot; err_count)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;close(Min_Pitch_BGA_Log_File)&lt;/p&gt;
&lt;p&gt;axlShell(&amp;quot;viewlog ./Min_Pitch_BGA.log&amp;quot;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;</description></item><item><title>RE: Skill script for checking BGA pitch</title><link>https://community.cadence.com/thread/1409240?ContentTypeID=1</link><pubDate>Tue, 25 Aug 2026 07:46:22 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:f6a7ac35-c057-457d-b67e-4f9bdf9f6032</guid><dc:creator>SG20260713408</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409240?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66279/skill-script-for-checking-bga-pitch/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I would love to see your code whenever you have time to test it.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m really looking forward to your approach.&lt;/p&gt;
&lt;p&gt;thank you.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Skill script for checking BGA pitch</title><link>https://community.cadence.com/thread/1409238?ContentTypeID=1</link><pubDate>Tue, 25 Aug 2026 01:20:05 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:191617f9-81bf-4bf3-be88-53365855c34d</guid><dc:creator>TL202608111936</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409238?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66279/skill-script-for-checking-bga-pitch/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Hi,&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Although I haven&amp;#39;t written the code to test my idea yet, I still stand by the idea.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Based on the initial user pitch and the pin list, I will sort the pin list by rows and columns, with each row/column separated by one user pitch and within a predefined tolerance. This will give me a matrix of the pin coordinates by row and column.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Then, within each row and column, I will sort the pins by X or Y coordinate. Finally, I will measure the distance between two consecutive coordinates in each row or column to find gaps that are smaller than the user pitch.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;This approach should significantly reduce the number of measurements compared with the current method.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Finally, I will filter out the pins that do not satisfy the row and column conditions described above. These pins can be considered an &amp;quot;exception pin list&amp;quot; and will be checked separately using the old method, which scans the area to find the pitch.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;If I have time, I will try coding this approach to see whether the idea is actually feasible.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Luan&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Skill script for checking BGA pitch</title><link>https://community.cadence.com/thread/1409234?ContentTypeID=1</link><pubDate>Mon, 24 Aug 2026 09:37:53 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:635bda14-4a7d-4fa0-b416-7df5af8e8215</guid><dc:creator>SG20260713408</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409234?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66279/skill-script-for-checking-bga-pitch/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Thank you for sharing your thoughts.&lt;/p&gt;
&lt;p&gt;Since the pitch and pin arrangement of BGAs are not all identical, it is difficult to grid them based on the input pitch.&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Skill script for checking BGA pitch</title><link>https://community.cadence.com/thread/1409232?ContentTypeID=1</link><pubDate>Mon, 24 Aug 2026 06:16:21 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:fa918eed-d509-4edf-a30a-f25499ac1d77</guid><dc:creator>TL202608111936</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409232?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66279/skill-script-for-checking-bga-pitch/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;For BGA packages with a large number of pins, identifying all pin pairs and measuring the distance between each pair can significantly slow down the code. I suggest dividing the BGA pins into a grid based on a predefined pitch. This way, I think we can reduce the number of distance measurements by approximately 50%.&lt;/p&gt;
&lt;p&gt;Luan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Skill script for checking BGA pitch</title><link>https://community.cadence.com/thread/1409230?ContentTypeID=1</link><pubDate>Sat, 22 Aug 2026 20:49:01 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:72bcce01-31b7-4c7e-8040-49a4b643b2f6</guid><dc:creator>SG20260713408</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409230?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66279/skill-script-for-checking-bga-pitch/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;There are no special conditions.&lt;/p&gt;
&lt;p&gt;I uploaded the relevant code a while ago, but I have improved the parts that were lacking and uploaded it again.&lt;/p&gt;
&lt;p&gt;I was just curious to see what ideas others might have.&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Skill script for checking BGA pitch</title><link>https://community.cadence.com/thread/1409229?ContentTypeID=1</link><pubDate>Sat, 22 Aug 2026 13:40:07 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:ec99556d-7d21-4916-8610-162eebae3b7d</guid><dc:creator>Elecguy</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409229?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66279/skill-script-for-checking-bga-pitch/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Just took a quick look at it and it seems good. Any special conditions for the board where it should be used?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Skill to update the value of Custom Variables in PCB Editor</title><link>https://community.cadence.com/thread/1409224?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 11:04:09 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:b29b1bf1-1b8b-4f19-ac7a-701d6655bcf5</guid><dc:creator>MZ20250602835</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409224?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66274/skill-to-open-custom-variables-window-in-allegro-x-25-1-pcb-editor/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I want to have the skill to update the value of custom variables.&lt;/p&gt;
&lt;p&gt;The commands i post above&amp;nbsp;&lt;span data-subtree="aimfl" data-processed="true" data-copy-service-computed-style="font-family: &amp;quot;Google Sans&amp;quot;, Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);"&gt;To update custom variables in Cadence PCB / Allegro using the Toolbox (&lt;/span&gt;&lt;code class="KDcb0c" dir="ltr" data-sfc-root="ep" data-processed="true" data-copy-service-computed-style="font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0.533333px solid rgb(240, 242, 245);"&gt;tbx&lt;!--mce:protected %3C%21--TgQPHd%7C%7C%7C%5B%5D--%3E--&gt;&lt;/code&gt;) utility, open the setup menu, select custom variables, and run the update command to input new values like dates or revisions, then run it again to refresh the drawing.&lt;/p&gt;
&lt;p&gt;I would like to have the same function with using skill instead of commands.&lt;/p&gt;
&lt;p&gt;I am still learning your code, but as far as i understand the code you post is for another function.&lt;/p&gt;
&lt;p&gt;Many thanks again&lt;/p&gt;
&lt;p&gt;Moyan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Skill to update the value of Custom Variables in PCB Editor</title><link>https://community.cadence.com/thread/1409222?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 10:59:19 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:87c52d54-157f-4819-bda5-2091afe3a8e9</guid><dc:creator>andakConsultingLtd</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409222?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66274/skill-to-open-custom-variables-window-in-allegro-x-25-1-pcb-editor/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Well, this shows you how to deal with custom properties and properties in general. What&amp;#39;s missing?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Skill to update the value of Custom Variables in PCB Editor</title><link>https://community.cadence.com/thread/1409221?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 10:57:07 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:dee01677-c692-4880-9c91-231f3f5a8a99</guid><dc:creator>MZ20250602835</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409221?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66274/skill-to-open-custom-variables-window-in-allegro-x-25-1-pcb-editor/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Many thanks for your reply, but i think this is not the skill i need.&lt;/p&gt;
&lt;p&gt;Best Regards&lt;/p&gt;
&lt;p&gt;Moyan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Skill to update the value of Custom Variables in PCB Editor</title><link>https://community.cadence.com/thread/1409219?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 08:46:31 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:5e9df9c5-9c43-4fea-8930-66f73431c840</guid><dc:creator>andakConsultingLtd</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409219?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66274/skill-to-open-custom-variables-window-in-allegro-x-25-1-pcb-editor/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi Moyan,&lt;/p&gt;
&lt;p&gt;See if you can use this (untested) code for your app:&lt;/p&gt;
&lt;p&gt;; ---------------------------------------------------------------------------&lt;br /&gt;; 1. DEFINE the property in the design&amp;#39;s property dictionary (one-time setup)&lt;br /&gt;;&amp;nbsp; &amp;nbsp; axlDBCreatePropDictEntry(name dataType objTypes valRange units constraint)&lt;br /&gt;;&amp;nbsp; &amp;nbsp; Only needs to run once per design -- guard it so re-running doesn&amp;#39;t error.&lt;br /&gt;; ---------------------------------------------------------------------------&lt;br /&gt;procedure( myskill_ensureProps()&lt;br /&gt;&amp;nbsp; &amp;nbsp; unless( axlDBGetPropDictEntry(&amp;quot;MY_TEMP&amp;quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; axlDBCreatePropDictEntry(&amp;quot;MY_TEMP&amp;quot; &amp;quot;REAL&amp;quot; list(&amp;quot;pins&amp;quot;) list(nil nil) &amp;quot;C&amp;quot; nil)&lt;br /&gt;&amp;nbsp; &amp;nbsp; )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;; ---------------------------------------------------------------------------&lt;br /&gt;; 2. WRITE the property onto a specific object&lt;br /&gt;;&amp;nbsp; &amp;nbsp; axlDBAddProp(dbid list(propName propValue))&lt;br /&gt;; ---------------------------------------------------------------------------&lt;br /&gt;procedure( myskill_setTemp(pin tempVal)&lt;br /&gt;&amp;nbsp; &amp;nbsp; myskill_ensureProps()&lt;br /&gt;&amp;nbsp; &amp;nbsp; unless( errset( axlDBAddProp(pin list(&amp;quot;MY_TEMP&amp;quot; tempVal)) )&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; error(&amp;quot;myskill&amp;quot; &amp;quot;axlDBAddProp failed for MY_TEMP=%g on %s.%s&amp;quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tempVal (or pin-&amp;gt;parent-&amp;gt;refdes &amp;quot;?&amp;quot;) (or pin-&amp;gt;number &amp;quot;?&amp;quot;))&lt;br /&gt;&amp;nbsp; &amp;nbsp; )&lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&amp;quot;INFO myskill: MY_TEMP = %g set on %s.%s\n&amp;quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tempVal (or pin-&amp;gt;parent-&amp;gt;refdes &amp;quot;?&amp;quot;) (or pin-&amp;gt;number &amp;quot;?&amp;quot;))&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;; ---------------------------------------------------------------------------&lt;br /&gt;; 3. READ the property back off the object&lt;br /&gt;;&amp;nbsp; &amp;nbsp; axlDBGetProperties(dbid &amp;#39;(&amp;quot;user&amp;quot;)) returns a list of (name value) pairs&lt;br /&gt;; ---------------------------------------------------------------------------&lt;br /&gt;procedure( myskill_getPropValue(propName propList)&lt;br /&gt;&amp;nbsp; &amp;nbsp; let( (result targetStr)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result&amp;nbsp; &amp;nbsp; = nil&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; targetStr = upperCase(propName)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach( entry propList&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; when( upperCase(sprintf(nil &amp;quot;%s&amp;quot; car(entry))) == targetStr&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result = cadr(entry)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result&lt;br /&gt;&amp;nbsp; &amp;nbsp; )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;procedure( myskill_getTemp(pin)&lt;br /&gt;&amp;nbsp; &amp;nbsp; let( (props strVal result)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; props&amp;nbsp; = axlDBGetProperties(pin &amp;#39;(&amp;quot;user&amp;quot;))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; strVal = myskill_getPropValue(&amp;quot;MY_TEMP&amp;quot; props)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result = if( strVal != nil then atof(sprintf(nil &amp;quot;%s&amp;quot; strVal)) else nil )&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result&lt;br /&gt;&amp;nbsp; &amp;nbsp; )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;; ---------------------------------------------------------------------------&lt;br /&gt;; 4. (optional) REMOVE the property from an object&lt;br /&gt;;&amp;nbsp; &amp;nbsp; axlDBDeleteProp(dbid propName)&lt;br /&gt;; ---------------------------------------------------------------------------&lt;br /&gt;procedure( myskill_clearTemp(pin)&lt;br /&gt;&amp;nbsp; &amp;nbsp; unless( errset( axlDBDeleteProp(pin &amp;quot;MY_TEMP&amp;quot;) )&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; error(&amp;quot;myskill&amp;quot; &amp;quot;axlDBDeleteProp failed for MY_TEMP on %s.%s&amp;quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (or pin-&amp;gt;parent-&amp;gt;refdes &amp;quot;?&amp;quot;) (or pin-&amp;gt;number &amp;quot;?&amp;quot;))&lt;br /&gt;&amp;nbsp; &amp;nbsp; )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;; ---------------------------------------------------------------------------&lt;br /&gt;; Example usage&lt;br /&gt;; ---------------------------------------------------------------------------&lt;br /&gt;let( (pin)&lt;br /&gt;&amp;nbsp; &amp;nbsp; pin = car(axlDBGetPointList(nil &amp;quot;Select a pin: &amp;quot; &amp;#39;(&amp;quot;Pin&amp;quot;)))-&amp;gt;objType&amp;nbsp; ; placeholder for pin selection&lt;br /&gt;&amp;nbsp; &amp;nbsp; myskill_setTemp(pin 85.0)&amp;nbsp; &amp;nbsp; &amp;nbsp; ; write MY_TEMP = 85.0 on the pin&lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&amp;quot;MY_TEMP readback = %g\n&amp;quot; myskill_getTemp(pin))&amp;nbsp; ; read it back&lt;br /&gt;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to check BGA minimum pitch using Allegro Skill language</title><link>https://community.cadence.com/thread/1409217?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 08:36:52 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:e21c5005-baeb-4fdc-93ab-d5aca667f901</guid><dc:creator>SG20260713408</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409217?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66158/how-to-check-bga-minimum-pitch-using-allegro-skill-language/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;My apologies for the late reply; I had an issue with my account.&lt;/p&gt;
&lt;p&gt;I do not think I can participate in a discussion due to my lack of knowledge.&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to check BGA minimum pitch using Allegro Skill language</title><link>https://community.cadence.com/thread/66158?ContentTypeID=0</link><pubDate>Mon, 13 Jul 2026 06:33:23 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:f3e25ee6-3bd5-41cf-a121-043c8ef935b3</guid><dc:creator>BZ202408076026</dc:creator><slash:comments>7</slash:comments><comments>https://community.cadence.com/thread/66158?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66158/how-to-check-bga-minimum-pitch-using-allegro-skill-language/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I want to check&amp;nbsp;BGA minimum pitch. If BGA pitch is less than 0.5mm, need to highlight these BGA in PCB layout. Does anyone have experience to write script to do the check?&lt;/p&gt;</description></item><item><title>RE: How to check BGA minimum pitch using Allegro Skill language</title><link>https://community.cadence.com/thread/1409216?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 08:19:30 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:ea2e0b35-6c6c-4abe-b250-50c83efdfbba</guid><dc:creator>SG20260713408</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409216?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66158/how-to-check-bga-minimum-pitch-using-allegro-skill-language/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I&amp;#39;m glad to hear that it was helpful.&lt;br /&gt;I plan to upload the improved script separately.&lt;br /&gt;Please take note.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Skill ： check for shape minimum aperture of gap width</title><link>https://community.cadence.com/thread/1409147?ContentTypeID=1</link><pubDate>Wed, 12 Aug 2026 09:54:34 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:2e454487-d48b-465a-8b84-d36557acfd73</guid><dc:creator>TL202608111936</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409147?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/62715/skill-check-for-shape-minimum-aperture-of-gap-width/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p class="PDq2pG_selectionAnchorContainer" data-start="605" data-end="680"&gt;Hi,&lt;br data-start="608" data-end="611" /&gt; I don&amp;#39;t know if you&amp;#39;ve resolved your problem yet, but I have an idea:&lt;/p&gt;
&lt;p class="PDq2pG_selectionAnchorContainer" data-start="605" data-end="680"&gt;- Select the shape &amp;rarr; extract the shape&amp;#39;s voids &amp;rarr; convert each void into a polygon &amp;rarr; expand the polygon &amp;rarr; select the other voids or shape segments by using axlAddselectbyPoly&amp;rarr; measure them.&lt;/p&gt;
&lt;p&gt;Luan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Skill ： check for shape minimum aperture of gap width</title><link>https://community.cadence.com/thread/62715?ContentTypeID=0</link><pubDate>Fri, 18 Oct 2024 02:11:56 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:f3902c5d-871c-4593-a8e4-58f3653ad480</guid><dc:creator>Xiaome8</dc:creator><slash:comments>8</slash:comments><comments>https://community.cadence.com/thread/62715?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/62715/skill-check-for-shape-minimum-aperture-of-gap-width/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi Bro,&lt;/p&gt;
&lt;p&gt;I has a trouble to check for shape minimum aperture of gap width , and there is an interesting picture which can&lt;img class="align-right" style="float:right;max-height:480px;max-width:640px;" alt=" " src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/2.jpg" /&gt; fix the issue，So can anyone help to share such kinds of skills ？ thanks in advance.&lt;/p&gt;</description></item><item><title>SKILL program to save user colors</title><link>https://community.cadence.com/thread/51534?ContentTypeID=0</link><pubDate>Wed, 20 Apr 2022 14:03:13 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:24098fc6-6695-4014-a948-e3eb1356f8e9</guid><dc:creator>soll</dc:creator><slash:comments>9</slash:comments><comments>https://community.cadence.com/thread/51534?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/51534/skill-program-to-save-user-colors/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hello :)&lt;/p&gt;
&lt;p&gt;I have written a SKILL program that save/load the colors of a BRD. It saves both the color palette and the colors associated with each subclass into a file, that can be loaded to another BRD (or the same).&lt;/p&gt;
&lt;p&gt;It mostly works :p On some (rather) rare occasions, the SaveColors() function will skip some subclasses, or mess their name, and I have no idea why. But most of the time, it works. It has been written with Cadence 17.2, but should work on any version.&lt;/p&gt;
&lt;p&gt;Sometime, after loading a color file, I get this error &lt;span style="color:#ff0000;"&gt;(SPMHDB-197): Subclass color index out of range.&lt;/span&gt; If anybody know what it exactly means, I am interested. If someone know were I could find a list of all the error codes and their meanings, I would be very interested too !&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;If you have any idea on how to make this program better or if you spot some grammatical/spelling mistakes, don&amp;#39;t hesitate to tell !&lt;br /&gt;If someone knows how to save the global transparency and shapes transparency of the Display tab (color dialog window), I think it would be a nice addition.&lt;/p&gt;
&lt;p&gt;REMINDER : always double save you BRD before executing some SKILL code from and internet stranger :p I didn&amp;#39;t had any problem with this program, but I don&amp;#39;t know if it works the same on my setup and on yours. It probably does.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Here is the code :&lt;/p&gt;
&lt;p&gt;; SaveColors() : save subclasses colors in a .colors file&lt;br /&gt;; LoadColors() : load subclasses colors from a file&lt;br /&gt;; skill &amp;quot;load SaveColors.il&amp;quot;&lt;br /&gt;&lt;br /&gt;axlCmdRegister(&amp;quot;savecolors&amp;quot; &amp;#39;SaveColors ?cmdType &amp;quot;general&amp;quot;)&lt;br /&gt;axlCmdRegister(&amp;quot;loadcolors&amp;quot; &amp;#39;LoadColors ?cmdType &amp;quot;general&amp;quot;)&lt;br /&gt;&lt;br /&gt;procedure( SaveColors()&lt;br /&gt;let((colorFileName colorFilePort subclass)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;; color file creation&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;colorFileName = axlDMFileBrowse(nil t ?defaultName strcat(&amp;quot;./&amp;quot; axlCurrentDesign() &amp;quot;-&amp;quot; getLogin() &amp;quot;.colors&amp;quot;) ?title &amp;quot;Save Colors As&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;colorFilePort = outfile(colorFileName)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:\n\n&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; Color file&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : %s\n&amp;quot; colorFileName)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; User&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : %s\n&amp;quot; getLogin())&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; Drawing&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : %s.brd\n&amp;quot; axlCurrentDesign())&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; Software version : %s\n&amp;quot; getVersion())&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; Date/Time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : %s\n\n&amp;quot; getCurrentTime())&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;---\n&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;; get color palette&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;paletteList = axlColorGet(&amp;#39;all)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach(color paletteList&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;%d~%d~%d\n&amp;quot; nth(0 color) nth(1 color) nth(2 color))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;) ;foreach&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;???\n&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;; get colors for each subclass&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach(ClassName axlGetParam(&amp;quot;paramLayerGroup&amp;quot;)-&amp;gt;groupMembers &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foreach(SubclassName (axlGetParam(strcat(&amp;quot;paramLayerGroup:&amp;quot; ClassName))-&amp;gt;groupMembers)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;subclass = axlLayerGet(strcat(ClassName &amp;quot;/&amp;quot; SubclassName))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;%s/%s~%d~%d\n&amp;quot; ClassName SubclassName subclass-&amp;gt;color subclass-&amp;gt;pattern)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;) ;foreach&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;) ;foreach&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(colorFilePort &amp;quot;!!!\n&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;close(colorFilePort)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printf(&amp;quot;Colors saved under %s.&amp;quot; colorFileName)&lt;br /&gt;)) ;let,procedure&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure( LoadColors()&lt;br /&gt;prog((colorFileName colorFilePort currentLine parsedLine colorPalette)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;colorFileName = axlDMFileBrowse(nil nil ?title &amp;quot;Load Colors&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;colorFilePort = infile(colorFileName)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;currentLine = &amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;; checks that the selected file is a color file&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(gets(currentLine colorFilePort) != &amp;quot;;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:\n&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;;println(currentLine)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;axlUIConfirm(&amp;quot;Le fichier choisi n&amp;#39;est pas compatible\n&amp;quot; &amp;#39;error)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;) ;if&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;; get to the color list&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;while(currentLine != &amp;quot;---\n&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;gets(currentLine colorFilePort)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;) ;while&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;; set the colors palette&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;while(currentLine != &amp;quot;???\n&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;gets(currentLine colorFilePort)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;unless( currentLine == &amp;quot;???\n&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;parsedLine = parseString(currentLine &amp;quot;~&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;parsedLine = list(atoi(nth(0 parsedLine)), atoi(nth(1 parsedLine)), atoi(nth(2 parsedLine)))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;colorPalette = cons(parsedLine colorPalette)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;) ;unless&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;) ;while&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;colorPalette = reverse(colorPalette)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;axlColorSet(&amp;#39;all colorPalette)&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;; set the subclasses colors&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;while(currentLine != &amp;quot;!!!\n&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;gets(currentLine colorFilePort)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;parsedLine = parseString(currentLine &amp;quot;~&amp;quot;)&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;subclass = axlLayerGet(nth(0 parsedLine))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(subclass != nil&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;subclass-&amp;gt;color = atoi(nth(1 parsedLine))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;subclass-&amp;gt;pattern = atoi(nth(2 parsedLine))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;axlLayerSet(subclass)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;) ;if&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;) ;while&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;; update display&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;axlVisibleUpdate(t)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printf(&amp;quot;Color file loaded succesfully (I guess).&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;close(colorFilePort)&lt;br /&gt;)) ;let,procedure&lt;/p&gt;</description></item><item><title>RE: SKILL program to save user colors</title><link>https://community.cadence.com/thread/1409145?ContentTypeID=1</link><pubDate>Wed, 12 Aug 2026 09:26:02 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:312b467b-8f62-4faf-a44c-57038e75051d</guid><dc:creator>TL202608111936</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409145?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/51534/skill-program-to-save-user-colors/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi Soll,&lt;/p&gt;
&lt;p&gt;It is simplest way to do that.&amp;nbsp;According to the Allegro documentation, &lt;strong data-start="40" data-end="84"&gt;File &amp;rarr; Export &amp;rarr; Parameters (&lt;code data-start="70" data-end="81"&gt;param out&lt;/code&gt;)&lt;/strong&gt; allows you to create a &lt;code data-start="108" data-end="114"&gt;.prm&lt;/code&gt; file, which can then be imported back using &lt;strong data-start="159" data-end="173"&gt;&lt;code data-start="161" data-end="171" data-is-only-node=""&gt;param in&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Luan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to merge excel cell in Allgero SKILL using axlSpreadsheet API</title><link>https://community.cadence.com/thread/1409137?ContentTypeID=1</link><pubDate>Mon, 10 Aug 2026 06:15:59 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:3f3e89ab-8663-40b0-b324-ac953a105fe0</guid><dc:creator>BT202507156313</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409137?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66183/how-to-merge-excel-cell-in-allgero-skill-using-axlspreadsheet-api/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Merging cells in an XML file can be done quite easily using the following approach:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;&lt;span&gt;Read the XML file again using the &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;infile&lt;/span&gt;&lt;/code&gt;&lt;span&gt; function.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Iterate through each row and store the row data.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;When reaching the target row and cell to be merged, add &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;MergeAcross&lt;/span&gt;&lt;/code&gt;&lt;span&gt; according to the Excel XML syntax.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Continue reading the file until reaching the last line.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Save the modified file.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;Luan&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to merge excel cell in Allgero SKILL using axlSpreadsheet API</title><link>https://community.cadence.com/thread/66183?ContentTypeID=0</link><pubDate>Tue, 21 Jul 2026 05:56:35 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:3976fc55-309a-4b96-8d2b-14f73d75362f</guid><dc:creator>SK202607205032</dc:creator><slash:comments>2</slash:comments><comments>https://community.cadence.com/thread/66183?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66183/how-to-merge-excel-cell-in-allgero-skill-using-axlspreadsheet-api/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I just using&amp;nbsp;&lt;span&gt;axlSpreadsheetInit&lt;/span&gt;&lt;span&gt;() to write excel file, but I don&amp;#39;t know how to merge cell,example as the picture below.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:480px;max-width:640px;" src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/pastedimage1784613139502v1.png" alt=" " /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Is there any suggestion? Thanks a lot.&lt;/span&gt;&lt;/p&gt;</description></item><item><title>How to use skill code to check pin to pin mark air gap?</title><link>https://community.cadence.com/thread/66189?ContentTypeID=0</link><pubDate>Wed, 22 Jul 2026 08:21:37 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:05cdf907-5d0c-43a0-8261-b16707bf01b8</guid><dc:creator>SK202607205032</dc:creator><slash:comments>2</slash:comments><comments>https://community.cadence.com/thread/66189?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66189/how-to-use-skill-code-to-check-pin-to-pin-mark-air-gap/rss?ContentTypeId=0</wfw:commentRss><description>&lt;div&gt;
&lt;p&gt;Hi all,&lt;/p&gt;
&lt;p&gt;I would like to get the air gap value between the first pin and the pin-1 marker (silkscreen text such as &amp;quot;*&amp;quot; or &amp;quot;&amp;gt;&amp;quot;), as shown below.&lt;/p&gt;
&lt;p&gt;I found the API &lt;code&gt;axlAirGap()&lt;/code&gt;, but I&amp;#39;m not sure how to implement it.&lt;/p&gt;
&lt;p&gt;Could anyone provide an example or some guidance?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Thanks!!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:480px;max-width:640px;" src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/pastedimage1784708098142v1.png" alt=" " /&gt;&lt;/p&gt;</description></item><item><title>RE: How to use skill code to check pin to pin mark air gap?</title><link>https://community.cadence.com/thread/1408999?ContentTypeID=1</link><pubDate>Tue, 28 Jul 2026 04:09:31 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:3f8d3639-e6fc-4dad-9609-b549731ad88e</guid><dc:creator>BT202507156313</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1408999?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66189/how-to-use-skill-code-to-check-pin-to-pin-mark-air-gap/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi!&lt;/p&gt;
&lt;p&gt;You can try&amp;nbsp;axlAirGap(pin_dbid mark_dbid nil &amp;#39;anyLayer) for gap&lt;/p&gt;
&lt;p&gt;Luan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>