Autor
|
Thema: Reihenfolge von Parts anhand durchdringender Schraube feststellen (1992 mal gelesen)
|
Alexander.Stud Mitglied
Beiträge: 30 Registriert: 15.09.2012 CATIA V5 R19SP9 WINDOWS XP & WINDOWS 7
|
erstellt am: 08. Nov. 2012 12:50 <-- editieren / zitieren --> Unities abgeben:
Hallo Community, ich habe ein Problem mit einem Makro was ich in CATScript schreiben möchte. Bisherige Recherchen haben mir noch keine brauchbaren Erkenntnisse gebracht! Ich stehe vor folgender Aufgabe bzw. vor folgendem Problem: Ich habe in einem CATProduct vier Parts. Drei dieser Parts sind eine Art Blechbauteile mit einer hinterlegten Materialstärke als Parameter. Das andere Part stellt eine Schraube dar. Die Schraube ist über die Anlagefläche (Contact Constrain) und einem Punkt (Coincidence Constrain) auf dem oberen Blech positioniert. Der Anwender soll im ersten Schritt des Makros die Schraube als Part über Selection auswählen. Nun soll mein Makro die Reihenfolge in der die Schraube die 3 Bleche durchdringt bestimmen und in einem Excelsheet darstellen (Die Bleche haben keine Bohrungen!) zusätzlich sollen noch die jeweiligen Parameter (Material und Materialstärke) mit ausgelesen werden. Dabei können die Bleche "wild" im Raum positioniert sein, sie liegen also nicht mit ihren Flächen in x-, y- oder z-Normalenrichtung. Die Selektion und die Erzeugung der Exceldatei ist aktuell nicht das große Problem (hoffe ich ). Auch das Parameter auslesen wurde schon oft genug thematisiert, sodass dies auch erst einmal vernachlässigbar ist. Ich würde gerne wissen ob es möglich ist, die Reihenfolge über einen Vektor der in der Mittelachse der Schraube läuft die Reihenfolge der Bleche zu erfassen und falls es klappt, wie kann ich dies umsetzen? Der Lösungsweg kann auch gerne von diesem abweichen, die Idee schwirrt mir momentan so vor. Ich hoffe meine kurze Erklärung reicht euch aus, falls nicht werde ich sehr gerne noch fehlende Informationen nachreichen. Vorab vielen Dank an alle Antwortenden und beste Grüße Alex [Diese Nachricht wurde von Alexander.Stud am 08. Nov. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tberger Mitglied Application Manager CATIA V5 / V6
Beiträge: 1385 Registriert: 13.01.2007 WIN 7 64bit V5R21SP3HF49 3DX/V6 R2016x
|
erstellt am: 08. Nov. 2012 13:06 <-- editieren / zitieren --> Unities abgeben: Nur für Alexander.Stud
Hier würde mir einfallen, da die Bleche keine Löcher haben, Verschneidungen zu bilden,die Verschneidungs-Abstände zum Kopf der Schraube messen zu lassen und so die Reihenfolge der Bleche festzustellen. ------------------ Grüße aus dem Thurgau Thomas +++++++++++++++++++++++++++++++++ CATIA - eine Laune der Natur ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 08. Nov. 2012 13:10 <-- editieren / zitieren --> Unities abgeben: Nur für Alexander.Stud
Hallo, ich würde das mittels einer Kollisionsuntersuchung lösen: Wenn du drei Bauteile hast, die von deiner Schraube durchdrungen werden bekommst du 3 Clashes zurück, die jeweils die am Clash beteiligten Instanzen beinhalten, also immer 1 Blech + die Schraube. Zudem ein Zahlenwert zur Beschreibung des Clashes: die Zahl gibt an, um wieviel eine der beiden am Clash beteiligten Instanzen in irgendeine Richtung verschoben werden muss, bis keine Kollision mehr vorhanden ist. Der Clash mit dem kleinsten Rückgabewert ist die Durchdringung mit dem von der Schraube am weitesten entfernten Blech. So habe ich das in einem anderen Zusammenhang umgesetz. Gruß ------------------ tomtom1972 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: 08. Nov. 2012 13:12 <-- editieren / zitieren --> Unities abgeben: Nur für Alexander.Stud
Servus Du könntest vielleicht die Clash-Analyse der SPA-Worbench nutzen (allerdings muss dann die Schraube die Bleche schneiden). Aus den Koordinaten der Kollision (ein Punkt je Partner) könntest du dann die Reihenfolge der Teile bestimmen. Stellt sich noch die Frage wo für dich der Ursprung und die Richtung (ggf Selektion oder X-Achse der Schraube) für die Reihenfolge ist. Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Alexander.Stud Mitglied
Beiträge: 30 Registriert: 15.09.2012 CATIA V5 R19SP9 WINDOWS XP & WINDOWS 7
|
erstellt am: 08. Nov. 2012 13:45 <-- editieren / zitieren --> Unities abgeben:
Das ging ja schnell! Vielen Dank für eure Antworten!!! Ich werde mir die Varianten mal anschauen und testen. @tomtom: Bist du vielleicht bei der Erstellung deines Makros in einem anderen Zusammenhang auf irgendwelche Quellcodeschnippsel bzgl. der Umsetzung bzw. zum Einlesen der Kollisionsuntersuchung ins Makro gestoßen? (bin leider nicht erfahren beim programmieren) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
em Michael Kirsch Mitglied Teamleiter KBE Methoden & Tools
Beiträge: 222 Registriert: 21.10.2002 CATIA V5 R16 CATIA V5 R18 CATIA V5 R19 NX 5 NX 6 NX 7.5
|
erstellt am: 08. Nov. 2012 14:29 <-- editieren / zitieren --> Unities abgeben: Nur für Alexander.Stud
Hi Alex, ich würde jeweils den Abstände zwischen dem Schraubenkopf und den Blechkörpern messen. Der nächstgelegene Blechkörper ist der, der als erstes durchdrungen wird. Der am weitesten entfernteste Blechkörper wird als letztes durchdrungen. Messungen kannst Du mit der SPAWorkbench durchführen, die Bernd weiter oben schon benannt hat. Zuerst brauchst Du das Workbench-Objekt: Dim oSPAWorkbench As Workbench Set oSPAWorkbench = CATIA.ActiveDocument.GetWorkbench ("SPAWorkbench") Dann ein Mess-Objekt mit der Schraube: Dim oMeasurable As Measurable Set oMeasurable = oSPAWorkbench.GetMeasurable(>> hier muss der Punkt im Schraubenkopf rein<< ) Von hier aus kannst Du dann den Abstand zu den Blechkörpern messen: Dim dblDistance As Double dblDistance = oMeasurable.GetMinimumDistance(>> hier muss der Blechkörper rein<< ) Hope that helps! Michael ------------------ CATIA, sonst NX ;-)
www.em.ag
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tberger Mitglied Application Manager CATIA V5 / V6
Beiträge: 1385 Registriert: 13.01.2007 WIN 7 64bit V5R21SP3HF49 3DX/V6 R2016x
|
erstellt am: 08. Nov. 2012 14:33 <-- editieren / zitieren --> Unities abgeben: Nur für Alexander.Stud
Das klappt dann nicht immer, wenn das sonst "äusserste" Blech im U-Profil oder ähnlich wieder zurückkommt und dem Kopf zu Nahe kommt. Bei der Verschneidung bist du sicher. ------------------ Grüße aus dem Thurgau Thomas +++++++++++++++++++++++++++++++++ CATIA - eine Laune der Natur ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Alexander.Stud Mitglied
Beiträge: 30 Registriert: 15.09.2012 CATIA V5 R19SP9 WINDOWS XP & WINDOWS 7
|
erstellt am: 08. Nov. 2012 17:45 <-- editieren / zitieren --> Unities abgeben:
Super, ich danke dir Michael! Es gibt bei mir zwar eine Fehlermeldung das die Typen "oSpaWorkbench.GetMeasureable" unverträglich sind, aber ich werde bis im Laufe der nächsten Woche versuchen einen goßen Teil meines Vorhabens umzusetzen. Um euch dann mit neuen Fragen zu löchern @Thomas: Danke für den Hinweis, glücklicherweise sind in meinen Products ausschließlich Bleche und keine Profilbauteile. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
em Michael Kirsch Mitglied Teamleiter KBE Methoden & Tools
Beiträge: 222 Registriert: 21.10.2002 CATIA V5 R16 CATIA V5 R18 CATIA V5 R19 NX 5 NX 6 NX 7.5
|
erstellt am: 08. Nov. 2012 21:38 <-- editieren / zitieren --> Unities abgeben: Nur für Alexander.Stud
Hallo Alex, stimmt ja, die Methode GetMeasurable will ein Objekt vom Typ Reference haben. Du musst also aus dem Referenzpunkt und den Körpern erstmal so ein Reference-Objekt erzeugen. Wenn der Schaubenpunkt selektiert ist, sollte es so gehen: Dim oSelection As Selection Set oSelection = CATIA.ActiveDocument.Selection Dim oReference As Reference Set oReference = oSelection.Item(1).Reference Alternativ kannst Du die Objekte auch über ihren Namen ansprechen: Dim oReference As Reference Set oReference = oProduct.CreateReferenceFromName("Root/Product1.1/Part Body") Lass einfach mal die Makroaufzeichnung laufen, während Du in der Baugruppe Baugruppenbedingungen erzeugst. Dann kommst Du schnell hinter das Schema. Viele Grüße, Michael ------------------ CATIA, sonst NX ;-)
www.em.ag
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Alexander.Stud Mitglied
Beiträge: 30 Registriert: 15.09.2012 CATIA V5 R19SP9 WINDOWS XP & WINDOWS 7
|
erstellt am: 09. Nov. 2012 09:59 <-- editieren / zitieren --> Unities abgeben:
@Michael: vielen Dank für den Änderungshinweis! Allerdings stoße ich mit dieser Methode an die Grenzen der Machbarkeit. Da ich nicht immer die gewünschten Produkte angesprochen bekommen die auch wirklich durchdrungenen werden (Korrigiert mich wenn ich das falsch sehe!). Daher möchte ich es über die "Standard" Clash-Application mein Glück probieren (so wie es tomtom1972) beschrieben und vorgeschlagen hat. Der Anwender wählt vor oder während des Makros die Schraube aus und soll dann die Interference-Ergebnisse als Text-Datei ausgespuckt bekommen. Für diesen Vorgang habe ich mir bereits mehrmals ein Makro aufgezeichnet indem ich die Schritte händig durchgehe, jedoch ist die Qualität dieser Aufzeichnungen für mich eher unbrauchbar. Da ich die Einstellungen innerhalb des Befehls nicht über das Makro einstellen kann, oder geht das? Anbei mal das Clash-Fenster mit den von mir gewünschten und benötigten Filterlist-Einstellungen. Ein weiteres Problem was sich bei der Erstellung der Clashresultate als Text-Datei (Export As) ergibt, ist dass er den Status und den Wert des Clashs erst nach anklicken des Products in der Liste aktualisiert. Diese Schritte würde ich gerne automatisch vom Makro durchlaufen lassen. Ist sowas im Makro umsetbar? Ich hoffe ich erschlage niemanden mit meinem Anliegen Vielen Dank und beste Grüße! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 09. Nov. 2012 10:36 <-- editieren / zitieren --> Unities abgeben: Nur für Alexander.Stud
Hallo, das was ich oben beschrieben habe hat sich alles aufs Programmieren in VB bezogen, nicht auf eine manuelle Vorgehensweise. Ein bischen Code: Set oSel = Catia.ActiveDocument.Selection oSel.Clear Dim InputObjectType(0) Dim Status InputObjectType(0) = "Product" '---- eine Instanz/ein Node, oder was du sonst willst Status = oSel.SelectElement3(InputObjectType, "**************** Bitte die Schraube auswählen ****************", False, CATMultiSelTriggWhenUserValidatesSelection, False) '--- UserSel If (Status <> "Normal") Then '-------Auswahl i.O?, wenn nicht, dann... ' End in VB oder Exit Sub im CATScript ElseIf (Status = "esc") Then ' End in VB oder Exit Sub im CATScript End if Set cClashes = Catia.ActiveDocument.Product.GetTechnologicalObject("Clashes") Set oClash = cClashes.AddFromSel oClash.ComputationType = catClashComputationTypeAgainstAll oClash.InterferenceType = catClashInterferenceTypeContact oClash.Compute Set cConflicts = oClash.Conflicts Dim iClash As Integer iClash = 0 For q = 1 To cConflicts.Count Set oConflict = cConflicts.Item(q) If (oConflict.Type = catConflictTypeClash) Or (oConflict.Type = catConflictTypeContact) Then If oConflict.FirstProduct.PartNumber = "DeineSchraube" Then Set oBlech1 = oConflict.SecondProduct iClashValue = oConflict.Value End If If oConflict.SecondProduct.PartNumber = "DeineSchraube" Then Set oBlech1 = oConflict.FirstProduct iClashValue = oConflict.Value End If End If Next Dann das ganze halt in ein dynamisches Array schreiben und am Ende auswerten. Fertig. Die Doku ist bezogen auf den Clash und die Auswertung des selbigen sehr ausführlich. Ohne das du selbst programmierst kommst du allerdings nicht weit. Bei Fragen: frag. Gruß TomTom ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Alexander.Stud Mitglied
Beiträge: 30 Registriert: 15.09.2012 CATIA V5 R19SP9 WINDOWS XP & WINDOWS 7
|
erstellt am: 09. Nov. 2012 10:40 <-- editieren / zitieren --> Unities abgeben:
Hey TomTom, besten Dank für den Code! Bin grad die Doku am durchforsten und hab schon einiges zu meiner obigen Problematik gefunden. Dann habe ich jetzt eine schöne Beschäftigung :-) Nochmal an alle vielen Dank, ich melde mich sobald ich was vorzeigbares habe! ALEX Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Alexander.Stud Mitglied
Beiträge: 30 Registriert: 15.09.2012 CATIA V5 R19SP9 WINDOWS XP & WINDOWS 7
|
erstellt am: 13. Nov. 2012 07:41 <-- editieren / zitieren --> Unities abgeben:
|
Alexander.Stud Mitglied
Beiträge: 30 Registriert: 15.09.2012 CATIA V5 R19SP9 WINDOWS XP & WINDOWS 7
|
erstellt am: 19. Dez. 2012 14:20 <-- editieren / zitieren --> Unities abgeben:
Hallo, da bin ich wieder :-) Beschäftige mich seit heute wieder mit obiger Problematik. @TomTom: Dein Code funktioniert wunderbar, ich habe mir die gemessenen Abstände per MsgBox ausgeben lassen. Doch folgenden Teil verstehe ich nicht: _________ Dim iClash iClash = 0 For q = 1 To cConflicts.Count Set oConflict = cConflicts.Item(q) If (oConflict.Type = catConflictTypeClash) Or (oConflict.Type = catConflictTypeContact) Then If oConflict.FirstProduct.PartNumber = "DeineSchraube" Then Set oBlech1 = oConflict.SecondProduct iClashValue = oConflict.Value End If If oConflict.SecondProduct.PartNumber = "DeineSchraube" Then Set oBlech1 = oConflict.FirstProduct iClashValue = oConflict.Value End If End If Next _________ Bei den Zeilen wo das "oBlech1" als SecondProduct oder FirstProduct gesetzt wird, bin ich völlig raus Wie habe ich dies zu verstehen? Ich setze ja meine Schraubenbezeichnung in die Zeile ein und setze dies mit der "oCOnflict.FirstProduct.Partnumber" gleich. Was passiert denn genau wenn diese beiden gleich sind? Frage hat sich erledigt --> "Kann ich mir die partnumbers der beteiligten Bleche auch hier irgendwo rausziehen?" Die Bezeichnung steht ja schon drin, einfach nur ".Name" anhängen und ich habe es :-) Besten Dank und VG Alexander [Diese Nachricht wurde von Alexander.Stud am 21. Dez. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Alexander.Stud Mitglied
Beiträge: 30 Registriert: 15.09.2012 CATIA V5 R19SP9 WINDOWS XP & WINDOWS 7
|
erstellt am: 21. Dez. 2012 15:16 <-- editieren / zitieren --> Unities abgeben:
Prünktlich zu Weihnachten habe ich mein Problem wie gewünscht gelöst bekommen Für alle die es interessiert hier nocheinmal mein aktueller/endgültiger Code: ________________________ .... Mld = MsgBox("Wählen Sie eine Schraube aus!", vbOKCancel, "Prüfbeginn") If Mld = vbOK Then Unload Me ElseIf Mld = vbCancel Then MsgBox "Tool abgebrochen." Exit Sub End If Set Selection1 = CATIA.ActiveDocument.Selection Dim ElementTyp(0) ElementTyp(0) = "Part" Selection1.Clear Do Dim Ausahl As Object Auswahl = Selection1.SelectElement2(ElementTyp, "Wählen Sie eine Schraube aus!", False) If Auswahl = "Normal" Then Set Element = Selection1.Item(1) MsgBox Element.Value.Name & " wurde ausgewählt.", 0, "Auswahl" If Element.Value.Name = "Schraube1" Or Element.Value.Name = "Schraube2" Then Fertig = True Else MsgBox Element.Value.Name & " ist keine Schraube," + Chr(10) + "bitte wählen Sie eine Schraube aus!", 0, "Auswahl" End If Else Box = MsgBox("Die Selektion wurde abgebrochen" + Chr(10) + "Das Makro wurde beendet!", 48, "Benutzerabbruch") Exit Sub End If Loop Until Fertig = True Set cClashes = CATIA.ActiveDocument.Product.GetTechnologicalObject("Clashes") Set oClash = cClashes.AddFromSel oClash.ComputationType = catClashComputationTypeAgainstAll oClash.InterferenceType = catClashInterferenceTypeContact oClash.Compute Set cConflicts = oClash.Conflicts Dim iClash As Integer iClash = 0 oBlechj = 0 For q = 1 To cConflicts.Count Set oConflict = cConflicts.Item(q) If (oConflict.Type = catConflictTypeClash) Then If oConflict.FirstProduct.PartNumber = "Schraube1" Or oConflict.FirstProduct.PartNumber = "Schraube2" Then Set oBlechj = oConflict.SecondProduct iClashValue = oConflict.Value End If End If Dim ofirstConlict As Conflict Dim osecondConflict As Conflict Set ofirstConflict = cConflicts.Item(1) Set osecondConflict = cConflicts.Item(2) MsgBox osecondConflict.SecondProduct.Name MsgBox ofirstConflict.SecondProduct.Name ... __________________________ Nochmals Danke an alle Helfenden!!! Ich wünsche schöne Feiertage. VG Alexander [Diese Nachricht wurde von Alexander.Stud am 22. Dez. 2012 editiert.] [Diese Nachricht wurde von Alexander.Stud am 22. Dez. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |