Autor
|
Thema: PowerCopy in Produktumgebung ausführen (3208 mal gelesen)
|
Bernod Mitglied
Beiträge: 40 Registriert: 03.03.2010
|
erstellt am: 26. Apr. 2010 10:28 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe das bereits in diesem Thema angesprochene Problem: http://ww3.cad.de/foren/ubb/Forum137/HTML/003626.shtml - Ich befinde mich in einem Product - In diesem Product befinden sich 2 Parts - ein Part ist als aktives Dokument gesetzt (Bsp. Part 2) - In diesem Part soll eine PowerCopy ausgeführt werden - Die Input-Geometrie wird per Selektion gewählt - Die Input-Geometrie befindet sich in einem anderen Part im gleichen Product (Bsp. Part 1). Die genaue Struktur des Products ist unbekannt. Bsp:
Code: Product_0 ! +- Product1 (Product1.1) ! ! ! +-!Product2 (Product2.1) ! ! ! +- Part1 (Part1.1) ! ! ! +- Part1 ! +- Product3 (Product3.1) ! +- Part2 (Part2.1) ! +- Part2
Wie muss ich nun vorgehen? Mein Code sieht derzeit wie folgt aus: Code: '(Global) Dim IntPointObj As Object
Code: Private Sub Punkt_OB_Button_Auswahl_Click() 'Auswahl festlegen -------------------------------- Dim Filter1(0) Filter1(0) = "Point" 'Selektion definieren und leeren ------------------ Dim UserSel As Object Set UserSel = CATIA.ActiveDocument.Selection UserSel.Clear 'Selection vornehmen lassen ----------------------- 'INPUT-Geometrie 1: Bezugspunkt oben -------------- Dim intSelAbfrageStr As String intSelAbfrageStr = UserSel.SelectElement2(Filter1, "Bezugspunkt oben waehlen.", False) ' Abfrage ob eine Selektion stattgefunden hat ------ If intSelAbfrageStr = "Normal" Then ' Wenn ja, dann .. Set IntPointObj = UserSel.Item(1).Value ' zuweisen des selektierten Objektes an die Variable intPointObj End If End Sub
Code: Private Sub OK_Button_Click() 'Abrufen des aktuellen Parts ------------------ Dim Prod As Product Set Prod = CATIA.ActiveDocument.Product Dim Prods As Products Set Prods = Prod.Products Dim myProd As Product Set myProd = Prods.Item("Product3.1") Dim myProds As Products Set myProds = myProd.Products Dim myPartInstance As Product Set myPartInstance = myProds.Item("Part2.1") Dim myPart As Part Set myPart = myPartInstance.ReferenceProduct.Parent.Part 'Abrufen der factory des aktuellen Parts ------ Dim myFactory As InstanceFactory Set myFactory = myPart.GetCustomerFactory("InstanceFactory") 'Start der PowerCopy -------------------------- myFactory.BeginInstanceFactory "HAS_Typ_A", "C:\TEMP_MAKRO\PC_HAS_Typ_A___v6.0.CATPart" 'Start der Instanziierung der Input-Daten ----- myFactory.BeginInstantiate'Input-Geometrie einlesen --------------------- myFactory.PutInputData "INPUT_Bezugspunkt_oberes_Ende", IntPointObj 'Parameterdeklaration ------------------------- Dim Param1 As Parameter Set Param1 = myFactory.GetParameter("Hoehe_oberer_Knickpunkt") Param1.ValuateFromString "100mm" '---------------------------------------------- Dim Instance As ShapeInstance Set Instance = myFactory.Instantiate 'Ende der Instanziierung ---------------------- myFactory.EndInstantiate 'Lösen vom Referenzdokument ------------------- myFactory.EndInstanceFactory 'Update --------------------------------------- myPart.Update End Sub
Wenn ich es so ausführe, dann kommt es in der vorletzten Zeile zu einem Fehler (beim Update). Schau ich mir das Ergebnis unter CATIA an, dann erkenne ich, dass die Input-Geometrie fehlerhaft indiziert wurde. Die Referenzen fehlen. Woran kann dies liegen? Wenn sich die Input-Geometrie im gleichen Part befindet in welches die PowerCopy ausgeführt werden soll, dann funktioniert alles wunderbar. [Diese Nachricht wurde von Bernod am 26. Apr. 2010 editiert.] [Diese Nachricht wurde von Bernod am 26. Apr. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 26. Apr. 2010 13:13 <-- editieren / zitieren --> Unities abgeben: Nur für Bernod
Hallo Bernod , mit dem Codeschnipsel kann man leider nichts anfangen da man gerade dein beschriebenes Problem nicht "sieht". Ich denke es liegt daran das in der Funktion "OK_Button_Click" dein Objekt "IntPointObj" keinen Wert (also Nothing) ist. Du hast wieder im Prozedurkopf hierzu eine Übergabe definiert noch kann man erkennen ob das Objekt eventuell global (Public, Private) deklariert wurde. Ich habe dir mal ganz kurz was zusammen geschrieben. Die Instantiierung des PC funktioniert im Beispiel so wie das es willst. Du solltest, wenn du schon in VBA arbeitest, die Option "Explicit" einschalten. Diese hilft solche nicht deklarierten Variablen zu finden ------------------ MFG Daniel Systeminformation | Inoffizielle CATIA Hilfeseite | CATIA FAQ | Suche | TraceParts (Normteile...) | 3D Content Central (noch mehr Normteile...) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernod Mitglied
Beiträge: 40 Registriert: 03.03.2010
|
erstellt am: 26. Apr. 2010 15:35 <-- editieren / zitieren --> Unities abgeben:
Hallo Daniel, vielen Dank für deine Antwort. Option Explicit habe ich bewusst nicht angegeben, da ich dachte dies bedeutet nur, dass undeklarierte Variablen nicht verwendet werden dürfen. Welchen Vorteil hätte ich dadurch? Oder habe ich das falsch verstanden? Und meine Variable "IntPointObj" ist global deklariert mit "Dim IntPointObj". Ich verstehe den Unterschied zwischen der Deklaration mit Dim, Public oder Private nicht. Versuche ich dein Makro auszuführen, dann passiert nichts bei mir. Weder eine Fehlermeldung noch sonst irgend etwas. Es tut sich einfach nichts. Um ehrlich zu sein blicke ich bei deinem Makro auch nicht ganz durch. Du verwendest viele Funktionen die mir noch fremd sind. Ich werde eine Weile brauchen um das zu verstehen. Anbei ist mein Versuch das Problem zu lösen. Und heir der vollständige Code
Code: Dim IntPointObj1, IntPointObj2 As ObjectPrivate Sub SelectButton1_Click() 'Auswahl festlegen ----------------------------------------------- Dim Filter(0) Filter(0) = "Point" 'Selektion definieren und leeren ---------------------------------- Dim UserSel As Object Set UserSel = CATIA.ActiveDocument.Selection UserSel.Clear 'Selection vornehmen lassen --------------------------------------- 'INPUT-Geometrie 1: Bezugspunkt oben ------------------------------ Dim intSelAbfrageStr As String ' Abfrage ob Selektion stattgefunden hat intSelAbfrageStr = UserSel.SelectElement2(Filter, "Punkt 1 wählen.", False) If intSelAbfrageStr = "Normal" Then ' Wenn ja, dann zuweisen des selektierten .. Set IntPointObj1 = UserSel.Item(1).Value ' .. Objektes an Variable intPointObj1 End If End Sub Private Sub SelectButton2_Click() 'Auswahl festlegen ----------------------------------------------- Dim Filter(0) Filter(0) = "Point" 'Selektion definieren und leeren ---------------------------------- Dim UserSel As Object Set UserSel = CATIA.ActiveDocument.Selection UserSel.Clear 'Selection vornehmen lassen --------------------------------------- 'INPUT-Geometrie 1: Bezugspunkt oben ------------------------------ Dim intSelAbfrageStr As String ' Abfrage ob Selektion stattgefunden hat intSelAbfrageStr = UserSel.SelectElement2(Filter, "Punkt 2 wählen.", False) If intSelAbfrageStr = "Normal" Then ' Wenn ja, dann zuweisen des selektierten .. Set IntPointObj2 = UserSel.Item(1).Value ' ..Objektes an Variable intPointObj2 End If End Sub Private Sub StartButton_Click() 'Abrufen des aktuellen Parts ----------------------------------- Dim Prod As Product Set Prod = CATIA.ActiveDocument.Product Dim Prods As Products Set Prods = Prod.Products Dim myProd As Product Set myProd = Prods.Item("Product3.1") Dim myProds As Products Set myProds = myProd.Products Dim myPartInstance As Product Set myPartInstance = myProds.Item("Part2.1") Dim myPart As Part Set myPart = myPartInstance.ReferenceProduct.Parent.Part 'Abrufen der factory des aktuellen Parts ----------------------- Dim myFactory As InstanceFactory Set myFactory = myPart.GetCustomerFactory("InstanceFactory") 'Start der PowerCopy -------------------------------------------- ' *** Pfad anpassen myFactory.BeginInstanceFactory "PowerCopy", "C:\TEMP_MAKRO\Test01\PowerCopy_Linie.CATPart" 'Start der Instanziierung der Input-Daten ---------------------- myFactory.BeginInstantiate 'Input-Geometrie einlesen --------------------------------------- myFactory.PutInputData "Point.1", IntPointObj1 ' Selektiertes Objekt an die PowerCopy senden myFactory.PutInputData "Point.2", IntPointObj2 ' Selektiertes Objekt an die PowerCopy senden '----------------------------------------------------------------- Dim Instance As ShapeInstance Set Instance = myFactory.Instantiate 'Ende der Instanziierung ---------------------------------------- myFactory.EndInstantiate 'Lösen vom Referenzdokument -------------------------------------- myFactory.EndInstanceFactory 'Update ---------------------------------------------------------- myPart.Update End Sub
Ich glaube der Fehler liegt in dem fett markierten Abschnitt. Gebe ich hier den "Pfad" für das Part an, aus welchem die Input-Geometrie entnommen wird, dann funktioniert es. Ich will jedoch nicht, dass die PowerCopy in dem gleichen Part ausgeführt wird in dem sich die Input-Geometrie befindet, sondern in einem anderen Part. Und genau da liegt der Fehler glaube ich. .....Abgesehen davon ... Eigentlich möchte ich hier auch garnicht den ganzen Pfad "von Hand" angeben, sondern ich möchte, dass die PowerCopy automatisch in das aktive Part eingefügt wird. Nur weiß ich nicht wie das machbar ist. [Diese Nachricht wurde von Bernod am 26. Apr. 2010 editiert.] [Diese Nachricht wurde von Bernod am 26. Apr. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 27. Apr. 2010 13:44 <-- editieren / zitieren --> Unities abgeben: Nur für Bernod
Hallo , Zitat: Und meine Variable "IntPointObj" ist global deklariert mit "Dim IntPointObj". Ich verstehe den Unterschied zwischen der Deklaration mit Dim, Public oder Private nicht.
Dim = Private => Werden Variablen mit "Dim" oder "Private" global deklariert, so sind sie im kompletten Modul sichtbar (D.h. jede Funktion bzw. Routine kann diese Variablen nutzen ohne das sie explizit übergeben werden müssen) Public => Wird eine Variable als "Public" global deklariert, so ist diese Variable in der kompletten VB-Library (also im ganzen Projekt) sichtbar Zitat: Versuche ich dein Makro auszuführen, dann passiert nichts bei mir. Weder eine Fehlermeldung noch sonst irgend etwas. Es tut sich einfach nichts. Um ehrlich zu sein blicke ich bei deinem Makro auch nicht ganz durch. Du verwendest viele Funktionen die mir noch fremd sind. Ich werde eine Weile brauchen um das zu verstehen.
Füge die Bibliothek (*.catvba Datei) zu den VB-Bibliotheken hinzu und öffne den VB-Editor. Im Anschluss blendest du mal die Symbolleiste "Debug" ein (View -> Toolbars -> Debug). Des weiteren solltest du das Watch-Fenster einblenden (View -> Watch Window). Auf der Symbolleiste "Debug" gibt es einen Button der sich "Step into" (Einzelschritt) nennt. Bei jedem Klick auf diesen Button wird das Makro um genau eine Zeile (ausführende Zeilen, also keine Deklarations- bzw. Kommentarzeilen) ausgeführt. Erstens kannst du so genau nachschauen wie ich das Makro aufgebaut habe (Aufruf Funktionen etc.) und zweiten hast du die Möglichkeit im Zusammenspiel mit dem Wacth Fenster Variablen explizit zu überwachen (d.h. den Inhalt der Variablen während der Laufzeit anzusehen). Um nun eine Überwachung einer Variablen oder eines Objekts durchzuführen, musst du zuerst die Variable oder das Objekt mit dem Cursor markieren (es reicht wenn sich der Cursor innerhalb des Namens befindet). Im Anschluss machst du einen Rechtsklick und wählst im Kontextmenü den Punkt "Add Watch" (Überwachung hinzufügen). Den Dialog kannst du einfach mit OK bestätigen. Das zu überwachende Objekt bzw. die Variable) erscheint nun im Watch-Fenster. Jetzt lässt du dein Makro Schritt für Schritt (Step into) ablaufen. Sobald dein zu überwachendes Objekt (bzw. deine Variabel) ein Wert zugewiesen bekommt, kannst du diesen auch im Watch Fenster sehen. Zitat: Eigentlich möchte ich hier auch garnicht den ganzen Pfad "von Hand" angeben, sondern ich möchte, dass die PowerCopy automatisch in das aktive Part eingefügt wird. Nur weiß ich nicht wie das machbar ist.
IMHO wirst du bei einem PowerCopy per VBA immer konstante Strings in deinem Quelltext angeben müssen. Die Methode "BeginInstanceFactory" verlangt als Übergabe zwei Strings. Der erste ist ein konstanter String der den Namen des PowerCopy-Features aus der Quelldatei angibt. Der zweite ist der Pfad zur Quelldatei. Diesen kannst du mit Hilfe der Methode "FileSelectionBox" auch dynamisch gestalten (was dir wiederum nicht unbedingt weiterhilft da der erste String statisch ist ) Des weiteren musst du die Namen der Inputs (string) konstant definieren. D.h. es gibt IMHO keine Möglichkeit das Quell-PowerCopy-Feature auszulesen um diese Strings dynamisch zu gestalten. Im Anhang ist mal eine Pojektmappe mitsamt GUI (UserForm). Das Testprodukt (R16) ist auch mit dabei. Im SOURCE_PART liegt die Datei mit dem PowerCopy-Feature (eine Linie mit zwei Punkten als Inputgeometrie). Im TARGET_PART gibt es die beiden Punkte die als Inputgeometrie für das in das TARGET_PART instanzierte PowerCopy definiert sind. Du startest das Makro, wählst die Quelldatei (Bauteil in dem sich das PowerCopy Feature) befindet aus, sowie die beiden Punkte aus dem TARGET_PART. Anschließend klickst du auf RUN. Das PowerCopy wird IMMER in das Part eingefügt in dem sich auch die beiden Zeilinputgeoemtrien (Punkte) befinden. Hierbei spielt es keine Rolle welches Part oder Produkt im Root-Produkt gerade aktiv ist. Als Screenshot habe ich dir noch den VB-Editor (mitsamt eingeblendeter "Debug" Symbolleiste und Wacth-Fenster angehängt) HTH ------------------ MFG Daniel Systeminformation | Inoffizielle CATIA Hilfeseite | CATIA FAQ | Suche | TraceParts (Normteile...) | 3D Content Central (noch mehr Normteile...) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernod Mitglied
Beiträge: 40 Registriert: 03.03.2010
|
erstellt am: 27. Apr. 2010 15:37 <-- editieren / zitieren --> Unities abgeben:
|
laxl Mitglied
Beiträge: 1 Registriert: 20.03.2012
|
erstellt am: 20. Mrz. 2012 11:19 <-- editieren / zitieren --> Unities abgeben: Nur für Bernod
Hallo zusammen, ich habe momentan ähnliches Problem: Ich möchte eine PowerCopy mittels vbs erstellen. Meine Produkstruktur sieht aus wie oben im Beitrag. Ich möchte also die PowerCopy in einem Part2 des Products2 erstellen. Input A liegt in diesem Part2, Input B liegt in Part1 des Products1. Catia scheitert am Update - Input A wird richtig unter Edit Inputs in Catia angegeben, allerdings fehlt mir dort der Input B. Interessanterweise gibt mir meine InstanceFactory aber zu jedem PowerCopyInput den richtigen Namen aus?! __________________________________________________________________________________________________ ... Dim instanceFactory1 Set instanceFactory1 = part.GetCustomerFactory("InstanceFactory") instanceFactory1.BeginInstanceFactory "PC", "..\*.CATPart" instanceFactory1.BeginInstantiate Set PowerCopyInput = part.FindObjectByName("A.1") MsgBox(PowerCopyInput.Name) '--die richtigen Elemente werden gefunden instanceFactory1.PutInputData "Input A", PowerCopyInput Set PowerCopyInput = part2.FindObjectByName("B.1") MsgBox(PowerCopyInput.Name) '--die richtigen Elemente werden gefunden instanceFactory1.PutInputData "Input B", PowerCopyInput instanceFactory1.Instantiate instanceFactory1.EndInstantiate instanceFactory1.EndInstanceFactory part.Update __________________________________________________________________________________________________ Irgendwie scheitert jeder Versuch - bin jedoch auch noch neu in diesem Themengebiet. Die PowerCopy funktioniert jedenfalls, wenn ich beide Inputs in einem Part habe. Außerdem funktioniert die PowerCopy auch wenn ich sie in Catia manuell einfüge. Der Macro Recorder nimmt das nur leider nicht auf.
Wäre klasse wenn mir hier jemand helfen könnte!! Danke schonmal Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|