Autor
|
Thema: In VBA - Not auf Catia-Befehle nicht möglich (4041 mal gelesen)
|
gladly Mitglied
Beiträge: 56 Registriert: 02.11.2007 Catia V5R19SP9HF40 64Bit Windows XP Pro x64
|
erstellt am: 03. Mrz. 2010 13:41 <-- editieren / zitieren --> Unities abgeben:
Guten Tag allesamt. Vorab - Ich habe die Suche genutzt (und nichts gefunden), über konkrete links würde ich mich aber auch freuen. Informationen zum System: PC mit Windows XP x64 SP2 Catia-Version wo der fehler auftrat: Catia V5 R19 HotFix 4 (aber auch R16 und R18 fehlerhaft getestet!) Lizenz: HD2 - Lizenzpaket Problemstellung: Es ist mir nicht möglich in einem VBA-Projekt (in CatScript/CatVBA noch nicht probiert) möglich Catia-Befehle verneint zu prüfen. Beispiel: (b = ein Part-Body)
Code:
If b.InBooleanOperation Then 'geht If not b.InBooleanOperation Then 'geht nicht -> immer Wahr if If b.InBooleanOperation = true Then 'geht nicht (immer wahr) -> Wahrscheinlich unterschiedliche konstante von VB und C(++) if If b.InBooleanOperation = true Then 'geht nicht (immer wahr) -> siehe oben
Derzeit habe ich deshalb solche Konstrukte, was nicht gerade schön ist!
Code:
If b.InBooleanOperation Then Else b.name = b.Parent.Parent.name End If
Probleme bestehen eben bei allen Catia-Funktion mit Boolean-Rückgabe. Code:
if CATIA.FileSystem.FileExists("PfadZuDatei") 'geht if not CATIA.FileSystem.FileExists("PfadZuDatei") 'geht nicht -> wie oben immer wahr, egal ob datei existiert oder nicht...
Vielen Dank schon einmal im Voraus. gladly Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 03. Mrz. 2010 14:05 <-- editieren / zitieren --> Unities abgeben: Nur für gladly
|
gladly Mitglied
Beiträge: 56 Registriert: 02.11.2007 Catia V5R19SP9HF40 64Bit Windows XP Pro x64
|
erstellt am: 03. Mrz. 2010 14:51 <-- editieren / zitieren --> Unities abgeben:
Hallo, vielen dank für die schnelle antwort. Die Idee hatte ich noch nicht (zumal ja auch mehr als normal...) Leider hat aber auch dies nicht zum gewünschten erfolg geführt. Code:
Sub NotTest() Dim b As Boolean b = CATIA.FileSystem.FileExists("C:\perl123.pl") 'Geht MsgBox b 'True wenn datei da - False wenn nicht b = Not b MsgBox b 'IMMER TRUE End Sub
Ich dachte schon fast der not operator hat nen tick, aber hier ein test, das das widerlegt. Einfach selsam... Ist dieses Verhalten irgendjemandem bekannnt. Code:
Sub NotTest2() Dim b As Boolean b = False MsgBox b 'Richtig ->False b = Not b MsgBox b 'Richtig -> True und auch False wenn oben True End Sub
Vielen dank nochmals im Voraus. gladly Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 03. Mrz. 2010 15:29 <-- editieren / zitieren --> Unities abgeben: Nur für gladly
Hallo, deinen Code verstehe ich nun gar nicht. Not ist nicht für eine Zuweisung gedacht, sodern für eine Negation, d.h. b = Not b geht sowieso nie. b ist False, wenn die Datei nicht existiert, und dann tritt ssomit die If-Abfrage If Not b Then End if ein, die ja nur eine verkürzte Schreibweise von If Not b = True Then End if ist, und das ist wiederum das gleiche wie If b = false Then End if Bei mir funktioniert das. Wie gesagt, willst du eine Zuweisung, dann heisst es: b = False Gruß ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gladly Mitglied
Beiträge: 56 Registriert: 02.11.2007 Catia V5R19SP9HF40 64Bit Windows XP Pro x64
|
erstellt am: 03. Mrz. 2010 15:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Wenn nicht angegeben wird immer auf True geprüft - Ja. Jedoch wird gerade bei Sprachübergreifenden Zugriffen erwähnt, das man nicht direkt "= True" prüfen soll, da es nur eine Konstante ist. Sind diese Konstanten unterschiedlich (Bit 10000 oder 11111) würde es nicht hinhauen. Jedoch würde er bei implizierter Umwandlung 10000 auch als True interpretieren. somit wäre wieder true = true. Das ist der grund warum ich die verkürzte schreibweise nutze (abgesehen von der faulheit... schuldige) Zu dem Not: Ich weise einfach mit hilfe des not-Operators die Negation zu. Es wird ja erst die rechte seite ausgewertet und dann zugewiesen. Es funktioniert sehr gut und wird oft von mir eingesetzt. (z.B. Checkbox zum ausschalten von etwas -> etwas.visible = not checkbox.value -- oder halt der testcode von oben. Der geht!!)
Code:
dim b as boolean b = True dim a as boolean a = not b 'immer das gegenteil von b 'umständlich wäre es so: if b = True then a = false else a = true 'bzw als IIF noch möglich...
Es ist durchaus legitimer code, welcher auch funktioniert... Nur nicht bei Catia-Funktionen. Nicht einmal wie wir ja gerade getestet haben, wenn man das Ergebnis der Funktion erst zwischenspeichert. Es wäre nett, wenn Sie den unteren Code (test der datei) einmal nutzen könnten. Zudem wäre interessant, welche Platform und Archtektur Sie nutzen (wie gesagt ich nutze Windows XP x64) Code:
Dim datei As String datei = "C:\perl1.pl" 'Hier richten Pfad Dim fake As String fake = "C:\perl123.pl" 'Hier falscher Pfad MsgBox Not CATIA.FileSystem.FileExists(datei) MsgBox Not CATIA.FileSystem.FileExists(fake) MsgBox CATIA.FileSystem.FileExists(datei) MsgBox CATIA.FileSystem.FileExists(fake)
Trozdem Danke, wenigstens ist hier jemand, der sich dafür Zeit nimmt! gladly Das soll jetzt bitte nicht negativ aufgenommen werden, aber hier ist ein link zum Not-Operator, welcher sehr wohl zur zuweisung und nicht nur prüfung ist: Link zu MSDN-Not-Operator
[Diese Nachricht wurde von gladly am 03. Mrz. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gladly Mitglied
Beiträge: 56 Registriert: 02.11.2007 Catia V5R19SP9HF40 64Bit Windows XP Pro x64
|
erstellt am: 03. Mrz. 2010 16:14 <-- editieren / zitieren --> Unities abgeben:
Schuldigt bitte das Doppelposting, jedoch wäre es ansonsten zu unübersichtlich geworden, wie ich finde... Also ich habe neue erkenntnisse. Wenn ich folgenden Code ablaufen lasse: Zitat:
Dim b As Boolean b = CATIA.FileSystem.FileExists("C:\perl1.pl") b = Not b
1) Funktioniert wie immer nicht 2) Wenn ich die Vokabel b manuell (im Locals-View) ändere, gehen die negationen wieder beliebig! Habe die Zeile der Negation mehrmals ausgeführt. -Vor manueller Änderung keine Änderung -Nach manueller Änderung wieder alles in Ordnung. Also da muss Catia wohl irgendwas mit der Boolean-Variable machen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 03. Mrz. 2010 16:28 <-- editieren / zitieren --> Unities abgeben: Nur für gladly
Das Problem kenne ich sogar. Passiert leider manchmal in manchen VB Konstrukten. Ich vermute der Fehler liegt an den unterschiedlichen Interpreter/Übersetzungs-Funktionen. Problem ist hier, dass true/false manchmal übersetzt werden auf wahr und unwahr. Hinzu kommt, dass deren Integerwerte sich unterscheiden können. Es gibt nämlich mehrere Kombinationsmöglichkeiten: false kann 0 oder -1 sein und true kann 0 oder 1 sein. Daher würde ich einfach mal pauschal empfehlen mit b.InBooleanOperation = False zu prüfen. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gladly Mitglied
Beiträge: 56 Registriert: 02.11.2007 Catia V5R19SP9HF40 64Bit Windows XP Pro x64
|
erstellt am: 15. Mrz. 2010 11:17 <-- editieren / zitieren --> Unities abgeben:
Guten Tag, entschuldigt bitte meine etwas längere Abwesenheit. Also wie ich schon weiter oben erklärt hatte ist die Prüfung auf False leider auch nicht möglich! Aber schön zu wissen, dass ich mit diesem Problem nicht alleine bin. Als Schlusswort sei somit angemerkt, dass ich bei dem folgenden Konstrukt (notgedrungen) bleiben werde: Code:
If b.InBooleanOperation then 'dummy fals nicht benötigt else 'z.B. Für eine Anweisung bei NICHT einhalten '-> InBooleanOperation = False b.name = "Test123" end if
Vielen Dank für alle Beiträge. Es scheint einfach ein Fehler in Catia oder dem VBA-Interpreter zu sein. Was solls Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 15. Mrz. 2010 15:50 <-- editieren / zitieren --> Unities abgeben: Nur für gladly
Eine Idee hätte ich noch: Ein TypeCast auf Integer. Code:
If CInt(b.InBooleanOperation) < 1 thenEnd If
------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gladly Mitglied
Beiträge: 56 Registriert: 02.11.2007 Catia V5R19SP9HF40 64Bit Windows XP Pro x64
|
erstellt am: 22. Mrz. 2010 11:26 <-- editieren / zitieren --> Unities abgeben:
Guten Tag, ICH DANKE DIR VIELMALS. Wie schon weiter oben erwähnt kommt man nie auf die einfachsten Varianten. Also Code:
Sub TestNotBoolV3() Dim b1 As Boolean Dim b2 As Boolean Dim i1 As Integer i1 = CInt(True) '-1 = True i1 = CInt(False) '0 = False i1 = CInt(CATIA.FileSystem.FileExists("C:\test.bat")) '1 = True i1 = CInt(CATIA.FileSystem.FileExists("C:\test2.bat")) '0 = False b1 = CInt(CATIA.FileSystem.FileExists("C:\test.bat")) = 1 'Somit Prüfung auf True b2 = CInt(CATIA.FileSystem.FileExists("C:\test.bat")) = 0 'und auf False... End Sub
Vb prüft so 0 = False alles andere = True (ob -1, 1 oder 5 usw...) Somit ist not True auch True (wie witzig) da Not 1 = -2 ist, also alles ungleich 0. Nun ist es komisch da die Fals-Konstante ja die selbe ist... Also habe ich nochmals bei FileExist geprüft und folgendes Funktioniert: Code:
b2 = CATIA.FileSystem.FileExists("C:\test2.bat") = False 'True da Datei nicht existiert b2 = Not b2 'nun false... 'Oder Direkt b2 = Not ( CATIA.FileSystem.FileExists("C:\test.bat") = False )
Nunja wir haben nun also Zwei Lösungen gefunden. Nochmals vielen dank an alle beteiligten und insbesondere an Henry Schneider für seinen erfolgreichen Vorschlag zur Lösung des Problems. Der auch die Prüfung auf False vorschlug... Nur schien mir da ein fehler unterlaufen zu sein... (Schuldige )
[Diese Nachricht wurde von gladly am 22. Mrz. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Merlin2001 Mitglied Sr. Software Engineer
Beiträge: 24 Registriert: 13.05.2011
|
erstellt am: 30. Okt. 2012 17:21 <-- editieren / zitieren --> Unities abgeben: Nur für gladly
Ein großes Dankeschön an euch! Ich dachte gerade schon, ich muss meine geistigen Fähigkeiten anzweifeln und bin dann zum Glück auf diesen Post gestoßen! Unities sind schon verteilt Viele Grüße Marcus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarkusK Mitglied
Beiträge: 130 Registriert: 09.08.2002 Dell Precision T5500 Intel Xenon X5560 4x 2,8 GHz 12 GB Ram NVIDIA Quadro FX 3800 Win XP Catia V5R19 SP3
|
erstellt am: 30. Okt. 2012 19:09 <-- editieren / zitieren --> Unities abgeben: Nur für gladly
Hallo, interesanter weise liefert die Funktion "FileExists" nur eine einfache 1 zurück, bei einem Boolean (2 Byte) ist das dann 0000 0000 0000 0001. Wenn man ein Boolean in VBA auf True setzt werden alle Bits auf 1 gesetzt, also 1111 1111 1111 1111 Wenn man 0000 0000 0000 0001 nun negiert (not) dann wird daraus 1111 1111 1111 1110 was ja immer noch true ist, da <>0. getestet mit der Funktion
Code:
Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" (dest As Any, source As Any, _ ByVal bytes As Long) Public Sub t() Dim ba(1) As Byte Dim bb(1) As Byte Dim a As Boolean Dim b As Boolean a = True b = CATIA.FileSystem.FileExists("C:\eine Datei") CopyMemory ByVal VarPtr(ba(0)), ByVal VarPtr(a), Len(a) CopyMemory ByVal VarPtr(bb(0)), ByVal VarPtr(b), Len(b) b = Not b CopyMemory ByVal VarPtr(bb(0)), ByVal VarPtr(b), Len(b) End Sub
im Überwachungsfenster dann die Byte-Arrays "ba" und "bb" anschauen ------------------ Gruss Markus [Diese Nachricht wurde von MarkusK am 30. Okt. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Randle Mitglied CAD/PLM Consultant
Beiträge: 695 Registriert: 12.04.2003 Win10 x64 CATIA V5 R18, R19, R21, R27-29
|
erstellt am: 06. Nov. 2012 09:34 <-- editieren / zitieren --> Unities abgeben: Nur für gladly
Hallo, auch wenn hier wohl schon eine Lösung existiert. Ich kenne das Problem im Zusammenhang mit der Abfrage IsDetail bei dem Objekt DrawingSheet. Hier habe ich mir immmer mit einer kleinen Funktion geholfen. Private Function IsMySheetADetail(t_oSheet As DrawingSheet) As Boolean If t_oSheet.IsDetail Then IsMySheetADetail = True Else IsMySheetADetail = False End If End Function Der Aufruf sieht dann wie folgt aus. For i = 1 To oDrwDoc.Sheets.Count oDrwDoc.Sheets.Item(i).Activate If IsMySheetADetail(oDrwDoc.Sheets.Item(i)) = True Then ..... Else ... Vielleicht ist das ja für den einen oder anderen ein gangbarer Weg. ------------------ MfG Randle ! It's not a bug, it's a feature ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Merlin2001 Mitglied Sr. Software Engineer
Beiträge: 24 Registriert: 13.05.2011
|
erstellt am: 23. Nov. 2012 14:46 <-- editieren / zitieren --> Unities abgeben: Nur für gladly
Eben bin ich in der CATIA V5 Visual Basic Hilfe genau auf dieses Thema gestoßen. Im Kapitel About VB, VBA, Debug and Portability steht dort unter der Überschrift Support of boolean type in CATVBA: Zitat: There is a known limitation concerning the usage of the Boolean type in the V5 Automation methods invoked from VBA. In V5 applications, the Boolean type is defined as an 'unsigned char' where the VBA definition is a short. When a V5 method returns True, the returned integer value is 1, though VBA is expecting -1. Because of this difference, the following VBA code will not work as expected (the method boolMethod returns True) :Code: If myObj.boolMethod() = True Then // This test will fail ... End If
to correct this limitation, you have to write some code like this : Code: If myObj.boolMethod() Then End If
or Code: If myObj.boolMethod() != False Then ... End If
For the same reason, the 'Not' operator cannot be applied directly on the returned value of such method: Code: Not(myObj.boolMethod())
will return True instead of returning False. To use correctly the 'Not' operator you have to use a variable to store the boolean value before applying the operator : Code: Dim myBool myBool = myObj.boolMethod() Not(myBool)
will correctly return False Note that this limitation is specific to VBA and is not concerning VBScript.
Es scheint, dass die Überprüfung auf != False die einzig sichere Methode ist, die immer funktioniert Viele Grüße Marcus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |