4 Replies Latest reply on Dec 21, 2016 9:17 AM by Patrick.Cashman

    Auto generate Padstack ?


      Hi All,

      Is there any way to create an auto generated Padstack script ?

      for example:

      I need an SMD Padstack - Rectangle 0.5x0.3

      So the top and bottom mount should be 0.5x0.3

                 top and bottom mount SM should be 0.6x0.4 (auto increase by 0.1mm)

                 top and bottom mount SP should be 0.5x0.3


      Any ideas how to make it work ?




        • 1. Re: Auto generate Padstack ?

          There is a section in the Automation and Scripting part of the help files for Library Management and Library Editors.  The methods for manipulating padstacks are described in there. You can also find the same information on the supportnet website here.


          There are some examples given there on how to get started.

          • 2. Re: Auto generate Padstack ?

            I did some work on this to try something out as a test.  It was a simple test to see if I could change a padstack and use different sized pads on different layers.


            Now, before the actual code, let me talk about methods.  You can't do this on an active PCB database.  You can query the padstack library of a pcb design, but everything in it is read-only.  This is stated in the help documentation.  So you can only make edits in the padstack database of a library (.lmc).  If I needed to do this, I'd create a secondary library which contains padstacks only to use as a sandbox for this purpose only.  Once you have a modified padstack in the library, you have to use library services to import it into your design.  If you are changing padstacks a lot, you'd want to keep your main central library intact and not change the default padstacks in it, so just use the secondary library to create or modify them for a specific purpose then import into your design. As long as everyone in your group knows the secondary database will have who knows what in it, and the padstacks in it may be changing frequently, you can safely do this without messing up someone else's design


            The following example is not 100% complete.  It assumes you have a .net project and the basics of how to use .net and the Mentor COM interfaces under control.


            In a public module, I declare the global variables used:


            Public app As MGCPCB.Application

                 Public doc As MGCPCB.Document

                 Public gui As MGCPCB.Gui


                 Public prog_id As Integer

                 Public mglaunch_path As String


                 Public ps_editor As PadstackEditorLib.PadstackEditorDlg

                 Public ps_db As PadstackEditorLib.PadstackDB

                 Public has_ps_editor, has_ps_db As Boolean


            Public pcb_path, lib_path As String


            You'll need routines to get prog_id and mglaunch_path.  I've covered that elsewhere and have made the routines available in a .net automation template. 

            On that note, remember that you'll need to start the .net IDE with mglaunch if you want to run in debug mode from the IDE.  I've also covered how to do that with a shell script, getting mglaunch path from the registry.


            Here is the part that connects to the padstack editor and padstack database in an lmc file:


            Public Sub ps_connect()

                     'Creates a handle to the Parts Editor in Library Manager


                         ps_editor = CreateObject("MGCPCBLibraries.PadstackEditorDlg" & "." & prog_id.ToString)

                     Catch ex As Exception

                         Debug.Print("failing to create padstack editor session with this error: " & ex.Message)

                     End Try


                     has_ps_editor = False

                     If ps_editor is Nothing Then

                         Debug.Print("ps_editor is nothing")

                         Exit Sub


                         has_ps_editor = True

                     End If


                     lib_path = "path_to_your_padstack_library.lmc"


                     ps_db = Nothing

                     ps_db = ps_editor.OpenDatabaseEx(lib_path, False)


                     has_ps_db = False

                     If ps_db Is Nothing Then

                         Debug.Print("ps_db is nothing")


                         has_ps_db = True

                     End If

            End Sub


            And here is a simple routine that changes a single via padstack:


            Sub change_a_padstack()


                     Dim pss As PadstackEditorLib.Padstacks

                     Dim ps As PadstackEditorLib.Padstack

                     Dim n As Integer

                     Dim pad As PadstackEditorLib.Pad

                     Dim pads As PadstackEditorLib.Pads

                     Dim hole As PadstackEditorLib.Hole

                     Dim holes As PadstackEditorLib.Holes


                     pss = ps_db.Padstacks


                     Debug.Print("there are " & pss.Count & " items in the collection")


                     For Each ps In pss

                         If ps.Name = "vsd:ex24y24d13a" Then

                             Debug.Print("found vsd:ex24y24d13a")




                         End If



                     ps = ps_db.NewPadstack()

                     ps.Type = 16

                     ps.Name = "vsd:ex24y24d13a"


                     hole = ps_db.FindHole("Rnd 13 +Tol 0 -Tol -13")


                     ps.Hole = hole


                     Debug.Print("hole name is " & hole.Name)


                     pad = ps_db.FindPad("Round 24")


                     ps.Pad(-1) = pad

                     ps.Pad(-3) = pad

                     ps.Pad(-2) = pad


                     pad = ps_db.FindPad("Round 26")


                     ps.Pad(3) = pad

                     ps.Pad(9) = pad







                     ps_db = Nothing


                     ps_editor = Nothing


            End Sub


            The key bit of information here is that all of the default pads have a designated integer (these are all listed in the help), with a negative sign.  For physical layer overrides, use the positive integer that corresponds to the physical layer in your board. I verified that when I pulled the changed via into a pcb design that the via padstack was correctly changed.


            In a real situation, you might want to get the pad size information from some external source, such as a text file or spreadsheet.  I'm not including that here because it's beyond the scope of this exercise, but it's not hard to do.  Using these methods, one could easily create or modify padstacks in the library using padstack names from an external source, along with the values of the pad sizes.


            Now if you want to change clearances on a per-layer basis, you'd need to use CES to create clearance rules net class, and apply them appropriately.  There is no way to define the clearances in the padstack editor, other than the default plane clearance, which is one of the default layers in the padstack definition. It is possible to automate CES, but you need to request the free license key for that from your Mentor AE.

            • 3. Re: Auto generate Padstack ?

              Hi Patrick,


              Thanks for the help...

              I'm new with the script's options

              Can you upload a working script that change 1 padstack ?

              I will try to see if it works.





              • 4. Re: Auto generate Padstack ?

                You're welcome.


                Sorry, I'm not going to write the whole thing and hand it to you.  I've provided everything you'd need here and elsewhere on this forum (my automation template) to implement this.  If you get the automation template and add what I've posted here to it, then change the name of the padstack to work on, it will do what you want.  You'd also have to change the pad names and layers for how you want your new padstacks.


                If your company is in need of more extensive implementation of automation solutions, I may be able to help you out.  Contact me at patcashman@gmail.com if you'd like to pursue that.