| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
Autor
|
Thema: Problemme mit den Nachrichten in Pro/Toolkit (1396 mal gelesen)
|
catoflu Mitglied Ingenieur
Beiträge: 37 Registriert: 23.06.2006 ThinkPad T60, Windows Vista Bussines, Intel Core 2 Duo 2,0 GHz T7200, ATI Mobility Radeon X4100 2,0 GB RAM, ProE WF2.0 M270
|
erstellt am: 23. Jun. 2006 15:30 <-- editieren / zitieren --> Unities abgeben:
Hallo an alle, Ich erstelle gerade einen Programm im Pro/Toolkit wo es mehrere Ausführungsfunktionen und eine Kernfunktion es gibt. Die Ausführungfunktionen -z.B. int funktion1(), int funktion2(), ...- übergeben der Kernfunktion -Kfunkt(ProFileName, ProSrftype)- immer zwei Parameter vom angegebenen Typ. Beim Aubrufen der jeweiligen Ausführungsfunktion, sollten die zwei Parameter einen anderen Wert bekommen. Das Problem liegt darin, dass der Wert des Parameters ProSrftype normal geändert wird, aber der Wert des ProFileName Parameters immer den ersten Wert, den er bekommen hat, speichert, und will ihn gar nicht mehr ändern. Die Änderung mache ich mittels der ProStringToWstring() Funktion. Die ProFileName Variable ist nicht global definiert. Das Parameter vom Typ ProFileName enthält den namen einer Textdatei, wo unterschiedliche Nachrichten für den Benutzer liegen. Für den Fall Nr. 1 wird die Funktion funktion1 abgerufen, und der Benutzer sieht die entsprechende Nachrichten für den ersten Fall. Für den Fall Nr. 2 das Gleiche und so weiter. Hat jemand Erfahrung mit der Übermittlung von Nachrichten am Benutzer für unterschiedlichen Fällen? Jede Hilfe ist willkommen. Ich habe alle Pro/T bezogene Beiträge durchgesucht, aber leider nichts dazu gefunden. Wenn jemand sich damit auskennt, schicke ich sofort noch zusätzliche Details dazu und evtl. auch Code. Vielen Dank im Voraus, catoflu Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
catoflu Mitglied Ingenieur
Beiträge: 37 Registriert: 23.06.2006 ThinkPad T60, Windows Vista Bussines, Intel Core 2 Duo 2,0 GHz T7200, ATI Mobility Radeon X4100 2,0 GB RAM, ProE WF2.0 M270
|
erstellt am: 25. Jun. 2006 14:54 <-- editieren / zitieren --> Unities abgeben:
|
Michael 18111968 Moderator F&E & CAD
Beiträge: 4893 Registriert: 25.07.2002 Wildfire 4 M220 (+SUT 2012) PDMLink 9.1 M050 NVIDIA Quadro FX 1700 Intel DualCore E8400 / 8GB WinXP 64 Prof. SP2
|
erstellt am: 25. Jun. 2006 17:13 <-- editieren / zitieren --> Unities abgeben: Nur für catoflu
Erst mal Hallo und Herzlich willkommen im Pro/E-Forum auf CAD.de! Ich kann Dir bei diesem speziellen Problem zwar auch nicht weiterhelfen, aber morgen wird das Forum bestimmt wieder gesprächiger! Schließlich ist grade schönes Wetter, Fußball-WM und Sonntag gleichzeitig... Solange solltest Du aber zumindest Deine Pro/E-Version und Wochenversion in die Sysinfo schreiben, dann kann Dir genauer geholfen werden. Am Besten auch gleich noch Deine Hardware und Dein Betriebssystem reinschreiben, dann bleiben kaum noch Fragen offen! Ansonsten schöne Grüße und bis bald mal - bei einer Frage zu der ich auch was sagen kann! ------------------ Viele Grüße aus Heilbronn & Umgebung, Michael. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefanba Mitglied Ingenieur
Beiträge: 61 Registriert: 08.11.2002
|
erstellt am: 26. Jun. 2006 07:50 <-- editieren / zitieren --> Unities abgeben: Nur für catoflu
|
catoflu Mitglied Ingenieur
Beiträge: 37 Registriert: 23.06.2006 ThinkPad T60, Windows Vista Bussines, Intel Core 2 Duo 2,0 GHz T7200, ATI Mobility Radeon X4100 2,0 GB RAM, ProE WF2.0 M270
|
erstellt am: 26. Jun. 2006 20:09 <-- editieren / zitieren --> Unities abgeben:
Hallo Michael, Hallo Stefan, und vielen Dank für Eure nette Nachrichten. Stefan, ich füge hier mein Program hinzu - ein bisschen abgespeckt, aber dennoch getestet und funktionsfähig. Das Problem liegt wie gesagt darin: 1. Menüpunkt 1 auswählen -> funktion1() wird abgerufen und 'msgfil' kriegt den Wert "msg_funkt1.txt" -> Program wird normal abgeschlossen. 2. Demnächst Menüpunkt 2 auswählen -> funktion2() wird abgerufen, und 'msgfil' hat weiter den Wert "msg_funkt1.txt" da die angezeigte Nachrichten vom Textdatei "msg_funkt1.txt" stammen und nicht vom "msg_funkt2.txt" 3. Wenn man zuerst Menupunkt 2 auswählt, kriegt 'msgfil' den Wert "msg_funkt2.txt" und so bleibts bis zum Schluss. Irgendwie sollte es an der Initialisierung des 'msgfil' durch die ProStringtoWstring() funktion nicht stimmen. Und sie nimmt auch '*msgfil' als Parameter nicht an, so dass den Originellen Wert geändert wird. Ich bin auch kein Experte weder in C, noch in ProToolkit (wahrscheinlich deshalb geht es auch nicht weiter und würde mich sehr freuen auf jedem Hinweis. Hier nun das Code. Es gibt zwei Dateien, main.c und kernfunkt.c. Vom main.c habe ich den Code weggelassen, wo die Menüs erstellt werden, da sie alle normal funktionieren, und auch noch wegen Übersichtlichkeit. Sollte jemand das Program testen wollen, schicke ich sofort die vollversion evtl. per email zu, samt textdateien.
Zitat:
/*File: main.c zweck: erstellt einen Menü, links vom Help Menu, und ruft die jeweiligen Ausführungfunktionen auf, durch anklicklen der entsprechenden Menüeinträge.*//*file begin*/ #include <string> #include <iostream> #include <vector> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include <ProToolkit.h> #include <prodevelop.h> #include <ProMenu.h> #include <ProMenuBar.h> #include <ProWstring.h> #include <ProMessage.h> #include <ProUtil.h> #include <TestError.h> extern int UserLabelFeature(ProFileName , ProSrftype);
extern "C" { int user_initialize(); void user_terminate(); } /*================================================================*\ FUNCTION: TestAccessDefault() PURPOSE: Define the accessibility of menu buttons. \*================================================================*/
static uiCmdAccessState TestAccessDefault (uiCmdAccessMode access_mode) { return (ACCESS_AVAILABLE); } /*================================================================*\ FUNCTION: funktion1() PURPOSE: Generic action function \*================================================================*/ int funktion1() { ProFileName msgfil; ProSrftype oberfltyp; ProStringToWstring (msgfil, "msg_funkt1.txt"); oberfltyp = PRO_SRF_PLANE; ProMessageDisplay (UserMsg, "USER %0s", "funktion1 gestartet."); KernFunkt(mesgfil, oberfltyp); return (0); } /*================================================================*\ FUNCTION: funktion2() PURPOSE: Generic action function \*================================================================*/ int funktion2() { ProFileName msgfil; ProSrftype oberfltyp; ProStringToWstring (msgfil, "msg_funkt2.txt"); oberfltyp = PRO_SRF_PLANE; ProMessageDisplay (UserMsg, "USER %0s", "funkt2 gestartet."); KernFunkt(msgfil, oberfltyp); return (0); } int user_initialize() { /*Hier kommt das code rein, wodurch die menus erstellt werden, und die Funktionen abgerufen werden.*/ /*Da es zu umfangreich ist schreibe ich es nicht mehr rein.*/ return (0); }
void user_terminate()
{ } /*file end*/ --------------------------------- /*File: kernfunkt.c Zweck: legt Parametern an auf Basis von übergebenen Parametern*/ /*file begin*/ #include <string> #include <iostream> #include <vector> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include <ProToolkit.h> #include <prodevelop.h>
#include <ProSurface.h> #include <ProSurfacedata.h> #include <ProSolid.h> #include <ProModelitem.h> #include <ProParameter.h> #include <ProUIMessage.h> #include <ProArray.h> #include <ProWstring.h> #include <ProMessage.h> #include <ProUtil.h> #include <TestError.h> /*================================================================*\ FUNCTION: UserLabelFeature PURPOSE: Label a feature with a string parameter. \*================================================================*/ int UserLabelFeature(ProFileName messagefile, ProSrftype surfacetype) { ProSurface surface; ProModelitem surf_modelitem; ProSelection *sel; ProParameter param; ProParamvalue value; ProUvParam uv_min, uv_max; ProSurfaceshapedata s_shapedata; ProGeomitemdata *sdata; ProSurfaceOrient s_orient; ProSrftype srftype; ProName name, name2; //ProLine line; ProError err; int nsel, s_id;
/*----------------------------------------------------------------*\ Select a feature to label. If nothing is selected, exit. \*----------------------------------------------------------------*/ err = ProMessageDisplay (messagefile, "USER %0s", "Select a feature to label:"); err = ProSelect ("surface", 1, NULL, NULL, NULL, NULL, &sel, &nsel); if (nsel <= 0) return (0); /*----------------------------------------------------------------*\ Get the model item from the selection. \*----------------------------------------------------------------*/ err = ProSelectionModelitemGet (sel[0], &surf_modelitem); err = ProGeomitemToSurface (&surf_modelitem, &surface);
/*----------------------------------------------------------------*\ Get information about the surfacetype \*----------------------------------------------------------------*/ err = ProSurfaceDataGet(surface, &sdata); err = ProSurfacedataGet(sdata->data.p_surface_data, &srftype, uv_min, uv_max, &s_orient, &s_shapedata, &s_id); /*----------------------------------------------------------------*\ Check if the surfacetype is the right one \*----------------------------------------------------------------*/
if (srftype != surfacetype) { ProMessageDisplay (messagefile, "USER Selected surface is false"); return (PRO_TK_GENERAL_ERROR); } /*----------------------------------------------------------------*\ Get the name of the surface. \*----------------------------------------------------------------*/ err = ProMessageDisplay (messagefile, "USER %0s", "Enter the surface name: "); err = ProMessageStringRead (PRO_NAME_SIZE, name2); err = ProModelitemNameSet(&surf_modelitem, name2); /*----------------------------------------------------------------*\ Get the name of the parameter. \*----------------------------------------------------------------*/ err = ProMessageDisplay (messagefile, "USER %0s", "Enter the name of the parameter: "); err = ProMessageStringRead (PRO_NAME_SIZE, name); /*----------------------------------------------------------------*\ Set the parameter type and value. \*----------------------------------------------------------------*/ value.type = PRO_PARAM_DOUBLE; err = ProMessageDisplay (messagefile, "USER %0s", "Enter the parameter string line: "); err = ProMessageStringRead (PRO_LINE_SIZE, value.value.s_val); /*----------------------------------------------------------------*\ If the parameter exists, set its new value. Otherwise, create it. \*----------------------------------------------------------------*/ err = ProParameterInit (&surf_modelitem, name, ¶m); if (err == PRO_TK_E_NOT_FOUND) { err = ProParameterCreate (&surf_modelitem, name, &value, ¶m); } else { err = ProParameterValueSet (¶m, &value); } return (PRO_TK_NO_ERROR); } /*file end*/
Ich benutze PRO/E Wildfire 2.0 Educational version und Microsoft Visual Studio 6.0 als Programierumgebung. Zum Rechner: er ist ein IBM mit 1200 MHz, 1024 MB RAM, 40GB Festplatte, Grafikkarte mit OpenGL und 3Dfx Unterstützung.
Vielen Dank! catoflu Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefanba Mitglied Ingenieur
Beiträge: 61 Registriert: 08.11.2002
|
erstellt am: 27. Jun. 2006 09:42 <-- editieren / zitieren --> Unities abgeben: Nur für catoflu
Hallo catoflu, ich denke das Problem ist, dass die Kenner der Messages (d.h. jeweils 1te Zeile im Messagefile) in beide Messagefiles identisch sind. Ausserdem muss man wissen, das Pro/E Messagefiles nur 1x einliest. => Beim ersten Aufruf von Funktion 1 liest pro/E das 1te file ein und hat darin die Message mit einem Kenner. Beim Aufruf von Funktion 2 liest er das 2te file ein und sucht nach der Message in seiner internen Messageliste, findet aber zuerst die Message aus Datei 1. Am besten Du schreibst alle Messages in eine Datei, versiehst den Messagekenner mit "...funktion1..." bzw. "...funktion2..." und setzt in den Funktionen dann die Messagekenner entsprechend zusammen. Hoffe das hilft weiter. Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
catoflu Mitglied Ingenieur
Beiträge: 37 Registriert: 23.06.2006 ThinkPad T60, Windows Vista Bussines, Intel Core 2 Duo 2,0 GHz T7200, ATI Mobility Radeon X4100 2,0 GB RAM, ProE WF2.0 M270
|
erstellt am: 27. Jun. 2006 10:53 <-- editieren / zitieren --> Unities abgeben:
Oh Stefan, Du bist ein König! Das ist tatsächlich das Problem. Ich hatte es auch früher mal, beim erstellen des Menüs, aber in einem anderen Form. Ich hatte damals in zwei unterschiedliche Files, die gleiche Nachrichten gehabt, und da musste ich unterschiedliche Kenner für jeder Nachricht vergeben. Aber da mussten die unterschiedlichen Nachrichten von zwei unterschiedliche Funktionen abgerufen werden: "msg_analyse.txt" _______________________ USER1 %0s %0s # # USER1 New Button help. New Button help. # # _______________________ "msg_synth.txt" _______________________
USER2 %0s %0s # # USER2 New Button help. New Button help. # # __________________________ Und die jeweilige Funktion hatte entweder "USER1 New Button Help" oder "USER2 New Button Help" abgerufen und es war ok. Nun in diesem Fall, wird in Rahmen der funktion KernFunkt() in der if Statement nur eine Nachricht abgerufen: if (srftype != surfacetype) { ProMessageDisplay (messagefile, "USER Selected surface is false"); return (PRO_TK_GENERAL_ERROR); } Denkst Du, dass ich einen Platzhalter in der Nachrichtkenner setzen kann? Eher nicht, oder? Die textdateien müssen schon unterschiedlich sein, da später auch noch weitere nachrichten rein gebracht werden, und es müsste alles unterschiedlich sein. Ich denke heute noch danach, wie ich das hinkriegen könnte. Wahrscheinlich erstelle ich eine zusätzliche Funktion DisplayMessage(ProSrftype) wo ich durch if statements, oder irgendwie die unterschiedliche nachrichten darstellen kann. Ich habe schon probiert mit einem "nested" if statement, und es geht soweit, aber ich musse es noch verfeinern, weil nach dem ich die richtige Nachricht bekommen habe(beim Fehlauswahl), kommt immer wieder die Nachricht, auch beim richtigen Auswahl, und die Funktion geht nicht weiter. Jedenfalls, tausend Dank für deine Hilfe. Ich gebe Dir Bescheid, wie weit ich noch gekommen bin. Wenn Du noch eine Idee hast, freue ich mich darauf. Schöne Grüsse, catoflu Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lars_Ziegler Mitglied CAD-Administrator, Pro/TOOLKIT
Beiträge: 96 Registriert: 01.06.2001 Windows XP-Professional (SP3) 32-Bit DELL Precision T5400 (RAM 4GB) NVIDIA Quadro FX 4600 Wildfire3 M180 Pro/TOOLKIT
|
erstellt am: 27. Jun. 2006 11:03 <-- editieren / zitieren --> Unities abgeben: Nur für catoflu
Hallo catoflu! Ich bin auch der Meinung von stefanba! Das Problem ist die Kennung der Message! Wobei ich noch nicht ganz verstanden habe, warum Du mit 2 verschiedenen msgfiles arbeitest, nachdem Du die Nachrichten sowieso hartcodiert hast: ... USER %0s", "Select a feature to label:"); Ich arbeite auch mit mehreren msgfiles. Ich achte aber auf unterschiedliche Kenner. Gruß Lars Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lars_Ziegler Mitglied CAD-Administrator, Pro/TOOLKIT
Beiträge: 96 Registriert: 01.06.2001 Windows XP-Professional (SP3) 32-Bit DELL Precision T5400 (RAM 4GB) NVIDIA Quadro FX 4600 Wildfire3 M180 Pro/TOOLKIT
|
erstellt am: 27. Jun. 2006 11:10 <-- editieren / zitieren --> Unities abgeben: Nur für catoflu
Oh, jetzt haben sich unsere Nachrichten überschnitten! Dein Problem würde ich über eine Klasse lösen! (nur so eine Idee, muss im Detail geprüft werden) Dann mehrere Instanzen der Klasse erzeugen und über Memberfunktion die MSGFiles zuweisen. Dann Deinen Funktionen nicht den MSGFile-Namen übergeben sondern die Instanzen der Klasse. Was hältst Du davon? Gruß Lars
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
catoflu Mitglied Ingenieur
Beiträge: 37 Registriert: 23.06.2006 ThinkPad T60, Windows Vista Bussines, Intel Core 2 Duo 2,0 GHz T7200, ATI Mobility Radeon X4100 2,0 GB RAM, ProE WF2.0 M270
|
erstellt am: 27. Jun. 2006 12:07 <-- editieren / zitieren --> Unities abgeben:
Hallo Lars und Danke für deinen Beitrag, Zu der Klasse, denkst Du dass es im Pro/Toolkit möglich ist, denn ich gedacht habe, dass es eigentlich auf die C Sprache basiert, und nicht C++. Wenn Du meinst es sollte gehen, ich könnte es auch weiter erforschen und versuchen. Ich habe es bis jetzt nicht probiert, und bin irgendwie noch am Anfang mit der Programmierung im Pro/T, und deshalb weiß ich nicht genau was man damit machen kann und was nicht. Ich habe eine Arbeit die ich bis September fertig machen muss, und deshalb wenn es zu aufwändig wäre, würde ich es irgendwie einfacher gestalten, damit ich es rechtzeitig fertig kriege. Grüsse und vielen Dank, catoflu Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lars_Ziegler Mitglied CAD-Administrator, Pro/TOOLKIT
Beiträge: 96 Registriert: 01.06.2001 Windows XP-Professional (SP3) 32-Bit DELL Precision T5400 (RAM 4GB) NVIDIA Quadro FX 4600 Wildfire3 M180 Pro/TOOLKIT
|
erstellt am: 27. Jun. 2006 14:09 <-- editieren / zitieren --> Unities abgeben: Nur für catoflu
Hallo catoflu, ich bin leider auch kein gelernter Proggi. Aber ich mach alles in C++. Habe mir auch schon diverse Klassen gebastelt. Funktioniert soweit alles prima! Es soll sogar irgendwie möglich sein, die MFC mit einzubinden. Aber das ist mir eh alles zu hoch und fang ich nimmer an. .NET kommt bestimmt Gruß Lars
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
catoflu Mitglied Ingenieur
Beiträge: 37 Registriert: 23.06.2006 ThinkPad T60, Windows Vista Bussines, Intel Core 2 Duo 2,0 GHz T7200, ATI Mobility Radeon X4100 2,0 GB RAM, ProE WF2.0 M270
|
erstellt am: 30. Jun. 2006 14:40 <-- editieren / zitieren --> Unities abgeben:
Hallo an alle, Ich habe es mit einem switch statement gelöst. Jede Funktion kriegt eine ID vom typ int, welche innerhalb eines switch statements durchgelesen werden: /*funktID wird innerhalb der jeweiligen Funktionen mit dem entsprechenden Funktions-ID initialisiert: für funkt1() funktID=1 und für funkt2() funktID=2*/ switch (funktID) { case 1: { if (oberfltyp!=srftype) { ProMessageDisplay(messagefile, "USER Selected Surface is not a plane"); return (PRO_TK_GENERAL_ERROR); } break; } case 2: { if (oberfltyp!=srftype) { ProMessageDisplay(messagefile, "USER Selected Surface is not a cylinder"); return (PRO_TK_GENERAL_ERROR); } break; } default: { return(PRO_TK_GENERAL_ERROR); } } Danke an Euch alle für die Tips! Ich hätte es sonst nicht geschafft.
Grüsse, catoflu Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|