Autor
|
Thema: Parameter auslesen (4503 mal gelesen)
|
milburn Mitglied Werkzeugkonstrukteur
Beiträge: 16 Registriert: 07.08.2006
|
erstellt am: 11. Sep. 2009 08:46 <-- editieren / zitieren --> Unities abgeben:
Hallo , ich bräuchte mal ein bisschen Hilfe ! simple bekannte Aufgabe ;-) : Ein Produkt durchlaufen und aus jedem vorhandenen Part (auch in Unterprodukten) 5 feste Parameter + Teilenamen auslesen . Diese anschließend in Exel übertragen. Meine Recherchen hier haben mir gezeigt, das ich mit dieser Absicht nicht alleine dastehe. (siehe Suche nach Parametern ) Ich habe mir einige Bruchstücke aus Beiträgen herauskopiert und versucht diese zu kombinieren, jedoch komme ich nicht zur finalen Lösung ! schaut vielleicht mal kurz drüber .... 1.) Anzahl der Parts bestimmen : ' Anzahl der Parts i = CATIA.Documents.Count MsgBox (i) ' nur zur info für mich 2.)
'Parameter auslesen Set prod = CATIA.ActiveDocument.Product Set objXL = CreateObject("Excel.Application") objXL.Visible = True Set oAWBook = objxl.Workbooks.Add objXL.Cells(2,6).Value = prod.Parameters.Item("Werkstoff").ValueAsString objXL.Cells(2,7).Value = prod.Parameters.Item("Bemerkung").ValueAsString objXL.Cells(2,11).Value = prod.Parameters.Item("Laenge").ValueAsString objXL.Cells(2,14).Value = prod.Parameters.Item("Breite").ValueAsString objXL.Cells(2,17).Value = prod.Parameters.Item("Hoehe").ValueAsString End Sub
Das klappt soweit mit einem einzelnen Part ganz gut, jedoch möchte in jedes Part rein. Wie hier gelesen hat wohl in Catia jedes Part-Dokument eine fortlaufende Nummer. Wie schaffe ich es jetzt einen Zähler einzusetzen, der die Parts anhand der Dokumentnummer bis zur oben bereits ausgelesenen Gesamtzahl durchläuft ? Und den Teilenamen (Dateiname geht auch ) hätte ich auch gern dabei. Wie frag ich den ab ? danke im voraus !!!!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Maetes Mitglied Student
Beiträge: 118 Registriert: 05.05.2009 XP 64Bit CATIA V5R19SP4 MS Office 2003
|
erstellt am: 11. Sep. 2009 09:57 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
Parts in einem Produkt findest du glaubs da: CATIA.ActiveDocument.Product.Products.Item(x) Dafür kann ich dir nur die Überwachung im Makroeditor empfehlen. Welche Parameter willst du auslesen? [Diese Nachricht wurde von Maetes am 11. Sep. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
milburn Mitglied Werkzeugkonstrukteur
Beiträge: 16 Registriert: 07.08.2006
|
erstellt am: 11. Sep. 2009 10:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Maetes, danke für die schnelle Antwort ! wir haben eigene Parameter eigefügt, die von Hand mit Werten (Strings) belegt werden, wie z.B. Werkstoff : 1.2379 Bemerkung : spiegelbildlich ect....Es sollen nicht alle Parameter abgefragt werden. In dem Programm liest er die Werte auch aus. Aber halt nur von dem aktuellen Part. Es soll ja jedes Part genommen werden. Anbei ein kleiner Screenshot... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 11. Sep. 2009 17:55 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
|
milburn Mitglied Werkzeugkonstrukteur
Beiträge: 16 Registriert: 07.08.2006
|
erstellt am: 12. Sep. 2009 18:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Zoltan, danke für die Links...genau was ich gesucht habe !!!! Jetzt wird alles gut ! ;-) Das Skript durchläuft jetzt alle Parts und nimmt noch den Teilenamen mit : ------------------------- Sub CATMain() Dim i as Integer Dim prod As Product Dim m As Integer ' Exel öffnen Set objXL = CreateObject("Excel.Application") objXL.Visible = True Set oAWBook = objxl.Workbooks.Add 'Berechnung m=2 ' Zeile in Exel i = 0
for i = 1 to CATIA.Documents.Count If (Right(CATIA.Documents.Item(i).Name,7) = "CATPart") then Set prod = CATIA.Documents.Item(i).Product objXL.Cells(m,2).Value = prod.PartNumber objXL.Cells(m,3).Value = prod.Parameters.Item("eigener Parameter1").ValueAsString objXL.Cells(m,3).Value = prod.Parameters.Item("eigener Parameter2").ValueAsString ect... m=m+1 end if next End Sub ------------------------------ Versuche das Ganze jetzt noch im Format ein bisschen zu schuppsen und zu optimieren (Bei Parts welche durch Baugruppensymetrie erstellt wurden, steigt er noch aus ...) Kommme aber jetzt erst mal weiter... Danke Zoltan, danke Maetes .. Bis zur nächsten Frage....... Gruß milburn 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: 13. Sep. 2009 13:17 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
Hallo milburn, das was du da programmiert hast funktioniert aber ist nicht gut. Das Problem ist die Documents.Collection aus CATIA. Folgendes Szenario zur Verdeutlichung: Du öffnest ein Produkt mit 10 Part. Du schließt diese wieder (über File -> Close oder über das X). Jetzt schaust du die Documents-Collection an. Du wirst in 50% der Fälle feststellen das sich die Dokumente des zuvor geschlossenen Produkts noch in der Collection befinden das Produkt aber schon geschlossen ist. Das heißt dein Makro ist extrem fehleranfällig und nicht stabil. Wenn es geht solltest du die Documents-Collection nur dafür verwenden um neue Dokumente anzulegen. Die Zeile "If (Right(CATIA.Documents.Item(i).Name,7) = "CATPart")" brauchst du auch nicht. Dazu gibt es eine Klasse Namens "TypeName". Diese stellt den Datentyp des jeweils übergeben Objekts (bzw. Variable) dar. Das heißt folgende Zeile sieht einfach besser aus "If TypeName(CATIA.Documents.Item(i).Name) = PartDocument" Jetzt zu meinem Lösungsvorschlag für dein Problem: ENTWEDER du durchläufst dein Produkt rekursiv und holst dir so die Parameter aus den einzelnen Parts. Ein gutes Snippet wie man ein Produkt rekursive durchläuft findest du HIER (erster Beitrag von TomTom)(dies ist sicherlich der schönere und ressourcenfreunlichere Weg über auch deutlich komplizierter wie der ODER-Weg) ODER du definierst dir eine neue Selektion und selektierst alle Produkte deinen Produkts (Parts die in einem Produkt hinterlegt sind sind für CATIA im ActiveDocument Produkte). Jetzt durchläufst du die Selektion (die Abfrage ob es sich um eine CATPart handelt bleibt) und schreibst die Parameter raus. Ich denke das ist die einfachst Möglichkeit. Diese ist im Gegensatz zur Document-Collection stabil. In dem Sinne wünsche ich dir einen schönen Sonntag ------------------ 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 |
IIYTII Mitglied
Beiträge: 85 Registriert: 30.05.2007 Catia V5 R19 Programmierung unter CATvba
|
erstellt am: 14. Sep. 2009 08:31 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
|
milburn Mitglied Werkzeugkonstrukteur
Beiträge: 16 Registriert: 07.08.2006
|
erstellt am: 14. Sep. 2009 09:14 <-- editieren / zitieren --> Unities abgeben:
Hallo DanielFr, wäre auch ein Wunder, wenn das Skript stabil wäre. Ist mein Erstes ....! ..grins.. Jetzt muss ich erst mal meine Hausaufgaben machen, sprich die Bedeutung rekursiver Abläufe erkennen ect. Da fehlen mir halt noch viele Grundlagen.... Der Link ist da sehr hilfreich ! Bei "If TypeName(CATIA.Documents.Item(i).Name) = PartDocument" steigt er mir aus,d.h.er erkennt dass CATPart nicht und läuft bis zum Ende ohne Aktion. ??
Und noch was !! Ich möchte einfach wiessen, wie oft das Bauteil z.B. "404A001" in meinem Gesamtprodukt vorkommt. Also für die Stückliste zählen. Zoltan hat mir oben schon einen Link gegeben, dessen Script ich noch nicht ganz verstehe, aber ich arbeitet dran....Zum Glück sind viele Anmerkungen im Skript vorhanden Ist das wirklich so ein Akt ? Das Zählen aller Catparts im Produkt mache ich in einer Zeile, nach einem Namen im Produkt suchen mit soooo vielen ? Danke IIYTII für den Link. Die grauen Herbstabende sind gerettet ...Jetzt hab ich erst mal eine Menge zu Lesen und zu Probieren.... Danke ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 14. Sep. 2009 16:53 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
Hallo, TypeName gibt ein String zurück. Korrigiere die Zeile auf Code: If TypeName(CATIA.Documents.Item(i)) = "PartDocument" then <code> endif
und dann wird es funktionieren. Noch geschickter ist aber die Groß/Kleinschreibung aus den Spiel zu lassen: Code: If LCase(TypeName(CATIA.Documents.Item(i))) = "partdocument" then <code> endif
Gruß, Zoltan [Diese Nachricht wurde von zoltan.bekesi am 17. Sep. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gunn Mitglied
Beiträge: 7 Registriert: 12.03.2009
|
erstellt am: 17. Sep. 2009 10:16 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
Sollte es nicht eher "If LCase(TypeName(CATIA.Documents.Item(i))) = "partdocument" then" heißen? du willst den typnamen vom dokument, nicht vom namen Zitat: Original erstellt von zoltan.bekesi: Hallo,TypeName gibt ein String zurück. Korrigiere die Zeile auf Code: If TypeName(CATIA.Documents.Item(i).Name) = "PartDocument" then <code> endif
und dann wird es funktionieren. Noch geschickter ist aber die Groß/Kleinschreibung aus den Spiel zu lassen: Code: If LCase(TypeName(CATIA.Documents.Item(i).Name)) = "partdocument" then <code> endif
Gruß, Zoltan
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
zoltan.bekesi Mitglied
Beiträge: 321 Registriert: 22.10.2006 Job: CATIA V5R19 / XP 32bit MS Office 2003 Microstation V8 2004 Edition DELL Precision M6300
|
erstellt am: 17. Sep. 2009 17:52 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
|
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: 03. Feb. 2011 14:06 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
Hallo zusammen ich habe das Makro von oben bei mir verwendet. läuft auch sehr gut. Habe aber ein Problem, das Makro list die Parameter vom letzten part (im Strukturbaum)zuerst aus, und vom ersten Part im Strukturbaum zuletzt. kann man die Reihenfolge beeinflussen ? oder einfach umdrehen ? hier der 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 On Error GoTo 0 objXL.Visible = True 'Berechnung m = 12 ' Zeile in Exel i = 0 p = 0 For i = 1 To CATIA.Documents.Count On Error Resume Next If (Right(CATIA.Documents.Item(i).Name, 7) = "CATPart") Then 'soll bessere Lösung sein funktioniert noch nicht 'If TypeName(CATIA.Documents.Item(i).Name) = PartDocument Set prod = CATIA.Documents.Item(i).Product 'Partname kann auch ausgegeben werden 'objXL.Cells(m, 2).Value = prod.PartNumber objXL.Cells(m, "a").Value = prod.Parameters.Item("Position").ValueAsString objXL.Cells(m, "b").Value = prod.Parameters.Item("Stueck").ValueAsString objXL.Cells(m, "c").Value = prod.Parameters.Item("K").ValueAsString objXL.Cells(m, "d").Value = prod.Parameters.Item("Benennung").ValueAsString objXL.Cells(m, "g").Value = prod.Parameters.Item("Werkstoff").ValueAsString objXL.Cells(m, "h").Value = prod.Parameters.Item("Bestellmass").ValueAsString objXL.Cells(m, "n").Value = prod.Parameters.Item("Bemerkungen").ValueAsString 'weitere Parameter möglich 'objXL.Cells(m, 10).Value = prod.Parameters.Item("eigener Parameter2").ValueAsString 'objXL.Cells(m, 11).Value = prod.Parameters.Item("eigener Parameter2").ValueAsString p = p + 1 If Err.Number <> 0 Then Err.Clear
End If m = m + 1 End If Next MsgBox "Es sind " & i - p & " Produkts und " & p & " Parts geöffnet", , "Info" End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 03. Feb. 2011 22:59 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
Servus Du durchsuchst mit deinem Script die Dokumenten-Collection. Stattdessen solltest du die Einträge im Strukturbaum abarbeiten (CATIA.ActiveDocument.Product.Products) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. 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: 04. Feb. 2011 06:18 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
|
cChris Mitglied Konstrukteur
Beiträge: 53 Registriert: 27.09.2010 CATIA V5 R19 Microsoft Windows XP; Professionalx64 Edition; Version 2003; SP 2; Intel Core2 Duo CPU E8600 3.33Ghz; 7.98Gb RAM CATScript
|
erstellt am: 04. Feb. 2011 08:03 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
Guten Morgen, Zitat: For i = 1 To CATIA.Documents.CountOn Error Resume Next If (Right(CATIA.Documents.Item(i).Name, 7) = "CATPart") Then 'soll bessere Lösung sein funktioniert noch nicht 'If TypeName(CATIA.Documents.Item(i).Name) = PartDocument
Wie von Bernd schon erwähnt:
Code:
For i = 1 To CATIA.ActiveDocument.Product.Products.CountIf TypeName(CATIA.Documents.Item(i).Name) = "PartDocument" Then
Hab gerade kein Beispiel zur Hand. Sollte Dir aber für den Anfang weiterhelfen. ------------------ Mit freundlichen Grüßen, cChris [Diese Nachricht wurde von cChris am 04. Feb. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 04. Feb. 2011 08:05 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
Servus Versuch es mal mit dem Codeschnippsel: Code:
'vorheriger Code objXL.Visible = True'Berechnung m = 12 ' Zeile in Exel i = 0 p = 0 Dim productDocument1 As ProductDocument Set productDocument1 = CATIA.ActiveDocument Dim products1 As Products Set products1 = productDocument1.Product.Products For i = 1 To products1.Count Dim oPorduct As Product Set oProduct = products1.Item(i) If TypeName(oProduct.ReferenceProduct.Parent) = PartDocument Then oobjXL.Cells(m, "a").Value = Product.Parameters.Item("Position").ValueAsString 'weitere parameter End If Next 'Rest des Codes End Sub
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Zerspanungsmechaniker/in (m/w/d) | Sie interessieren sich für spannende Projekte? Sie möchten selbstständig und eigenverantwortlich in einem innovativen Unternehmen arbeiten? Sie bewältigen auch administrative Aufgaben und wollen sich mit Ihrer Erfahrung und guten Ideen einbringen? Dann sind Sie bei HTS richtig. Wir entwickeln und produzieren Transport- und Hebetechnik in Fellbach und beliefern Kunden weltweit in allen Industrie- und Wirtschaftszweigen.... | Anzeige ansehen | Mechaniker |
|
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: 04. Feb. 2011 10:42 <-- editieren / zitieren --> Unities abgeben: Nur für milburn
Hallo bgrittmann hab das mal auf die schnelle probiert, hat aber nicht funktioniert. Läuft irgenwie nicht durch die Parts nur durch die Produkte. Kann das sein ? Ich werde es aber in Ruhe nochmal testen, nicht daß ich einen Fehler eingebaut habe.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |