Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03485.jsonl.gz/1058

How to BScript
In diesem Manual wird:
für Input-Code und
für Output-Code verwendet.
BScript ist eine Script-basierte Programmiersprache für CAD Anwendungen. Die Sprache verfügt neben Kontrollstrukturen (“wenn, dann”-Bedingungen, Schleifen, etc.) über rund 300 leistungsfähige Befehle, welche erlauben, geometrische Berechnungen durchzuführen, sowie Abläufe von technischen Prozessen effizient zu programmieren.
BScript verfügt auch über eine Schnittstelle zu Unigraphics (NX), mit der über die User-Functions Operationen ausgeführt und graphische Objekte ausgetauscht werden können.
Die BScript-Software kann entweder als eigenständiges Programm (BScript.Runtime) genutzt werden, oder als AddOn zu NX (BScript.NX). Das BScript.NX ist abhängig von der Version von NX. Zurzeit stehen folgende Versionen zur Verfügung: NX_60, NX_80 und NX_85.
Seit 2016 existiert das BScript Studio von SoftART, welches analog dem Visual Studio von Microsoft aufgebaut ist und ähnlich funktioniert. BScript Prozeduren können so einfacher geschrieben und debugged werden.
Da BScript Projekte bestehend aus mehreren Dateien keinen eindeutig definierten Haupteinstiegspunkt haben (Main Methode), muss der Programm-Stack beim BScirpt Studio explizit mit dem Haupt-Script initialisiert werden. Ein bestehender Ausführungsstack (von möglich vorangehenden unabgeschlossenen Scripts) wird dabei gelöscht. Aus Komfortgründen kann ein Main-Script durch einen Klick auf Main spezifiziert werden. Restart initialisiert dann den Stack und startet die Ausführung.
Wird Run gedrückt und ist der Stack leer, wird das aktuell geöffnete File als Einstiegspunkt auf den Stack gelegt. Die Position des Programmzeigers (kleiner gelber Pfeil) kann mit der rechten Maustaste gesetzt werden, falls die Ausführung pausiert ist. Dies ist sehr praktisch beim Debuggen, da eine Zeile zu Testzwecken oft mehrmals hintereinander ausgeführt werden muss. Break-Points setzt man mit der linken Maustaste, wie in Visual Studio.
Um Code nicht immer wieder zu schreiben, kann dieser in BScript-Prozeduren gespeichert werden. Diese Textfiles mit der Endung .bsp können in einem beliebigen Texteditor verändert werden.
BScript verfügt über Befehle zum Laden dieser Prozeduren, sowie Hilfen zum einfacheren Debuggen. So kann eine Prozedur auch weitere Prozeduren aufrufen und nach deren Ende im eigenen Code weiterfahren.
Mit
ADD F=Prozedurname wird eine Prozedur gestartet und der darin enthaltene Code durchgelaufen. Die bearbeiteten Codezeilen und allfällige Outputs werden im Ausgabefenster des BScript-Windows angezeigt. Hilfreiche Befehle für das Debuggen finden sich im Kapitel "Tipps für einfacheres Debuggen" gegen Ende dieser Seite.
Zusätzlich zu den Prozeduren gibt es die Möglichkeit, Funktionen (BFunctions) aufzurufen. Während bei einem Prozeduraufruf der Workspace und die Symboltabelle gleich bleiben, wird die Funktion in einer neue BScript-Instanz aufgerufen. Somit müssen alle benötigen Variablen und Elemente übergeben werden und alle temporären Elemente werden am Ende der Funktion verworfen.
Zudem können die Funktionen parallelisiert werden. Es können in einem Loop mehrerer Funktionen gestartet werden und anschliessen in einem zweiten Loop auf deren Beendigung gewartet werden. So können rechenintensive Aufgaben etwas beschleunigt werden.
Die genaue Syntax zur Verwendung von Funktionen wird im Kapitel „BFunctions“ detailliert erklärt.
Es gibt 2 Arten von Daten: Variablen und Elemente. Variablen sind Einzelwerte oder Wertegruppen. Elemente können Punktmengen, BSpline-Linien, Flächen etc. sein.
Variablen sind selber definierte Werte (beliebiger Dimension) oder Resultate aus Berechnungen oder Funktionen. Sie müssen immer mit einer Definition initialisiert werden.
Es gibt drei Typen von Variablen: Integer (ganze Zahlen), Real (reelle Zahlen) und Character (Text). Bei der Definition einer Variable muss der Typ (
:I,
:R oder
:C) zwingend angegeben werden. Variablen können jederzeit überschrieben werden und gelten global.
Achtung: Ein Symbol muss immer mit einem Doppelpunkt vor dem Namen gekennzeichnet werden! Zum Ersten bei der Definition (DEF), danach bei jedem Gebrauch (siehe nachfolgende Beispiele).
Beispiel: C Definition von Reellen Zahlen: DEF :R:PLOP=18.09132008 DEF :R:R1=(200*:PI) ! PI ist bereits vordefiniert und kann jederzeit verwendet werden. DEF :R:W1=(360/15) DEF :R:VT=0,-110,0 ! Definition eines 3D-Vektors C Definition eines Integer-Wertes: DEF :I:L1=200 DEF :I:UT=:L1/3 ! Ist das Resultat keine ganze Zahl, wird der abgerundete Integerwert übernommen. C Definition eines Characters: DEF :C:TEXTOUTPUT="'AUFTRAG : '+:L1+' Liter Wein'" C Um einen Realwert mit beliebigen Anzahl Stellen in einen Textstring zu wandeln wird die Funktion #FF verwendet: DEF :C:TX="'Der Radius beträgt ca. '+#FF(:R1,6,2)"
Will man mit Vektoren rechnen, muss man nicht jede Dimension einzeln berechnen, sondern kann die Operation direkt über die mathematischen Operatoren ausführen:
DEF :R:VT=1,4,3
DEF :R:V2=2*:VT
Grundsätzlich kann im BScript jeder Variable-Typ ohne spezielle Notation in einen anderen Typ gewandelt werden:
DEF :R:A1=3.3333
DEF :I:A2=:A1 ! Der Wert wird dann 3
DEF :C:A3=:A1 ! Der Wert wird dann '3.3333'
DEF :C:A4=:A3 ! :A4=:A1
Beim Wandeln von Real in Char wird empfolen, die Funktion #FF zu benutzen, damit die Länge des Textes gesteuert werden kann.
Um den Inhalt von Workspace-Elementes auszulesen, stehen einige WS-Funktionen (#WS..) zur Verfügung. So können z.B. einzelne Punkte eines Elements abgefragt werden (#WSGG) oder Berechnungen ausgeführt werden (z.B. den Mittelwert einer Spalte (#WSAVG)).
Umgekehrt können die Variablen direkt bei der Definition von Elementen benutzt werden.
Beispiel: C 2 Punkte definieren (als Variable): DEF :R:P1=0,0,0 DEF :R:P2=100,100,100 C Definition eines Punkt-Elements mit den beiden Punkten: ESTA ND=GERADE_1 E G=:P1 E G=:P2 EEND C Transformation des Elements mit dem Transformations-Element TT (muss zuerst mit TRASYS erstellt werden) TRAFOR NE=GERADE_1 NT=TT C Zurücklesen der Punkte in Variable: DEF :R:P1_T=#WSGG(GERADE_1,1) DEF :R:P2_T=#WSGG(GERADE_1,2)
Elemente bestehen aus einer Zeile mit der Definition des Elementes (
ESTA), dann beliebig vielen Zeilen mit dem Inhalt des Elementes (beginnend mit (
E G=) und endend mit einer Schlusszeile (
EEND).
Als nächstes eröffnen wir ein Kreis-Geraden-Element (Gebilde aus beliebiger Abfolge von Geradenabschnitten und Kreisbögen). Dabei wird klar, dass nicht jede Zeile innerhalb eines Elementes gleich aufgebaut sein muss. Die Geradenabschnitte brauchen nur X/Y-Koordinaten, während die Kreisbögen zusätzlich einen Radius und Start- oder Endwinkel benötigen:
Beispiel: KGSTA ND=LINIE ICL=1 ! ICL ist eine Option der Linie (dessen Bedeutung siehe Manual) KG X=10 Y=50 KG X=40 Y=70 KG X=70 Y=70 R=12 FIS=180 KG X=90 Y=70 R=12 FIE=0 KG X=150 Y=70 KG X=130 Y=50 R=-20 KG X=85 Y=30 R=10 KG X=35 Y=40 R=-25 KGEND ! Hier schliessen wir das Element
Die folgende Animation zeigt die schrittweise Entstehung des Elementes:
BScript hat diverse Befehle für den Umgang mit Elementen.
Hier eine kleine Auswahl:
TYPE : Das Element wird mit dem Befehl
TYPE ausgelistet (für den zugehörigen Output siehe das Beispiel "Zugriff auf den Workspace" im Kap. "Interner Speicher"). Handelt es sich um ein grosses Element, kann die Ausgabe mit Hilfe von Tags beschränkt werden.
EDIT : Mit diesem Befehl können einzelne Werte oder ganze Gruppen eines Elementes geändert werden.
COPY : Mit
COPY lassen sich bestehende Elemente kopieren.
SET : Mehrere Elemente können zusammen in einem Set gespeichert werden. Dies ist beispielsweise nützlich für den Export von Resultaten in Text- oder Binärfiles oder der Bearbeitung von vielen gleichartigen Elementen mittels einer Schleife.
Siehe hierzu die Beispiele im Kapitel "Beispiele zu Befehle und Funktionen".
Die Verwendung von Befehlen ist in dessen Kapitel, sowie dem Manual genauer beschrieben.
Jede erzeugte Speicherstruktur – Elemente und Variable – wird für die Dauer einer BScript-Session zwischengespeichert. Elemente landen im Workspace, Variable in der Symboltabelle (siehe Bild im Kapitel BScript-Window).
Sämtliche im Workspace und der Variabelliste enthaltenen Elemente und Variabeln können mit dem Befehl
SNAPSHOT,W (write) zusammen als ein File gespeichert werden.
Um diese gespeicherten Files zu lesen wird der Befehl
SNAPSHOT,R (read) verwendet.
Beispiel: !Bemerkung: hier wurden vorgängig schon die Elemente LINE und TEST definiert DIR ! Alle Elemente/Variablen des Workspace-Directory auflisten TYPE NE=TEST ! Inhalt des Workspace-Elements TEST anzeigen
Diese zwei Eingabezeilen bewirken folgende Ausgabe:
DIR Elementname Element Type Group Length # of Groups LINIE BCurve 4 57 TEST BPoints 3 5 Number of objects : 2 TYPE NE=TEST BPoints TEST ------------ Points : Part 1 1 -100.000000 0.000000 0.000000 2 0.000000 100.000000 0.000000 3 100.000000 0.000000 0.000000 4 0.000000 170.000000 0.000000 5 -100.000000 0.000000 0.000000 Number of groups : 5 Number of parts : 1
Beispiel: DEF,P NP=:R1 ! Ausgabe Variable-Inhalt (siehe Befehle) DEF,P NP=:VT DEF,P NP=:TX DEF,D ! Ausgabe Variable-Tabelle (siehe Befehle)
BScript Ausgabe:
DEF,P NP=:R1 R1 628.318530717959 DEF,P NP=:VT Table of Variables : Name Value VT 0 VT(2) -110 VT(3) 0 DEF,P NP=:TX TX Der Radius beträgt ca. 628.32 DEF,D Table of Variables : Name Value $CURRENTPROCEDURE $DEFDIR C:\Program Files\Siemens\NX80\UGII $NOWAIT false $PROGRAM CSharp $VERSION <ip-pii>71 E 2.71828182845905 L1 200 PI 3.14159265358979 R1 628.318530717959 TEXTOUTPUT AUFTRAG : 200 Liter Wein VT 0 VT(2) -110 VT(3) 0 W1 24
Elemente und Sets können mit dem Befehl
SAVE in Text- oder Binärfiles geschrieben werden. Variablen kennen keinen Befehl zur Speicherung, da sie meist relativ einfach rekapituliert werden können. Falls gewisse Variablen trotzdem gespeichert werden sollen, können diese in ein Element geschrieben und so gespeichert werden.
(
ESTA ND=VAR / E G=:VARIABLE / EEND / SAVE,B NE=VAR F=Variable.bin)
Mit
LOAD werden Elemente oder Sets aus Dateien wieder geladen.
Ein einzelner Punkt kann entweder als Symbol (3D Vektor) oder als BPoint-Element mit nur einer Gruppe definiert werden. Wenn mit dem Punkt vor allem Vektorrechnungen gemacht werden, empfiehlt sich die erste Variante, wenn geometrische Berechnungen durchgeführt werden sollen (z.B. Abstand auf Flächen) braucht es die zweite Variante.
Eine Punktmenge definiert eine Gruppe von Punkten, welche einen Zusammenhang haben. Die Anzahl der Punkte ist frei wählbar (es sind auch leere Punktemengen möglich) und darf sich während des Programmablaufs auch ändern.
Es ist auch möglich, Punktmengen mit einer Gruppenlänge (LGRU) grösser als 3 zu definieren. In diesem Fall müssen die ersten 3 Werte x, y, und z definieren und danach können Zusatzinformationen gespeichert werden.
Dieses Element erweitert die Punktmenge durch einen Richtungsvektor für jeden Punkt. Das Element hat somit eine fixe Gruppenlänge von 6 (x,y,z,vx,vy,vz).
Die Ebene im Raum ist definiert durch einen Raumpunkt und den Normalenvektor der Ebene. Um Berechnungen auf der Ebene ausführen zu können, wird zusätzlich noch eine lokale Richtung vx definiert. Die Ausdehnung der Ebene ist unendlich.
Die Ebene wird im Format x, y, z, vnx, vny, vnz, vly, vly, vlz gespeichert.
Zusätzlich gibt es die Möglichkeit, eine begrenzte Ebene als BSpline Fläche mit 4 Gitterpunkten zu definieren (Befehl EBN,B).
BSpline-Elemente
Freiform Elemente im BScript basieren auf der B-Spline-Theorie. Um mit BScript zu arbeiten, muss diese Theorie nicht verstanden werden, für höhere geometrische Berechnungen ist es jedoch nützlich. Wichtig zu wissen ist, dass B-Spline-Elemente immer ein U/V-Gitter besitzen, welches ein lokales (! nichtlineares) Koordinatensystem des Elementes bilden.
BScript kennt zwei unterschiedliche Arten von Kontrollstrukturen: Befehle und Funktionen.
Grob kann man wie folgt unterteilen:
Befehle greifen (mehrheitlich) auf Elemente zu und umfassen geometrische Berechnungen/Transformationen, BScript-Steuerungen, Organisation des Workspace, graphische Outputs und NX-Steuerung. Als Code sieht das folgendermassen aus:
BEFEHL,OPTION TAG1=wert1 TAG2=wert2 ... . Dabei variiert die Anzahl und Notwendigkeit von Optionen und Tags von Befehl zu Befehl und je nach gewünschter Verwendung.
Funktionen greifen (mehrheitlich) auf Variablen zu und umfassen mathematische Berechnungen, Vektorrechnungen (an BSplines), und Zugriff auf den Inhalt von Elementen im Workspace. Als Code sieht das folgendermassen aus:
OUTPUT = #FUNKTION(PARAMETER1,PARAMETER2,...)
Der Aufbau eines Befehls am Beispiel von
ABST (Abstand von Punkten auf Kurve/Fläche):
ABST,B NF=FDS NE=PUN ND=APUN NDUV=UVP
FDS
- Name der Input-Kurve
PUN
- Name des Input-Punktearrays
APUN
- Name des neu generierten Output-Elementes
UVP
- Name der neu generierten Output-UV-Punktmenge
,B
- Option des Befehls. In diesem Fall bewirkt sie, dass Punkte ausserhalb der Boundary der Fläche ignoriert werden.
NF NE ND NDUV
- Tags mittels welchen In- oder Outputs dem Befehl angegeben werden.
Es ist nicht immer zwingend, alle Tags anzugeben. In bestimmten Fällen verlangt eine Option zusätzliche Tags, diese sind dem Manual zu entnehmen. Als Merkhilfe sei erwähnt: NE - Name des Existierenden Elements, ND - Name des zu Definierenden Elements.
Beispiele zur Verwendung von Schleifen und zur Flusskontrolle finden sich im Kapitel "Beispiele zu Befehle und Funktionen".
Der Aufbau einer Funktion am Beispiel von
#BCTANVU (Tangentenvektor einer Kurve bei einem gegebenen U-Wert berechnen):
DEF :R:VT = #BCTANVU(LINIE,0.26)
LINIE
- Name der Input-Fläche
0.26
- U-Wert auf der Kurve
Eine Gruppe der Funktionen erlauben den Zugriff auf den Workspace. So können z.B. auf einzelne Einträge oder Werte in Elementen zugegriffen werden, die Anzahl Einträge eines Elements abgefragt werden oder Extremwerte berechnet werden.
Hier ein Beispiel, bei welchem der Maximalwert aus der zweiten Spalte (=Y-Wert) des Elementes LINE abgefragt wird.
DEF :R:YMAX = #WSMAX(LINE,2)
LINIE
- Name der Input-Kurve
2
- Index der Wertkolonne
Achtung: BScript zählt von 1 aus!
Die Funktionsnamen erscheinen auf den ersten Blick etwas kryptisch. Mit etwas Übung findet sich die benötigte Funktion jedoch schnell, da die einzelnen Buchstaben meist für wichtige Bestandteile der Funktion stehen.
Der Funktionsname
#WSGSNN bedeutet in etwa "from WorkSpace Get from a Set the element-Name of the N'th element".
Alle BScript-Funktionen sind im Manual beschrieben.
Ungeschriebene Gesetze
- BScript-Code wird nur in Grossbuchstaben geschrieben. (Allerdings ist der Script-Analyzer nicht Case Sensitiv)
- Variablen- und Elementnamen sind mindestens 3 Charakter lang. Ausnahmen sind nur innerhalb einer kleinen Schleife verwendete Namen und Laufziffern.
- Laufziffern werden gewöhnlich als
:I, :J, :Kbezeichnet.
- Es lohnt sich, wenn bei Elementen aus dem Namen sichtbar wird, von welcher Art sie sind: z.B. F.. für Flächen, L… für Linien/Kurven, P… für Punktmengen.
Tipps für einen schönen Code
- Jede BScript-Routine sollte Titelzeilen tragen, in denen der Name der Routine, Programmierer, Datum und Projekt vermerkt ist.
- Befehle wie
ADDund
LOADsollen zu Beginn einer Routine aufgerufen werden.
- Innerhalb Schlaufen (DO) empfiehlt es sich die Zeilen mit Blanks einzurücken, damit der Code einfacher lesbar wird. Zudem wird eingerückt nach IF/ELSE, ESTA, KSTA, KGSTA und GSTA. Also bei allen Befehlen, beim welchen eine Art Klammer gebildet wird.
- BScript-Code sollte mittels Überschriften möglichst einfach verständlich gegliedert werden.
- Um den Code mit Kommentaren zu verwenden, verwendet man nach dem Code ein
!, oder auf eigener Zeile ein
C.
C Abschnitt, in dem wir die Kreiselemente berechnen DEF :R:R1=(200*:PI) ! Radius des Kreises
- Da BScript Prozeduren relativ lang werden können, lohnt es sich den Code mit Zwischentiteln aufzugliedern.
C ------------------------------- C EINSTELLUNGEN FÜR SAUGSEITE C -------------------------------
Achtung: Niemals Tabs verwenden!
Achtung: Ein Blank vor einem Kommentar-C erzeugt einen Fehler!
Tipps für einfacheres Debuggen
BScript enhält einige Befehle zum Debuggen:
WAIT,I unterbricht das Abarbeiten der Routine und gibt dem User die Möglichkeit zu überprüfen ob die Berechnung wie gewünscht abläuft. Mit der Eingabe von
ADD,C in der Konsole wird die Berechnung fortgesetzt. Fügt man in der
WAIT-Zeile einen eindeutigen
!-Kommentar an, erkennt man auch einfach, wo im Code man gerade gehalten hat.
Der Befehl
ECHO AUS bzw.
ECHO EIN stoppt bzw. startet die Wiedergabe des abgearbeiteten Codes in der Konsole. Die wiederholte Anzeige von Schlaufen kann so vermieden und die Bearbeitungsgeschwindigkeit gesteigert werden.
Bevor eine Routine erneut aufgerufen wird, sollten die Befehle
DEL,ALL und
UGDEL,ALL ausgeführt werden, um den Workspace bzw. die NX-Anzeige zu leeren.
Tipps für mehr Spass mit BScript
In der Praxis von SoftART hat sich herausgestellt, dass sich der Editor UltraEdit oder Notepad++ am besten eignet für das Programmieren mit BScript. Er bietet nützliche Werkzeuge wie den Block-Edit-Modus, Tastatur-Shortcuts und sprachbasierte Text-Einfärbung.
Falls Sie mit UltraEdit arbeiten können Sie von uns das BScript-Wordfile erhalten, welches Ihren Code nach BScript-Regeln einfärbt und so die Übersicht in Ihren Routinen massgeblich verbessern kann!
BScript Manual
Auf der Homepage von SoftART ist das gesamte BScript-Manual aufrufbar, in welchem alle Befehle und Funktionen beschrieben sind.
Die folgenden Beispiele sind so aufgebaut, dass sie direkt per Copy/Paste ins BScript-Window eingefügt werden können. Dies sind typische Beispiele von Anwendungen, welche häufig vorkommen.
UGPART,C NE=WORK.PRT FILE,D NE=WORK.PRT UGPART,L F=D:\Temp\NX_Start.prt WAIT T=1 UGPART,S F=WORK.PRT UGLAYER N=1
DO REPEAT=:NB :I:I=1 DEF :R:VVAL=(:I-1)/(: NB-1) DEF :C:NAME=”’LINE_’+:I” EXTRA,V NF=EFLA ND=:NAME V=:VVAL SET,A ND=LINESET NE=:NAME DEF :I:I=:I+1 ENDDO
#FF() ! Achtung: Der Dezimalpunkt zählt auch als eine Stelle! Um die Parameter sinnvoll auszufüllen ist es also nützlich, die ungefähre Zahllänge zu kennen. ! #FF rundet ! Gesamtzahl sehr hoch, dann mit #STRTRIM() abschneiden. Oder im Voraus Position des Punktes mit #STRLEN und #LOCATE herausfinden.
WRITE T=“‘PI mit 10 Nachkommastellen ist gleich ‘+#FF(:PI,12,10)“
ESTA ND=TEST1 LGRU=3 ! Zuerst definieren wir drei Elemente. E G=-100,0,50 E G=0,100,20 EEND ESTA ND=TEST2 LGRU=3 E G=100,0,80 E G=0,170,0 E G=-100,0,30 EEND ESTA ND=TEST3 LGRU=3 E G=0,100,-10 E G=50,180,40 E G=100,0,0 E G=0,120,0 EEND SET ND=TESTSET NE=TEST1,TEST2,TEST3 ! Elemente in Set fügen DEF :R:SUMVAL=0 ! Summe initialisieren DEF :I:NSE=#WSNSE(TESTSET) ! Anzahl der Elemente im Set DO REPEAT=:NSE :I:I=1 ! Schleife (:NSE Durchgänge) DEF :C:NAME=#WSGSNN(TESTSET,:I) ! Name des n-ten Elemetes DEF :R:VAL=#WSSUM(:NAME,3) ! 3. Wert der 1. Wertgruppe DEF :R:SUMVAL=:SUMVAL+:VAL ! :VAL zu :SUMVAL addieren DEF :I:I=:I+1 ! Laufvariable hochzählen! ENDDO DEF,P NP=:SUMVAL ! Output Resultat. Hier: 210
DEF :C:KLASSE="undefiniert" IF C=(:SUMVAL>0) ! Definition von :SUMVAL siehe Beispiel zu Schleifen DEF :C:KLASSE="positiv" ELSE DEF :C:KLASSE="negativ" ENDIF DEF,P NP=:KLASSE C Der IF-Block funktioniert, beachtet aber die Möglichkeit :SUMVAL=0 nicht. Dazu werden zwei IF-Blöcke ineinander verschachtelt: DEF :C:KLASSE="undefiniert" IF C=(:SUMVAL>0) ! Definition von :SUMVAL siehe Beispiel zu Schleifen DEF :C:KLASSE="positiv" ELSE IF C=(:SUMVAL=0) DEF :C:KLASSE="null" ELSE DEF :C:KLASSE="negativ" ENDIF ENDIF DEF,P NP=:KLASSE