Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Parameter aus Produkt Eigenschaften auslesen

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:  Parameter aus Produkt Eigenschaften auslesen (3145 mal gelesen)
K-Volkmann
Mitglied



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

Beiträge: 60
Registriert: 19.06.2007

WIn XP64 Catia V5R19 SP3 HF60<P>Intel I7 3,4GH 16GB RAM , NVIDIA Quadro 4000 2048MB

erstellt am: 22. Aug. 2011 10:49    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 zusammen

ich habe folgendes Problem

wenn ich ein part habe, und unter Eigenschaften/Produkt ("hinzugefügte Eigenschaften) einen neuen Paramter Zeichenkette z.B Kunde anlege, kann ich diesen mit meinem Makro auslesen.
Wenn ich nur ein produkt habe und lege dort auch diesen Parameter an, kann ich diesen nicht auslesen.
Mache ich wiederum ein Unterprodukt und lege dort den Parameter an liest er mir diesen wieder aus.

So wie es aussieht funktioniert das nur beim Hauptprodukt nicht.
Kann mir da jemand weiterhelfen ?

es folgt der kurze Qellkode des makros:

Sub CATMain()

Dim i As Integer
Dim prod As Product
Dim m As Integer

' Exel öffnen
Dim objXL
On Error Resume Next
Set objXL = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
Err.Clear
Set objXL = CreateObject("Excel.Application")
Set oAWBook = objXL.Workbooks.Add
End If

objXL.Visible = True

'Berechnung
m = 12 ' Zeile in Exel
i = 0
p = 0

For i = 1 To CATIA.Documents.Count


On Error Resume Next



Set prod = CATIA.Documents.Item(i).Product
 
 
 
  objXL.Cells(m, "r").Value = prod.Parameters.Item("Kunde").ValueAsString
 
 

  p = p + 1
 
  If Err.Number <> 0 Then
  Err.Clear

End If

    m = m + 1
' End If

Next

End Sub

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 11: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 Nur für K-Volkmann 10 Unities + Antwort hilfreich

probiers mal so, gruß

Code:
Sub CATMain()

Dim i As Integer
Dim prod As Product
Dim m As Integer

' Exel öffnen
Dim objXL
On Error Resume Next
Set objXL = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
    Err.Clear
    Set objXL = CreateObject("Excel.Application")
    Set oAWBook = objXL.Workbooks.Add
End If

objXL.Visible = True

'Berechnung
m = 12 ' Zeile in Exel
i = 0
p = 0

'On Error Resume Next  ' <- wenn davor nicht irgendwo On Error Goto 0 steht
                      '    ist das unnötig

Dim param1 As String, param1Name As String
  param1Name = "Kunde"
Dim j As Integer

For i = 1 To CATIA.Documents.Count
    Set prod = CATIA.Documents.Item(i).Product
   
    With prod
        For j = 1 To .Parameters.Count
            If VBA.Left(.Parameters.Item(j).Name, Len(.PartNumber)) = .PartNumber _
              And VBA.InStr(.Parameters.Item(j).Name, param1Name) <> 0 Then
                param1 = .Parameters.Item(j).ValueAsString
            End If
        Next j
    End With
   
    objXL.Cells(m, "r").Value = param1
    p = p + 1
   
    If Err.Number <> 0 Then
        Err.Clear
    End If

    m = m + 1
' End If

Next

End Sub


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

K-Volkmann
Mitglied



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

Beiträge: 60
Registriert: 19.06.2007

WIn XP64 Catia V5R19 SP3 HF60<P>Intel I7 3,4GH 16GB RAM , NVIDIA Quadro 4000 2048MB

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

Hallo meisterlumpi

super ! , danke ! funktioniert.

Verstanden habe ich das allerdings nicht wie das mit der Schleife J un den 2 parametern param1 und param1Name funktioniert.
kannst du das für einen anfänger, etwas erklären, das ich das nachvollziehen kann ??

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 13:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K-Volkmann 10 Unities + Antwort hilfreich

Klar, sorry

kleines beispiel
hab eine baugruppe mit Produkt1 als hauptprodukt und produkt2 (als unterprodukt) in produkt1. beide haben parameter "Kunde". Kunde von Produkt2 ist Mr. T und von Produkt1 Superman.

ergänzt man den code mit

Code:
...
    With prod
        For j = 1 To .Parameters.Count
       
            Debug.Print "Produkt: " & .PartNumber & _
                        " | Para. Name: " & .Parameters.Item(j).Name & _
                        " | Para. Value: " & .Parameters.Item(j).ValueAsString
...

also zeig mir alle parameter im produkt mit name und value.
wird folgende ausgabe erzeugt.

Code:

Produkt: Produkt1 | Para. Name: Produkt2\Eigenschaften\Kunde | Para. Value: Mr. T
Produkt: Produkt1 | Para. Name: Produkt2\Teilenummer | Para. Value: Produkt2
Produkt: Produkt1 | Para. Name: Produkt2\Nomenklatur  | Para. Value:
Produkt: Produkt1 | Para. Name: Produkt2\Überarbeitung  | Para. Value:
Produkt: Produkt1 | Para. Name: Produkt2\Produktbeschreibung | Para. Value:
Produkt: Produkt1 | Para. Name: Produkt2\Definition | Para. Value:
Produkt: Produkt1 | Para. Name: Produkt1\Produkt2.1\Aktivierungsstatus der Komponente | Para. Value: true
Produkt: Produkt1 | Para. Name: Produkt1\Eigenschaften\Kunde | Para. Value: Superman
Produkt: Produkt1 | Para. Name: Produkt1\Teilenummer | Para. Value: Produkt1
Produkt: Produkt1 | Para. Name: Produkt1\Nomenklatur  | Para. Value:
Produkt: Produkt1 | Para. Name: Produkt1\Überarbeitung  | Para. Value:
Produkt: Produkt1 | Para. Name: Produkt1\Produktbeschreibung | Para. Value:
Produkt: Produkt1 | Para. Name: Produkt1\Definition | Para. Value:

Produkt: Produkt2 | Para. Name: Produkt2\Eigenschaften\Kunde | Para. Value: Mr. T
Produkt: Produkt2 | Para. Name: Produkt2\Teilenummer | Para. Value: Produkt2
Produkt: Produkt2 | Para. Name: Produkt2\Nomenklatur  | Para. Value:
Produkt: Produkt2 | Para. Name: Produkt2\Überarbeitung  | Para. Value:
Produkt: Produkt2 | Para. Name: Produkt2\Produktbeschreibung | Para. Value:
Produkt: Produkt2 | Para. Name: Produkt2\Definition | Para. Value:


da sieht man, dass der Kunde von Produkt2 auch bei Produkt1 steht (weil Produkt2 ist ja unterprodukt von p1). im parametername steht vorne um welches produkt es sich handelt und das fragt das skript ab.

Code:
If VBA.Left(.Parameters.Item(j).Name, Len(.PartNumber)) = .PartNumber _

sprich wenn am anfang von string die partnumber vom produkt steht und nicht eine von einem unterprodukt

Code:
And VBA.InStr(.Parameters.Item(j).Name, param1Name) <> 0 Then

und der parameter name (param1Name = "Kunde") muss im string vorkommen..

param1 und param1Name sind einfach string variablen für den parameter value und den festgelegten Namen ("Kunde" in deinem Beispiel).

gibt wahrscheinlich elegantere Methoden..

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 13: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 K-Volkmann 10 Unities + Antwort hilfreich

kleiner Nachtrag, prinzipiell könntest du auch alle parameter aus dem hauptprodukt auslesen und sie dann mit string Operationen sortieren etc. dann könntest du dir die erste for-schleife die durch alle CATIA.Documents geht sparen. der nachteil dabei ist nämlich, dass CATIA.Documents alle dokumente sind, die in catia geöffnet sind, also nicht nur die aktive Baugruppe. bei großen baugruppen geht das zulasten der geschwindigkeit..

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

K-Volkmann
Mitglied



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

Beiträge: 60
Registriert: 19.06.2007

WIn XP64 Catia V5R19 SP3 HF60<P>Intel I7 3,4GH 16GB RAM , NVIDIA Quadro 4000 2048MB

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

Hallo meisterlumpi

so grob habe ich das jetzt verstanden
es werden sozusagen alle parameter nach der Zeichenkette "Kunde" durchsucht, und wenn eine übereinstimmung gefunden ist,
nimmt er den passenden Wert aus diesem Parameter ?! Ist mein Gedankengang so richtig ?

Ist es auch möglich direkt nur mit dem Parameternamen z.B Kunde auf den Wer´t des Parameters zuzugreifen ohne eine Schleiche laufen zu lassen ? Würde auch reichen, wenn er nur im Hauptprodukt sucht, restliche baugruppe könnte vernachlässigt werden.

Ich habe das an einer grösseren baugruppe mal ausprobiert, läuft schon ziemlich lange.

aber trotzdem 1000 dank . Lösung funktioniert auf jeden fall schon mal.

bis dann, K-Volkmann

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 15: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 K-Volkmann 10 Unities + Antwort hilfreich

das hast du richtig verstanden.
So könnte dein code aussehen ohne die schleife durch alle dokumente. hier wird nur das aktive hauptprodukt durchsucht. prodInContext ist das produkt, auf das sich der parameter bezieht.

Code:
Sub CATMain()
    Dim i As Integer, m As Integer
    Dim param1 As String, param1Name As String
      param1Name = "Kunde"
    Dim prod As Product
      Set prod = CATIA.ActiveDocument.Product
    Dim prodInContext As Product
   
    ' Exel öffnen
    Dim objXL
    On Error Resume Next
    Set objXL = GetObject(, "Excel.Application")
    If Err.Number <> 0 Then
        Err.Clear
        Set objXL = CreateObject("Excel.Application")
        Set oAWBook = objXL.Workbooks.Add
    End If
    objXL.Visible = True
   
    'Berechnung
    m = 12 ' Zeile in Exel
    i = 0
    p = 0
    objXL.Cells(m - 1, "q").Value = "*Bauteil*"
    objXL.Cells(m - 1, "r").Value = "*Kunde*"
   
    With prod.Parameters
        For i = 1 To .Count
            If VBA.Right(.Item(i).Name, Len(param1Name)) = param1Name Then
               
                param1 = .Item(i).ValueAsString
                Set prodInContext = .Item(i).Context
               
                objXL.Cells(m, "q").Value = prodInContext.Name
                objXL.Cells(m, "r").Value = param1
               
                p = p + 1
                If Err.Number <> 0 Then
                    Err.Clear
                End If
                m = m + 1
               
            End If
        Next i
    End With
End Sub


Wenn du alle PartNumbers kennst von den Teilen mit dem Parameter, geht es auch ganz ohne schleife, dann kannst du die parameter direkt übers hauptprodukt ansprechen z.B.

Code:

Dim prod as Product
  Set prod = CATIA.ActiveDocument.Product

  debug.print prod.Parameters.Item("Produkt4\Eigenschaften\Kunde").ValueAsString


bzw.

Code:

  debug.print prod.Parameters.Item( <product_variable>.PartNumber & "\Eigenschaften\" & param1Name).ValueAsString

allerdings ist der string abhängig von der catia sprache. im engl catia geht das so nicht. da müsste dann properties stehen oder so.

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

K-Volkmann
Mitglied



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

Beiträge: 60
Registriert: 19.06.2007

WIn XP64 Catia V5R19 SP3 HF60<P>Intel I7 3,4GH 16GB RAM , NVIDIA Quadro 4000 2048MB

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

Hallo meisterlumpi


vielen  dank !!!
so läuft es noch schneller. klasse !!

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