Autor
|
Thema: Auslesen PartNunber auf unterschiedlichen Ebenen (1230 mal gelesen)
|
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 20. Mrz. 2019 14:12 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich möchte die PartNumber aller Parts im Products auslesen in einer Schleife und bin soweit, dass ich alle Parts finde und selektieren kann, wenn ich aber die PartNumber auslesen möchte schaffe ich es nur auf erster Ebene. Das habe ich soweit: myProductDoc = myCatiaApp.ActiveDocument myProduct = myProductDoc.Product myProductDoc.Selection.Search("CATProductSearch.Part,all") myCountPart = myProductDoc.Selection.Count() 'MsgBox(myCountPart) 'mySelection = myProductDoc.Selection For x = 1 To myProductDoc.Selection.Count() myCatiaApp.StartCommand("Activate Terminal Node") myCatiaApp.StartCommand("Load") myName = myProductDoc.Product.Products.Item(x).Name https://ww3.cad.de/foren/ubb/icons/icon8.gif --> Hier muss der Fehler liegen Next THX Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Big-Fish Mitglied
Beiträge: 13 Registriert: 23.04.2014
|
erstellt am: 20. Mrz. 2019 14:39 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
Hallo Tweety79, probiers mal mit dem Code Schnipsel: Ist allerdings C#,die for Scheife ist aber fast identisch mit vb.net/vba. Die Variabelen musst du noch anpassen. Am Ende schreibt er die ganzen Filenames aller Parts im Produkt in eine Excel untereinander(dazu fehlen hier ein paar Zeilen). Ich weiss nicht ob dir die Filenames oder die Partnumbers reichen. Ich denke es liste auch alle dokumente im Catia auf. Kannst du aber auch auf die Dokumente im Assambly beziehen. Code:
int anzahl = catiaapp.Documents.Count; for (int i = 1; i < anzahl; i++ ) { //MessageBox.Show(i.ToString()); //MessageBox.Show(catiaapp.Documents.Item(i).FullName); var dokument = catiaapp.Documents.Item(i); string name = dokument.FullName; string pfad = dokument.Path; string Dateiname = name.Substring(pfad.Length+1); excel.Cells[i, 1] = Dateiname;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 20. Mrz. 2019 15:42 <-- editieren / zitieren --> Unities abgeben:
Hi Big-Fisch, ich jag den Code durch den Converter nach vb.NET. Danke schon mal, muss ich ausprobieren. Ich frage mich, ob die Parts wirklich auf allen Ebenen gefunden werden? var dokument = catiaapp.Documents.Item(i) - sieht auf den ersten Blick nach Ebene 1 aus. Grüße
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 20. Mrz. 2019 16:06 <-- editieren / zitieren --> Unities abgeben:
Hi Big-Fish, habe es getestet. Ich erreiche alle Ebenen, aber auch alle Dokumente, also auch Products, nicht nur gewünschte Parts. Ich versuche eine Abfrage dazwischen zu schalten, ob das Dokument ein Part ist. Vielleicht kann ich die Parts so aussieben. Wie der andere Weg geht, von vorn herein nur Parts abzugreifen, wüsste ich aber auch gerne. Jemand einen Hinweis? Bestimmt irgendwas mit ReferenceProduct.Part ? Ich krieg's gerade nicht zusammen. THX!! 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: 20. Mrz. 2019 18:09 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
Servus Entweder mit einer rekursiven Schleife über die Products-Collection (zu rekursiv oder Treewalk oder ProdScan solltest du was finden). Von einer Instanz sollte .ReferenceProduct.Parent das zugehörige Dokument sein (zB PartDocument) Wenn du mit myProductDoc.Selection.Search gesucht hast, warum arbeitest du dann nicht die selektierten Elemente per Schleife ab? Hinweis: In Documents-Colletion sind alle geöffneten Dokumente enthalten (zB auch in anderen Fenstern) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 21. Mrz. 2019 10:23 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 21. Mrz. 2019 14:35 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
Servus Willst du jetzt die Schleife abarbeiten? Code: myProductDoc.Selection.Search("CATProductSearch.Part,all") myCountPart = myProductDoc.Selection.Count() For x = 1 To myCountPart MyPart = myProductDoc.Selection.Item2(x).Value MsgBox MyPart.PartNumber next
Wie wäre es wenn mal öfters das Watchfenster oder die Doku nutzt. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 22. Mrz. 2019 17:40 <-- editieren / zitieren --> Unities abgeben:
Servus, danke Bernd. Ich bin inzwischen weiter; ich habe zwei Baugruppen offen und durchsuche BG B nach PartNumber aus BG A. Wenn PartNumber nicht gefunden wird, wird sie in eine ListBox geschrieben. So der Plan. Hier mein Code dazu: myCatiaApp.Windows.Item(1).Activate() mySelection = myCatiaApp.ActiveDocument.Selection mySelection.Search("CATProductSearch.Part,all") myCountPart = mySelection.Count For i = 1 To myCountPart myPartNumber = mySelection.Item(i).Value.ReferenceProduct.Name 'ReDim Preserve strPartNumberArray(i) 'strPartNumberArray(i) = myPartNumber
mySelectionB = myCatiaApp.Documents.Item(2).Selection mySelectionB.Search("Name='myPartNumber*',sel") If mySelectionB.Count = 0 Then ListBoxA_o_G.Items.Add(myPartNumber) End If myCatiaApp.Windows.Item(1).Activate() Next Der Unterschied der beiden BG liegt in einem Part - dessen PArtNumber allein sollte in der ListBox erscheinen, es erscheinen aber alle. Keins wird in BG B gefunden. Ist vielleicht an diesen beiden Zeilen was verkehrt?: mySelectionB = myCatiaApp.Documents.Item(2).Selection mySelectionB.Search("Name='myPartNumber*',sel") Danke und Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 22. Mrz. 2019 18:28 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 22. Mrz. 2019 18:40 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
Servus Mit deiner Einschätzung an was es liegt könnte, liegst du richtig. Auch deine Verbesserung beim Filter geht in die richtige Richtung. Ist Documents.Item(2) wirklich die zweite Baugruppe? Das könnte ja auch ein Einzelteil der ersten Baugruppe sein. (die Documents-Collection enthält alle geladenen Dokumente). Da es nur eine Selektion gibt, ist nach der Suche der Inhalt der mySelection auch weg. Somit fällt die Schleife ab dem zweiten Durchlauf auf die Nase. Ich würde eher so vorgehen: Suche in der 1. Baugruppe durchführen -> Namen (PartNumber sprichst du in deine Code nicht an) in Array/Liste schreiben (doppelte entfernen) -> in die zweite Baugruppe wechseln dort nach den Namen suchen. Den Filter würde ich dann dort so weit wie möglich einschränken zB: Code: mySelectionB.Search("CATProductSearch.Part.Name=" & sNameAusListe & ",all")
Falls die Baugruppen nur eine Ebene haben wäre vielleicht auch eine Schleife über die Products-Collection einfacher/schneller. Gruß Bernd PS: Bitte Code in entsprechende Tags posten. ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tweety79 Mitglied Entwicklung Automotive
Beiträge: 269 Registriert: 09.12.2007 WPF, VBA, CATScript, Access
|
erstellt am: 26. Mrz. 2019 14:23 <-- editieren / zitieren --> Unities abgeben:
|
Big-Fish Mitglied
Beiträge: 13 Registriert: 23.04.2014
|
erstellt am: 26. Mrz. 2019 15:23 <-- editieren / zitieren --> Unities abgeben: Nur für Tweety79
mySelectionB ist dein Array. Eine For Schleife dient zur Abarbeitung eines Arrays. Das Array hat "mySelectionB.Count2()" Zeilen und arbeitet jede Zelle mit Namen n nacheinander ab. Du kannst jederzeit auf eine spezielle Zelle (mit Namen "n")zugreifen. Code: for n = 1 to mySelectionB.Count2()Aktion next
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |