老外的PCB设计软件,是免费的.可以上网更新.

源代码在线查看: cmd-net-list2sch.ulp

软件大小: 7411 K
上传用户: RR15133422795
关键词: PCB 设计软件 更新
下载地址: 免注册下载 普通下载 VIP

相关代码

				#usage "Import an EAGLE-Net-List into a schematic\n"
				       ""
				       "Usage:"
				       "RUN cmd-net-list2sch [netlist-file ] "
				       "RUN cmd-net-list2sch [net device pin device pin ] "
				       "RUN cmd-net-list2sch : Opens a file dialog to select the Net list file."
				       ""
				       "Example:"
				       "RUN cmd-net-list2sch hexapod.lst"
				       "RUN cmd-net-list2sch IN1 R1 1 C1 2"
				       "RUN cmd-net-list2sch clk ic1 9 ic3 15"
				       "Attention:"
				       ""
				       "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."
				       "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."
				       "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."
				       ""
				       "Author: support@cadsoft.de"
				
				// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED
				
				/* German info
				       "ACHTUNG\n"
				       "Das Einlesen einer Netzliste (Airwire) in den Schaltplan, "
				       "kann in besonderen Situationen zu falschen Verbindungen fuehren.\n"
				       "Werden die Netze als "Luftlinien" zwischen den Bauteilpins gezeichnet, "
				       "so kann es vorkommen, dass eine Netzlinie Bauteilpins ueberlagert. "
				       "Wird spaeter dieser Pin unter der Linie an ein Netz angeschlossen "
				       "so nimmt EAGLE das Netz als Kontaktpunkt und nicht den "
				       "darunterliegenden Pin."
				       "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.\n"
				       "Wird ein Netz auf einer anderen Schaltplanseite weitergefuehrt, "
				       "so wird vom Pin um 50 Mil diagonal weggezeichnet und zusaetzlich "
				       "ein LABEL plaziert.\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 				        do
				        {
				          if (netlistLines[ncnt] )
				          {
				            pin = netlistLines[ncnt];
				            ncnt++;
				          }
				          ncnt++;
				        } while (ncnt 				      }
				
				      else
				      {
				        do
				        {
				          if (netlistLines[ncnt])
				          {
				            dev_b = netlistLines[ncnt];
				            ncnt++;
				            break;
				          }
				          ncnt++;
				        } while (ncnt 				        do
				        {
				          if (netlistLines[ncnt] )
				          {
				            pin_b = netlistLines[ncnt];
				          }
				          ncnt++;
				        } while (ncnt 				      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 				  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);
				}
							

相关资源