Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  NX Programmierung
  Journal (VB) soll eine Komponente finden und auswählen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von UdoMM an!   Senden Sie eine Private Message an UdoMM  Schreiben Sie einen Gästebucheintrag für UdoMM

Beiträge: 270
Registriert: 02.07.2004

NX1 ... Continuous
I-deas MS6 ... NXI6.1m1 (15)
TC12

erstellt am: 09. Okt. 2014 16:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von matthias-p an!   Senden Sie eine Private Message an matthias-p  Schreiben Sie einen Gästebucheintrag für matthias-p

Beiträge: 501
Registriert: 09.06.2006

Teamcenter 11.3 / NX 11
Windows 10

erstellt am: 10. Okt. 2014 07:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für UdoMM 10 Unities + Antwort hilfreich


searchcomponent.jpg

 
Hi UdoMM,

ich will ja deinen Ehrgeiz nicht trüben, aber die Funktion gibt es im NX schon.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

UdoMM
Mitglied
Senior Consultant CAX


Sehen Sie sich das Profil von UdoMM an!   Senden Sie eine Private Message an UdoMM  Schreiben Sie einen Gästebucheintrag für UdoMM

Beiträge: 270
Registriert: 02.07.2004

NX1 ... Continuous
I-deas MS6 ... NXI6.1m1 (15)
TC12

erstellt am: 10. Okt. 2014 12:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von matthias-p an!   Senden Sie eine Private Message an matthias-p  Schreiben Sie einen Gästebucheintrag für matthias-p

Beiträge: 501
Registriert: 09.06.2006

Teamcenter 11.3 / NX 11
Windows 10

erstellt am: 10. Okt. 2014 13:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für UdoMM 10 Unities + Antwort hilfreich

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 ansehenKonstruktion, Visualisierung
UdoMM
Mitglied
Senior Consultant CAX


Sehen Sie sich das Profil von UdoMM an!   Senden Sie eine Private Message an UdoMM  Schreiben Sie einen Gästebucheintrag für UdoMM

Beiträge: 270
Registriert: 02.07.2004

NX1 ... Continuous
I-deas MS6 ... NXI6.1m1 (15)
TC12

erstellt am: 13. Okt. 2014 12:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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.vb

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
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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz