TKM-Hの実装に関係して,eagleで作成したPCBデータにある部品座標の一覧が必要となりました.

具体的には,各部品の以下の情報が必要です.

  • 部品名(R1とかC1とか)
  • 中心X座標(mmで)
  • 中心Y座標(mmで)
  • 回転角度(度で)
  • 実装位置とスルーホール部品・面実装部品(部品面に取り付けるスルーホール部品,半田面に取り付けるスルーホール部品,部品面に取り付ける面実装部品,半田面に取り付ける面実装部品)

これらの情報を出力するには,eagleのupl(User Programming Language)を使えばよさそうです.eagleにははじめからいくつかのulpが含まれていますが,上記と全く同じような出力をしてくれるものはありません.無いものは作るしかありませんので,作ってみました.

フルスクラッチで作ることは大変ですし,そもそも私はあまりuplの使い方が分かりません.そこで,mount.uplとmountsmd.uplを参考にしてみました.結果が下のuplです.

if (board) board(B) {

  // Get filename
  string fileName = dlgFileSave("Save File", filesetext(B.name, ".mnt"), "*.mnt");
  if (fileName == "") exit(0);

  output(fileName) {

    B.elements(E) if (E.populate) {

      int xmax =-2147483648,
          xmin = 2147483647,
          ymax = xmax,
          ymin = xmin;
      string mount_layer = "Unknown";

      E.package.contacts(C) {
        if(C.smd){
          if(C.smd.layer == 1) mount_layer = "Top(smd)";
          else mount_layer = "Bottom(smd)";
        }
        else{
          if(E.mirror == 1) mount_layer = "Bottom(Through)";
          else mount_layer = "Top(Through)";
        }
         
        if (C.x > xmax) xmax = C.x;
        if (C.y > ymax) ymax = C.y;
        if (C.x < xmin) xmin = C.x;
        if (C.y < ymin) ymin = C.y;
      }
      printf("%s;%5.8f;%5.8f;%3.0f;%s \n",
             E.name, u2mm((xmin + xmax)/2), u2mm((ymin + ymax)/2),
             E.angle, mount_layer);
    }
  }
}

else {
   dlgMessageBox("\n    Start this ULP in a Board    \n");
   exit (0);
}

 

このuplにより生成されるファイルはセミコロン区切りのテキストファイルになりますので,Excelで編集する場合には,ファイルを開くときにセミコロン区切りにすればよいです.