Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  NX Programmierung
  Komponente finden und Geometrie kopieren mit Makro

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
Autor Thema:   Komponente finden und Geometrie kopieren mit Makro (438 mal gelesen)
Kc1.1
Mitglied
Konstrukteur

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

Beiträge: 6
Registriert: 17.02.2012

Catia V5 R26 // Siemens NX 12
Dell Precision WS // W7
Nvidia Quattro // Intel Xeon

erstellt am: 19. Jan. 2019 13:27    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 Community,

ich bräuchte Hilfe bei einem Projekt, das in Fetzen quasi schon existiert mir aber das notwendige Wissen über die Programmiersprache fehlt um es zu vollenden.

Ich möchte mit einem "Makro" Geometrie von einem Part ins andere kopieren, gleichzeitig spiegeln und zwar mit dem "Geometrie Linker" Funktion Mirror Body. Zum Start möchte ich nur einen Body, der immer gleich heißt kopieren/spiegeln und ein Koordinatensystem, das immer gleich heißt. Die Spiegelfläche soll die YZ Achse des Koordinatensystems "Referenc Coordinate System" im Zielpart sein. Es soll in das aktuelle Workpart kopiert werden (was ja sowieso immer sein sollte). Das Quellpart möchte ich finden über "FindObject" od3er "FindComponent" heißt die Funktion glaub ich. Kann gerade leider nicht nachschauen. Ich möchte also in einem User Input Fenster eine eindeutige Positionsnummer angeben und das Quellpart darüber finden. Die Parts sind nicht mehrfach verbaut.

Dieses Journal.vb habe ich aufgenommen und schon modifiziert:

Code:
' NX 12.0.1.7
' Journal created by rb on Fri Dec 21 14:35:20 2018 Mitteleuropäische Zeit

'
Option Strict Off
Imports System
Imports NXOpen
Imports NXOpenUI
Imports System.Windows.Forms


Module NXJournal
Sub Main (ByVal args() As String)

Dim theSession As NXOpen.Session = NXOpen.Session.GetSession()
Dim workPart As Part = theSession.Parts.Work
Dim theUISession As UI = UI.GetUI
Dim partnr As String = ""
Dim findpart As String = ""
'Main.Controls(args & "Main").Visible = true

'input box: prompt, title, and initial text
partnr = NXInputBox.GetInputString("PosNr des zu spiegelnden Parts angeben: (01.02.005)", "Parts spiegeln", "")
partnr = partnr.Replace(".","_")
findpart = COMPONENT + partnr
'echo the input
MsgBox("PartNr: """ & partnr & """")

Dim displayPart As NXOpen.Part = theSession.Parts.Display

' ----------------------------------------------
'   Menu: Insert->Associative Copy->WAVE Geometry Linker...
' ----------------------------------------------
Dim markId1 As NXOpen.Session.UndoMarkId = Nothing
markId1 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Start")

Dim nullNXOpen_Features_Feature As NXOpen.Features.Feature = Nothing

Dim waveLinkBuilder1 As NXOpen.Features.WaveLinkBuilder = Nothing
waveLinkBuilder1 = workPart.BaseFeatures.CreateWaveLinkBuilder(nullNXOpen_Features_Feature)

Dim waveDatumBuilder1 As NXOpen.Features.WaveDatumBuilder = Nothing
waveDatumBuilder1 = waveLinkBuilder1.WaveDatumBuilder

Dim compositeCurveBuilder1 As NXOpen.Features.CompositeCurveBuilder = Nothing
compositeCurveBuilder1 = waveLinkBuilder1.CompositeCurveBuilder

Dim waveSketchBuilder1 As NXOpen.Features.WaveSketchBuilder = Nothing
waveSketchBuilder1 = waveLinkBuilder1.WaveSketchBuilder

Dim waveRoutingBuilder1 As NXOpen.Features.WaveRoutingBuilder = Nothing
waveRoutingBuilder1 = waveLinkBuilder1.WaveRoutingBuilder

Dim wavePointBuilder1 As NXOpen.Features.WavePointBuilder = Nothing
wavePointBuilder1 = waveLinkBuilder1.WavePointBuilder

Dim extractFaceBuilder1 As NXOpen.Features.ExtractFaceBuilder = Nothing
extractFaceBuilder1 = waveLinkBuilder1.ExtractFaceBuilder

Dim mirrorBodyBuilder1 As NXOpen.Features.MirrorBodyBuilder = Nothing
mirrorBodyBuilder1 = waveLinkBuilder1.MirrorBodyBuilder

Dim curveFitData1 As NXOpen.GeometricUtilities.CurveFitData = Nothing
curveFitData1 = compositeCurveBuilder1.CurveFitData

curveFitData1.Tolerance = 0.01

curveFitData1.AngleTolerance = 0.5

extractFaceBuilder1.FaceOption = NXOpen.Features.ExtractFaceBuilder.FaceOptionType.FaceChain

waveLinkBuilder1.Type = NXOpen.Features.WaveLinkBuilder.Types.MirrorBodyLink

extractFaceBuilder1.FaceOption = NXOpen.Features.ExtractFaceBuilder.FaceOptionType.FaceChain

extractFaceBuilder1.AngleTolerance = 45.0

waveDatumBuilder1.DisplayScale = 2.0

extractFaceBuilder1.ParentPart = NXOpen.Features.ExtractFaceBuilder.ParentPartType.OtherPart

mirrorBodyBuilder1.ParentPartType = NXOpen.Features.MirrorBodyBuilder.ParentPart.OtherPart

theSession.SetUndoMarkName(markId1, "WAVE Geometry Linker Dialog")

compositeCurveBuilder1.Section.DistanceTolerance = 0.01

compositeCurveBuilder1.Section.ChainingTolerance = 0.0094999999999999998

compositeCurveBuilder1.Section.AngleTolerance = 0.5

compositeCurveBuilder1.Section.DistanceTolerance = 0.01

compositeCurveBuilder1.Section.ChainingTolerance = 0.0094999999999999998

mirrorBodyBuilder1.Associative = True

mirrorBodyBuilder1.MakePositionIndependent = False

mirrorBodyBuilder1.FixAtCurrentTimestamp = False

mirrorBodyBuilder1.InheritDisplayProperties = False

Dim scCollector1 As NXOpen.ScCollector = Nothing
scCollector1 = mirrorBodyBuilder1.MirrorBodyCollector

mirrorBodyBuilder1.CopyThreads = True

mirrorBodyBuilder1.FeatureOption = NXOpen.Features.MirrorBodyBuilder.FeatureOptionType.OneFeatureForAllBodies

' ----------------------------------------------
'   Dialog Begin Find Component
' ----------------------------------------------
Dim rotMatrix1 As NXOpen.Matrix3x3 = Nothing
rotMatrix1.Xx = -0.86737089712805193
rotMatrix1.Xy = -0.24910341688861962
rotMatrix1.Xz = 0.4308308421059206
rotMatrix1.Yx = 0.18879575276592278
rotMatrix1.Yy = 0.63628972211310852
rotMatrix1.Yz = 0.74799167994755966
rotMatrix1.Zx = -0.46046052008052807
rotMatrix1.Zy = 0.73012524763059428
rotMatrix1.Zz = -0.50486951999455432
Dim translation1 As NXOpen.Point3d = New NXOpen.Point3d(-345.87527669145163, -356.71138832921025, 1378.5799999999999)
displayPart.ModelingViews.WorkView.SetRotationTranslationScale(rotMatrix1, translation1, 0.29136406091137773)

Dim component1 As NXOpen.Assemblies.Component = CType(displayPart.ComponentAssembly.RootComponent.FindObject(findpart), NXOpen.Assemblies.Component)

Dim component2 As NXOpen.Assemblies.Component = CType(component1.FindObject(findpart), NXOpen.Assemblies.Component)

Dim component3 As NXOpen.Assemblies.Component = CType(component2.FindObject(findpart), NXOpen.Assemblies.Component)

Dim component4 As NXOpen.Assemblies.Component = CType(component3.FindObject(findpart), NXOpen.Assemblies.Component)

Dim datumPlane1 As NXOpen.DatumPlane = CType(component4.FindObject("NC_Achse"), NXOpen.DatumPlane)

mirrorBodyBuilder1.Plane.Value = datumPlane1

Dim markId2 As NXOpen.Session.UndoMarkId = Nothing
markId2 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "WAVE Geometry Linker")

theSession.DeleteUndoMark(markId2, Nothing)

Dim markId3 As NXOpen.Session.UndoMarkId = Nothing
markId3 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "WAVE Geometry Linker")

Dim sourcepartoccurrences1(0) As NXOpen.TaggedObject
Dim component5 As NXOpen.Assemblies.Component = CType(component3.FindObject(), NXOpen.Assemblies.Component)

sourcepartoccurrences1(0) = component5
mirrorBodyBuilder1.SetSourcePartOccurrences(sourcepartoccurrences1)

Dim selectedobjects1(0) As NXOpen.Assemblies.ProductInterface.InterfaceObject
Dim part1 As NXOpen.Part = CType(theSession.Parts.FindObject("02_10_005__MESSER__123456"), NXOpen.Part)

Dim interfaceObject1 As NXOpen.Assemblies.ProductInterface.InterfaceObject

interfaceObject1 = CType(part1.ProductInterface.FindObject("EXTRACTED_BASE_BODY(192)"), NXOpen.Assemblies.ProductInterface.InterfaceObject)

selectedobjects1(0) = interfaceObject1
mirrorBodyBuilder1.SetProductInterfaceObjects(selectedobjects1)

Dim nXObject1 As NXOpen.NXObject = Nothing
nXObject1 = waveLinkBuilder1.Commit()

theSession.DeleteUndoMark(markId3, Nothing)

theSession.SetUndoMarkName(markId1, "WAVE Geometry Linker")

waveLinkBuilder1.Destroy()

theSession.CleanUpFacetedFacesAndEdges()

Dim rotMatrix2 As NXOpen.Matrix3x3 = Nothing
rotMatrix2.Xx = -0.85805544272999634
rotMatrix2.Xy = -0.25601399244375744
rotMatrix2.Xz = 0.44519399465226484
rotMatrix2.Yx = 0.1957743428353885
rotMatrix2.Yy = 0.63835891410912327
rotMatrix2.Yz = 0.74442615716052929
rotMatrix2.Zx = -0.47477706756835325
rotMatrix2.Zy = 0.72591647759947386
rotMatrix2.Zz = -0.49762636953920181
Dim translation2 As NXOpen.Point3d = New NXOpen.Point3d(-342.45569857612941, -356.71138832921025, 1378.5799999999999)
displayPart.ModelingViews.WorkView.SetRotationTranslationScale(rotMatrix2, translation2, 0.29308577238598571)

' ----------------------------------------------
'   Menu: Tools->Journal->Stop Recording
' ----------------------------------------------
Dim rotMatrix3 As NXOpen.Matrix3x3 = Nothing
rotMatrix3.Xx = -0.8560378779220611
rotMatrix3.Xy = -0.25413853109246953
rotMatrix3.Xz = 0.45012526987146484
rotMatrix3.Yx = 0.19784843384180226
rotMatrix3.Yy = 0.6433983717773113
rotMatrix3.Yz = 0.73952317909626808
rotMatrix3.Zx = -0.47755120017548147
rotMatrix3.Zy = 0.72211643258443126
rotMatrix3.Zz = -0.50049246647925705
Dim translation3 As NXOpen.Point3d = New NXOpen.Point3d(-348.53074531105369, -355.97404757205697, 1378.5799999999999)
displayPart.ModelingViews.WorkView.SetRotationTranslationScale(rotMatrix3, translation3, 0.29676540779546212)


End Sub
End Module



Aufgenommen hab ich folgendes: Setze Zielpart als Workpart, Starte Aufnahme, Starte Geometrie Linker, Setze Modus Mirror Body, Mache Feld Component aktiv, Starte Funktion FindComponent, gebe Positionsnummer ein, drücke OK (Part ist selektiert), kopiere den Body der "Extracted_Base_Body" heißt, Selektiere YZ Achse im Part, Apply, Ändere Modus auf Datum, kopiere Achse die "NC_Achse" heißt, ok.

Dieses Makro funktionierte. Bei jedem Aufruf kopierte es Achse und Body vom aufgenommenen Quellpart ins aufgenommene Zielpart.

Zeile 18,19,22-27 hab ich die Inputbox eingebaut:

Code:
Dim partnr As String = ""
Dim findpart As String = ""
'Main.Controls(args & "Main").Visible = true

'input box: prompt, title, and initial text
partnr = NXInputBox.GetInputString("PosNr des zu spiegelnden Parts angeben: (01.02.005)", "Parts spiegeln", "")
partnr = partnr.Replace(".","_")
findpart = COMPONENT + partnr
'echo the input
MsgBox("PartNr: """ & partnr & """")


In Zeile 127-135 hat der Rekorder alle Componenten ab dem Root Objekt deklariert und hier komme ich nicht weiter. Ich habe gelesen das der Rekorder natürlich alles so genau dokumentiert, dass er genau diese Funktion so wieder machen kann. In der Funktion "FindObject(Pfad)" stand der komplette Pfad vom Rootprodukt bis zu jedem ZSB Produkt einzeln deklariert. Hier müsste irgendwie eine Variable rein, die das oben angegebene und gefundene Part beinhaltet. Das hab ich versucht aber es hat natürlich nicht funktioniert.

Code:
Dim component1 As NXOpen.Assemblies.Component = CType(displayPart.ComponentAssembly.RootComponent.FindObject(findpart), NXOpen.Assemblies.Component)

Dim component2 As NXOpen.Assemblies.Component = CType(component1.FindObject(findpart), NXOpen.Assemblies.Component)

Dim component3 As NXOpen.Assemblies.Component = CType(component2.FindObject(findpart), NXOpen.Assemblies.Component)

Dim component4 As NXOpen.Assemblies.Component = CType(component3.FindObject(findpart), NXOpen.Assemblies.Component)

Dim datumPlane1 As NXOpen.DatumPlane = CType(component4.FindObject("NC_Achse"), NXOpen.DatumPlane)


Das zweite Problem ist der Timestamp. Im Product Interface heißt der Body nur "Extracted_Base_Body". Das Makro schreibt aber den Timestamp des Quellparts mit rein. Der Timestamp kann aber immer unterschiedlich sein. Der Versuch hier einen Wildcard einzubauen schlug natürlich auch fehl...

Code:
interfaceObject1 = CType(part1.ProductInterface.FindObject("EXTRACTED_BASE_BODY(192)"), NXOpen.Assemblies.ProductInterface.InterfaceObject)

Code:
interfaceObject1 = CType(part1.ProductInterface.FindObject(EXTRACTED_BASE_*), NXOpen.Assemblies.ProductInterface.InterfaceObject)

Danke schonmal für die Hilfe!
PS: Gibt es keinen UBB Code für Spoiler? Ich habe zumindest keinen gefunden. Dann wäre es etwas übersichtlicher.
Edit: Dateiendung hinzugefügt. Es handelt sich um ein aufgenommenes Visual Basic Script.

[Diese Nachricht wurde von Kc1.1 am 19. Jan. 2019 editiert.]

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

mseufert
Moderator
Freiberuflicher CAD/CAM Ingenieur


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

Beiträge: 2390
Registriert: 18.10.2005

HP Z420
WIN XP32 / WIN7 64
UG NX6-11
SUN Ultra 60
Solaris 7
CADDS5
3D Printer Prusa MK2 S

erstellt am: 22. Jan. 2019 10:33    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 Kc1.1 10 Unities + Antwort hilfreich

Hallo Kc1.1,

"Fetzen quasi" trifft es ganz gut. 
Aber: Wie lautet jetzt die konkrete Frage ?

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

Kc1.1
Mitglied
Konstrukteur

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

Beiträge: 6
Registriert: 17.02.2012

Catia V5 R26 // Siemens NX 12
Dell Precision WS // W7
Nvidia Quattro // Intel Xeon

erstellt am: 22. Jan. 2019 17:22    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

Fragen gibt es viele  z.B.

1. Was kann man aus dem Code erstmal ohne Sorgen streichen?
Ich vermute mal, dass das nicht gebraucht wird:

Code:
' ----------------------------------------------
    Dim rotMatrix3 As NXOpen.Matrix3x3 = Nothing
    rotMatrix3.Xx = -0.8560378779220611
    rotMatrix3.Xy = -0.25413853109246953
    rotMatrix3.Xz = 0.45012526987146484
    rotMatrix3.Yx = 0.19784843384180226
    rotMatrix3.Yy = 0.6433983717773113
    rotMatrix3.Yz = 0.73952317909626808
    rotMatrix3.Zx = -0.47755120017548147
    rotMatrix3.Zy = 0.72211643258443126
    rotMatrix3.Zz = -0.50049246647925705
    Dim translation3 As NXOpen.Point3d = New NXOpen.Point3d(-348.53074531105369, -355.97404757205697, 1378.5799999999999)
    displayPart.ModelingViews.WorkView.SetRotationTranslationScale(rotMatrix3, translation3, 0.29676540779546212)

2. Wie baue ich für die Elemente im ProductInterface Wildcards ein?
Im Makro steht ja der Name mit dem Timestamp.
Die Publikation heißt immer gleich (ohne Timestamp), hat aber mit ziemlicher Wahrscheinlichkeit immer einen anderen Timestamp.
Ich möchte dass er immer Extracted_Base_Body nimmt. Am besten nicht Case Sensitiv. So funktionierts zumindest nicht.

Code:
interfaceObject1 = CType(part1.ProductInterface.FindObject(EXTRACTED_BASE_*), NXOpen.Assemblies.ProductInterface.InterfaceObject)

3. Brauch ich die Deklaration für jedes ZSB bis zum Part? Also Dim Root, dim ÜberZSB, dim UnterZSB, dim UnterunterZSB, dim Part?
Wenn ja, wie kann ich das umnudeln, damit es immer zum gefundenen Part passt?

Code:
Dim component1 As NXOpen.Assemblies.Component = CType(displayPart.ComponentAssembly.RootComponent.FindObject(findpart), NXOpen.Assemblies.Component)

    Dim component2 As NXOpen.Assemblies.Component = CType(component1.FindObject(findpart), NXOpen.Assemblies.Component)

    Dim component3 As NXOpen.Assemblies.Component = CType(component2.FindObject(findpart), NXOpen.Assemblies.Component)

    Dim component4 As NXOpen.Assemblies.Component = CType(component3.FindObject(findpart), NXOpen.Assemblies.Component)

    Dim datumPlane1 As NXOpen.DatumPlane = CType(component4.FindObject("NC_Achse"), NXOpen.DatumPlane)


Die Funktion mit der ich die Parts finden möchte heißt: Find Component.
Eingeben möchte ich im Inputwindow nur die Positionsnummer.

Gruß Rouven

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

geraldb
Mitglied



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

Beiträge: 27
Registriert: 13.09.2008

erstellt am: 22. Jan. 2019 20:31    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 Kc1.1 10 Unities + Antwort hilfreich

Hallo Rouven,

Zitat:
1. Was kann man aus dem Code erstmal ohne Sorgen streichen?
Ich vermute mal, dass das nicht gebraucht wird:


Was man mit funktionierendem Code nicht braucht sind die Undo-Sprungmarken, alle entfernbar
Code:

Dim markId2 As NXOpen.Session.UndoMarkId = Nothing
markId2 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "WAVE Geometry Linker")
theSession.DeleteUndoMark(markId2, Nothing)

Sofern die aufgezeichneten Rotationsmatrizen und Translationsdaten nur auf eine Objektdrehung/bewegung zurückzuführen sind und keine andere Verwendung haben ->  ebenfalls streichen. Das reduziert die Zeilenanzahl um einiges.

Zitat:
3. Brauch ich die Deklaration für jedes ZSB bis zum Part? Also Dim Root, dim ÜberZSB, dim UnterZSB, dim UnterunterZSB, dim Part?
Wenn ja, wie kann ich das umnudeln, damit es immer zum gefundenen Part passt?

Von dem was ich aus dem Code entziffere wurde eine 4. Unterstufe des WorkParts gesucht. Dafür wird man sich eine Funktion bauen müssen, welche rekursiv ihre Kinder prüft und einen Treffer entsprechend verarbeitet (an die Oberstrukturen bzw. das Workpart zurückgibt). Stichwort hierfür NXOpen.Assemblies.ComponentAssembly

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)2019 CAD.de | Impressum | Datenschutz