Eagle ULP

マニュアルのダウンロード先 http://www.cadsoftusa.com/downloads/file/ulp720_en.pdf

サンプルULPはデフォルトのULPフォルダ内の ex- から始まるもの

関数は大文字、小文字を区別するので注意

dlgMessageBoxは最大4つの引数を取り、対応は下記のとおり

スケマティックの部品数を数えるULP

int cnt=0;
/* スケマティックになっているか確認 */
if (schematic) schematic(S) //スケマティックオブジェクトSのインスタンス生成 
  {
    S.parts(P)
      {
        P.instances(E)                                                             
          {
            cnt++;
          }
      }
  }

string result;
sprintf(result, "The parts count is %d", cnt);
dlgMessageBox(result, "+Yes", "No","Maybe");                                               // display the parts count in a dlgMessageBox
exit(0);

デバッグ用にprintfデバックをするには dlgMessageBox と sprintf を使うのが定番

string result,a;
result="";
board(B){
  B.texts(T){
  sprintf(a,"%s,%d\n",T.value,T.size);
  result+=a;
  }
}
dlgMessageBox(result, "+Yes", "No","Maybe");
exit(0); 

boardのElementsを使ってパッケージ(パッドの情報が入っているボード上のパーツ)の色々な要素を読みだす

string result,a;
result="";
board(B){
  B.elements(E){
  sprintf(a,"Elements %s,(%f %f),package=%s\n",E.name,u2mm(E.x),u2mm(E.y),E.package.name);
  result+=a;
  }
}
dlgMessageBox(result, "Yes");
exit(0); 

グループ指定されている部品かどうかは ingroup(オブジェクト) で判定できる

string result,a;
result="";
board(B){
  B.elements(E){
  sprintf(a,"Elements %s,(%f %f),package=%s",E.name,u2mm(E.x),u2mm(E.y),E.package.name);
  result+=a;
  if(ingroup(E)) result+=" <=group";
  result+="\n";
  }
}
dlgMessageBox(result, "Yes");
exit(0); 

boardオブジェクト階層

#usage "&lt;b&gt;Example: Usage of argv&lt;/b&gt;\n"
       "

"
       "Returns the path of the ULP."
       "

"
       "&lt;author&gt;Author: support@cadsoft.de&lt;/author&gt;"
// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED
void main(void) {
   string ulp_path = "";
   char c = '/';
   int pos = strrchr(argv[0], c);
   if (pos &gt;= 0) {
      ulp_path = strsub(argv[0], 0, pos + 1);
   }
   dlgMessageBox(ulp_path , "+OK");
}

ディレクティブは #include , #require , #usage の3つ

#usage・・・コントロールパネルに表示される文字列を指定する

コメント

/* 1行だけのコメント */
/* 複数行の
   コメント
*/

16進数の表し方・・・0xを付ける
エスケープシーケンス
\n 改行 \r キャリッジリターン \t タブ \’ シングルクォート \” ダブルクォート

変数の方
char(1文字) , int(32bit整数) , real(64bit実数) , string(文字列)

オブジェクト
library(L) { … }
schematic(S) { … }
board(B) { … }

データメンバー

board(B) {
  printf("%s\n", B.name);
  }
board(B) {
  printf("%f\n", B.grid.size);
  }

ループメンバー

board(B) {
  B.elements(E) {
    printf("%-8s %-8s\n", E.name, E.value);
    }
  }
board(MyBoard) {
  MyBoard.elements(TheCurrentElement) {
    printf("%-8s %-8s\n", TheCurrentElement.name, TheCurrentElement.value);
    }
  }