| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: Frage zur NXOpen Funktion GetAllObjectsOnLayer (2281 mal gelesen)
|
oehrnie Mitglied Programmierer
Beiträge: 8 Registriert: 08.04.2009
|
erstellt am: 08. Apr. 2009 16:11 <-- editieren / zitieren --> Unities abgeben:
Ich möchte mir gerne die Objekte auf einem bestimmten Layer zurückgeben lassen. und verwende den Code Code:
int errorCode = UF_initialize(); NXOpen::Session *theSession = NXOpen::Session::GetSession(); int layer = layerLayer->ItemValue(); NXOpen::Part* pWorkpart = theSession->Parts()->Work(); NXOpen::Layer::LayerManager* pLayerMan = pWorkpart->Layers(); vector< NXOpen::NXObject* > objVector = pLayerMan->GetAllObjectsOnLayer( layer ); errorCode = UF_terminate();
Die fett gedruckte Zeile ist das Problem, da ich hier einen Assert _BLOCK_TYPE_IS_VALID( ... ) erhalte. Offenbar gibts ein Problem dass der in std:vector eingebaute Copy-Konstruktor etwas freigibt was er besser nicht sollte. Hat jemand eine Idee?Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 09. Apr. 2009 10:15 <-- editieren / zitieren --> Unities abgeben: Nur für oehrnie
|
oehrnie Mitglied Programmierer
Beiträge: 8 Registriert: 08.04.2009
|
erstellt am: 09. Apr. 2009 11:17 <-- editieren / zitieren --> Unities abgeben:
Hallo, in VB ist es kein Problem, ich brauche es allerdings in c++ Das Problem ist halt, das man der Doku nicht entnehmen kann, was genau zurückgeliefert wird (Value/Referenz auf den Vektor, Value oder Referenz der Element des Vektors). http://uganswer.ugs.com hat nur genau einen Verweis auf die Funktion, in der sie als Ersatz für eine nicht funktionierende Funktion angegeben wird (ohne jede weitere Info). Ein c++ Beispiel das eine Funktion benutzt, die einen Vektor zurück liefert habe ich leider noch nicht gefunden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 09. Apr. 2009 12:03 <-- editieren / zitieren --> Unities abgeben: Nur für oehrnie
Hallo oehrnie, die Rückgabe ist ein Array von NXObjects, wie hier zu sehen: Dim objs() As NXObject = workPart.Layers.GetAllObjectsOnLayer(104) objs ist der Variablenname, () sagt, es handelt sich um ein Array, as NXObject ist die Typangabe. Gruß, Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oehrnie Mitglied Programmierer
Beiträge: 8 Registriert: 08.04.2009
|
erstellt am: 09. Apr. 2009 12:16 <-- editieren / zitieren --> Unities abgeben:
Das trifft nur auf VB zu. In der C++ Doku steht als Rückgabetyp std::vector< NXOpen::NCObject* > Es wird also ein Vektor mit Zeigern auf die Objekte zurückgeliefert. Der Teufel steckt hier im Detail der Zuweisung, der Fehler tritt bei der '=' Zuweisung auf. Gibt es jemand, der NXOpen und C++ Guru ist, der hier eine Idee hat? [Diese Nachricht wurde von oehrnie am 09. Apr. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 09. Apr. 2009 12:30 <-- editieren / zitieren --> Unities abgeben: Nur für oehrnie
|
oehrnie Mitglied Programmierer
Beiträge: 8 Registriert: 08.04.2009
|
erstellt am: 09. Apr. 2009 12:40 <-- editieren / zitieren --> Unities abgeben:
NX 5.0/UGDOC/html_files/nxopen_c++_ref/a01185.html Da steht in der NXOpen::Layer::LayerManager Class Reference: std::vector< NXOpen::NXObject * > GetAllObjectsOnLayer (int layer) Returns all objects on the specified layer. Nicht alle VB Typen gibts in C++ und umgekehrt. Auch die Behandlung der Argumente ist anderes, sind eben unterschiedliche Programmiersprachen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Zoechi Mitglied Software Entwickler
Beiträge: 28 Registriert: 03.07.2008 NX 4.0.4.2 MP9, MS Visual Studio 2005, NX 4.0 Open C und MFC
|
erstellt am: 09. Apr. 2009 14:53 <-- editieren / zitieren --> Unities abgeben: Nur für oehrnie
Hallo oehrnie! Hab mir schon mal einen Vector zurück geben lassen um ein die Expression eines Measurement Features umzubenennen. Die Erstellung des Vectors habe ich aber auch mit '=' gemacht. MeasureLength* measureLength = NULL; Measure* FeatureLength = NULL; ... FeatureLength = measureLength->CreateFeature(); std::vector<Expression *> expr_vec = FeatureLength->GetExpressions(); Sonst versuch mal, die Größe des Vector mit "pLayerMan->GetAllObjectsOnLayer(layer).size()" zurückzugeben und sieh nach, ob da überhaupt was drinnen ist. Kannst du direkt mit dem Vector auch arbeiten ohne ihn kopieren zu müssen? so in etwa:
Code:
for(int i = 0; i < pLayerMan->GetAllObjectsOnLayer(layer).size(); i++) { MyFunctionUsingLayer(pLayerMan->GetAllObjectsOnLayer(layer).at(i)); }
fg Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Siassei Mitglied MB - Student
Beiträge: 490 Registriert: 08.07.2007 SWX NX 3 und höher ;) Windows and UNIX<P>C, C++, Java, Phyton,...</P>
|
erstellt am: 09. Apr. 2009 17:23 <-- editieren / zitieren --> Unities abgeben: Nur für oehrnie
Servus, Zitat: Original erstellt von mseufert: Bin zwar kein "C++ - Guru" , aber daß die API bei Nutzung verschiedener Sprachen unterschiedliche Rückgabewerte hat, halte ich auch so für höchst unwahrscheinlich.
Leider ist das so. Mir kommt es so vor, dass die API's von C++, .NET (VB, C#, CLI, ...) und Java von unterschiedlichen Teams zeitgleich geschrieben wurden. Daher sind die API's nicht immer 100% gleich. Ich hab mal eine Java-Anwendung nach VB.NET portiert und musste feststellen, dass viele NXOpen-Operationen unterscheiden. Einfaches Beispiel zum selbst Studium. - Versuche mal in Java eine NXOpen.Session (Session, UFSession) zu erstellen und dann in VB.NET oder C#. @oehrnie Wenn die Methode von Zoechi funktioniert, dann liegt es wohl an dem Allocator. Hast du dir die magere Hilfe für die Objekterzeugung und -/verwaltung etwas genauer angeschaut? Ich konnte hier nichts über das Handhaben von std Klassen entnehmen, würde aber auf dem Allocator setzen. Was sagt den die Hotline? Hast du schon mal den Debugger bemüht? Achja, benutzt du C++ oder CLI? Gruß Thomas ------------------ Hopfen und Mals Gott erhalts Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 14. Apr. 2009 15:04 <-- editieren / zitieren --> Unities abgeben: Nur für oehrnie
|
| Konstruktionsingenieur für Schweißbaugruppen (m/w/d) | Dank unserer innovativen und genialen Hightech-Lösungen sind wir da, wo wir jetzt sind, nämlich Markt- und Technologieführer, wenn es um die thermische Zubereitung von Speisen geht. Bei uns spielen Sie in der Champions League, wenn es um die Technik von morgen geht. Unser Erfolg wird durch unsere Mitarbeitenden und Ihr umfassendes Know-how gemacht. Dabei treibt uns an, den größtmöglichen Kundennutzen zu stiften.... | Anzeige ansehen | Konstruktion, Visualisierung |
|
oehrnie Mitglied Programmierer
Beiträge: 8 Registriert: 08.04.2009
|
erstellt am: 14. Apr. 2009 16:03 <-- editieren / zitieren --> Unities abgeben:
Es war der Deallokator. Die Zuweisung klappte schließlich prima, wenn aber das Programm den aktuellen (try -) Block verließ, wurde laut Debugger intern die tidy() Methode von der std::vector - Klasse aufgerufen, der dann besagte Fehlermeldung lieferte. Recht hat er aber, der Compiler. NX liefert im Vektor die Elemente zurück die ich haben möchte und die möchte das NX dann aber auch gerne weiter behalten. Der Destruktor versucht die aber sauber aufzuräumen. Also die Variable auf static gesetzt und Compiler und NX haben wieder miteinander Frieden geschlossen. Hier ist auf jeden Fall Siemens/UGS gefordert, die Dokumentation zu verbessern (genauer zu sagen, was wird wie zurückgeliefert), bzw. zumindest mehr und aussagekräftigere Beispiele beizulegen. Ich will ja programmieren und keine Ratespielchen machen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |