Autor
|
Thema: Objekt finden, vergleichen und in Tabelle darstellen. (2483 mal gelesen)
|
lamdiabolo Mitglied Student
Beiträge: 31 Registriert: 17.04.2013 Intel Pentium 4CPU 2,8GHz 1GB RAM 32-Bit Betriebssystem Win 7 Catia V5R21
|
erstellt am: 30. Apr. 2013 09:33 <-- editieren / zitieren --> Unities abgeben:
Guten Tag, ich hoffe ihr könnt mir nochmal behilflich sein. Ich probiere im Moment ein Makro zu programmieren, welches in Catia ein Bauteil durchgehen und alle Löcher finden, den Durchmesser bemessen und alle gleichen Löcher mit der Gesamtanzahl in einer Tabelle ausgeben soll. Es soll nachher ungefähr folgend aussehen: 3 x 50mm 5 x 20mm 4 x 10mm Es wäre natürlich schön wenn die Durchmesser der Größe nach geordnet wären, aber wenns leichter ist reicht es mir erst auch mal, wenn man überhaupt die Anzahl mit den dazugehörigen Durchmessern in einer Tabelle ausgegeben bekommt. Es wäre nett wenn ihr mir ein paar eurer Ideen schicken könntet, da ich im Moment nicht allzu weit komme. Die Löcher zu finden und deren Durchmesser herauszufinden bekomme ich hin, nur nicht die Auflistung bzw der vergleich unter den Löchern, ob sie den gleichen Durchmesser haben. Mein bisherige Codeversuche: Set selection1 = CATIA.ActiveDocument.Selection selection1.Search ".hole,all" '----Selection sichern Dim SelElemente() As Object ReDim SelElemente(selection1.Count) For i = 1 To selection1.Count Set SelElemente(i) = selection1.Item(i) Next Dim length1 As Length Dim hole2 '----Selection wieder herstellen For i = 1 To UBound(SelElemente) selection1.Clear selection1.Add SelElemente(i).Value Set hole2 = selection1.Item2(1).Value Set length1 = hole2.Diameter Next selection1.Clear Das nachfolgende um die einzelnen Löcher anzuwählen und dessen jeweiligen Durchmesser anzuzeigen: '----Checkbox (Durchmesser Liste) deklarieren If CheckBox2.Value = True Then selection1.Search ".hole,all" For i = 1 To selection1.Count Set hole1 = selection1.Item2(i).Value Set laenge = hole1.Diameter Dim ausgabe As Integer ausgabe = laenge.Value Dim box As Long box = MsgBox(selection1.Item2(i).Value.Name & " = " & ausgabe & "mm", 48, "Durchmesser Löcher!") Next Set documents1 = CATIA.Documents For h = 1 To documents1.Count On Error Resume Next Set partdocument1 = documents1.Item(h) Next End If Vielen Dank schonmal im Vorraus! Gruß Jan 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: 30. Apr. 2013 10:42 <-- editieren / zitieren --> Unities abgeben: Nur für lamdiabolo
Servus Grober Ablauf: - alle Löcher suchen - Dictionary (siehe zB hier) für Durchmesser und Anzahl erstellen - Selektion "abarbeiten" - für jedes Loch den Durchmesser ermitteln - prüfen ob Durchmesser schon im Dictionary vorhanden ist - wenn ja Zähler um ein erhöhen - wenn nicht, Durchmesser im Dictionary anlegen Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lamdiabolo Mitglied Student
Beiträge: 31 Registriert: 17.04.2013 Intel Pentium 4CPU 2,8GHz 1GB RAM 32-Bit Betriebssystem Win 7 Catia V5R21
|
erstellt am: 30. Apr. 2013 10:55 <-- editieren / zitieren --> Unities abgeben:
|
lamdiabolo Mitglied Student
Beiträge: 31 Registriert: 17.04.2013 Intel Pentium 4CPU 2,8GHz 1GB RAM 32-Bit Betriebssystem Win 7 Catia V5R21
|
erstellt am: 30. Apr. 2013 11:27 <-- editieren / zitieren --> Unities abgeben:
Habe das mal ausprobiert, muss aber ehrlich sein und zugeben, das ich den Dictionary Befehl nicht ganz verstehe. Bislang mein Code: Sub CATMain() '----Dokument nach Löchern durchsuchen set selection1 = catia.activedocument.selection selection1.Search ".hole,all" '----Dictionary erstellen '---- Durchmesser der Löcher herausfinden For i = 1 To selection1.Count Set hole1 = selection1.Item2(i).Value Set laenge = hole1.Diameter Dim ausgabe As Integer ausgabe = laenge.Value '----Prüfen ob Durchmesser schon im Dictionary t=0 if ausgabe = dictionary then t=t+1 else set ausgabe.save =dictionary end if Set documents1 = CATIA.Documents For h = 1 To documents1.Count On Error Resume Next Set partdocument1 = documents1.Item(h) Next
End Sub Falls ihr mir da eventuell weiter helfen könntet, wäre ich euch sehr verbunden Danke schonmal imVorraus Jan 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: 30. Apr. 2013 12:06 <-- editieren / zitieren --> Unities abgeben: Nur für lamdiabolo
Servus Diconary ist auch kein Befehl sonder ein Objekt (ähnlich wie eine Collection bzw Array). Mit dem Unterschied dass man einen Key (zB den Durchmesser) und einen Value (zB Anzahl) angeben kann. Das Dictonary bietet dann zB die Methode "Exists" um zu prüfen ob ein Key schon vorhanden ist. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 30. Apr. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lamdiabolo Mitglied Student
Beiträge: 31 Registriert: 17.04.2013 Intel Pentium 4CPU 2,8GHz 1GB RAM 32-Bit Betriebssystem Win 7 Catia V5R21
|
erstellt am: 30. Apr. 2013 13:33 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die schnelle Antwort. Ich habe jetzt mal ein wenig rumprobiert, bekomme es leider aber immer noch nicht hin, da ich die einzelnen Schritte, die bei der Dictionary Programmierung durchlaufen werden, nicht ganz verstehe. Für weitere Unterstützung wäre ich sehr dankbar. Mit freundlichem Gruß Jan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 30. Apr. 2013 15:51 <-- editieren / zitieren --> Unities abgeben: Nur für lamdiabolo
Hallo Jan, schau Dir vielleicht mal mein Dictionary (http://ww3.cad.de/foren/ubb/Forum137/HTML/005045.shtml) an, vielleicht ist das eindeutiger für Dich. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lamdiabolo Mitglied Student
Beiträge: 31 Registriert: 17.04.2013 Intel Pentium 4CPU 2,8GHz 1GB RAM 32-Bit Betriebssystem Win 7 Catia V5R21
|
erstellt am: 30. Apr. 2013 16:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Henry, bei deinem Dictionary verstehe ich leider auch nicht genau wie ich ihn umbauen muss, damit er mir meine Durchmesser behält und diese abgleicht bzw. bei mehrfachvorkommen, den Zähler erhöht und nachher eine Tabelle ausgibt. Ich beschäftige mich leider erst seit kurzem mit der Makroprogrammierung bei Catia und bin daher noch nicht der aller geübteste,im Umgang mit VBA bzw.VBS Script. Danke aber trotzdem für dein Bemühen Gruß Jan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 01. Mai. 2013 10:24 <-- editieren / zitieren --> Unities abgeben: Nur für lamdiabolo
Ich würde es so machen (nach empfehlung von Bernd): Code:
Sub CATMain()Dim length1 As Length Dim hole1 Dim d Dim It Dim Ke Const CNew = 1 ' Counter New = 1 Dim CAct ' Counter Actual dim Text Set Selection1 = CATIA.ActiveDocument.Selection Selection1.Search ".hole,all" Set d = CreateObject("Scripting.Dictionary") For i = 1 To Selection1.Count Set hole1 = Selection1.Item2(i).Value Set length1 = hole1.Diameter If d.Exists(length1.Value) Then CAct = d.Item(length1.Value) CAct = CAct + 1 d.Item(length1.Value) = CAct Else d.Add length1.Value, CNew End If Next It = d.Items Ke = d.Keys For i = 0 To d.Count - 1 Text = Ke(i) & "mm ---> " & It(i) & "Stk." & vbCrLf & Text Next Selection1.Clear MsgBox Text End Sub
[Diese Nachricht wurde von imation1999 am 01. Mai. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lamdiabolo Mitglied Student
Beiträge: 31 Registriert: 17.04.2013 Intel Pentium 4CPU 2,8GHz 1GB RAM 32-Bit Betriebssystem Win 7 Catia V5R21
|
erstellt am: 02. Mai. 2013 08:47 <-- editieren / zitieren --> Unities abgeben:
Meine Güte, ihr seit wohl alle Profis hier im Forum. Das System läuft, wie auch alle zuvor, einwandfrei. Ich danke dir imation 1999 für deinen Code und zudem verstehe ich diesen auch noch So, jetzt probiere ich den Code noch so zu ändern, das er nachträglich alle Größen vom größten Durchmesser zum kleinsten hin sortiert. Gruß Jan PS:Vielen Dank nochmal an alle die mir behilflich waren, ich werde dieses Forum auf jeden Fall weiterempfehlen, da man hier noch respektvoll behandelt wird. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 02. Mai. 2013 13:47 <-- editieren / zitieren --> Unities abgeben: Nur für lamdiabolo
Hallo Jan, in meinem Dictionaly ist eine QuickSort-Methode bereits implementiert. Diese arbeitet zwar in der aktuellen Version mit Strings, aber es sollte ein leichtes sein den Stringvergleich gegen einen Double-Vergleich zu ersetzen. Hintergrund ist der, dass ich natürlich gleich Methoden implementiert habe, die mir in dem normalen Dictionary immer fehlten, wie auch die Methode auf genau ein Item zuzugreifen, auch wenn ich den Key nicht habe. Des Weiten lässt die Add() Methode nur jeden Key genau einmal zu, wodurch Du nicht abprüfen musst ob das Element schon existiert. Du müsstest also nur ein New Dictionary machen und dann alle Durchmesser hinzufügen, als Key würden sie sowieso nicht doppelt gehen und dann die Sort-Methode aufrufen (die für die Strings heißt glaube ich sortABC()). ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing 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: 02. Mai. 2013 13:55 <-- editieren / zitieren --> Unities abgeben: Nur für lamdiabolo
Servus kleiner Hinweis zum Makro: ich befürchte (gemäß meinem Test)dass bei diesem Makro die Zählungen von Bohrungen die gemustert wurden, die falsche Anzahl ermittelt wird. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lamdiabolo Mitglied Student
Beiträge: 31 Registriert: 17.04.2013 Intel Pentium 4CPU 2,8GHz 1GB RAM 32-Bit Betriebssystem Win 7 Catia V5R21
|
erstellt am: 02. Mai. 2013 14:54 <-- editieren / zitieren --> Unities abgeben:
Hallo, also der Code von Imation1999 funktioniert bei mir einwandfrei, nur werden mir bislang die ergebnisse querbeet bzw nach dem ersten Vorkommen im Strukturbaum angezeigt. Zum beispiel: 50 mm -> 3stk 36 mm-> 2stk 40 mm-> 5stk Aber das ist nicht all zu schlimm, wichtig war mir ja das ich überhaupt auf einen Blick sehe wie viele Löcher es von jeweils einem Durchmesser gibt und das funktioniert damit super. Danke euch für die schnellen Antworten. Schönen Tag noch Gruß Jan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
imation1999 Mitglied dipl.-ing. Maschinenbau
Beiträge: 276 Registriert: 02.08.2011 Dell Precision T3500 Intel® Xeon® Quad Core NVIDIA Quadro® 5000 Win7 x64 Ultimate CATIA V5 R20 SP2
|
erstellt am: 02. Mai. 2013 15:07 <-- editieren / zitieren --> Unities abgeben: Nur für lamdiabolo
Zitat: Original erstellt von bgrittmann: Servus kleiner Hinweis zum Makro: ich befürchte (gemäß meinem Test)dass bei diesem Makro die Zählungen von Bohrungen die gemustert wurden, die falsche Anzahl ermittelt wird.Gruß Bernd
Hallo Bernd, du hast natürlich Recht. Hast du vielleicht einen Vorschlag, wie man korrigieren kann? EDIT (VBAProject mit Sortierung von Durchmesser):
Code:
Sub CATMain()Dim length1 As Length Dim hole1 Dim d Dim It Dim Ke Const CNew = 1 ' Counter New = 1 Dim CAct ' Counter Actual Dim Arr() Dim dTemp Dim KeyVal Dim Txt dim Temp Set Selection1 = CATIA.ActiveDocument.Selection Selection1.Search ".hole,all" Set d = CreateObject("Scripting.Dictionary") For i = 1 To Selection1.Count Set hole1 = Selection1.Item2(i).Value Set length1 = hole1.Diameter If d.Exists(length1.Value) Then CAct = d.Item(length1.Value) CAct = CAct + 1 d.Item(length1.Value) = CAct Else d.Add length1.Value, CNew End If Next Ke = d.keys It = d.Items ReDim Arr(0 To d.Count - 1) For i = 0 To d.Count - 1 Arr(i) = Ke(i) Next i For i = LBound(Arr) To UBound(Arr) - 1 For j = i + 1 To UBound(Arr) If Arr(i) > Arr(j) Then Temp = Arr(j) Arr(j) = Arr(i) Arr(i) = Temp End If Next j Next i Set dTemp = CreateObject("Scripting.Dictionary") For i = LBound(Arr) To UBound(Arr) KeyVal = Arr(i) dTemp.Add Key:=KeyVal, Item:=d.Item(KeyVal) Next i For i = 0 To d.Count - 1 Txt = Arr(i) & "mm ---> " & It(i) & "Stk." & vbCrLf & Txt Next i MsgBox Txt, vbInformation Selection1.Clear End Sub
[Diese Nachricht wurde von imation1999 am 02. Mai. 2013 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: 02. Mai. 2013 19:22 <-- editieren / zitieren --> Unities abgeben: Nur für lamdiabolo
Servus Zitat: Original erstellt von imation1999: Hast du vielleicht einen Vorschlag, wie man korrigieren kann?
Solange immer nur die Bohrungen gemustert wurden und nicht ein ganzer Körper könnte es so gehen: - alle Muster (im PartDesign) suchen - über "ItemToCopy" jedes Muster prüfen ob dabei eine Bohrung gemustert wurde - Muster untersuchen welche Anzahl von Bohrungen diese beinhaltet (auch die inaktivierten Positionen beachten) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| (Senior) TGA Planer - HLS (m/w/d) | Die CG Plan GmbH ist eine 100 %-ige Tochter der CG Elementum und professioneller Generalplaner, technischer Projektsteuerer und Berater für unternehmenseigene Immobilien-Projekte. Mit moderner Hard- und Software und integralen 3-D-Modellen entsprechend der BIM-Methodik entwickeln wir Ausführungspläne, Mengenauszüge und Visualisierungen. Darüber hinaus fungieren wir als Wissensträger für unternehmensinterne ... | Anzeige ansehen | Projektmanagement |
|
lamdiabolo Mitglied Student
Beiträge: 31 Registriert: 17.04.2013 Intel Pentium 4CPU 2,8GHz 1GB RAM 32-Bit Betriebssystem Win 7 Catia V5R21
|
erstellt am: 06. Mai. 2013 09:19 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Community, ich habe jetzt ein Makro geschrieben, welches alle Durchmesser eines Bauteils ausgibt und nach Art unterschiedlich einfärbt. Dazu habe ich eine Listbox benutzt, welche ich gerne sortiert haben würde. Ich habe mich auch schon im Internet etwas schlau gemacht, wie das funktionieren könnte, aber leider funktioniert das bei mir nicht so wie erwartet. Ich habe es mit : Listbox1.sorted=true ausprobiert, was aber leider zu keinem Ergebnis geführt hat. Bitte helft mir,wenn ihr irgendeine Idee habt, danke! Mit freundlichem Gruß Ja PS: Meinen Code welcher die Listbox füllt: Dim length1 As Length Dim hole1 Dim d Dim It Dim Ke Const CNew = 1 ' Counter New = 1 Dim CAct ' Counter Actual Dim Text Set selection1 = CATIA.ActiveDocument.Selection If CheckBox1.Value = True And CheckBox3.Value = True Then selection1.Search ".hole,all" t = 1 ElseIf CheckBox1.Value = True Then selection1.Search ".hole.threaded=true,all" t = 1 ElseIf CheckBox3.Value = True Then selection1.Search ".hole.threaded=false,all" t = 1 Else MsgBox (" Bitte setzen sie mindestens ein Häkchen!") End If Set d = CreateObject("Scripting.Dictionary") For i = 1 To selection1.Count Set hole1 = selection1.Item2(i).Value Set length1 = hole1.Diameter If d.Exists(length1.Value) Then CAct = d.item(length1.Value) CAct = CAct + 1 d.item(length1.Value) = CAct Else d.Add length1.Value, CNew End If Next It = d.Items Ke = d.Keys lstuebung.Clear For i = 0 To d.Count - 1 'Text = Ke(i) & "mm ---> " & It(i) & "Stk." & vbCrLf & Text 'lstuebung.AddItem (Ke(i) & "mm ---> " & It(i) & "Stk.") lstuebung.AddItem lstuebung.List(lstuebung.ListCount - 1, 0) = Ke(i) lstuebung.List(lstuebung.ListCount - 1, 1) = It(i) Next selection1.Clear End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |