| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: FindObject(LINKED_BODY(xxx)), Body); ObjectTag ändern (2254 mal gelesen)
|
AFUHR Mitglied Ingenieur
Beiträge: 10 Registriert: 24.03.2020 NX 8.0.3.4
|
erstellt am: 02. Apr. 2020 09:41 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich stehe vor dem Problem, ein Feature über den Programmcode ausfindig zu machen. Vorab folgende Info zum Aufbau. Es gibt ein _AS, welches _child1 und _child2 steuert (platziert/bewegt). Nach Ende einer Bewegung wird ein Linked_Body von _child1 in _child2 erzeugt. Von diesem Linked_Body werden dann alle Parameter entfernt. Danach erfolgt eine erneute Bewegung und das Spiel wiederholt sich/soll sich wiederholen. Es gibt also immer nur einen Linked_Body, dessen Nummer/Tag aber hochzählt (immer einen festgelegten Abstand). Der Programmcode funktioniert auch soweit ganz gut. Nun möchte ich das als Schleife programmieren. Bekomme dann aber nach dem ersten Durchlauf den Linked_Body nicht mehr "gefasst", da sich sein Tag geändert hat. Hier etwas code: ' ---------------------------------------------- ' Menü: Bearbeiten->Formelement->Remove Parameters... ' ---------------------------------------------- theSession.CleanUpFacetedFacesAndEdges()
theSession.CleanUpFacetedFacesAndEdges() Dim markId4 As Session.UndoMarkId markId4 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Start") Dim removeParametersBuilder1 As Features.RemoveParametersBuilder removeParametersBuilder1 = workPart.Features.CreateRemoveParametersBuilder() theSession.SetUndoMarkName(markId4, "Remove Parameters Dialogfenster") Dim body2 As Body = CType(workPart.Bodies.FindObject("LINKED_BODY(189)"), Body) Dim added2 As Boolean added2 = removeParametersBuilder1.Objects.Add(body2) Dim markId5 As Session.UndoMarkId markId5 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Remove Parameters") Dim nXObject2 As NXObject nXObject2 = removeParametersBuilder1.Commit() theSession.DeleteUndoMark(markId5, Nothing) theSession.SetUndoMarkName(markId4, "Remove Parameters") removeParametersBuilder1.Destroy() theSession.CleanUpFacetedFacesAndEdges() --------------------------------------------------------- Entweder ich kann den Tag mit einer Variablen belegen, was bisher nicht geklappt hat. Habe es z.B. so versucht: Dim body2 As Body = CType(workPart.Bodies.FindObject("LINKED_BODY(Bodyno)"), Body) oder Dim body2 As Body = CType(workPart.Bodies.FindObject("LINKED_BODY(Bodyno.ToString)"), Body) Damit kommt der Compiler aber nicht zurecht. Es wäre natürlich die (für mich) schönste Variante, das so zu lösen. Einfach den Tag hochzählen lassen und dort als Variable stehen haben. Eine andere Möglichkeit wäre den Linked_Body unabhängig vom ObjectTag zu finden. Es wird immer nur einen Linked_Body geben. Danach wird er ja "zerstört" zu einem "dummen" Körper. Aber hier weiß ich leider wirklich nicht weiter. Dazu habe ich zu weinig Erfahrung mit den Möglichkleiten im NX.Open. Vorab schon einmal vielen Dank an die, die sich hierüber Gedanken machen. Ciao
------------------ Konstruktion 2D / 3D Zerspanungswerkzeuge Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. 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: 02. Apr. 2020 15:03 <-- editieren / zitieren --> Unities abgeben: Nur für AFUHR
Hallo AFUHR, irgendo im Code wird ja bestimmt der LinkedBody als Feature erzeugt. Das ist in dem "etwas code" leider nicht zu erkennen. Dort gibt's sicher auch eine Variable für das erzeugte Feature. Da es sich beim LinkedBody um ein sog. BodyFeature handelt, kann man diesen Body abfragen und an anderer Stelle, z.B. zum Entfernen der Parameter benutzen. Es kann dann z.B. so aussehen: Dim body2 As Body = MyLinkedFeat. Getbodies(0) Der so ermittelte Body ist aktuell und unabhängig vom Timestamp. Gruß, Michael b.t.w.: Fragen zu NXOpen sind im Programmier-Forum besser aufgehoben ... und Tags sind 5-6-stellige Integer zur Identifizierung eines Objekts. FindObject braucht dagegen einen String, den sog. JournalIdentifier.
------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AFUHR Mitglied Ingenieur
Beiträge: 10 Registriert: 24.03.2020 NX 8.0.3.4
|
erstellt am: 02. Apr. 2020 15:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Michael, vielen dank schon einmal für die Antwort. Das mit dem JournalIdentifier hatte ich zwar auch schon gefunden und probiert, bin aber nicht so recht weiter gekommen o. hab es nicht kapiert. Der linked_body wird ganz unspektakulär mit folgenden Programmzeilen erzeugt: Dim selectObjectList1 As SelectObjectList selectObjectList1 = extractFaceBuilder1.BodyToExtract extractFaceBuilder1.CopyThreads = True Dim component1 As Assemblies.Component = CType(displayPart.ComponentAssembly.RootComponent.FindObject("COMPONENT _test_sk_WZ_PP 1"), Assemblies.Component) Dim body1 As Body = CType(component1.FindObject("PROTO#.Bodies|EXTRUDE(8)"), Body) Dim added1 As Boolean added1 = selectObjectList1.Add(body1) Dim markId3 As Session.UndoMarkId markId3 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "WAVE Geometry Linker") Dim nXObject1 As NXObject nXObject1 = waveLinkBuilder1.Commit() theSession.DeleteUndoMark(markId3, Nothing) theSession.SetUndoMarkName(markId2, "WAVE Geometry Linker") waveLinkBuilder1.Destroy() theSession.CleanUpFacetedFacesAndEdges() Diese Programmzeilen kommen genau vor denen mit dem Parameter entfernen. Dein Vorschlag würde also mit: Dim body2 As Body = nXObject1.Getbodies(0) funktionieren? Grunß Andi ------------------ Konstruktion 2D / 3D Zerspanungswerkzeuge Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ThomasZwatz Moderator cadadmin
Beiträge: 5397 Registriert: 19.05.2000 (10-2022) --------------------------------------------- [stable] NX2007(2027.3701) + TC13.3.0.3, RAC +AWC6.0.3 SingleSite 4Tier, DocMgt, Client4Office, MRO, ReqMgt, SchedMgt, T4S, TcVis Mockup, TcSSO, Multi-CAD BCT-Inspector Neutral v22R2 --------------------------------------------- [testing] NX2007(2027.3701) + TC13.3.0.3, RAC +AWC6.0.3 BCT-Inspector Neutral v22R2 @M7720 Win10 (1909)
|
erstellt am: 02. Apr. 2020 18:14 <-- editieren / zitieren --> Unities abgeben: Nur für AFUHR
|
AFUHR Mitglied Ingenieur
Beiträge: 10 Registriert: 24.03.2020 NX 8.0.3.4
|
erstellt am: 03. Apr. 2020 07:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, das wäre sicherlich ein guter Tipp. Leider bekomme ich folgende Meldung: Page Forbidden Access to the requested resource is forbidden. Return to WebKey Login page Evtl. brauche ich da mehr, als nur einen "einfachen" Login. Oder bekommt man einen Zugang, sobald man auch Lizenzgebühren für die unterschiedlichen Pakete bezahlt? Könnte also einer unserer Admins über so einen Zugang verfügen? Gruß Andi
------------------ Konstruktion 2D / 3D Zerspanungswerkzeuge Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AFUHR Mitglied Ingenieur
Beiträge: 10 Registriert: 24.03.2020 NX 8.0.3.4
|
erstellt am: 03. Apr. 2020 07:38 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, das wäre sicherlich ein guter Tipp. Leider bekomme ich folgende Meldung: Page Forbidden Access to the requested resource is forbidden. Return to WebKey Login page Evtl. brauche ich da mehr, als nur einen "einfachen" Login. Oder bekommt man einen Zugang, sobald man auch Lizenzgebühren für die unterschiedlichen Pakete bezahlt? Könnte also einer unserer Admins über so einen Zugang verfügen? Gruß Andi
------------------ Konstruktion 2D / 3D Zerspanungswerkzeuge Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. 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: 03. Apr. 2020 13:55 <-- editieren / zitieren --> Unities abgeben: Nur für AFUHR
Hallo zusammen, wenn man beim waveLinkBuilder anstatt waveLinkBuilder1.Commit() waveLinkBuilder1.CommitFeature verwendet, sollte ein Feature zurückgegeben werden. Das in ein BodyFeature umgewandelt, kann man den Body direkt abfragen. Code: Dim myfeat as Feature = waveLinkBuilder1.CommitFeature() Dim mybody as Body = Ctype(myfeat, BodyFeature).GetBodies(0)
Gruß, Michael ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AFUHR Mitglied Ingenieur
Beiträge: 10 Registriert: 24.03.2020 NX 8.0.3.4
|
erstellt am: 08. Jun. 2021 16:02 <-- editieren / zitieren --> Unities abgeben:
Hallo Michael, ich möchte mich nach so langer Zeit erst einmal für deine Vorschläge bedanken. Leider war es voriges Jahr dann so, dass "Corona" voll zugeschlagen hat und auf Grund von Kurzarbeitsregelung nur noch Zeit fürs Tagesgeschäft übrig war. nun hat sich die Lage wieder entspannt. Ich hoffe dir und auch den anderen Interessierten geht es genau so. Die Woche konnte ich mit diesem Projekt weitermachen. Und es ist zum Verrücktwerden (zumindest was die unterschiedlichen Fehlermeldungen angeht). Habe auch den Code -------------------- Dim myfeat as Feature = waveLinkBuilder1.CommitFeature() Dim mybody as Body = Ctype(myfeat, BodyFeature).GetBodies(0) ------------------------------------------------------------ ausprobiert. Folgendes passiert: Meldung1: "Linie xxx: Der Typ Feature ist nicht definiert". Also umgeschrieben in "Dim myfeat as Features.Feature = waveLinkBuilder1.CommitFeature()" Dann kommt kein Fehler mehr, aber dafür für die nächste Zeile: "Linie xxx: Der Typ BodyFeature ist nicht definiert" Die Änderung von "Dim mybody as Body = Ctype(myfeat, BodyFeature).GetBodies(0)" in "Dim mybody as BodyFeature = Ctype(myfeat, BodyFeature).GetBodies(0)" bringt den gleichen Fehler. Ich habe noch ein paar andere Konstellationen ausprobiert, aber irgendein Fehler kommt dabei immer heraus. Kann es daran liegen, dass "BodyFeature" nicht in NX8.0 hinterlegt ist? Es scheint bei der ganzen Sache nur ein ganz kleiner Haken zu sein. Habe auch eine Abwandlung von folgendem Forenbeitrag ausprobiert: ------------------------------------------------------ Dim feats As Features.FeatureCollection = workPart.Features For Each feat As Feature In feats If feat.FeatureType = "EXTRUDE" Then (hier "LINKED_BODY" verweden) Dim feature_body As BodyFeature = CType(feat, BodyFeature) ' Dim feature_faces() As Face ' feature_faces = feature_body.GetFaces() ' Dim disp_mod As DisplayModification ' disp_mod = theSession.DisplayManager.NewDisplayModification() ' disp_mod.ApplyToAllFaces = False ' disp_mod.NewColor = 214 ' disp_mod.Apply(feature_faces) ' disp_mod.Dispose() End If Next ------------------------------------- bringt aber auch nichts wegen des Problems mit BodyFeature. Na ja, vielleicht übersehe ich was. Für Anregungen bin ich immer dankbar. Ciao Andi
------------------ Konstruktion 2D / 3D Zerspanungswerkzeuge Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. 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: 08. Jun. 2021 18:25 <-- editieren / zitieren --> Unities abgeben: Nur für AFUHR
Zitat: dass "Corona" voll zugeschlagen hat
Zitat: Ich hoffe dir und auch den anderen Interessierten geht es genau so.
Hallo Andi, die Formulierung ist wohl leicht missglückt, oder wünschst du anderen das selbe Schicksal, mit Kurzarbeit etc. ? Die Lösung von Problem 1 wird sehr wahrscheinlich auch Problem 2 lösen: Versuch's mal mit Features.Bodyfeature oder stell' oben ein Imports NXOpen.Features voran. Michael ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AFUHR Mitglied Ingenieur
Beiträge: 10 Registriert: 24.03.2020 NX 8.0.3.4
|
erstellt am: 09. Jun. 2021 14:25 <-- editieren / zitieren --> Unities abgeben:
Hallo Michael, vielen Dank für die schnelle Antwort. Ich meinte natürlich, dass sich die Lage wieder entspannt hat und das dies bei allen hoffentlich auch so ist. Bei den Fehlermeldungen allerdings gibt es keine Fortschritte. Es scheint so, als ob NX generell was dagegen hat, das Feature in einen Body zu "verwandeln". Ich habe mal alle möglichen Varianten (immer nur die betreffenden Programmzeilen), die Fehler hervorrufen dargestellt. Beim "Dateikopf" habe ich die Zeile mit Imports NXOpen.Features ergänzt. Sieht jetzt so aus: Option Strict Off Imports System Imports NXOpen Imports NXOpen.Features Nun die einzelnen Varianten (dreht sich irgendwie im Kreis). Variante 1: Dim myfeat as Features.Feature = waveLinkBuilder1.CommitFeature() Dim mybody as BodyFeature = Ctype(myfeat, BodyFeature).GetBodies(0) 'das ist Linie 318 Fehlermeldung:: Linie 318: Der Wert vom Typ "NXOpen.Body" kann nicht in "NXOpen.Features.BodyFeature" konvertiert werden. Dim bodies1(0) As Body bodies1(0) = mybody 'das ist Linie 378 Dim bodyDumbRule1 As BodyDumbRule bodyDumbRule1 = workPart.ScRuleFactory.CreateRuleBodyDumb(bodies1) Fehlermeldung:: Linie 378: Der Wert vom Typ "NXOpen.Features.BodyFeature" kann nicht in "NXOpen.Body" konvertiert werden. Variante 2 (kleine Abwandlung in Zeile 377): Dim bodies1(0) As BodyFeature bodies1(0) = mybody 'das ist Linie 378 Dim bodyDumbRule1 As BodyDumbRule bodyDumbRule1 = workPart.ScRuleFactory.CreateRuleBodyFeatureDumb(bodies1) Fehlermeldung:: Linie 380: "CreateRuleBodyFeatureDumb" ist kein Member von "NXOpen.ScRuleFactory". Das also wieder zurück genommen. Variante 3 (nur Typ Body, bringt zumindest keinen Fehler in Zeile 378): Dim myfeat as Features.Feature = waveLinkBuilder1.CommitFeature() Dim mybody as Body = Ctype(myfeat, Body).GetBodies(0) 'das ist Linie 318 Fehlermeldung:: Linie 318: Der Wert vom Typ "NXOpen.Features.Feature" kann nicht in "NXOpen.Body" konvertiert werden. Variante 4 (wieder nur Feature verwendet in Zeile 317, ändert aber nichts): Dim myfeat as Feature = waveLinkBuilder1.CommitFeature() Dim mybody as Body = Ctype(myfeat, Body).GetBodies(0) 'das ist Linie 318 Fehlermeldung:: Linie 318: Der Wert vom Typ "NXOpen.Features.Feature" kann nicht in "NXOpen.Body" konvertiert werden. Variante 5: Dim myfeat as Feature = waveLinkBuilder1.Commit() 'bringt gleichen Fehler wie .CommitFeature() Dim mybody as Body = Ctype(myfeat, Body).GetBodies(0) 'das ist Linie 318 Fehlermeldung:: Linie 318: Der Wert vom Typ "NXOpen.Features.Feature" kann nicht in "NXOpen.Body" konvertiert werden. So, ich probier' noch was aus. Schau'n wir mal. Ciao Andi
------------------ Konstruktion 2D / 3D Zerspanungswerkzeuge Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. 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. Jun. 2021 15:26 <-- editieren / zitieren --> Unities abgeben: Nur für AFUHR
Hallo Andi, du musst zwischen dem allgemeinen Feature, dem speziellen BodyFeature und dem Typ Body unterscheiden, dann müsste es funktionieren. Zitat: Dim myfeat as Features.Feature = waveLinkBuilder1.CommitFeature() Dim mybody as BodyFeature = Ctype(myfeat, BodyFeature).GetBodies(0) 'das ist Linie 318
... und .GetBodies(0) verursacht den Fehler. Richtig wäre: Dim myfeat as Feature = waveLinkBuilder1.CommitFeature() ' Allgemeines Feature Dim mybodyfeat as BodyFeature = Ctype(myfeat, BodyFeature) ' Spezielles BodyfFeature Dim mybody as Body = mybodyfeat.GetBodies(0) ' Der (erste) Body des Bodyfeatures Das sind wesentliche Grundlagen, daher die Empfehlung, dir mal das Thema Typen und Objekte im Zusammenhang mit objektorientierter Programmierung anzuschauen. Das sollte helfen, diese Art von Fehlermeldungen zu verstehen und entsprechende Methoden und Eigenschaften anzuwenden. Gruß, Michael
------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit selt'ner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AFUHR Mitglied Ingenieur
Beiträge: 10 Registriert: 24.03.2020 NX 8.0.3.4
|
erstellt am: 17. Jun. 2021 10:28 <-- editieren / zitieren --> Unities abgeben:
|
AFUHR Mitglied Ingenieur
Beiträge: 10 Registriert: 24.03.2020 NX 8.0.3.4
|
erstellt am: 17. Jun. 2021 10:55 <-- editieren / zitieren --> Unities abgeben:
|
AFUHR Mitglied Ingenieur
Beiträge: 10 Registriert: 24.03.2020 NX 8.0.3.4
|
erstellt am: 17. Jun. 2021 11:42 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|