Eagleで手動ルーティングと自動ルーティングを組み合わせる。Eagle ULPでの選択的リップアップ


8

Eagleでは、自分でいくつかのワイヤ(電源、xtal、UBSなど)を自分で配線し、残りをオートルーターに任せることがよくあります。結果に満足できない場合は、自分でさらにルーティングし、オートルーターにもう一度試してもらいます。

私の問題は、自分の作業を取り消すことなく、オートルーターの作業を取り消すことです。これを行う基本的な方法は、自動ルーティングバージョンを保存せずに、ボードを再度ロードすることです。しかし、自動ルーティングバージョンの保存(およびバックアップのパージ)を誤った場合でも、自動ルーティング前のバージョンに戻れるようにしたいと考えています。

これを行う1つの試みは、ULP内のすべての自動ルーティングワイヤを識別し、これらのセグメントをRIPUPするコマンド文字列を作成することです。ULPが自動配線されたワイヤを識別するように、たとえば、異なる幅を与えることで、それらを調整できます。しかし、RIPUPコマンドは、選択したワイヤーセグメントと隣接セグメントをリップアップするようです。これまでのところ、選択したワイヤセグメントのみをリッピングするコマンドは見つかりませんでした。

だから私は2つの質問があると思います:-反復(試行錯誤)の方法で手動ルーティングと自動ルーティングをどのように組み合わせますか?-ワイヤセグメントのサブセットをリップアップする方法(おそらくULPとコマンドを使用)はありますか?

(更新)私は反対のアプローチを試しました:ULPで、保持したいすべてのワイヤーセグメントを収集し、完全なリップアップを実行してから、ワイヤーセグメントを復元します(ROUTEコマンドを使用)。成功しません。セグメントはルートコマンドの特定の順序でなければなりません(ULPがセグメントを見つける順序ではありません:()。最初にビアを作成する必要があり、さらにいくつかの問題があります。

GRRRR、これを行う簡単な方法があるに違いない、または私は過度に楽観的ですか?


Eagleのデータファイルが、私がこれまでに使用した古いファイル(たとえば、古いDOS Autotrax)と同じアプローチに従う場合、各トラックセグメントはそれ自体への線を持ちます。トラック幅が一意である場合は、[tm]トラックセグメントを簡単に識別し、関係する行を削除する必要があります。Dimメモリーは、ある段階で、コンポーネントラベルを識別し、コンポーネントボディに対して相対的にサイズ変更、回転、移動するルーチンを作成したことを教えてくれます。トラックの識別は簡単に比較できます。プログラムを実行する前にコピーを保存してください!!! :-)。
ラッセルマクマホン

これは素晴らしい質問です。Eagleelement14.com/community/message/5177のElement14エキスパートにも投稿してください。もしあなたが何かを見つけたら、ここにポストバックしてください!
vicatcu 2011

了解しました。それが失敗した場合、イーグルフォーラムを試すことができます。
Wouter van Ooijen、2011

回答:


4

自分の質問に答えるのは嫌いですが、ここに行きます。解答のポイントがもらえないことを願っています。解答を受け入れるだけで、それは奇妙です。(ちなみに、Element14フォーラムでは応答がありませんでした。)

解決策は、ROUTEではなくDRAWコマンドを使用することです。DRAWは、指定された正確な場所にワイヤーセグメントを配置します(ルーティングされていないエアワイヤーに接続しようとするROUTEとは異なります。ROUTEはスクリプトでは基本的に役に立ちません)。次の問題はviaです。手動のviaと自動配線されたviaを区別できない(またはしたくない)ので、2つ(またはそれ以上)の手動ワイヤセグメントを接続するすべてのviaを保持します。他のビアは削除されます。

つまり、私の最終的なスクリプトは次のとおりです。

prepare a ripup command
for all copper segments that are not 0.01 wide (the width I use for autorouting)
   check both endpoints for a via at that location
      prepare the via to be resurrected when it is visited the 2nd time
   prepare a command that resurrects the copper segment
execute the prepared commands

3層以上では機能せず、銅層のワイヤセグメント以外では機能しないことに注意してください。

イーグルULPとコマンド言語の概念全体が面倒です。ULPは読み取り専用環境で実行されます。ULPが回路、ボード、またはライブラリに影響を与える唯一の方法は、コマンドのリストを作成することです。これにより、いくつかの有用なプログラミング手法が不要になりますが、さらに悪いことに、コマンドがULPから簡単に作成できるように設計されていません。ULPの世界からCMDの世界に変換するには、あらゆる種類の変換(この場合は座標、形状名)が必要です。

(編集)このULPを実行する前に、「ワイヤーベンド」の選択を任意の角度を許可するように設定します。そうしないと、イーグルは復活したワイヤーを許可された角度に適合させようとします。私見これはULP / SCRの問題の別の例です。

これはULPコードです。

// gather the commands that must be run on exit
string RunOnExit = "";
void cmd( string s ) { RunOnExit += s + "\n"; }

// return an x or y position in the form that can be used in a command
real f( int x ){
   board( B ) switch( B.grid.unit ) {
      case 0: return u2mic(x);
      case 1: return u2mm(x);
      case 2: return u2mil(x);
      case 3: return u2inch(x);
   }
}   

// return the string form of the a via's shape
string sn( int x ){
   if( x == VIA_SHAPE_SQUARE )  return "square";
   if( x == VIA_SHAPE_ROUND )   return "round";
   if( x == VIA_SHAPE_OCTAGON   ) return "octagon";
   if( x == VIA_SHAPE_ANNULUS   ) return "annulus";
   if( x == VIA_SHAPE_THERMAL   ) return "thermal";
   return "unknown-via-shape";
}

// count the number of times x occurs in s
int n_ocurrences( string s, string x ){
   int i, n = 0;
   while( 1 ){
      i = strstr( s, x );
      if( i == -1 ) return n;
      s = strsub( s, i + strlen( x ));
      n++;
   }
}

// add a via, but only when it is visited the second time
string via_list = "";
void add_via( int a, int b ){

   // for all via's
   board( B ) B.signals( S ) S.vias( V ){

      // if the via is at the current location
      if(( V.x == a ) && ( V.y == b )){
         string s, coo;

         // the coordinates of the via are used as its identification
         sprintf( coo, "(%.6f %.6f)", f( V.x ), f( V.y ));         

         // if this is the second visit to this via
         via_list += coo;
         if( n_ocurrences( via_list, coo ) == 2 ){

            // resurrect this via
            sprintf( s, "VIA '%s' %f %s %s;", 
            S.name, f( V.drill ), sn( V.shape[ 1 ] ), coo );
            cmd( s );      
         }
      }
   }         
}

if( !board ){
   dlgMessageBox("start this ULP in Board", "OK");
   exit( 0 );
}

board( B ){ 

   // first delete all coper segments, 
   // later we will resurrect what we want to keep 
   cmd( "RIPUP;" );

   // for all wire segments in the top and bottom copper layers
   B.signals(S) S.wires(W) {
      if( ( W.layer == 1 ) || ( W.layer == 16 ) ){ 

         // that are not 0.01 width (that is what the autorouter uses)
         if( f( W.width ) != 0.01 ){
            string s;

            // resurrect via's adjacent to this wire segment
            add_via( W.x1, W.y1 );
            add_via( W.x2, W.y2 );

            sprintf( s, "CHANGE LAYER %d;", W.layer );
            cmd( s );      

            // resurrect this wire segment                 
            sprintf( 
               s, "WIRE '%s' %f (%.6f %.6f) (%.6f %.6f);", 
               S.name, f( W.width),
               f(W.x1), f(W.y1), f(W.x2), f(W.y2));
            cmd( s );   
         }   
      }
   }
   // dlgMessageBox( RunOnExit, "OK");
   exit( RunOnExit );
}

イーグルのULP / SCRは、その最も強力な機能の1つです。あなたが発見したように、ULPはボードにクエリを実行し、スクリプトを作成するために使用されます。それがその力です。私はそれが「通常の」言語、おそらくPythonまたはLuaであることを望みますが、ソフトウェアの作成者が考えなかった何かを実行できることは良い気持ちであることを認めなければなりません。
akohlsmith

もちろん、その力は難解な方法で使用する必要があります。ULPは強力ですが、回路図やボードを変更することはできません。SCRは、GUIの不自由なバリエーションです。一緒に彼らは有用な仕事をすることができますが、物事ははるかに簡単になったかもしれません!そして、私の特定の問題については、オートルーターによって追加されたものがなんらかの形で識別可能であると良かったでしょう。
Wouter van Ooijen 2013

2
EAGLE v6.3では、コマンドはDRAWではなくWIREです(DRAWコマンドはありません)。

2

ウーター。私は先週マスターズにいたので、あなたの質問は先に見ませんでした。

これに対処する方法は、オートルーターを実行する直前にボードのコピーを別の名前で保存することです。私は常にSAVE.BRDという名前を付けています。これは、すべて完了したら安全に削除できます。

私のルーティングワークフローはあなたのワークフローとよく似ているようです。クリティカルパーツを手動でルーティングし、ネットクラスが適切に設定されていることを確認してから、オートルーターを実行します。次に、オートルーターが解決策を見つけることができなかった場所、不便な結果になった場所などの問題を探します。保存されたバージョンに戻って(オートルートの前に)手動でいくつか変更して、オートルーターが取得されないようにします問題が発生した場合は、再試行してください。ボードの複雑さに応じて、これは5〜10回繰り返される場合があります。最初の数回の自動ルートパスは、解決策があるかどうかを確認するためのものであり、おおよそ問題点を見つけるためのものです。そのため、最適化パスを使用しません。後の自動ルートは完全に最適化されています。私にとっては通常、8パスで、必要な特性を得るためにこれらのパスでコストを変更します。

各自動ルーティングパスの前にSAVE.BRDに保存します(そして、元のファイルを再度開いて続行します)が、全体に満足するまで自動ルーティングの結果を保存しないようにします。スナップショットを毎回SAVE.BRDに保存することは、私の指が思いがけないうちに誤って保存してしまった場合の安全バックアップです。

Eagleに最後の自動ルートパスのリップアップオプションがあればいいのですが、そのようなものはありません。


あなたの規律は常に規律のある人のために働くでしょう。あなたは私ではないと推測するかもしれません。自動ルーティングしたら、回路にいくつかの変更を加え、brdを削除して、自動ルーティング前のバージョンに切り替えようとしました。良い考えではありません...自動配線されたトレースを幅で区別できるのであれば、自動配線を解除する方法が多少あります。自動ルーティングされたトレースにそれらを識別するいくつかの属性があればよいでしょう。
Wouter van Ooijen

奇妙なことに、私は投稿の冒頭で「こんにちは、ウーター」と書きましたが、「こんにちは」の部分が削除されたようです。
Olin Lathrop、2011

それがスタック交換の「特徴」だと思います。投稿の冒頭にある「こんにちは」と言うのは不要であり、「クリーン」を保つために削除する必要があります。いくつかのケースで@usernameを削除するのと同様に...同じコメントに@ Olin(スペースなし)と@ usernameを入力できなかったこのケースと同じです。
Kellenjb


1

Eagleのデータファイルが、私がこれまでに使用した古いファイルと同じアプローチに従う場合(たとえば、古いDOS Autotrax)、各トラックセグメントはそれ自体に線を持っています。行は「スタンドアロン」であり、他に影響を与えることなく編集または削除できます。新しい「より良い」システムは、それほど強力な単純さを持っていないかもしれません。

上記のようにトラックが独立している場合、およびトラック幅が一意の場合は、トラックセグメントを簡単に識別し、関係する行を削除する必要があります。

Dimメモリーは、ある段階で、コンポーネントラベルを識別し、コンポーネントボディに対して相対的にサイズ変更、回転、移動するルーチンを記述したことを教えてくれます。トラックの識別は簡単に比較できます。プログラムを実行する前にコピーを保存してください!!! :-)。


どのファイル形式について話しているのですか?イーグル.brdファイルはテキストファイルではありません。トラックセグメントに関する私の問題は、トラックセグメントを識別できないことではありませんが、使用できることを認識している唯一のコマンドが多すぎることを実行します。RIPUPは、セグメントだけでなく(一部の)隣接するセグメントもリッピングします。
Wouter van Ooijen、2011

@Wouter van Ouijen-YMMV :-)。テキストそのものではないということは、ハッキングできないことを意味するわけではありません。Eagle .brdファイルがどのように表示されるかわかりません。また、トラックセグメント全体を切り離して残りを安全に連結できるかどうかはわかりません。おそらくそうではありません。一見の価値があります。不要な部分を除いてファイルをインテリジェントに再構築するファイルリーダーとリライターを作成できる場合があります。それは、ファイル形式がどれだけよく知られているか、または知っているかに依存します。
ラッセルマクマホン

質問を書いている時点では、これは真実だったと思いますが、Eagleのファイル形式は単純なXMLテキストファイルになっています。
akohlsmith
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.