Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  User-Selektion umbennen

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:  User-Selektion umbennen (6674 mal gelesen)
newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 15. Aug. 2011 16:08    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,
habe ein Problem wo ich hoffe das mir jemand helfen kann mache gerade meine ersten Gehversuche mit VBA und bin schon am verzweifeln.
Folgende Voraussetzungen;
Ich habe ein Produkt (RootProdukt) in dem sich mehrere Unterelemente (Produkte, Parts, etc.) befinden.
Vorhaben;
Nun wähle ich über eine Userselektion ein/ mehrere Elemente (Part, Produkt) aus, dabei kann die Ebene wo sich dieses Element befindet unterschiedl. sein.
Nun möchte ich den Instance-Namen der selektierten Elemente auslesen und an einer bestimmten Stelle einen zusätzl. Text mit anhängen. Das hat auch annährend funktioniert.
nun das Problem;
Wenn ein selektiertes Element nicht in der ersten Ebene des Rootproduktes liegt wird der Name nicht geändert.
soweit ich mich in diesem Forum belesen habe hängt dies damit zusammen das von dem selektiertem Element das direkt übergeordnete Produkt aktiv sein muß.
Leider weiß ich nicht wie ich das auf die Selektion anwende. Kann mir jemand den Quellcode dafür benennen.
Für Hilfe wäre ich dankbar :-)
Zum besseren Verständnis hier mein Quellcode wie ich in derzeit habe:

Private Sub CommandButton_Click()

Dim AnhangInstName As String

    AnhangInstName = "_" & "Zusatztext"
   
    Dim MyString
    Dim z As Integer
    Dim Usersel As Object
    Set Usersel = CATIA.ActiveDocument.Selection
    Usersel.Clear

    ' Variable für Auswahl-Filter (InputObjectType) festlegen
    Dim selPart As Part
    Dim selProd As Product
    Dim selComp As ProductDocument
   
    ' Auswahl-Filter für SelectElement3 (InputObjectType)definieren
    Dim eingabe(1)
    eingabe(0) = "Product"
    eingabe(1) = "Part"
   
    ' Interaktion mit User zur Selektion der Elemente
    MsgBox "Elemente selektieren." + Chr(10) + Chr(10) +, vbInformation
    Status = Usersel.SelectElement3(eingabe, "Bitte die Elemente selektieren", False,
    CATMultiSelTriggWhenUserValidatesSelection, False)

    'Abbruch des Macros
    If (Status = "Cancel") Then
    MsgBox "Macro wird beendet"
    Exit Sub
   
    ' Ansonsten weiter mit User-Selektion
    ' Name vom Element auslesen
    ElseIf Status = "Normal" Then
            For z = 1 To Usersel.Count
            Set oItem = Usersel.Item(z)
            MyString = oItem.Value.Name
           
            ' Zeichenanzahl von links bis einschließlich dem "Punkt"ermitteln
            SuchZeichen = "."
            myposition = InStrRev(MyString, SuchZeichen, -1, 1)
           
            ' kompl. Zeichenanzahl des Elemente-Namen
            mylength = Len(MyString)
           
            ' String von links bis einschließlich "." beibehalten
            newstring = Left(MyString, myposition)
           
            ' neuen String vom Element definieren und zurückgeben
            oItem.Value.Name = newstring & "_" & AnhangInstName

            Next
     
    End If
   
    ' Selektion freigeben --------------------------------------------
    Usersel.Clear
       
End Sub


Danke im voraus
Gruß Matze

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 16. Aug. 2011 01: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 Nur für newmann 10 Unities + Antwort hilfreich

das geht mit Little Cthulhu’s Script. ganz oben auf der seite. ist auch das einzige skript das ich kenne, was product/part namen ohne rekursive funktionen, die zuerst das ganze produkt durchlaufen, ändern kann.

gruß

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

newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 16. Aug. 2011 06:52    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

Hi,
Danke für den Hinweis..... Mmmhh, funktioniert aber leider nicht ganz. Ich kann mit dem Script nur Parts auswählen (keine Unterprodukte, Components) und auch eine Multi-Selektion ist nicht möglich (denke dafür muß eine Schleife eingebaut werden). Wie gesagt bin noch "Frischling" auf dem VBA-Gebiet  .
Kannst du mir helfen und sagen wie bzw. wo ich den Code entsprechend ändern muß oder muß hier dann ein anderer Ansatz her? Danke schonmal!

Gruß Matze

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 16. Aug. 2011 10:09    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 newmann 10 Unities + Antwort hilfreich

Hallo

mit Little Cthulhu’s Script kannst du parts auf beliebigen Dokumentenebenen renamen.
So würde das skript mit schleife aussehen, die parts müssen dabei vorm start des skripts ausgewählt sein.

Code:
' Little Cthulhu's Sctipt - http://www.catiav5forum.de/wbb3/wbb/index.php?page=Thread&postID=29885#post29885

Sub CATMain()
Dim i As Integer
' retrieve selection for active document
Dim varSelection
Set varSelection = CATIA.ActiveDocument.Selection

''' set filter for objects to be selected
''Dim ArrSelectionFilter(1)
''ArrSelectionFilter(0) = "Part"
''ArrSelectionFilter(1) = "Product"
''
''Dim strSelResult As String
''strSelResult = varSelection.SelectElement2(ArrSelectionFilter, "Select part that needs to be renamed", False)

' if user selected part
Dim selElement As SelectedElement
Dim prtSelected As Part
Dim prdSelected As Product
Dim prdParent As Product
Dim prdReference As Product
Dim prdSource As Product
Dim iProduct As Integer
Dim strNewPartNumber As String

If (varSelection.Count > 0) Then
   
    For i = 1 To varSelection.Count
   
        ' retrieve selected part
        Set selElement = varSelection.Item(i)
   
        ' check type of selected object (can be both Part and Product)
        If (TypeName(selElement.Value) = "Product") Then
            ' get product
            Set prdSelected = selElement.Value
           
            ' product selected retrieve part from it
            Set prtSelected = Nothing
            On Error Resume Next
                Set prtSelected = selElement.Value.ReferenceProduct.Parent.Part
   
            If (Err.Number <> 0) Or (prtSelected Is Nothing) Then
                Err.Clear
              'MsgBox "Selected Product doesn't contain a part. Exiting...", vbCritical, "Wrong object"
                Exit Sub
            End If
   
        Else
            ' part selected, get it right from selection
            Set prtSelected = selElement.Value
   
            ' get Product that is associated with PartDocument that contains selected part
            Set prdSelected = selElement.LeafProduct
   
        End If
   
        ' now we want to find corresponding product from a productdocument that contains selected part product
        ' get parent product
        Set prdParent = Nothing
        On Error Resume Next
            Set prdParent = prdSelected.Parent.Parent
   
        If Not (prdParent Is Nothing) Then
            ' get associated product document
            Set prdReference = Nothing
            On Error Resume Next
                Set prdReference = prdParent.ReferenceProduct
   
            If Not (prdReference Is Nothing) Then
                ' get product associated with selected part product
                For iProduct = 1 To prdReference.Products.Count
                    ' cycle through all products in product document
                    Set prdSource = prdReference.Products.Item(iProduct)
   
                    ' look for match of reference products
                    If (prdSource.ReferenceProduct Is prdSelected.ReferenceProduct) _
                      And (prdSource.Name = prdSelected.Name) Then
                        Set prdSelected = prdSource
                        Exit For
                    End If
                Next
   
            Else
                Err.Clear
            End If
   
        Else
            Err.Clear
        End If
   
        ' display dialog box to allow user to define new part number
        Dim strOriginalPartNumber As String
        strOriginalPartNumber = prdSelected.PartNumber
   
        strNewPartNumber = InputBox("Enter new part number for selected part: ", strOriginalPartNumber)
   
        ' retrieve entered name
        If (strNewPartNumber <> "Cancel") Then
            prdSelected.PartNumber = strNewPartNumber
            prdSelected.Name = prdSelected.PartNumber & ".ori"
        End If
   
    Next i
   
End If
End Sub



Zitat:
Nun wähle ich über eine Userselektion ein/ mehrere Elemente (Part, Produkt) aus, dabei kann die Ebene wo sich dieses Element befindet unterschiedl. sein.
Nun möchte ich den Instance-Namen der selektierten Elemente auslesen und an einer bestimmten Stelle einen zusätzl. Text mit anhängen.

mehrfach selektion mit products und parts die darin enthalten sind umzubenennen wird nicht ganz einfach. es gibt ne möglichkeit, die ist allerdings extrem rechenintesiv und daher nicht zu empfehlen.

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 16. Aug. 2011 11: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 newmann 10 Unities + Antwort hilfreich

nochmal hallo

alternative kannst du auch mein skript benutzen, das führt halt zunächst eine rekursive product erkennung durch, sprich bei wirklich großen baugruppen kann das 2-3 sekunden dauern. Allerdings ist es damit möglich beliebige products UND parts gleichzeitig zu renamen, egal wie viele und egal wo sie sich im product befinden (also ob Haupt-, Über-, oder Unterproduct).

[Diese Nachricht wurde von meisterlumpi am 04. Sep. 2011 editiert.]

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

newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 16. Aug. 2011 14:55    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,
habe mal dein Alternativ-Script ausprobiert (da schon Produkte/Parts ausgewählt werden sollten) und war fürs erste begeistert. Hatte gedacht das man mit der Such-Funktion und einer Schleife ans Ziel kommt aber auf so ein komplexes Modul/ Funktion wäre ich nie gekommen (hätte ich alleine nie geschafft).

Also erstmal ein doppelten superdank  .... aber irgenwie funktioniert das mit den Produkten bzw. Componenten nicht Das Makro läuft ohne Fehler durch aber manche Produkte/ Components werden nicht umbenannt (auch nicht bei Einzelselektion bzw. wenn diese in der 1. Ebene stehen)??

Ach ja,kann man die Selektion auch nach dem Makro-Aufruf durchführen (die Tools-Palette mit dem blauen "Beutel").

...hoffe du kannst auch hier weiterhelfen.....

Gruß Matze

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 17. Aug. 2011 02:01    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 newmann 10 Unities + Antwort hilfreich

So dann, Produkte mit Komponenten machen die sache nochmal ein bisschen komplizierter, da man die nicht einfach umbenennen kann wie Produkte. und produkte die unter komponenten liegen auch nicht..

aber gehen tuts doch. weil ich ihn da leichter updaten kann hab ich den neuen code auf meine homepage gestellt.

http://nj.riotdowntown.com/2011/06/obtain-the-structure-for-a-catproduct/


C_DocStructureObject und M_DocStructure stehen ganz oben auf der seite unter "Core Functions". das modul M_PartProductRename steht bisschen weiter unten unter "Usage/Examples". Alle drei Module/Klasse haben sich geändert, also die alten löschen und neu kopieren. (und immer die buttons benutzen um den code zu kopieren, sonst haste zeilennummer mit drin)

es ist immernoch so, dass die objekte vorm makro start selektiert sein müssen. Wenn du das makro erst starten willst und dann den user auffordern willst was auszuwählen würd ich das mit ner userform machen. Die würd ich dann vbModal anzeigen, also so, dass der user noch was auswählen kann wenn die userform auf ist. wenn er dann fertig ist würd ich den user einfach auf nen button klicken lassen um den durchlauf zustarten. (mit ner msgbox geht das leider nicht, da man die zuerst bestätigen muss bevor man was anderes auswählen kann.)

ich hab eine do while schleife drin, mit ner abbruchbedinung von 100 durchläufen. wenn ihr also produkte habt mit mehr als 100 komponenten auf 100 ebenen untereinander dann muss man die zahl hochsetzten (oder mal über seine produktstruktur nachdenken).


strZusatz = "_whatever"
ist die variable, die jeweils an den namen angehangen wird, steht ganz oben im rename modul. wenn du strZusatz im code suchst findest du auch die stellen wo die namen geändert werden und kannst den code da anpassen wie du's haben willst.

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

newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 17. Aug. 2011 06:48    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,
habe es mal versucht aber irgendwie läuft er dabei auf den Fehler Runtime-Error '13': Type mismatch
Wenn ich dann auf Debug gehe springt er in die Funktion;
"Public Function FindParentProductDocument"
auf die Zeile;
"Set iProduct = iProduct.Parent.Parent"
Habe es auch mit einem einfachen Produkt (nur 1 Part/ Produkt/Komponenete enthalten)probiert und nur eines davon selektiert mit dem gleichen Fehlerbild.
Weißt du wo hier der "Hund begraben" liegt??

Gruß Matze

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 17. Aug. 2011 08:39    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 newmann 10 Unities + Antwort hilfreich

probier mal im M_DocStructure modul die zeile
Code:
Public Function FindParentProductDocument(iProduct As Product) As ProductDocument


zuändern in
Code:
Public Function FindParentProductDocument(iProduct) As ProductDocument

und die Zeile

Code:
Public Function IsComp(iProduct As Product) As Boolean


in
Code:
Public Function IsComp(iProduct) As Boolean

(ich habs grad nochmal mit einen produkt ausprobiert, also neues vba projekt gemacht und den code von der seite reinkopiert und lief einwandfrei.)


Edit:
du könntest auch noch probieren aus dem

Code:
Loop While M_DocStructure.IsComp(iProduct)

ein

Code:
Loop While M_DocStructure.IsComp(iProduct) = True


zumachen.

[Diese Nachricht wurde von meisterlumpi am 17. Aug. 2011 editiert.]

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

newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 17. Aug. 2011 10:04    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


Struktur.jpg

 
Hallo,
habe deine Änderungen eingebracht und jetzt eine neue Fehlermeldung/ Macroabbruch  :
Run-Time error
Method 'SetImpl' of Objekt 'Documents' failed
Debug-Zeile:
With CATIA.Documents.Item(ParentProductFileName).Product.Products.Item(curProduct.Name)

Muß ich vielelicht bei der Erstellung des VBA-Projektes anders vorgehen (habe bisher immer ein vorhandenes Macro genommen neu abgespeichert, alle Userforms/ Module, etc. gelöscht und mit Insert neu erstellt) wüßte auch nicht wie man sonst ein neues VBA-Projekt erzeugt. Denke aber das der Fehler damit nicht zusammenhängt, oder??
Anbei mal wie meine Struktur aussieht.
in Modul1:
lade ich die Userform
Userform (mit einem CommandButton):
beim clicken auf den Button wird der Quellcode von deinem M_PartProductRename gestartet.

alles andere ist wie von dir beschrieben
ist hier vielleicht schon ein Fehler??

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 17. Aug. 2011 10:29    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 newmann 10 Unities + Antwort hilfreich

generell sollte man für neue projekte auch immer ein neues VBA projekt anlegen. So startet man auch wieder mit den standard einstellungen und übernimmt nicht die vom vorherigen projekt, wo man nur die module gelöscht hat. (weil du ja auch nicht unbedingt weißt was der ersteller des Projekts so alles geändert hat und was davon deinen code "behindern" wird)

neues projekt erstellst du in CATIA -> ALT + F8 -> 'Makrobibliotheken' -> BibTyp auf 'VBA-Projekte' stellen -> 'Neue Bib erzeugen'

über 'Vorhandene Bib hinzufügen' kannst du dann die runtergeladene catvba datei in deine bib "aufnehmen" usw.

[Diese Nachricht wurde von meisterlumpi am 04. Sep. 2011 editiert.]

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

newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 17. Aug. 2011 14:40    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

habe dein Macro heruntergeladen, ein "jungfreuliches" Produkt erstellt und nur ein Part eingefügt. Dieses selektiert und das Macro gestartet.
Erhalte dann wieder die Fehlermeldung;
Typ-Mismatch Error-Run Time
Debug-Zeile:
Set iProduct = iProduct.Parent.Parent

wenn ich dann die oben von dir beschriebenen Modifikationen ausführe kommt wieder die Fehlermeldung/ Macroabbruch:
Run-Time error
Method 'SetImpl' of Objekt 'Documents' failed
Debug-Zeile:
With CATIA.Documents.Item(ParentProductFileName).Product.Products.Item(curProduct.Name)

Scheinbar liegt das Problem doch woanders........seufz... zumal deine Ursprungsversion (mit dem Benennungsbug) ja wenigstens durchlief aber halt nicht das macht was ich wollte....seufz....

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 17. Aug. 2011 17:10    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 newmann 10 Unities + Antwort hilfreich

Die codezeile, die bei dir den fehler auslöst wird eigentlich nur dann aufgerufen wenn auch eine komponente in der baugruppe vorhanden ist. anscheinend wird sie bei dir immer aufgerufen was vermuten lässt, dass der fehler in zeile 62 liegt:
Code:
If M_DocStructure.IsComp(ParentProduct) Then

                   
IsComp überprüft ob das Product eine Komponente ist oder ein normales Produkt. dabei wird entweder wahr oder falsch zurückgegeben von der function. Ich gehe davon aus, dass die bei dir immer wahr zurückgibt.. das kannste einfach mal testen indem du im projekt ein neues modul mit folgendem code erstellst.
Code:
Sub CATMain()
    Call M_DocStructure.CATMain
   
    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    Dim sel1 As Product
    Set sel1 = sel.Item(1).Value
   
    MsgBox M_DocStructure.IsComp(sel1)
End Sub

Dann mal ein product selektieren und das modul starten. beim product sollte die msgbox "falsch" anzeigen. wenn du eine komponente auswählst sollte "wahr" angezeigt werden.

und da die vorschläge die ich dir 4 posts drüber geschrieben hab nicht geholfen haben solltest du die wieder rückgängig machen. and den variablen typen scheints ja nicht gelegen zu haben.

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

newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 18. Aug. 2011 06: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

ja du hast recht, wenn ich deinen Test durchführe wird jedesmal "wahr" ausgegeben egal was ich auswähle (Product, Part, Componente).
Was bedeutet dies jetzt?

(Änd. habe ich zurückgesetzt...)

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 18. Aug. 2011 08:10    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 newmann 10 Unities + Antwort hilfreich

folgendes (neues) modul könntest du noch probieren:

Code:
Sub CATMain()

  'Call M_DocStructure.CATMain
   
    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    Dim sel1 As Product
    Set sel1 = sel.Item(1).Value
   
    MsgBox IsComp2(sel1)
   
End Sub


Public Function IsComp2(iProduct As Product) As Boolean
  'On Error Resume Next
    Dim P1 As Product, P2 As Product
    IsComp2 = True
    Set P1 = iProduct.ReferenceProduct
  ' falls das Objekt keine Product ist, ist es auch
  ' keine Component
  If Err.Number <> 0 Then
      IsComp2 = False
      Exit Function
  End If
'    For Each fDocument In pDocuments
'        Set P2 = fDocument.Product
    For i = 1 To CATIA.Documents.Count
        Set P2 = CATIA.Documents.Item(i).Product
        If P1 Is P2 Then
            IsComp2 = False
            Exit For
        End If
    Next
End Function


wie vorhin, "wahr" bei comp. "falsch" bei product und part.

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 18. Aug. 2011 08:25    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 newmann 10 Unities + Antwort hilfreich

falls das auch nicht funktioniert, dann ergänze mal diese funktion in dem modul was du grad erstellt hast (siehe meine antwort vor 5 min.)
und änder die Zeile in der CATMain() entsprechend von
Code:
MsgBox IsComp2(sel1)

in
Code:
MsgBox IsComp3(sel1)

____

Code:
Public Function IsComp3(iProduct As Product) As Boolean
  'On Error Resume Next
    Dim P1 As Product, P2 As Product
    IsComp3 = True
    Set P1 = iProduct.ReferenceProduct
  ' falls das Objekt keine Product ist, ist es auch
  ' keine Component
  If Err.Number <> 0 Then
      IsComp3 = False
      Exit Function
  End If
    For i = 1 To CATIA.Documents.Count
        Set P2 = CATIA.Documents.Item(i).Product
        If P1.PartNumber = P2.PartNumber Then
            IsComp3 = False
            Exit For
        End If
    Next
End Function


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

newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 18. Aug. 2011 09:17    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

habe in beiden Fällen folgende Fehlermeldung;
Run-time error '438':
Object doesen't support this property or method

Debug-Zeile:
Set P2 = CATIA.Documents.Item(i).Product

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 19. Aug. 2011 20:42    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 newmann 10 Unities + Antwort hilfreich

Hier ist noch eine andere Funktion, die prüft ob Komponente oder nicht. Die hab ich jetzt auch in meinen code eingebaut, sprich falls die bei dir funktioniert kannste die VBA-PartProductRename.catvba nochmal runterladen und ausprobieren -> http://nj.riotdowntown.com/downloads/?did=3

ansonsten weiß ich ehrlich gesagt auch nicht mehr weiter, überall wo ich das makro ausprobiert hab bzw. ausprobieren hab lassen, hat es funktioniert. Welche Catia Version und Servicepack benutzt du eigentlich?

Code:

Sub CATMain()
    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    Dim sel1 As Product
    Set sel1 = sel.Item(1).Value
   
    MsgBox IsComp2(sel1)
End Sub

'----------------------------
' IsComp2 (by Little Cthulhu):
' - checks if product is a component
' - überprüft, ob das Produkt eine Komponente ist
'=========================================================
Public Function IsComp2(prdProductToCheck As Product) As Boolean
    ' check that product is not a root (otherwise it is definitely NOT component)
    If (TypeOf prdProductToCheck.Parent Is Application) Then
        ' it is a root product and NOT a component
        IsComp2 = False
    Else
        ' check refernce product (where it is located)
      ''If (prdProductToCheck.ReferenceProduct Is prdProductToCheck.ReferenceProduct.Parent.Product) Then
        If (prdProductToCheck.ReferenceProduct.PartNumber = prdProductToCheck.ReferenceProduct.Parent.Product.PartNumber) And _
          (prdProductToCheck.ReferenceProduct.Name = prdProductToCheck.ReferenceProduct.Parent.Product.Name) Then
            IsComp2 = False
        Else
            IsComp2 = True
        End If
    End If
End Function


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

newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 22. Aug. 2011 06:25    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

Hi,
also habe R19SP9 und als Betriebssystem Windows7 und somit 64bit-Catia und hier liegt glaube ich auch das Problem. Habe dein Macro an einem 32-bit XP-Rechner (32bit-Catia) ausprobieren lassen und es funktioniert einwandfrei  Bei einem 64-bit XP-Rechner (64bit-Catia) ist das gleiche Problem wie bei mir und das Macro läuft auf einen Fehler.
weißt du wo man die Einstellungen machen muß bzgl. des Unterschiedes zwischen 32 und 64 bit?
Wie gesagt unter 32bit-Catia läuft das Macro perfekt und macht auch genau das was ich möchte  . Jetzt müßte es halt 64-bit-lauffähig sein........ 

Ach ja deine Funktion liefert auch bei mir das richtige Ergebnis (Komponente =true; Part/Produkt = false).

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 22. Aug. 2011 09:08    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 newmann 10 Unities + Antwort hilfreich

Ich hab leider keinen zugang zu ein 64bit catia, daher kann ich dir so direkt nicht weiterhelfen. im forum hab ich noch 2 themen gefunden die in die richtung gehen.

http://ww3.cad.de/foren/ubb/Forum137/HTML/002979.shtml

http://ww3.cad.de/foren/ubb/Forum137/HTML/004138.shtml

Zitat:
schau mal im Visual Basic ob unter Extras -> Verweise irgendwo "Missing" steht. Den Haken dort rausmachen.

Edit:
Ein Kollege hat mir gerade folgendes zurückgeschrieben

Zitat:
Works fine on Win2003 server x64, both in R19 and R20 x64 releases.

[Diese Nachricht wurde von meisterlumpi am 22. Aug. 2011 editiert.]

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

newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 23. Aug. 2011 06:47    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

so aber jetzt.....also,
Var-1: habe keine References gefunden welche mit "Missing" deklariert sind.
Var-2: Auch das mit dem unter 32bit exportieren und unter 64bit importieren hat nichts gebracht (selbe Fehlermeldung wie vorher)

Mit deinem 2. Zitat "Works fine on Win2003 server x64, both in R19 and R20 x64 releases." kann ich leider nichts anfangen, was ist damit gemeint??

Fazit:
also erstmal ein Riesen-Dankeschön für deine Hilfe      , habe dich hoffentlich nicht zu sehr genervt. Ein so komplexer Quellcode mit Functionen übersteigt halt noch mein "Einsteigerwissen". Daher hätte ich halt versucht über eine Schleife den jeweiligen Namen in der Selektion mit der Suchfunktion ausfindig zu machen und dann irgendwie das übergeordnete Produkt zu aktivieren..... dein Macro läuft ja wie gesagt auf 32 bit werde es also erstmal dabei belassen (auch wenn hier natürlich der Catia-Speicher schnell an seine Grenzen kommt)in der Hoffnung es irgendwann auch mal in 64 bit lauffähig zu bekommen.
Danke und Gruß
Matze

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 23. Aug. 2011 09: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 Nur für newmann 10 Unities + Antwort hilfreich

"Works fine on Win2003 server x64, both in R19 and R20 x64 releases." soll heißen, dass das makro bei ihm in der 64bit catia version (R19 & R20) funktioniert hat. er benutzt zwar win2003 server x64 anstatt win7, aber ich kann nicht wirklich glauben, dass hier das problem liegt.

Es nervt mich nur ein bisschen, dass es nicht funktioniert :-) Aber eine idee hab ich noch. Probiers mal mit folgendem makro.. das funktioniert ganz für sich alleine, sprich mach ein neues projekt nur mit einem modul mit diesem code (ohne M_Docstructure, etc..)

vor dem starten wieder alles auswählen (was man will..).

Code:
Sub CATMain()
    '----------------------------
    Dim extStr As String
      extStr = "__XYZ***___"
    '----------------------------
    Dim i As Integer
   On Error Resume Next
    Dim ActiveDocument1 As Document
      Set ActiveDocument1 = CATIA.ActiveDocument
   If Err.Number <> 0 Then
       ' in case no open document was found
       ' ...
       Err.Clear
   End If
    Dim Selection1 As Selection
      Set Selection1 = ActiveDocument1.Selection
   
    ' check document type for active document
    Select Case TypeName(ActiveDocument1)
        Case Is = "ProductDocument"
            ' active document is a product
            For i = 1 To Selection1.Count
                With Selection1.Item(i)
                    ' check selected element
                    If TypeName(.Value) = "Product" Then
                            Dim product1 As Product
                              Set product1 = .Value
                            If TypeName(product1.Parent.Parent) = "Application" Then
                                ' if item is main document
                                product1.PartNumber = product1.PartNumber & extStr
                            Else
                                ' if item is a subproduct
                                Dim Product1Parent As Product
                                  Set Product1Parent = product1.Parent.Parent.ReferenceProduct
                                Dim product2 As Product
                                  Set product2 = Product1Parent.Products.Item(product1.Name)
                                product2.Name = product2.Name & extStr
                            End If
                    End If
                End With
            Next i
        Case Is = "PartDocument"
            ' active document is a part
            Dim partDocument3 As PartDocument
              Set partDocument3 = ActiveDocument1
            Dim product3 As Product
              Set product3 = partDocument3.GetItem(ActiveDocument1.Part.Name)
            product3.PartNumber = product3.PartNumber & extStr
        Case Else
            ' active document is neither product nor part
            Call MsgBox("Macro only works with product- or part documents.", vbInformation)
    End Select
   If Err.Number <> 0 Then
       ' in case there was an error
       ' ...
       Err.Clear
   End If
End Sub

gruß

[Diese Nachricht wurde von meisterlumpi am 04. Sep. 2011 editiert.]

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

newmann
Mitglied



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

Beiträge: 18
Registriert: 15.08.2011

erstellt am: 23. Aug. 2011 10: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

    Oooh Held, ooh Held du großer Krieger vor deines Schatten-Angesicht, da knie ich nieder..... etc., etc.

doppel, dreifach-supi  ..................was lange währt wird letztendlich gut...
was soll ich sagen es fuunnzt genau so wie ich es haben möchte..ganz ohne irgendein "gezicke".....kurz perfekt
Danke dir vielmals....  

hast du vielleicht einen Tip für mich wie ich an Lektüre herankomme, da ich feststellen mußte das mein Können/Wissen doch sehr weit hinten steht. Habe bisher nur Excel-VBA gefunden (da stammt mein Grundwissen her). Und das Catia-Script von "Ziethen" scheint mir nicht hilfreich, oder??

aber nochmal spitzen-Dank

Gruß Matze

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

meisterlumpi
Mitglied



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

Beiträge: 118
Registriert: 15.04.2011

Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64

erstellt am: 23. Aug. 2011 11:50    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 newmann 10 Unities + Antwort hilfreich

kein problem, freut mich,dass es geklappt hat.

Dieter R. Ziethen Makroprogrammierung und Jens Hansens Kochbuch kann ich beide empfehlen. Den Ziethen hab ich als Nachschlagewerk benutzt, wobei das Kochbuch sich mit konkreten Beispielen auseinander setzt.

ansonsten gibts beispiele im internet andere foren wie
http://www.catiav5forum.de/
http://www.coe.org/Default.aspx?tabid=210

mike's blog ist sehr informativ http://v5vb.wordpress.com/

den makrorecorder und viel ausprobieren.

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