| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX | | |  | Productronica 2025 - Weltleitmesse für Elektronikfertigung, eine Veranstaltung am 18.11.2025
|
Autor
|
Thema: Back und Cancel mit Ufunc (944 mal gelesen)
|
totti2305 Mitglied Dipl Ing Maschinenbau
 
 Beiträge: 183 Registriert: 10.03.2005 Windows 7 x64 SP1 NX 7.5.5.4 MP12 Teamcenter 8.3.3.8
|
erstellt am: 06. Mai. 2008 19:46 <-- editieren / zitieren --> Unities abgeben:         
Hallo! in dem Programm an dem ich gerade am arbeiten bin benutze ich UF_UI_select_with_single_dialog um verschiedene Componenten in einer Baugruppe auszusuchen. In UG Help steht drin das als response natürlich auch UF_UI_BACK und UF_UI_CANCEL ausgegeben werden können. Nur wie beende ich denn dass ganze Programm nachdem resp == UF_UI_CANCEL ist. habs mal mit UF_terminate und abort() versucht, hat aber nicht geklappt. Will eigetnlich nur dem Benutzer die möglichkeit geben überall das Programm zu beenden. Genauso ist das mit UF_UI_Back, gibt es da vielleicht auch nen schlauen befehl für; will da auch nur einen schritt im Programm zurück, mit undo springt die Nixe gleich wieder an die Ausgangsposition. Danke im Voraus Torsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
älg Mitglied CADmin
 
 Beiträge: 403 Registriert: 17.06.2003
|
erstellt am: 07. Mai. 2008 07:26 <-- editieren / zitieren --> Unities abgeben:          Nur für totti2305
Die sauberste Lösung ist wohl ein return zur Startroutine, wo das 'UF_terminate()' schon lauert. Alternativ gleich selbigen Befehl an die Stelle, wo Schluß sein soll - nur Vorsicht, was Rückgabe von Speicher angeht. Folgender Code sollte - alternativ zu '(response == UF_UI_OBJECT_SELECTED)'- kein Problem sein: Code:
if (response == UF_UI_CANCEL | | response == UF_UI_BACK) UF_CALL(UF_terminate());
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
totti2305 Mitglied Dipl Ing Maschinenbau
 
 Beiträge: 183 Registriert: 10.03.2005 Windows 7 x64 SP1 NX 7.5.5.4 MP12 Teamcenter 8.3.3.8
|
erstellt am: 07. Mai. 2008 08:08 <-- editieren / zitieren --> Unities abgeben:         
Hallo aelg! Jou, so hatte ich das auch schon, hier mal der code static int mask_for_components(UF_UI_selection_p_t select, void *type) { UF_UI_mask_t mask = { UF_component_type, 0, 0 }; if (!UF_CALL(UF_UI_set_sel_mask(select, UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC, 1, &mask))) return (UF_UI_SEL_SUCCESS); else return (UF_UI_SEL_FAILURE); } static tag_t select_a_component(char *prompt) { int resp; double cp[3]; tag_t object, view; UF_CALL(UF_UI_select_with_single_dialog("Select a component", prompt, UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY, mask_for_components, NULL, &resp, &object, cp, &view)); if (resp == UF_UI_CANCEL) { UF_CALL(UF_terminate()); } if (resp == UF_UI_OBJECT_SELECTED | | resp == UF_UI_OBJECT_SELECTED_BY_NAME) { UF_CALL(UF_DISP_set_highlight(object, 0)); return object; } else return NULL_TAG; Die Funktion select_a_component steckt in ner while schleife drin, und wenn ich cancel druecke, bricht das program nur die while schleife ab und setzt das programm danach fort. Genau das selbe ist auch schon vorher passiert. irgendwie scheint es dass UF_terminate gar nichts macht. Hab mir auch mal die Variable resp ausdrucken lassen und die if-schleife mit dem zahlenwert probiert, auch nichts. Uf-terminate scheint eh nicht so ganz zu funktionieren, oder? Denn immer wenn ich das programm laufen lasse, was im code veraendere und dann wieder compilen will, kommt der error code LNK1201, nicht genuegend speicherplatz vorhanden. keine ahnung, hab schon alles moegliche versucht zu "freen". Torsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
älg Mitglied CADmin
 
 Beiträge: 403 Registriert: 17.06.2003
|
erstellt am: 07. Mai. 2008 08:26 <-- editieren / zitieren --> Unities abgeben:          Nur für totti2305
Zitat: Folgender Code sollte - alternativ zu '(response == UF_UI_OBJECT_SELECTED)'- kein Problem sein
... Geht wohl doch nicht so einfach? Muß ich bei Gelegenheit mal testen. Also dann: teste in der while-Schleife den return-Wert und beende die Schleife ggf. mit 'break;'. Durchhangeln bis zum Ende ... Wie schon beschrieben: Zitat: sauberste Lösung ist wohl ein return zur Startroutine
Nach dem Terminieren (sauber oder unsauber) sollte eigentlich nichts mehr gehen können, da die Lizenz zurückgegeben wurde und die API-Umgebung schließt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
totti2305 Mitglied Dipl Ing Maschinenbau
 
 Beiträge: 183 Registriert: 10.03.2005 Windows 7 x64 SP1 NX 7.5.5.4 MP12 Teamcenter 8.3.3.8
|
erstellt am: 07. Mai. 2008 10:20 <-- editieren / zitieren --> Unities abgeben:         
Hallo! hab das auch mal mit exit() versucht, aber dann schliesst die ganze session. egal ob exit_success oder exit_failure. Hab gerade mal auf der ugs answer seite gelesen dass das sich bei nx5 wieder geaendert hat. Benutz aber noch nx4. Ok, das mit dem return zur Startroutine versteh ich nicht so ganz. meinst du die main-funktion oder das hier: void ufusr(char *param, int *retcode, int paramLen) { if (UF_CALL(UF_initialize())) return; do_it(); UF_terminate(); } int ufusr_ask_unload(void) { return (UF_UNLOAD_IMMEDIATELY); } hab das auch schon versucht aufzurufen, waere ja dann return ufusr , oder? das klappt auch nicht, kann auch nicht meiner meinung nach. und die main aufzurufen macht ja gar keinen sinn, finde ich. Torsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
älg Mitglied CADmin
 
 Beiträge: 403 Registriert: 17.06.2003
|
erstellt am: 07. Mai. 2008 11:04 <-- editieren / zitieren --> Unities abgeben:          Nur für totti2305
Die fragliche Routine ist über 'do_it();' gerufen worden. Ich meine also, Du solltest im Fall von CANCEL als saubere Lösung Dein 'do_it' beenden, z.B: per Test auf NULL_TAG. Dann landest Du wieder in 'ufusr(...)', zu dem das unload definiert ist. Das 'UF_terminate();' sollte wohl allgemein nur in den userexit-Funktionen selbst auftauchen, interpretiere ich. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
totti2305 Mitglied Dipl Ing Maschinenbau
 
 Beiträge: 183 Registriert: 10.03.2005 Windows 7 x64 SP1 NX 7.5.5.4 MP12 Teamcenter 8.3.3.8
|
erstellt am: 07. Mai. 2008 13:06 <-- editieren / zitieren --> Unities abgeben:         
Ok, aber die frage is wie mach ich das. hab jetzt mal mit den verschiedesten sachen rumprobiert (break, exit...). hat nichts geholfen. goto soll man ja nicht so benutzen, aber auch wenn, funktioniert das nicht so einfach. haste vielleicht noch ne wuink mit dem zaunpfahl auf lager? Torsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
totti2305 Mitglied Dipl Ing Maschinenbau
 
 Beiträge: 183 Registriert: 10.03.2005
|
erstellt am: 07. Mai. 2008 13:28 <-- editieren / zitieren --> Unities abgeben:         
ok, habs doch hinbekommen, hab einfach einen wert aus der klasse zurueckgeben lassen, und diesen wert dann in der main-funktion abgefragt und einfach mal return gemacht. funktioniert! torsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |