| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: Journal (VB) soll eine Komponente finden und auswählen (4737 mal gelesen)
|
UdoMM Mitglied Senior Consultant CAX
Beiträge: 270 Registriert: 02.07.2004 NX1 ... Continuous I-deas MS6 ... NXI6.1m1 (15) TC12
|
erstellt am: 09. Okt. 2014 16:57 <-- editieren / zitieren --> Unities abgeben:
Hallo allerseits, ich möchte ein Journal in VB.NET schreiben, das eine Komponente anhand eines Komponentenattributes findet (z.B. "NAME" = "xyz"). Das habe ich bereits realisiert. Diese gefundene Komponente möchte ich nun als ausgewählte Komponente dem Anwender bereit stellen, d.h. sie soll nach Beenden des Journals ausgewählt sein. Idealerweise darf auch noch der BG-Navi zu dieser Komponente expandieren. Zweck der Übung: Damit kann ich eine Suchfunktion nach beliebigen Attributen zum Auffinden von Komponenten machen. Leider habe ich keine passende Methode oder Funktion gefunden. Highlight() ist nicht das was ich suche. Gibt's da was oder kann ich die Flinte in's Korn werfen? Hier mein bisherige Code, noch etwas unfein durcheinander...
Code:
' Find_Component_by_NAME.vb ' This program walks an assembly structure starting from the WorkPart. ' For each component below the Work Part it will ' look for the component Attribute "NAME" to be set to a certain value ' Based on a script from NXJOURNALING.COM Option Strict On Imports System Imports System.IO Imports System.Collections Imports NXOpen Imports NXOpen.Assemblies Imports NXOpen.Drawings Imports NXOpen.UF '.Net wrapped User Function Module NXJournal Dim theSession As Session = Session.GetSession() Dim ufSession As UFSession = ufSession.GetUFSession() Dim LW As ListingWindow = theSession.ListingWindow Dim workPart As Part = theSession.Parts.Work Dim alreadyProcessed As Hashtable Dim prototype As Part Dim knt As Integer = 0 Dim AttribValue As String Dim SearchString As String = "XYZ" Sub Main() Dim markId2 As Session.UndoMarkId markId2 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Replace Reference Set to Entire Part") LW.Open() Try Dim part1 As Part = theSession.Parts.Work Dim origPart As Part = part1 ' Initialize a hash table to store components that have been processed. ' This will prevent components from being processed twice alreadyProcessed = New Hashtable Dim c As ComponentAssembly = part1.ComponentAssembly Walk(c.RootComponent, 0) Catch e As Exception 'LW.WriteLine("Error running application: " & e.Message) End Try End Sub Sub Walk(ByVal c As Component, ByVal level As Integer) Dim children As Component() = c.GetChildren() Dim child As Component prototype = CType(c.Prototype, Part) If Not alreadyProcessed.Contains(prototype) Then ' Add this prototype to the hash table so that we don't process it again alreadyProcessed.Add(prototype, prototype) knt = knt + 1 End If For Each child In children Try AttribValue=child.GetStringAttribute("NAME") If AttribValue = SearchString Then child.Highlight() child.UnHighlight() End If Catch ex As NXException '512008 = attribute not found If ex.ErrorCode = 512008 Then 'component is in list but does not have the attribute, create attribute and set to value in list 'myComp.SetAttribute(attributeTitle, previousValue) lw.WriteLine("## Error: " & ex.ErrorCode & " : " & ex.ToString) Else 'some other error occurred lw.WriteLine("## Error: " & ex.ErrorCode & " : " & ex.ToString) End If End Try 'recurse Walk(child, level + 1) Next End Sub End Module
Vielen Dank & viele Grüße ------------------ Gruß UdoMM : <>< Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
matthias-p Moderator Konstruktion / Anwenderbetreuung
Beiträge: 501 Registriert: 09.06.2006 Teamcenter 11.3 / NX 11 Windows 10
|
erstellt am: 10. Okt. 2014 07:23 <-- editieren / zitieren --> Unities abgeben: Nur für UdoMM
|
UdoMM Mitglied Senior Consultant CAX
Beiträge: 270 Registriert: 02.07.2004 NX1 ... Continuous I-deas MS6 ... NXI6.1m1 (15) TC12
|
erstellt am: 10. Okt. 2014 12:11 <-- editieren / zitieren --> Unities abgeben:
Hallo Mattias, danke für den Hinweis! Ja, das löst den konkreten Anwendungsfall (zugegeben: etwas peinlich für mich, dass ich die Funktion vergessen hatte). Aus sportlicher Sicht würde es mich nun dennoch interessieren, ob das Auswählen eines Objekts per Programm (Journal / VB) grundsätzlich möglich ist, oder nicht. Denn im letzteren Fall müsste ich nicht länger nach einer Lösung (für andere Anwendungen) suchen... Viele Grüße ------------------ Gruß UdoMM : <>< Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
matthias-p Moderator Konstruktion / Anwenderbetreuung
Beiträge: 501 Registriert: 09.06.2006 Teamcenter 11.3 / NX 11 Windows 10
|
erstellt am: 10. Okt. 2014 13:18 <-- editieren / zitieren --> Unities abgeben: Nur für UdoMM
Hi, peinlich muss dir das nun wirklich nicht sein. NX ist so groß, da kann man das ein oder anderen schon mal verdrängen ;-) Hast du die folgenden Funktion schon mal probiert? Code:
NX8 NXOpen .Net API Reference AddToTaggedObjectsSelectionList Method (select, objs, highlightFlag)Namespaces ► NXOpen ► Selection ► AddToTaggedObjectsSelectionList(SelectionHandle, array<TaggedObject>[]()[][], Boolean)C#Visual BasicVisual C++Add objects to the selection list. Declaration Syntax C# Visual Basic Visual C++ public void AddToTaggedObjectsSelectionList( SelectionHandle select, TaggedObject[] objs, bool highlightFlag ) Public Sub AddToTaggedObjectsSelectionList ( _ select As SelectionHandle, _ objs As TaggedObject(), _ highlightFlag As Boolean _ ) public: void AddToTaggedObjectsSelectionList( SelectionHandle^ select, array<TaggedObject^>^ objs, bool highlightFlag ) Parameters select (SelectionHandle) Selection handle objs (array<TaggedObject>[]()[][]) Objects to be added in the selection list highlightFlag (Boolean) If true, highlight objects Remarks Any objects already in the selection list are ignored. Use this function with UIStyler dialogs. You can call this from the constructor callback/selection initialization procedure to begin the dialog with objects already selected. The user can then review these objects, and if desired, deselect them. The application selection callback can also call this function to add other objects to the selection list based on the objects(s) just selected. The selection filter procedure cannot call this function. Based on the object(s) just selected, other objects may need to be selected. For example, all edges of the selected face or all faces tangent to the selected face. Created in NX7.5.4 License requirements: None. Copyright 2011 Siemens Product Lifecycle Management Software Inc. All Rights Reserved.
Assembly: NXOpenUI (Module: NXOpenUI) Version: 8.0.0.25
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Konstruktionsingenieur (w/m/d) Maschinenbau / Mechatronik / Entwicklung | Hinter NOVEXX Solutions verbirgt sich ein dynamisches Mittelstandsunternehmen mit Hauptsitz in Eching bei München. Als Spezialist bieten wir erstklassige Kennzeichnungs- und Etikettierlösungen für Produkte, Kartons und Paletten in allen Branchen: Lebensmittel, Pharma, Kosmetik, Chemie, Logistik und mehr. 100 % MADE IN GERMANY. Mehr als 55 Jahren Erfahrung und Know-how ... | Anzeige ansehen | Konstruktion, Visualisierung |
|
UdoMM Mitglied Senior Consultant CAX
Beiträge: 270 Registriert: 02.07.2004 NX1 ... Continuous I-deas MS6 ... NXI6.1m1 (15) TC12
|
erstellt am: 13. Okt. 2014 12:12 <-- editieren / zitieren --> Unities abgeben:
Hallo matthias-p, vielen Dank für den Tipp. Damit bin ich jetzt so weit gekommen, dass ich einen "Selection Handle" brauche. Google sagt, dass ich den zurzeit nur von einem UIStyler-Dialog bekommen kann - den ich aber nicht habe und nicht möchte. Dazu gäbe es einen ER1785948, dem man sich anschließen könne. (Stand: 2013). Es sieht also zurzeit so aus, als ob der Wunsch nicht realisierbar wäre. Das ist um so mehr schade, als die vorgeschlagene "Find Components"-Funktion sich nicht als Journal aufzeichnen lässt und auch keinen Dialog-Favoriten zulässt. Bleibt also nur Macro, was nicht gerade meine erste Wahl ist... Mein Code sieht demnach zurzeit so aus, vielleicht hat jemand noch eine Idee (Sorry, die Einrückungen haben scheinbar ein Eigenleben):
Code:
' Find_Component_by_NOMENCLATURE.vbOption Strict On Imports System Imports System.IO Imports System.Collections Imports NXOpen Imports NXOpen.Assemblies Imports NXOpen.Drawings Imports NXOpen.UF '.Net wrapped User Function Module NXJournal Dim theSession As Session = Session.GetSession() Dim ufSession As UFSession = ufSession.GetUFSession() Dim LW As ListingWindow = theSession.ListingWindow Dim workPart As Part = theSession.Parts.Work Dim alreadyProcessed As Hashtable Dim prototype As Part Dim knt As Integer = 0 Dim AttribValue As String Dim SearchString As String = "XYZ"
Sub Main() Dim markId2 As Session.UndoMarkId markId2 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Replace Reference Set to Entire Part")
LW.Open() Try Dim part1 As Part = theSession.Parts.Work Dim origPart As Part = part1 ' Initialize a hash table to store components that have been processed. ' This will prevent components from being processed twice alreadyProcessed = New Hashtable Dim c As ComponentAssembly = part1.ComponentAssembly Walk(c.RootComponent, 0) Catch e As Exception 'LW.WriteLine("Error running application: " & e.Message) End Try End Sub Sub Walk(ByVal c As Component, ByVal level As Integer) Dim children As Component() = c.GetChildren() Dim child As Component prototype = CType(c.Prototype, Part) If Not alreadyProcessed.Contains(prototype) Then ' Add this prototype to the hash table so that we don't process it again alreadyProcessed.Add(prototype, prototype) knt = knt + 1 End If For Each child In children Try AttribValue=child.GetStringAttribute("NAME") If AttribValue = SearchString Then Dim my_select As SelectionHandle = New TransientObject() Selection.AddToTaggedObjectsSelectionList(my_select, child,True) End If Catch ex As NXException '512008 = attribute not found If ex.ErrorCode = 512008 Then 'component is in list but does not have the attribute, create attribute and set to value in list 'myComp.SetAttribute(attributeTitle, previousValue) lw.WriteLine("## Error: " & ex.ErrorCode & " : " & ex.ToString) Else 'some other error occurred lw.WriteLine("## Error: " & ex.ErrorCode & " : " & ex.ToString) End If End Try 'recurse Walk(child, level + 1) Next End Sub End Module
Viele Grüße ------------------ Gruß UdoMM : <>< Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|