| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Parameter Abfangen (810 mal gelesen)
|
Rodario7 Mitglied Maschinenbautechniker
Beiträge: 85 Registriert: 08.02.2013 Windows 7 64bit Inventor 2013 Visual Basic 2010 Express
|
erstellt am: 09. Okt. 2014 13:05 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe mal eine Frage: Ich möchte vor dem Deklarieren eines Parameters erst mal in die Datei(ipt) schauen um nachzusehen ob der Parameter überhaupt vorhanden ist. Mein bisheriger Versuch sieht so aus : Code:
Dim oInventorApp As Inventor.Application oInventorApp = CType(GetObject(, "Inventor.Application"), Application) Dim oDocOpen As Inventor.PartDocument Dim oParameters As Inventor.Parameters oParameters = oDocOpen.ComponentDefinition.Parameters For Each para As Parameter In oParameters If not oParameters.Item("Bauart") Is Nothing Then dim ParaBauart As Parameter = oParameters.Item("Bauart") Dim Str As String = ParaBauart.Expression Str = Str.Remove(Str.Length - 3, 3) If CInt(Str) <> 2 Then Exit Sub Else tuwas End If End If Next
Bei der Zeile Code: If not oParameters.Item("Bauart") Is Nothing
steigt des Proggi aus und sagt mir : falscher Parameter irgendwer ne Ahnung wie ich das hinkriege? ------------------ Gruß Klaus [Diese Nachricht wurde von Rodario7 am 09. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 09. Okt. 2014 19:53 <-- editieren / zitieren --> Unities abgeben: Nur für Rodario7
Hallo Schau dir mal die Try-Catch-Anweisung an. Damit kann man sehr einfach beide Möglichkeiten abdecken. Man probiert in der Try-Anweisung einfach den Parameter abzufragen. Existiert der Parameter nicht, löst das einen Ausnahmefehler aus, den Catch "einfängt" und die Möglichkeit zum Behandeln des Fehlers bietet. Wir "behandeln" den Fehler "Parameter gibt's noch nicht" mit "tu was". Sieht im Prinzip so aus:
Code:
Try 'hier dein Code zum Abfragen des Parameters Catch ex as Exception 'hier dein Code zum tu was End Try
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rodario7 Mitglied Maschinenbautechniker
Beiträge: 85 Registriert: 08.02.2013 Windows 7 64bit Inventor 2013 Visual Basic 2010 Express
|
erstellt am: 15. Okt. 2014 21:47 <-- editieren / zitieren --> Unities abgeben:
Hi und sy dass ich jetzt erst antworte. Mir ist bewusst dass ich den Fehler mit try-catch abfangen kann. Da in einem Code aber mehr Fehler stecken können als nur der dass der Parameter nicht da ist kann das verwirren. Ich möchte den Fehler tatsächlich sauber abfangen. Geht das irgendwie? ------------------ Gruß Klaus [Diese Nachricht wurde von Rodario7 am 15. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 15. Okt. 2014 22:55 <-- editieren / zitieren --> Unities abgeben: Nur für Rodario7
|
Rodario7 Mitglied Maschinenbautechniker
Beiträge: 85 Registriert: 08.02.2013 Windows 7 64bit Inventor 2013 Visual Basic 2010 Express
|
erstellt am: 16. Okt. 2014 08:13 <-- editieren / zitieren --> Unities abgeben:
Den Code so : Code: Dim bol As Boolean 'Wenn parameter vorhanden dann true For Each para As Parameter In oParameters If para.Name = "Bauart" Then bol = True else bol=false Next If bol = False Then MsgBox("Nicht da") Else MsgBox("Ist da") Exit Sub End If
kann ich offenbar nicht ausführen. Dafür müsste der Parameter Bauart der letzte Parameter der Inventor Datei sein, da die Variable "bol" sonst immer überschrieben wird. Wie kann ich denn eine verbünftige Fehlermeldung aufbauen? ------------------ Gruß Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rodario7 Mitglied Maschinenbautechniker
Beiträge: 85 Registriert: 08.02.2013 Windows 7 64bit Inventor 2013 Visual Basic 2010 Express
|
erstellt am: 16. Okt. 2014 08:18 <-- editieren / zitieren --> Unities abgeben:
Muhaha... 1 Minute nach meinem letztem Post kams mir in den Sinn Code: Dim bol As Boolean 'Wenn parameter vorhanden dann true For Each para As Parameter In oParameters If para.Name = "Bauart" Then bol = True Exit for else bol=false Next If bol = False Then MsgBox("Nicht da") Else MsgBox("Ist da") Exit Sub End If
Das Exit for fehlte ... Danke jedenfalls für die Denkanstösse ------------------ Gruß Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 16. Okt. 2014 19:42 <-- editieren / zitieren --> Unities abgeben: Nur für Rodario7
Hallo Ich hätte halt nicht den gesamten Code, sondern speziell nur den Schnipsel mit der Parameterprüfung da reingepackt. Dafür wäre das for each weggefallen. Zumindest wenn man erstmal ein paar tausend Parameter mit for each durchläuft ist Try-Catch schneller. Ich klammere aus Prinzip jede Sub und Funktion in ein Try Catch, egal ob theoretisch kein Fehler auftreten kann oder nicht. In den Catch Zweig setze ich eine MessageBox mit dem Ausnahmefehler. Wenn einer meiner User es fertig bringt an meiner göttlichen Unfehlbarkeit zu kratzen und mir so eine Fehlermeldung präsentiert, hab ich schonmal einen Hinweis was wo schief gegangen ist. Außerdem kann man so in Unterfunktionen sauber aussteigen und reicht den Fehler im Code nicht bis an die Stelle weiter an der Autodesk zum Abschied sein Tschuldigung-Fensterchen einblendet. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 16. Okt. 2014 22:57 <-- editieren / zitieren --> Unities abgeben: Nur für Rodario7
Zitat: Original erstellt von rkauskh: Hallo ... Zumindest wenn man erstmal ein paar tausend Parameter mit for each durchläuft ist Try-Catch schneller. ...
Allerdings bewirkt im aktuellen Fall eine Exit For einen sofortigen Ausstieg aus der ForEach sobald der Parameter gefunden wurde. Und es wird keine Ausnahme ausgelöst. Zitat:
Ich klammere aus Prinzip jede Sub und Funktion in ein Try Catch, egal ob theoretisch kein Fehler auftreten kann oder nicht.
Bedenke, dass eine Try Catch immer viel mehr Zeit für die Ausführung benötigt als der Code den man einfach so laufen lassen kann, ohne dem Fangnetz. Zitat:
...Wenn einer meiner User es fertig bringt an meiner göttlichen Unfehlbarkeit zu kratzen und mir so eine Fehlermeldung präsentiert...
Hahaha Der war gut BTW. Danke Rodario für die 8 Unities. Die sind jetzt wieder rund ------------------ Grüße Igor FX64 Software Solutions - Inventor Tools FX64 LambdaSpect - Lichtsimulation mit Autodesk Inventor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 16. Okt. 2014 23:20 <-- editieren / zitieren --> Unities abgeben: Nur für Rodario7
Hallo Deswegen sollte auch im Try direkt versucht werden auf den Parameter zuzugreifen, so daß er entweder gefunden und bearbeitet wird oder wenn er nicht gefunden wird, eine Ausnahme auslöst, in Catch springt und dort den Parameter erstellt. For each wäre dann gar nicht erforderlich. Stimmt, Try-Catch ist langsamer als ohne. Aber ein Inventorabsturz aufgrund einer nicht abgefangenen Ausnahme inklusive der Wiederherstellung der leider nicht mehr gespeicherten Arbeit des Users könnte noch länger dauern.
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012
|
erstellt am: 16. Okt. 2014 23:27 <-- editieren / zitieren --> Unities abgeben: Nur für Rodario7
Zitat: Original erstellt von rkauskh: HalloDeswegen sollte auch im Try direkt versucht werden auf den Parameter zuzugreifen, so daß er entweder gefunden und bearbeitet wird oder wenn er nicht gefunden wird, eine Ausnahme auslöst, in Catch springt und dort den Parameter erstellt. For each wäre dann gar nicht erforderlich.
Ah das stimmt. Das erste war ja doppelt gemoppelt (foreach und collection). Es ist zwar abhängig von den Anzahl der Parameter, aber in der Regel dürfte die TryCatch mit dem Zugriff auf die Collection schneller sein. Hast Recht. ------------------ Grüße Igor
FX64 Software Solutions - Inventor Tools FX64 LambdaSpect - Lichtsimulation mit Autodesk Inventor Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rodario7 Mitglied Maschinenbautechniker
Beiträge: 85 Registriert: 08.02.2013 Windows 7 64bit Inventor 2013 Visual Basic 2010 Express
|
erstellt am: 19. Okt. 2014 14:17 <-- editieren / zitieren --> Unities abgeben:
|