Makra w Protelu99SE... to też slang VBA.

Powrót do strony głównej

      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ć*.

( * )
1)zmienić należy nazwę makra

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:

  1. 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).

  2. Napisałem program porównujący dwie dokumentacje bazujące na tym samym PCB (porównanie plików CSV).

  3. Mam wspomniane już makro wspomagające panelowanie.

  4. Stworzyłem skrypt automatyzujący formatowanie wydruków w PCB (to jest skompilowany programik typu exe napisany w VB)*.

Aha... jest wreszcie polska książka o Protelu99SE !
link do wydawnictwa:
http://www.btc.pl/index.php?id=p99se

Powrót do głównej...