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

📄 cmd-net-list2sch.ulp

📁 老外的PCB设计软件,是免费的.可以上网更新.
💻 ULP
字号:
#usage "<b>Import an EAGLE-Net-List into a schematic</b>\n"
       "<p>"
       "Usage:<p>"
       "RUN cmd-net-list2sch [<i>netlist-file</i> ] <p>"
       "RUN cmd-net-list2sch [<i>net device pin device pin</i> ] <p>"
       "RUN cmd-net-list2sch : Opens a file dialog to select the Net list file."
       "<p>"
       "Example:<p>"
       "RUN cmd-net-list2sch hexapod.lst<p>"
       "RUN cmd-net-list2sch IN1 R1 1 C1 2<p>"
       "RUN cmd-net-list2sch clk ic1 9 ic3 15<p>"
       "<b>Attention:</b>"
       "<p>"
       "In special situations it could happen that importing a netlist "
       "into a schematic (in form of 'airwires' as it happens here) "
       "results in misconnections. This is the case if a net line "
       "overlaps a pin connection point. If this certain pin under the "
       "net should get connected later, EAGLE will connect to the net "
       "instead of the pin under it.<p>"
       "We want to avoid this problem in the ULP by drawing the net "
       "line from the first pin with an offset of 50 mil. This way "
       "diagonal net lines will be drawn and there will be hardly pins "
       "that lie under net lines.<p>"
       "If a net has to be drawn on a further sheet of the schematic "
       "EAGLE uses the diagonal offset of 50 mil and places an "
       "additional LABEL."
       "<p>"
       "<author>Author: support@cadsoft.de</author>"

// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED

/* German info
       "<b>ACHTUNG</b><p>\n"
       "Das Einlesen einer Netzliste (Airwire) in den Schaltplan, "
       "kann in besonderen Situationen zu falschen Verbindungen fuehren.<p>\n"
       "Werden die Netze als "Luftlinien" zwischen den Bauteilpins gezeichnet, "
       "so kann es vorkommen, dass eine Netzlinie Bauteilpins ueberlagert. "
       "Wird spaeter <b>dieser</b> Pin unter der Linie an ein Netz angeschlossen "
       "so nimmt EAGLE das Netz als Kontaktpunkt und nicht den "
       "darunterliegenden Pin.<p>"
       "In diesem ULP wird versucht diese Problematik zu umgehen, in dem vom "
       "ersten Pin mit einem Offset (50mil) vom Pin weg "
       "und dann zum zweiten Pin gezeichnet wird. Dadurch entstehen diagonale "
       "Luftlinien die nur in seltenen Faellen einen Pin ueberlagern.<p>\n"
       "Wird ein Netz auf einer anderen Schaltplanseite weitergefuehrt, "
       "so wird vom Pin um 50 Mil diagonal weggezeichnet und zusaetzlich "
       "ein <b>LABEL</b> plaziert.<p>\n"
*/

// Eagle NET-Command definition
string net_name = strupr(argv[1]);
string device_a = strupr(argv[2]);
string pin_a    = strupr(argv[3]);
string device_b = strupr(argv[4]);
string pin_b    = strupr(argv[5]);

string cmd = "";

string lines[];
int    nLines;
//string s;

// *** Eagle NET LIST definition ***
string tok_Net = "Net";
string tok_Part = "Part";
string tok_Pad = "Pad";
string netlistLines[];
string signalName;
int    signalCnt = 0;
string NetListfileName;

// *** functions ***

int actSheet(UL_SHEET S)
{
  return S.number;
}

void readNetList(void)
{
  int sn = 0;

  for (sn = 0; sn < nLines; sn++)
  {  // search for start line "Net  Part  Pin" in Eagle Netlist
    if( (strstr(lines[sn], tok_Net) == 0) && (strstr(lines[sn], tok_Part) >= 8) && (strstr(lines[sn], tok_Pad) >= 16) )
    {
      sn++;
      break;
    }
  }
  if (sn == nLines)
  {
    dlgMessageBox(NetListfileName + " is not a Eagle-Netlist", "OK");
    exit (0);
  }

  string netName;
  string dev;
  string pin;
  string dev_b;
  string pin_b;

  do
  {
    signalCnt = strsplit (netlistLines, lines[sn], ' ');

    if (signalCnt > 1)
    {
      // init NET command
      int ncnt = 1;
      if (netlistLines[0])
      {
        netName = netlistLines[0];
        do
        {

          if (netlistLines[ncnt])
          {
            dev = netlistLines[ncnt];
            ncnt++;
            break;
          }
          ncnt++;
        } while (ncnt <= signalCnt);
        do
        {
          if (netlistLines[ncnt] )
          {
            pin = netlistLines[ncnt];
            ncnt++;
          }
          ncnt++;
        } while (ncnt <= signalCnt);
      }

      else
      {
        do
        {
          if (netlistLines[ncnt])
          {
            dev_b = netlistLines[ncnt];
            ncnt++;
            break;
          }
          ncnt++;
        } while (ncnt <= signalCnt);
        do
        {
          if (netlistLines[ncnt] )
          {
            pin_b = netlistLines[ncnt];
          }
          ncnt++;
        } while (ncnt <= signalCnt);
      cmd += "run " + argv[0] + " " + netName + " " + dev + " " + pin + " ";
      cmd += dev_b + " " + pin_b + ";\n";
      dev = dev_b;
      pin = pin_b;
      dev_b = "";
      pin_b = "";
      }
    }
    sn++;
  } while (sn <= nLines);
  return;
}

// *** MAIN ***
if (schematic)
{
   // run as net command
   if (device_b && pin_b)
   {
      int pinA_sheet = 0;
      int pinB_sheet = 0;
      int xA, yA, xB, yB;
      string g = ";\nGRID LAST;\n";
      int actualsheet;
      if (sheet) sheet(SH) actualsheet = SH.number;

      // *** Schematic coord. ***
      schematic(S) {
         cmd = "SET WIRE_BEND 2;\nGRID MIL 50 2 ;\n";
         S.sheets(SH)
         {
            SH.parts(PA)
            {
               if (PA.name == device_a )
               {
                  PA.instances(IN)
                  {
                     IN.gate.symbol.pins(P) // Pin
                     {
                        if (P.contact)
                        {
                           string cp = P.contact.name;        // PAD name von Connect/Pad
                           if (cp == pin_a)
                           {
                              xA = P.x;
                              yA = P.y;
                              pinA_sheet = SH.number;
                           }
                        }
                     }
                  }
               }
               if (device_b)
               {
                  if (PA.name == device_b )
                  {
                     PA.instances(IN)
                     {
                        IN.gate.symbol.pins(P) // Pin
                        {
                           if (P.contact)
                           {
                              string cp = P.contact.name;        // PAD name von Connect/Pad
                              if (cp == pin_b)
                              {
                                 xB = P.x;
                                 yB = P.y;
                                 pinB_sheet = SH.number;
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
      if (net_name) net_name = "'" + net_name + "'";
         // place Name in ' ' for NET-Command

      string s;
      if ( (pinA_sheet != 0) && (pinB_sheet != 0) )
      {
         if (pinA_sheet == pinB_sheet)
         {
            if (actualsheet != pinA_sheet)
            {
               sprintf(s, "EDIT .s%d;\n", pinA_sheet);
               cmd += s;
            }
            sprintf(s, "NET %s (%.3f %.3f)", net_name, u2mil(xA), u2mil(yA) );
            cmd += s;
            sprintf(s, " (%.3f %.3f)", u2mil(xA)+50, u2mil(yA)-50 );
            cmd += s;
            sprintf(s, " (%.3f %.3f);\n", u2mil(xB), u2mil(yB) );
            cmd += s;
            exit (cmd + g);
         }
         else
         {
            if (actualsheet != pinA_sheet)
            {
               sprintf(s, "EDIT .s%d;\n", pinA_sheet);
               cmd += s;
            }
            sprintf(s, "NET %s (%.3f %.3f)", net_name, u2mil(xA), u2mil(yA) );
            cmd += s;
            sprintf(s, " (%.3f %.3f);\n", u2mil(xA)+50, u2mil(yA)+50 );
            cmd += s;
            sprintf(s, "LABEL (%.3f %.3f)", u2mil(xA), u2mil(yA) );
            cmd += s;
            sprintf(s, " (%.3f %.3f);\n", u2mil(xA)+50, u2mil(yA)+50 );
            cmd += s;
            sprintf(s, "CHANGE LAYER 91 (%.3f %.3f);\n", u2mil(xA)+50, u2mil(yA)+50 );
            cmd += s;

            if (actualsheet != pinB_sheet)
            {
               sprintf(s, "EDIT .s%d;\n", pinB_sheet);
               cmd += s;
            }
            sprintf(s, "NET %s (%.3f %.3f)", net_name, u2mil(xB), u2mil(yB) );
            cmd += s;
            sprintf(s, " (%.3f %.3f);\n", u2mil(xB)+50, u2mil(yB)+50 );
            cmd += s;
            sprintf(s, "LABEL (%.3f %.3f)", u2mil(xB), u2mil(yB) );
            cmd += s;
            sprintf(s, " (%.3f %.3f);\n", u2mil(xB)+50, u2mil(yB)+50 );
            cmd += s;
            sprintf(s, "CHANGE LAYER 91 (%.3f %.3f);\n", u2mil(xB)+50, u2mil(yB)+50 );
            cmd += s;
            exit (cmd + g);
         }
      }
      else
      {
         cmd = "";
         if (pinA_sheet == 0) cmd += "Device " + device_a + " Pin " + pin_a + "\n";
         if (pinB_sheet == 0) cmd += "Device " + device_b + " Pin " + pin_b + "\n";
         cmd += "not fond!";
         dlgMessageBox(cmd, "OK");
         exit (-1);
      }
   }

   // run as script converter
   else
   {
      string ulp_path ;
      char bkslash = '/';
      int pos = strrchr(argv[0], bkslash);
      if (pos >= 0) ulp_path = strsub(argv[0], 0, pos + 1);

      // File handling
      int n = 0;
      string text;
      int nBytes;

      if (argv[1]) NetListfileName = argv[1];
      else NetListfileName = dlgFileOpen("Select Script File", "*.*", "*.*");

      if (NetListfileName)
      {
         nLines = fileread(lines, NetListfileName);
         readNetList();
      }
      output(NetListfileName + "x", "wt") printf("%s", cmd);
      exit (cmd);
   }
}

else
{
   dlgMessageBox("Start this ULP from a schematic!", "OK");
   exit (0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -