Makra w Protelu99SE... to też slang VBA.
Client Basic jest implementowany do aplikacji głównej jako któryś z kolei serwer (tak to już jest w tym Protelu99, że są te serwery). Automatyzacja na bazie ClientBasic jest implementowana począwszy od pierwszej 32-bitowej wersji Protela (ver96) do dziś czyli po wersję DXP. Przykłady "fabrycznych" makr są umiejscowione w specjalnym pliku dostarczanym przez producenta oprogramowania (plik ten ładuje się wraz z instalacją). Baza z makrami nazywa "Templates.ddb" [poszukajcie w swoim Protelu w tym katalogu => C:\Program Files\Design Explorer 99 SE\System]. Teraz pracuję nad przetłumaczeniem Helpa dotyczącego makr. Tu jest link do podstronystrony => HELP-Protel-Macros
Udostępniam swoją bazę z kilkoma moimi skryptami, którą można pobrać tutaj => MakraOsobiste.ddb* (należy wybrać makraprotel.zip)
*Ich zadanie to umożliwienie szybkiego przełączania między najważniejszymi grupami warstw czyli między grupą warstw "Topowych" a grupą "Bottomową". Jest tu też bardzo przydatne makro znacznie przyśpieszające wykonywanie panelowania (zwielokrotnianie pojedynczego PCB). Jeżeli zechcesz je sobie zainstalować i nie będziesz wiedział jak, to daj znać pocztą, pomogę Ci je zainstalować, mogę też udostępnić do nich przyciski na pasek [].
Poniżej przedstawiam przykłady makr Protelowskich z opisami (świeżość - 29 czerwca 2003)
Zaczynamy od PCB (Schematic na razie czeka)
Ta formatka powstała za pomocą wbudowanego w Protel - Client Basic |
![]() |
|
| Obok jest listing deklaracji formatu
powyższej formatki* *To nie jest oczywiście kod całego skryptu makra. Kod całego makra jest podany poniżej. |
Begin Dialog DialogWyboru 30, 30,
250, 180, "Uklad
warstw - TOPLAYER" TEXT 50, 4, 150, 8, "Wlacz/wylacz lub zaakceptuj uklad warstw" CHECKBOX 42, 18, 68, 12, "Top", .WartTopLayer CHECKBOX 42, 28, 68, 12, "TopOverlay", .WartTopOverlay CHECKBOX 90, 38, 68, 12, "MultiLayer", .WartMultiLayer CHECKBOX 90, 48, 68, 12, "Mid_1", .WartMid1 CHECKBOX 90, 58, 68, 12, "Mid_2", .WartMid2 CHECKBOX 90, 68, 68, 12, "KeepOut", .WartKeepOut CHECKBOX 140, 18, 68, 12, "Bottom", .WartBottomLayer CHECKBOX 140, 28, 68, 12, "BottomOverlay", .WartBottomOverlay CHECKBOX 90, 78, 68, 12, "Mechanical1", .WartMechanical1 CHECKBOX 90, 88, 68, 12, "Mechanical2", .WartMechanical2 CHECKBOX 90, 98, 68, 12, "Mechanical3", .WartMechanical3 CHECKBOX 90, 108, 68, 12, "Wymiary", .WartMechanical4 CHECKBOX 42, 128, 68, 12, "TopPaste", .WartTopPaste CHECKBOX 42, 138, 68, 12, "TopSolder", .WartTopSolder CHECKBOX 140, 128, 68, 12, "BottomPaste", .WartBottomPaste CHECKBOX 140, 138, 68, 12, "BottomSolder", .WartBottomSolder OKBUTTON 70, 160, 100, 12 End Dialog |
|
| Oto makro, któro konkretnie robi to,
że przełącza warstwy na Top'owe. Podobne makro robi podobnie, tzn. przełącza na wastwy Bottom'owe. żeby sobie zrobić takie makro, trzeba tylko coś minimalnie pozmieniać*. ( * ) 2)zmienić należy też ustawienia domyślne: "Dlg1.WartTop..." 3)reszta kodu - ta sama ! |
Sub WarstwyTOP ' Na początku kodu jest umiejscowiona deklaracja formy (wyglądu) formatki. TEXT 50, 4, 150, 8, "Wlacz/wylacz lub zaakceptuj uklad warstw" CHECKBOX 42, 18, 68, 12, "Top", .WartTopLayer CHECKBOX 42, 28, 68, 12, "TopOverlay", .WartTopOverlay CHECKBOX 90, 38, 68, 12, "MultiLayer", .WartMultiLayer CHECKBOX 90, 48, 68, 12, "Mid_1", .WartMid1 CHECKBOX 90, 58, 68, 12, "Mid_2", .WartMid2 CHECKBOX 90, 68, 68, 12, "KeepOut", .WartKeepOut CHECKBOX 140, 18, 68, 12, "Bottom", .WartBottomLayer CHECKBOX 140, 28, 68, 12, "BottomOverlay", .WartBottomOverlay CHECKBOX 90, 78, 68, 12, "Mechanical1", .WartMechanical1 CHECKBOX 90, 88, 68, 12, "Mechanical2", .WartMechanical2 CHECKBOX 90, 98, 68, 12, "Mechanical3", .WartMechanical3 CHECKBOX 90, 108, 68, 12, "Wymiary", .WartMechanical4 CHECKBOX 42, 128, 68, 12, "TopPaste", .WartTopPaste CHECKBOX 42, 138, 68, 12, "TopSolder", .WartTopSolder CHECKBOX 140, 128, 68, 12, "BottomPaste", .WartBottomPaste CHECKBOX 140, 138, 68, 12, "BottomSolder", .WartBottomSolder OKBUTTON 70, 160, 100, 12 End Dialog Dim warstwa1 As String Dim warstwa2 As String Dim warstwa3 As String Dim warstwa4 As String Dim warstwa5 As String Dim warstwa6 As String Dim warstwa7 As String Dim warstwa8 As String Dim warstwa9 As String Dim warstwa10 As String Dim warstwa11 As String Dim warstwa12 As String Dim warstwa13 As String Dim warstwa14 As String Dim warstwa15 As String Dim warstwa16 As String Dim Dlg1 As DialogWyboru Dlg1.WartTopLayer = 1 ' Wartosc domyslna pola wyboru1 Dlg1.WartTopOverlay = 1 ' Wartosc domyslna pola wyboru2 Dlg1.WartMultiLayer = 1 ' Wartosc domyslna pola ... Dlg1.WartMid1 = 0 Dlg1.WartMid2 = 0 Dlg1.WartKeepOut = 1 Dlg1.WartBottomLayer = 0 Dlg1.WartBottomOverlay = 0 Dlg1.WartMechanical1 = 0 Dlg1.WartMechanical2 = 0 Dlg1.WartMechanical3 = 1 Dlg1.WartTopPaste = 0 Dlg1.WartTopSolder = 0 Dlg1.WartBottomPaste = 0 Dlg1.WartBottomSolder = 0 Dlg1.WartMechanical4 = 0 Dialog Dlg1 'Ostateczne wyswietlenie naszego dialogu (można pominąć) Select Case Dlg1.WartTopLayer Case 1 warstwa1 = "True" Case 0 warstwa1 = "False" End Select Select Case Dlg1.WartTopOverlay Case 1 warstwa5 = "True" Case 0 warstwa5 = "False" End Select Select Case Dlg1.WartMultiLayer Case 1 warstwa15 = "True" Case 0 warstwa15 = "False" End Select Select Case Dlg1.WartMid1 Case 1 warstwa2 = "True" Case 0 warstwa2 = "False" End Select Select Case Dlg1.WartMid2 Case 1 warstwa3 = "True" Case 0 warstwa3 = "False" End Select Select Case Dlg1.WartKeepOut Case 1 warstwa11 = "True" Case 0 warstwa11 = "False" End Select Select Case Dlg1.WartBottomLayer Case 1 warstwa4 = "True" Case 0 warstwa4 = "False" End Select Select Case Dlg1.WartBottomOverlay Case 1 warstwa6 = "True" Case 0 warstwa6 = "False" End Select Select Case Dlg1.WartMechanical1 Case 1 warstwa12 = "True" Case 0 warstwa12 = "False" End Select Select Case Dlg1.WartMechanical2 Case 1 warstwa13 = "True" Case 0 warstwa13 = "False" End Select Select Case Dlg1.WartMechanical3 Case 1 warstwa14 = "True" Case 0 warstwa14 = "False" End Select Select Case Dlg1.WartTopPaste Case 1 warstwa7 = "True" Case 0 warstwa7 = "False" End Select Select Case Dlg1.WartTopSolder Case 1 warstwa9 = "True" Case 0 warstwa9 = "False" End Select Select Case Dlg1.WartBottomPaste Case 1 warstwa8 = "True" Case 0 warstwa8 = "False" End Select Select Case Dlg1.WartBottomSolder Case 1 warstwa10 = "True" Case 0 warstwa10 = "False" End Select Select Case Dlg1.WartMechanical4 Case 1 warstwa16 = "True" Case 0 warstwa16 = "False" End Select Call ResetParameters Call AddStringParameter ("TopSignal" , warstwa1 ) Call AddStringParameter ("Mid1" , warstwa2 ) Call AddStringParameter ("Mid2" , warstwa3 ) Call AddStringParameter ("Mid3" , "True" ) Call AddStringParameter ("Mid4" , "True" ) Call AddStringParameter ("Mid5" , "True" ) Call AddStringParameter ("Mid6" , "True" ) Call AddStringParameter ("Mid7" , "True" ) Call AddStringParameter ("Mid8" , "True" ) Call AddStringParameter ("Mid9" , "True" ) Call AddStringParameter ("Mid10" , "True" ) Call AddStringParameter ("Mid11" , "True" ) Call AddStringParameter ("Mid12" , "True" ) Call AddStringParameter ("Mid13" , "True" ) Call AddStringParameter ("Mid14" , "True" ) Call AddStringParameter ("BottomSignal" , warstwa4 ) Call AddStringParameter ("TopOverlay" , warstwa5 ) Call AddStringParameter ("BottomOverlay" , warstwa6 ) Call AddStringParameter ("TopPaste" , warstwa7 ) Call AddStringParameter ("BottomPaste" , warstwa8 ) Call AddStringParameter ("TopSolder" , warstwa9 ) Call AddStringParameter ("BottomSolder" , warstwa10 ) Call AddStringParameter ("Plane1" , "False" ) Call AddStringParameter ("Plane2" , "False" ) Call AddStringParameter ("Plane3" , "False" ) Call AddStringParameter ("Plane4" , "False" ) Call AddStringParameter ("DrillGuide" , "False" ) Call AddStringParameter ("KeepOut" , warstwa11 ) Call AddStringParameter ("Mechanical1" , warstwa12 ) Call AddStringParameter ("Mechanical2" , warstwa13 ) Call AddStringParameter ("Mechanical3" , warstwa14 ) Call AddStringParameter ("Mechanical4" , warstwa16 ) Call AddStringParameter ("DrillDrawing" , "False" ) Call AddStringParameter ("MultiLayer" , warstwa15 ) Call RunProcess ("Pcb:DocumentPreferences") End Sub |
|
| Automatyzer ten pozwala w każdej
chwili odczytać dokładne koordynaty kursora tzn. współrzędne
względem absolutnego punktu zerowego (lewy dolny róg
desktopu) oraz współrzędne typu offset tzn. względem
punktu (0,0) wyznaczonego komendą Origin\Set. UWAGA: Makro wykorzystuje nowy proces zainstalowany w Design Explorer'rze, który nie jest instalowany standardowo. Taki serwer udostępnia w internecie (jako free) f-ma australijska - Considered Solution. |
'----------------------------------- ' PCB prompt for coordinate example ' Copyright (c) 2001 Considered Solutions '---------------------------------------------------- 'To makro będzie wyznaczać bezwzgledne położenie kursora (tzw. koordynaty PCB) 'na dwa sposoby i wyświetli rezultat we własnym oknie dialogowym. 'Aby to makro uruchomić pomyślnie, 'musi być zainstalowany dodatkowy serwer - ServerExposePCBToMacro '.................................................... Sub Main Dim ChoosenOK As String Dim XString As String Dim YString As String Dim XOffsetString As String Dim YOffsetString As String ResetParameters AddStringParameter "Prompt", "Wprowadz wspolrze do analizy przez CBasic" RunProcess "ExposePCBToMacro:PromptUserForCoordinate" GetStringParameter "OK", ChoosenOK if ChoosenOK = "Yes" then GetStringParameter "X", XString GetStringParameter "Y", YString GetStringParameter "OffsetX", XOffsetString GetStringParameter "OffsetY", YOffsetString Call PokazKoordynatow(XString, YString, XOffsetString, YOffsetString) end if End Sub Sub PokazKoordynatow(X As String, Y As String,Xoff As String, Yoff As String ) ' zdefiniowanie formy Dialogu: Begin Dialog DlgType 100,100,200,80, "Wyznaczanie koordynatow wzgl. i bzwzgl." Text 5, 13, 110, 10, "wspolrzedna bezwzgledna X:" TextBox 100, 12, 60, 12, .X Text 5, 28, 110, 10, "wspolrzedna bezwzgledna Y:" TextBox 100, 27, 60, 12, .Y Text 25, 43, 90, 8, "Offset X (usersOrigin):" TextBox 100, 42, 60, 10, .XOffset Text 25, 58, 90, 8, "Offset Y (usersOrigin):" TextBox 100, 57, 60, 10, .YOffset OKButton 170, 12, 20, 12 End Dialog Dim DlgBox As DlgType DlgBox.X = X DlgBox.Y = Y DlgBox.XOffset = Xoff DlgBox.YOffset = Yoff Dialog DlgBox 'ostateczne wyswietlenie przygotowanego wczesniej dialogu End Sub |
|
| Automatyzer
ten pozwala w przyśpieszyć wykonanie zdublowania
gotowej płytki, która ma być wydrukowana na jednym
arkuszu w wielu egzemplarzach. Dublując wykonany wcześniej dubel można bardzo szybko zwielokratniać liczbę kopii. |
'------------------------------------------------------------------- 'Makro Panelowanie wymyślił i po raz pierwszy zastosował Adam Grążka 'w miesiącu kwietniu roku 2003. 'Adres email do autora - adamgra@poczta.onet.pl 'To makro pomaga przyspieszyc zwielokrotnianie gotowych PCB 'Najlepiej jezeli jest wywolywane dedykowanym przyciskiem z paska narzedz. '.................................................................. Sub Panelowanie () Call ResetParameters Call AddStringParameter ("Scope=All") Call RunProcess ("PCB:Select") Call ResetParameters Call AddStringParameter ("Object=Relative") Call RunProcess ("PCB:Jump") Call RunProcess ("PCB:Copy") Call RunProcess ("PCB:Paste") End Sub |
|
| Jak wstawiać przyciski (uruchamiające nasze makra) na pasek narzędziowy Protela oraz kody następnych makr - o tym w następnym odcinku. Hej (30cze2003) | Sub Beeee Beep MsgBox "Zadzialalem" End Sub 'jak wam to makierko nie zadziała...?! 'CZEKAM NA WASZE MAKRA ! ! |
Pracuję nad przetłumaczeniem części helpa dotyczącej Client Basica (oto początek prac). Jeżeli ktoś chce koniecznie już teraz coś wiedzieć na ten temat, to proponuję kontakt pocztowy. (...a moze już ktoś porządnie to przetłumaczył?)
Jeżeli ktoś ma jakiś
problem, który by chciał zautomatyzować w Protelu (najlepiej w
PCB lub SCH), to proszę dać znać.
Gdyby ktoś chciał napisać jakąś pracę (np. dyplomową) na
temat automatyzacji Protela to chętnie udzielę korepetycji (mieszkam
w Rzeszowie).
Już rozwiązałem pewne problemy:
Napisałem makra, które meldują oddzielnymi BOM'ami jakie komponenty są na TOPie a jakie na BOTTOMie (Protel udostępnia swoje BOMy tylko z listami zbiorczymi, czyli z Top i Bottom razem - ciężko się wtedy obkłada płytki).
Napisałem program porównujący dwie dokumentacje bazujące na tym samym PCB (porównanie plików CSV).
Mam wspomniane już makro wspomagające panelowanie.
Stworzyłem skrypt automatyzujący formatowanie wydruków w PCB (to jest skompilowany programik typu exe napisany w VB)*.
link do wydawnictwa: http://www.btc.pl/index.php?id=p99se