Kết hợp định tuyến tay và định tuyến tự động trong Eagle; ripup chọn lọc trong Eagle ULP


8

Trong Eagle, tôi thường thích tự định tuyến một số dây (power, xtal, UBS, v.v.) và để phần còn lại vào autorouter. Khi tôi không hài lòng với kết quả, tôi tự định tuyến thêm một chút và để cho autorouter thử lại lần nữa.

Vấn đề của tôi là hoàn tác công việc của autorouter, mà không hoàn tác công việc của riêng tôi. Cách cơ bản để làm điều này chỉ đơn giản là không lưu phiên bản tự động, và sau đó tải lại bảng. Nhưng một khi tôi mắc lỗi lưu phiên bản tự động (và xóa các bản sao lưu), tôi vẫn muốn có thể quay lại phiên bản đã được tự động trước.

Một nỗ lực để làm điều này là xác định tất cả các dây tự động trong một ULP và tạo chuỗi lệnh để RIPUP các phân đoạn này. Tôi có thể sắp xếp cho ULP để xác định các dây tự động, ví dụ bằng cách cho chúng có chiều rộng khác nhau. Nhưng lệnh RIPUP dường như tách ra đoạn dây đã chọn VÀ QUẢNG CÁO ĐIỀU CHỈNH. Cho đến nay tôi không tìm thấy một lệnh nào chỉ trích đoạn dây được chọn.

Vì vậy, tôi đoán tôi có hai câu hỏi: - Làm thế nào để bạn kết hợp định tuyến tay và tự động định tuyến theo cách lặp (thử và sai)? - Có cách nào (có thể sử dụng ULP và các lệnh) để trích xuất một tập hợp con của các đoạn dây không?

(cập nhật) Tôi đã thử cách tiếp cận ngược lại: trong một ULP, thu thập tất cả các phân đoạn dây tôi muốn giữ, thực hiện ripup đầy đủ và sau đó khôi phục các phân đoạn dây (sử dụng lệnh ROUTE). Không thành công, các phân đoạn phải theo thứ tự cụ thể cho các lệnh tuyến đường (không phải thứ tự mà ULP tìm thấy chúng :(), việc thông qua phải được thực hiện trước và một số vấn đề khác.

GRRRR, phải có một cách dễ dàng để làm điều này, hay tôi quá lạc quan?


Nếu tệp dữ liệu của Eagle tuân theo cách tiếp cận tương tự như tệp cũ mà tôi đã chơi (ví dụ: ye olde DOS Autotrax) thì mỗi phân đoạn theo dõi có một dòng riêng. Nếu độ rộng của bản nhạc là duy nhất, [tm] sẽ dễ dàng xác định các phân đoạn theo dõi và xóa các dòng liên quan. Bộ nhớ Dim cho tôi biết rằng ở một giai đoạn tôi đã viết một thói quen để xác định nhãn thành phần và thay đổi kích thước, xoay và di chuyển chúng so với thân thành phần. Theo dõi âm thanh dễ dàng so sánh. Lưu một bản sao trước khi chạy chương trình !!! :-).
Russell McMahon

đây là một câu hỏi tuyệt vời, tôi có thể đề nghị bạn cũng gửi nó đến các chuyên gia Element14 trên Eagle element14.com/community/message/5177 . Nếu bạn làm và bạn tìm thấy bất cứ điều gì xin vui lòng gửi trở lại đây!
Abbeyatcu

OK xong. Nếu thất bại tôi có thể thử các diễn đàn đại bàng.
Wouter van Ooijen

Câu trả lời:


4

Tôi ghét trả lời câu hỏi của riêng tôi, nhưng ở đây tôi đi. Tôi hy vọng tôi không nhận được điểm để trả lời, điều đó thật kỳ lạ, chỉ khi chấp nhận một câu trả lời? (BTW, tôi không nhận được bất kỳ phản hồi nào trên diễn đàn Element14.)

Giải pháp là sử dụng lệnh DRAW, không phải ROUTE. DRAW sẽ đặt một phân đoạn dây, chính xác là nơi bạn chỉ định (không giống như ROUTE, nơi cố gắng kết nối với một dây dẫn không có giới hạn. ROUTE về cơ bản là vô dụng trong một tập lệnh.). Vấn đề tiếp theo là thông qua: Tôi không thể (hoặc không muốn) phân biệt giữa hướng dẫn qua và tự động chạy qua, vì vậy tôi giữ tất cả thông qua kết nối hai (hoặc nhiều) đoạn dây thủ công. Thông qua khác được xóa.

Vì vậy, những gì kịch bản cuối cùng của tôi làm là:

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

Lưu ý rằng nó có thể sẽ không hoạt động nhiều hơn hai lớp, cũng như cho những thứ khác ngoài các đoạn dây ở lớp đồng.

IMHO toàn bộ khái niệm về đại bàng ULP và ngôn ngữ chỉ huy là rắc rối. Một ULP chạy trong môi trường chỉ đọc, cách duy nhất nó có thể ảnh hưởng đến mạch, bảng hoặc thư viện là bằng cách tạo một danh sách các lệnh. Điều này giúp loại bỏ một số kỹ thuật lập trình hữu ích, nhưng tệ hơn là các lệnh không được thiết kế để dễ dàng tạo ra từ một ULP. Bạn cần tất cả các loại biến đổi (trong trường hợp này: tọa độ, tên hình dạng) để dịch từ thế giới ULP sang thế giới CMD.

(chỉnh sửa) Trước khi bạn chạy ULP này, hãy đặt lựa chọn 'uốn cong dây' để cho phép các góc tùy ý, nếu không, đại bàng sẽ cố gắng điều chỉnh các dây được phục hồi thành các góc cho phép, điều này có thể dẫn đến tình trạng lộn xộn đẫm máu. IMHO đây là một ví dụ khác về vấn đề với ULP / SCR.

Đây là mã 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 );
}

Eagle's ULP / SCR là một trong những tính năng mạnh mẽ nhất của nó. Như bạn đã tìm thấy, các ULP được sử dụng để truy vấn bảng và viết các tập lệnh hoàn toàn có thể là bất cứ điều gì bạn có thể tự làm. Đó là sức mạnh của nó. Đã nói rằng tôi ước rằng nó ở ngôn ngữ 'bình thường', có thể là Python hoặc thậm chí là Lua, nhưng ngay cả bạn cũng phải thừa nhận rằng có thể làm điều gì đó mà các tác giả của phần mềm không nghĩ đến là một cảm giác tốt.
akohlsmith

Chắc chắn, nhưng sức mạnh của chúng phải được sử dụng theo cách phức tạp: Các ULP rất mạnh, nhưng không thể thay đổi sơ đồ / bord, SCR là một biến thể bị tê liệt của GUI. Cùng nhau họ có thể làm công việc hữu ích, nhưng mọi thứ có thể đã được thực hiện dễ dàng hơn nhiều! Và đối với vấn đề cụ thể của tôi, thật tuyệt nếu những thứ được thêm vào bởi autorouter bằng cách nào đó có thể nhận dạng được.
Wouter van Ooijen

2
Trong EAGLE v6.3, lệnh là WIRE chứ không phải DRAW (không có lệnh DRAW).

2

Đồ trang sức. Tôi đã không nhìn thấy câu hỏi của bạn sớm hơn bởi vì tôi đã ở Masters tuần trước.

Cách tôi đối phó với điều này là lưu một bản sao của bảng vào một tên khác ngay trước khi chạy autorouter. Tôi luôn đặt tên nó là SAVE.BRD, có thể xóa một cách an toàn sau khi hoàn tất.

Quy trình định tuyến của tôi dường như rất giống với bạn. Tôi định tuyến các phần quan trọng bằng tay, đảm bảo các lớp net được thiết lập hợp lý, sau đó chạy autorouter. Sau đó, tôi tìm kiếm các vấn đề như nơi autorouter không thể tìm ra giải pháp, cuối cùng nó đã làm điều gì đó bất tiện, v.v. Tôi quay lại phiên bản đã lưu (trước khi tự động định tuyến) thực hiện một vài thay đổi thủ công để hy vọng rằng autorouter sẽ không nhận được gặp rắc rối, sau đó thử lại. Điều này có thể được lặp lại 5-10 lần, tùy thuộc vào độ phức tạp của bảng. Một vài lần vượt tuyến đầu tiên chủ yếu là để xem liệu có giải pháp hay không và tìm ra các điểm rắc rối. Cho rằng tôi thậm chí không sử dụng bất kỳ vượt qua tối ưu hóa. Các autorout sau này được tối ưu hóa hoàn toàn, mà đối với tôi thường là 8 lượt với chi phí thay đổi so với các lượt đó để có được các đặc điểm tôi muốn.

Mặc dù tôi lưu vào SAVE.BRD trước mỗi lần vượt tuyến tự động (và sau đó mở lại tệp gốc để tiếp tục với điều đó), tôi cố gắng không lưu kết quả tự động cho đến khi tôi hài lòng với toàn bộ. Lưu ảnh chụp nhanh vào SAVE.BRD mỗi lần là một bản sao lưu an toàn trong trường hợp ngón tay của tôi vô tình thực hiện lưu trước khi tôi nghĩ về nó.

Sẽ thật tuyệt nếu Eagle có tùy chọn ripup cho lần vượt tuyến cuối cùng, nhưng không có điều đó.


Bạn kỷ luật sẽ làm việc cho một người luôn luôn kỷ luật. Bạn có thể đoán rằng tôi không phải. Khi tôi đã tự động chạy, sau đó thực hiện một số thay đổi đối với mạch, sau đó xóa brd và cố gắng chuyển về phiên bản tiền tự động. Không phải là một ý tưởng hay ... Vì vậy, bây giờ tôi ít nhiều có một cách để tự động định tuyến, với điều kiện tôi có thể phân biệt các dấu vết tự động theo chiều rộng. Sẽ thật tuyệt nếu dấu vết tự động có một số thuộc tính xác định chúng là như vậy.
Wouter van Ooijen

Thật kỳ lạ, tôi đã viết "Hi, Wouter" ở đầu bài viết của mình, nhưng phần "Hi", dường như đã bị tước bỏ.
Olin Lathrop

Tôi tin rằng đó là một "tính năng" mà trao đổi ngăn xếp có. Họ nghĩ rằng nói "Hi" ở đầu bài là không cần thiết và nên được gỡ bỏ để giữ cho mọi thứ "sạch sẽ". Tương tự như họ tước bỏ @username trong một số trường hợp ... và giống như trường hợp này khi tôi không thể gõ @ Olin (không có khoảng trắng) và tên người dùng @ trong cùng một nhận xét.
Kellenjb


1

Nếu tệp dữ liệu của Eagle tuân theo cách tiếp cận tương tự như tệp cũ mà tôi đã chơi (ví dụ: ye olde DOS Autotrax) thì mỗi phân đoạn theo dõi có một dòng riêng. Các dòng là "độc lập" và có thể được chỉnh sửa hoặc xóa mà không ảnh hưởng đến bất cứ điều gì khác. Các hệ thống "tốt hơn" mới hơn có thể không có sự đơn giản mạnh mẽ như vậy.

Nếu các bản nhạc là độc lập, như trên và nếu độ rộng của bản nhạc là duy nhất thì [tm] sẽ dễ dàng xác định các phân đoạn bản nhạc và xóa các dòng liên quan.

Bộ nhớ Dim cho tôi biết rằng ở một giai đoạn tôi đã viết một thói quen để xác định nhãn thành phần và thay đổi kích thước, xoay và di chuyển chúng so với thân thành phần. Theo dõi âm thanh dễ dàng so sánh. Lưu một bản sao trước khi chạy chương trình !!! :-).


Bạn đang nói về định dạng tập tin nào? Tệp .brd đại bàng không phải là tệp văn bản. Vấn đề của tôi với các phân đoạn theo dõi không phải là tôi không thể xác định được chúng, mà là lệnh duy nhất tôi biết rằng tôi có thể sử dụng sẽ làm quá nhiều: RIPUP không chỉ phân khúc mà cả (một số) phân đoạn liền kề.
Wouter van Ooijen

@Wouter van Ouijen - YMMV :-). Không phải là văn bản mỗi lần không có nghĩa là nó không thể bị hack - nhưng nó có thể. Tôi không biết tệp Eagle .brd trông như thế nào bên trong và tôi không biết liệu bạn có thể xé toàn bộ các phân đoạn theo dõi và nối phần còn lại một cách an toàn hay không - có lẽ là không. Đáng xem Bạn có thể viết một trình đọc và viết lại tập tin một cách thông minh để xây dựng lại tập tin ít hơn những phần không mong muốn. Nó sẽ phụ thuộc vào mức độ nổi tiếng hoặc có thể biết của định dạng tệp.
Russell McMahon

Tôi nhận ra rằng tại thời điểm viết câu hỏi này là đúng, nhưng các định dạng tệp của Eagle bây giờ là các tệp văn bản XML đơn giản.
akohlsmith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.