Autor
|
Thema: Parameter aus Produkt Eigenschaften auslesen (3145 mal gelesen)
|
K-Volkmann Mitglied
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 / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für K-Volkmann
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
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 / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für K-Volkmann
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 unterproduktCode: 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
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 / zitieren --> Unities abgeben: Nur für K-Volkmann
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
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 / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für K-Volkmann
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
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 / zitieren --> Unities abgeben:
|