Autor
|
Thema: Case Verzweigung (1819 mal gelesen)
|
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 23. Jul. 2009 07:43 <-- editieren / zitieren --> Unities abgeben:
Hallo, mein kleines Problem ist zwar wahrscheinlich auch mit der Hilfe von anderen Forum-Einträgen zu lösen, da die Suchmaschine aber immer noch offline ist, hoffe ich, dass mir so auch schnell geholfen wird. Hab einen Parameter (Typ Boolean) in meinem Part erstellt und will jetzt mit nem Makro ne Case-Verzweigung abfragen, das funktioniert aber nicht so wie ich es will. Die Abfrage springt immer in die CaseElse-Anweisung, egal wie ich den Parameter einstelle, bzw. was ich ins Makro schreibe. Ok, das stimmt nicht ganz, in manchen Fällen kommt auch ne Fehlermeldung. Hier ist mal mein Code (in einer Variante ohne Fehlermeldung): --------------------- Sub CATMain() Set Parameter = CATIA.ActiveDocument.Part.Parameters Set Para1 = Parameter.item ("DIN 6935") Var4 = Para1.Value Select Case Var4 Case Var4 = true MsgBox (Var4) Case Else MsgBox ("blöd") End Select End Sub --------------------- Gruß Betty
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 23. Jul. 2009 08:33 <-- editieren / zitieren --> Unities abgeben: Nur für BettinaRauch
Servus Müsste es nicht: Code:
Sub CATMain() Set Parameter = CATIA.ActiveDocument.Part.Parameters Set Para1 = Parameter.item ("DIN 6935") Var4 = Para1.ValueSelect Case Var4 Case True MsgBox (Var4) Case Else MsgBox ("blöd") End Select End Sub
heißen?Gruß Bernd PS: Mit Google funktioniert die Suche immer noch zB "case catia site:cad.de" oder allgmein nur nach "VB case" ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 23. Jul. 2009 09:01 <-- editieren / zitieren --> Unities abgeben:
Danke für deine Antwort. Leider funktioniert es immer noch nicht. Hab inzwischen auch mal bei "google" gesucht... kein Erfolg! Hab jetzt ne Vermutung: Kann es sein, dass man keinen Parameter mit dem Typ Boolean in ner Case-Anweisung abfragen kann? Denn wenn ich einen anderen Parametertyp (length) abfrage, dann bekomm ich die Case-Verzweigung einwandfrei hin, bzw. wenn ich meinen Code wie folgt schreibe, dann kommt gar keine Ausgabe mehr. --------------------- Sub CATMain() Set Parameter = CATIA.ActiveDocument.Part.Parameters Set Para1 = Parameter.item ("DIN 6935") Var4 = Para1.Value Select Case Var4 Case true MsgBox (Var4) Case false MsgBox ("blöd") End Select End Sub ---------------------
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 23. Jul. 2009 09:33 <-- editieren / zitieren -->
Hallo Bettina, für die Fehlersuche oft hilfreich ist den Wert der Variablen zu überprüfen. Da ein Debugger in CATIA fehlt, ist die Msgbox ein gutes Mittel Was enthält Var4 ? Sub CATMain() Set Parameter = CATIA.ActiveDocument.Part.Parameters Set Para1 = Parameter.item ("DIN 6935") Var4 = Para1.Value MsgBox (Var4) Select Case Var4 Case true MsgBox (Var4) Case false MsgBox ("blöd") End Select End Sub Gruß Martin ------------------ mb |
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 23. Jul. 2009 09:39 <-- editieren / zitieren --> Unities abgeben:
Hallo, Danke, dass ihr euch mit meinem Problem beschäftigt. Leider hab ich den Anstoss von Martin auch schon probiert und bin dadurch zu keinem Ergebnis gekommen. Bei einer Überprüfung des Wertes kommt: 'wahr' heraus. Hab deswegen auch versucht, den Code mit wahr/unwahr, "wahr"/"unwahr", "true"/"false" zum Laufen zu bekommen -> funktioniert aber alles nicht. Langsam am verzweifeln, denn: das ist bestimmt total banal! Viele Grüße Betty Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 23. Jul. 2009 09:56 <-- editieren / zitieren -->
was kommt so raus ? Sub CATMain() Set Parameter = CATIA.ActiveDocument.Part.Parameters Set Para1 = Parameter.item ("DIN 6935") Var4 = Para1.Value MsgBox (Var4) If Var4 Then MsgBox "wahr " & Var4 Else MsgBox "blöd" & Var4 End If End Sub Gruß Martin
------------------ mb |
BigCheese Mitglied Dipl-Ing
Beiträge: 130 Registriert: 12.05.2004 CATIA V5R19 SP3
|
erstellt am: 23. Jul. 2009 10:02 <-- editieren / zitieren --> Unities abgeben: Nur für BettinaRauch
Guten Morgen Betty, es ist in der Tat recht banal... Code: Case "True"
sollte es tun. Einfach die Abfrage in Anführungszeichen setzen. Ich schätze, dass der Rückgabewert des Parameters einfach als String zu behandeln ist. Grüße, Alex Mist, zu langsam
[Diese Nachricht wurde von BigCheese am 23. Jul. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 23. Jul. 2009 10:27 <-- editieren / zitieren --> Unities abgeben:
@ BigCheese: Danke auch für deine Antwort. Leider hab ich das probiert und es funktioniert nicht (siehe weiter oben) @ marbat: Also die If-verzweigung funktioniert, auch wenn ich nicht ganz verstehe warum. In der If-Abfrage steht doch nur 'Wenn Var4 Dann' ... woher weiß der jetzt, ob er auf wahr oder falsch prüfen soll? (Wär allein für mein Verständnis hilfreich. Ich hätte nämlich wieder 'If Var4 = true Then' oder Ähnliches probiert. Das funktioniert aber natürlich wieder nicht... und ich dachte, dass ich die If-Verzweigungen verstanden hätte.) Da deine If-Verzweigung aber funktioniert, hab ich versucht, das auf das Case anzuwenden: Select Case Var4 Case Var4 MsgBox ("gut") Case Else MsgBox ("blöd") End Select In dem Fall wird aber immer nur "gut" angezeigt, egal ob der Parameter auf 'true' oder 'false' eingestellt ist. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 23. Jul. 2009 10:59 <-- editieren / zitieren -->
If Var4 ist gleichbedeutend wie If Var4=True die Werte für Boolean-Variabeln sind True=-1 und False=0 probier mal das aus Select Case Var4 case -1 MsgBox "wahr " & Var4 case 0 MsgBox "falsch " & Var4 End Select vermutlich hat @BigChees recht und Var4 ist ein String wenn das so ist, versuch einmal nach Var4 = Para1.Value Var4=Ucase(Var4) und prüfe dann auf WAHR oder FALSCH ------------------ mb [Diese Nachricht wurde von marbat am 23. Jul. 2009 editiert.] |
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 23. Jul. 2009 11:23 <-- editieren / zitieren --> Unities abgeben:
Ha! Ist also doch banal, zumindest wenn man es weiß (wie immer). Das mit den Werten für die Boolean-Variablen funktioniert, zumindest wenn man für True = 1 setzt. Wenn man das Ganze mit Upcase versucht kommt ne Fehlermeldung: "Typen unverträglich 'Upcase'" So, ich hoffe, dass das vielleicht auch noch ein paar anderen Leuten hilft. Danke an alle, die was gepostet haben und marbat bekommt natürlich ein paar Unities für die Lösung und das Durchhalten bei so nem "banalen" Problem Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BigCheese Mitglied Dipl-Ing
Beiträge: 130 Registriert: 12.05.2004 CATIA V5R19 SP3
|
erstellt am: 23. Jul. 2009 11:33 <-- editieren / zitieren --> Unities abgeben: Nur für BettinaRauch
Nochmals hallo, ich habe mir die Sache nun nochmals angeschaut und stelle fest, dass CATIA mich immer wieder überraschen kann... Anscheinend macht es auch noch einen Unterschied, ob Du mit VBA oder catvbs programmierst. Mit VBA würde es so funktionieren, wie ich es oben beschrieben habe. In catvbs habe ich es wie folgt zum Laufen bekommen: Code: Sub CATMain() Set Parameter = CATIA.ActiveDocument.Part.Parameters Set Para1 = Parameter.Item("DIN 6935") Var4 = Para1.Value MsgBox Var4 Select Case Var4 Case "Wahr" MsgBox (Var4) Case "Falsch" MsgBox ("blöd") End Select End Sub
Man beachte dabei unbedingt die Groß/Kleinschreibung: "wahr" <> "Wahr".... catvbs holt sich den Zustand wohl in deutsch... Meiner Meinung nach ist für die Abfrage einer booleschen Variablen eine Select-Case Anweisung etwas übertrieben. Ich würde da eher zur vorgeschlagenen If-Then-Abfrage tendieren. Grüße, Alex
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 23. Jul. 2009 11:41 <-- editieren / zitieren --> Unities abgeben:
Ach ne... Groß- und Kleinschreibung! Also jetzt funktioniert es bei mir auch. Da hätte ich ja auch echt selber drauf kommen können... Ich mach nicht nur so ne einfache Abfrage... da kommt schon noch mehr rein. Es ist aber halt schon an dem kleinen Problem gescheitert. Danke. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
V5Playaz Mitglied Dipl.-Ing (BA)
Beiträge: 447 Registriert: 12.07.2005 DELL PRECISION 390 3,25 GB RAM WIN XP PRO SP2 CATIA V5 R16-19 Delmia V5 R19 VB6, VB2008 Adobe Acrobat 9 Pro Extended
|
erstellt am: 23. Jul. 2009 13:37 <-- editieren / zitieren --> Unities abgeben: Nur für BettinaRauch
Ich glaube was Alex meint, ist dass es bei einer boolean-Variable sowieso immer nur 2 Werte gibt und das mit einer IF-Abfrage problemlos gelöst werden kann, egal wie umfangreich dein zusätzlicher Code ist. Select Case Abfragen werden eher für Funktionen eingesetzt, in denen eine Variable (viel) mehr Werte annehmen kann. Grüße Dominik Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 23. Jul. 2009 13:45 <-- editieren / zitieren --> Unities abgeben:
Ja, aber wenn ich zum Beispiel zwei Boolean-Werte mit einer And-Anweisung koppel, dann hab ich doch schon vier verschiedene Abfragen: Wahr-Wahr Wahr-Falsch Falsch-Wahr Falsch-Falsch Oder ist es dann mit einer If-Anweisung immer noch einfacher? Dann müsste ich doch ne verschachtelte If-Anweisung basteln, oder? Noch ne andere Frage: Wenn ich mit case 'größer als' oder 'kleiner als' abfragen will, wie macht man das? Hab es mit 'Case Is > 2', 'Case >2', 'Case Is >"2"', 'Case >"2" ', ... probiert. Heute ist echt so n Tag, da funktioniert noch nicht so viel... will nach Hause... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
V5Playaz Mitglied Dipl.-Ing (BA)
Beiträge: 447 Registriert: 12.07.2005 DELL PRECISION 390 3,25 GB RAM WIN XP PRO SP2 CATIA V5 R16-19 Delmia V5 R19 VB6, VB2008 Adobe Acrobat 9 Pro Extended
|
erstellt am: 23. Jul. 2009 14:16 <-- editieren / zitieren --> Unities abgeben: Nur für BettinaRauch
|
Ex-Mitglied
|
erstellt am: 23. Jul. 2009 14:22 <-- editieren / zitieren -->
Hallo Bettina, hier ein Auszug aus http://msdn.microsoft.com/de-de/library/2f43da0y(VS.80).aspx Visual Basic-Sprachreferenz Select...Case-Anweisung (Visual Basic) Führt je nach dem Wert eines Ausdrucks eine von mehreren Anweisungsgruppen aus. Select [ Case ] testexpression [ Case expressionlist [ statements ] ] [ Case Else [ elsestatements ] ] End Select Bestandteile testexpression Erforderlich. Ausdruck. Muss einem der elementaren Datentypen entsprechen (Boolean, Byte, Char, Date, Double, Decimal, Integer, Long, Object, SByte, Short, Single, String, UInteger, ULong oder UShort). expressionlist In einer Case-Anweisung erforderlich. Eine Liste von Ausdrucksklauseln, die Vergleichswerte für testexpression darstellen. Mehrere Ausdrucksklauseln werden durch Komma voneinander getrennt. Eine Klausel kann folgendermaßen strukturiert sein: expression1 To expression2 [ Is ] comparisonoperator expression expression Mit dem To-Schlüsselwort geben Sie die Begrenzungen eines Bereichs von Vergleichswerten für testexpression an. Der Wert von expression1 muss kleiner oder gleich dem Wert von expression2 sein. Verwenden Sie das Is-Schlüsselwort mit einem Vergleichsoperator (=, <>, <, <=, > oder >=) um eine Einschränkung der Vergleichswerte für testexpression anzugeben. Wenn das Is-Schlüsselwort nicht angegeben wird, wird es automatisch vor comparisonoperator eingefügt. Die Variante, nur expression anzugeben, wird als Sonderfall der Is-Variante behandelt, bei dem comparisonoperator das Gleichheitszeichen (=) ist. Diese Variante wird als testexpression = expression ausgewertet. Die Ausdrücke in expressionlist können einen beliebigen Datentyp aufweisen, vorausgesetzt, sie können implizit in den Datentyp von testexpression konvertiert werden, und der entsprechende comparisonoperator ist für die beiden verwendeten Datentypen gültig. statements Optional. Eine oder mehrere Anweisungen nach Case, die ausgeführt werden, wenn testexpression mit einer beliebigen Klausel in expressionlist übereinstimmt. elsestatements Optional. Eine oder mehrere Anweisungen nach Case Else, die ausgeführt werden, wenn testexpression mit keiner Klausel in der expressionlist einer der Case-Anweisungen übereinstimmt. End Select Beendet die Definition der Select...Case-Konstruktion. Deine Frage zu If Then:
Prinzip If A and B then ElseIf A and NOT B then ElseIf NOT A and B then Else das wäre dann (NOT A and NOT B) End If ------------------ mb |
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 23. Jul. 2009 16:25 <-- editieren / zitieren --> Unities abgeben:
Hi, Danke für eure Inforamtionen. Leider muss ich gestehen, dass ich damit nicht wirklich weitergekommen bin. Ich hab auch noch ein paar Bücher zur Makroprogrammierung auf meinem Tisch liegen, aber funktionieren tut es trotzdem nicht. Hier mal mein erstes Problem: Hab einen Parameter erzeugt (length). Dann hab ich ne If-Anweisung geschrieben. Das funktioniert auch: -------------------- Set Parameter = CATIA.ActiveDocument.Part.Parameters Set Para1 = Parameter.item ("Radius") Var1 = Para1.Value If Var1 > "0" Then MsgBox ("Das Tool wird angewendet") ElseIf Var1 = "0" Then MsgBox ("Das Tool kommt zu keiner Lösung") Else MsgBox ("Eingabe stimmt nicht!") End If -------------------- Jetzt wollte ich das Ganze in eine Case-Anweisung schreiben. Da kommt die Fehlermeldung: 'Syntaxfehler'. Mein Code sieht bis jetzt so aus: -------------------- Set Parameter = CATIA.ActiveDocument.Part.Parameters Set Para1 = Parameter.item ("Radius") Var1 = Para1.Value Select Case Var1 Case Is > "0" '<- hier wird schon gemeckert! MsgBox ("Das Tool wird angewendet") Case "0" MsgBox ("Das Tool kommt zu keiner Lösung") Case Else MsgBox ("Eingabe stimmt nicht!") End Select -------------------- Ist das mit Case in dem Fall gar nicht so einfach? Ich dachte eigentlich, dass "Select-Case-Else" leistungsfähiger ist als "If-Then-Else" (zumindest steht das in einem meiner schlauen Bücher). Wenn dem nicht so ist, dann verstehe ich den Sinn von Case wohl doch noch nicht richtig. Vor allem íst das noch nicht alles. Jetzt kommt nämlich erst noch was richtig Tolles. Zweites Problem: Hab jetzt 3 Parameter (length, length, Boolean). Das funktioniert als If-Anweisung auch wieder ganz perfekt, als Case-Anweisung bekomm ich das natürlich auch nicht hin, wobei ich nicht glaub, dass es da nur an dem ersten Problem hängt, sondern auch daran, wie ich in einer Case-Abfrage mehrere Variablen Selektieren kann. Da wird zumindest schon gemeckert, wenn ich es mit ner Kommatrennung probiere. Hier erstmal das Ganze als If-Code: -------------------- Set Parameter = CATIA.ActiveDocument.Part.Parameters Set Para1 = Parameter.item ("Radius") Var1 = Para1.Value Set Para2 = Parameter.item ("Abstand") Var2 = Para2.Value Set Para3 = Parameter.item ("DIN") Var3 = Para3.Value If Var1 > "0" AND Var2 > "0" AND Var3 = "Wahr" Then MsgBox ("Das Tool wird angewendet") ElseIf (Var1 = "0" OR Var2 = "0") AND Var3 = "Wahr" Then MsgBox ("Das Tool kommt zu keiner Lösung") Else MsgBox ("Eingabe stimmt nicht!") End If -------------------- Als Case-Code hab ich es so geschrieben (auch wenn ich das erste Problem noch nicht gelöst hab.) -------------------- Set Parameter = CATIA.ActiveDocument.Part.Parameters Set Para1 = Parameter.item ("Radius") Var1 = Para1.Value Set Para2 = Parameter.item ("Abstand") Var2 = Para2.Value Set Para3 = Parameter.item ("DIN") Var3 = Para3.Value Select Case Var1, Var2, Var3 ‘<- Das gefällt anscheinend schon nicht! Case Is > "0" AND > "0" AND = "WAHR" MsgBox ("Das Tool wird angewendet") Case "0" OR "0" AND = "WAHR" MsgBox ("Das Tool kommt zu keiner Lösung") Case Else MsgBox ("Eingabe stimmt nicht!") End Select -------------------- Könnt ihr mit dem ganzen Zeug was anfangen? Bzw. könnt ihr nachvollziehen, was mein Problem ist? Schönen Abend noch. Betty Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 23. Jul. 2009 18:38 <-- editieren / zitieren --> Unities abgeben: Nur für BettinaRauch
Hallo Betty, ich muss dir leider sagen, dass die Compiler berechtigt an den angegebenen Zeilen meckern, weil die einfach falsch sind. Ein Select-Case ist in manchen Fällen effektiver als if-then-else, in vielen Büchern wird aber gerade bei VB von Select-Case abgeraten, da es langsamer ist als if-then-elseif-else. Bei Case darf man nicht mehrere Variable übergeben, woher sollte das Programm auch wissen, wie die Informationen kombiniert werden sollten. Ich schätze, größer/kleiner oder sowas darf es auch nicht geben, eigentlich nur "aufzählbare" Sachen wie Integer oder Enums, vielleicht noch Strings (wobei letzteres nicht in jede Sprache unterstüzt wird). Einen Boolean würde ich nie über Select-Case prüfen. Anbei ein Beispiel für die richtige Anwendung von Select-Case und dasselbe dahinter mit If-Then-Else Code: dim i as integer select case i case 1 msgbox("1") case 2 to 5 msgbox("2-5") case 6 msgbox("6") case else msgbox("sonst was") end selectif i=1 then msgbox("1") elseif (i<=2 and i>=5) then msgbox("2-5") elseif i=6 then msgbox("6") else msgbox("sonst was") end if
Gruß, Zoltan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 24. Jul. 2009 07:18 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 24. Jul. 2009 08:29 <-- editieren / zitieren -->
Hallo Bettina, ich möchte dazu noch anmerken,es ist sicher gut, wenn man sich zuerst darüber einigt von was man "spricht". Ist CATIA in deutscher od. engl. Version Was wird verwendet, CATScript, MS Vbscript od. catvba dadurch ergibt sich dann auch bei Boolean ist es wahr, Wahr oder doch True ist True nun 1 od. -1 Sonst kann ich Zoltan nur beipflichten. Select case eignet sich vor allem bei "aufzählbarem" z. B. enthält Var Klein- od. Großbuchstaben case "a" to "z" case "A" to "Z" case 1 to 100 usw. Gruß Martin ------------------ mb |
BettinaRauch Mitglied BA-Studentin, Fahrzeug-System-Engineering
Beiträge: 65 Registriert: 06.07.2009 Catia V5 R19
|
erstellt am: 29. Jul. 2009 11:00 <-- editieren / zitieren --> Unities abgeben:
Hallo, ja, sorry, dass ich das nicht beachtet hab. Also ich schreib eigentlich grad alles nur in VBscript und meine Catia Oberfläche ist eigentlich auf Englisch eingestellt. Dennoch nimmt er bei den Makros manchmal deutsche Bezeichnungen (wie zum Bsp. "Wahr" und "Falsch" - gehe daher mal davon aus, dass das halt doch ne deutsche Version ist. Werde das beim nächsten Mal gleich mit reinschreiben. Gruß Betty Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |