Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  PowerCopy in Produktumgebung ausführen

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:  PowerCopy in Produktumgebung ausführen (3208 mal gelesen)
Bernod
Mitglied



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

Beiträge: 40
Registriert: 03.03.2010

erstellt am: 26. Apr. 2010 10:28    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,

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


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

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 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 Bernod 10 Unities + Antwort hilfreich


InsertPCinProd.rar

 
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



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

Beiträge: 40
Registriert: 03.03.2010

erstellt am: 26. Apr. 2010 15:35    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


Test01.zip

 
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 Object

Private 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


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

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 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 Bernod 10 Unities + Antwort hilfreich


InsertPCinProd_v1.1.rar


Step_Into.png

 
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



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

Beiträge: 40
Registriert: 03.03.2010

erstellt am: 27. Apr. 2010 15:37    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
Vielen Dank für die sehr ausführliche Erklärung! 

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

laxl
Mitglied


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

Beiträge: 1
Registriert: 20.03.2012

erstellt am: 20. Mrz. 2012 11:19    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 Bernod 10 Unities + Antwort hilfreich

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

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