|   |   | 
  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für CATIA & Co. | 
|   |   | 
  | KISTERS 3DViewStation: Unterstützung für 3D CAD Kollaboration mit Lieferanten, eine Pressemitteilung
  | 
| 
Autor
 | 
Thema:  Eckpunkte von Geometrie entgegen Uhrzeigersinn messen (1450 /  mal gelesen)
 | 
 
                        M.Ungericht Mitglied Student
  
        Beiträge: 9 Registriert: 14.05.2018 MS Windows 7 Professional Catia V5 6R2017 
                         | 
                        
                         
                                                 
                        erstellt am: 07. Jun. 2018 08:03       <-- editieren / zitieren -->           Unities abgeben:           
                        
  Guten Morgen zusammen, aus einer Geometrie möchte ich die Eckpunkte auslesen.  Der Anwender des Makros soll dabei einen Punkt auswählen, von dem dann entgegen des Uhrzeigersinns die restlichen Punkte angewählt werden, um dann den jeweiligen Abstand zum Referenzpunkt ausmessen zu können, der irgendwo innerhalb der Geometrie liegen kann. Die Punkte sind dabei nicht in einer bestimmten Reihenfolge und Punkt1 nicht immer der Startpunkt,(siehe angehängte Datei) was mein Wissen an die Grenzen bringt.  Auch ist es möglich dass ein Punkt nicht auf den Linien liegt, dieser soll dann nicht beachtet werden. Danke. Gruß Mark Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        bgrittmann Moderator Konstrukteur
         
  
        Beiträge: 12117 Registriert: 30.11.2006 CATIA V5R19 
                         | 
                        
                         
                                                 
                        erstellt am: 07. Jun. 2018 17:34       <-- editieren / zitieren -->           Unities abgeben:            Nur für M.Ungericht  
                        
  Servus Die Koordinaten er Punkte solltest du über GetCoordinates auslesen können (siehe Point2D  in der Doku) Den Abstand zum Referenzpunkt entweder berechnen (beide Koordinaten bestimmen und dann berechnen) oder den Abstand über die SPA-Workbench messen. Fest zu stellen ob die Punkte auf einer Linie liegen: - Punkte in eine Collection/Array packen - Linien/Kurven in einen Array packen - per Schleife alle Punkte abarbeiten und den Abstand zu jeder Linie/Kurve ermitteln. Falls ein Abstand 0 ist zum nächsten Punkt gehen. Falls alle Abstände eines Punktes größer 0 ist, Punkt später nicht berücksichtigen Die Reihenfolge der Punkte (Drehsinn) könntest du so bestimmen: - zwei Dimensionales Array anlegen: Punktname, X, Y, Winkel alpha - Array befüllen, Winkel mit tan(Y/X) berechnen - Array sortieren Viel Spaß dabei das ganze auszuarbeiten und zusammen zufügen Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        M.Ungericht Mitglied Student
  
        Beiträge: 9 Registriert: 14.05.2018 MS Windows 7 Professional Catia V5 6R2017 
                         | 
                        
                         
                                                 
                        erstellt am: 07. Jun. 2018 18:42       <-- editieren / zitieren -->           Unities abgeben:           
                         | 
                        
                        M.Ungericht Mitglied Student
  
        Beiträge: 9 Registriert: 14.05.2018 MS Windows 7 Professional Catia V5 6R2017 
                         | 
                        
                         
                                                 
                        erstellt am: 08. Jun. 2018 14:59       <-- editieren / zitieren -->           Unities abgeben:           
                        
  Hallo nochmal, danke Bernd, ich konnte deine Vorschläge soweit umsetzen und auch die Winkel werden richtig berechnet und im Array abgelegt. Leider kommt, wie auf dem Bild zu sehen, das Makro bei den Punkten E und F an seine Grenzen. Da hier Punkt F einen kleineren Winkel zum Referenzpunkt in der Mitte hat, wird erst Punkt F und dann Punkt E ausgegeben, was falsch herum ist. Im Moment fällt mir dazu nichts ein, da das überall vorkommen kann.  Ich hoffe jemand hat dazu eine Idee. Danke. Gruß Mark Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        bgrittmann Moderator Konstrukteur
         
  
        Beiträge: 12117 Registriert: 30.11.2006 CATIA V5R19 
                         | 
                        
                         
                                                 
                        erstellt am: 08. Jun. 2018 15:15       <-- editieren / zitieren -->           Unities abgeben:            Nur für M.Ungericht  
                        
  Servus Mark Eckpunkte von einer Geometrie in der richtigen Reihenfolge ausgeben zu lassen könnte zB so gehen: - Kontur erstellen (zB Skizze) - Kontur im GSD zusammenfassen - den Join selektieren und nach Scheitelpunkten bzw Kanten suchen lassen - die selektieren Elemente sind (nach meinem Kurztest) dann in der entsprechenden Reihenfolge entlang der Kontur Allerdings kann der Anfang und die Richtung nicht definiert werden. ggf dies dann danach filtern/analysieren/berechnen. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        M.Ungericht Mitglied Student
  
        Beiträge: 9 Registriert: 14.05.2018 MS Windows 7 Professional Catia V5 6R2017 
                         | 
                        
                         
                                                 
                        erstellt am: 11. Jun. 2018 10:12       <-- editieren / zitieren -->           Unities abgeben:           
                        
  Hallo Bernd, könntest du mir dazu eventuell den Code einstellen oder genauer erklären was ich zu tun habe?  Da ich absoluter Neuling bin habe ich noch nicht mit dem GSD gearbeitet und immer noch keinen richtigen Ansatz, wie ich das umsetzen soll. Danke. Gruß Mark
  Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        bgrittmann Moderator Konstrukteur
         
  
        Beiträge: 12117 Registriert: 30.11.2006 CATIA V5R19 
                         | 
                        
                         
                                                 
                        erstellt am: 11. Jun. 2018 11:04       <-- editieren / zitieren -->           Unities abgeben:            Nur für M.Ungericht  
                        
  Servus Mark Hier ein grober Code wie das aussehen könnte (nur rudimentär getestet, keine Fehlerbehandlung, nicht einheitliches Namensschema der Variablen): Code: Sub CATMain()Dim partDocument1 As Document Dim part1 As Part Dim hybridBodies1 As HybridBodies Dim hybridBody1 As HybridBody Dim hybridShapeFactory1 As Factory Dim selection1 As Selection dim sFilter() as String Dim sStatus as String Dim oRefKontur as Reference Dim hybridShapeExtract1 As HybridShapeExtract Dim oSPAWorkbench as SPAWorkbench Dim oMeasureable as oMeasureable Dim oCoordinates(2) as Variant dim oRefPoint as Reference Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part Set selection1 = partDocument1.Selection Set hybridShapeFactory1 = part1.HybridShapeFactory Set hybridBodies1 = part1.HybridBodies 'Kante zur Kontursuche selektieren ReDim sFilter(0) sFilter(0) = "Edge" sStatus = selection1.SelectElement2(sFilter, "bitte Kante zur Kontursuche wählen", False) If sStatus <> "Normal" Then     MsgBox "Das Makro wird abgebrochen"     Exit Sub End If Set oRefKontur = selection1.item2(1).Reference 'Kante ableiten Set hybridBody1 = hybridBodies1.Add() hybridBody1.Name = "Kontur" part1.Update  Set hybridShapeExtract1 = hybridShapeFactory1.AddNewExtract(oRefKontur) hybridShapeExtract1.PropagationType = 1 hybridShapeExtract1.ComplementaryExtract = False hybridShapeExtract1.IsFederated = False hybridBody1.AppendHybridShape hybridShapeExtract1 part1.UpdateObject hybridShapeExtract1 'in der neuen Kontur nach Scheitelpunkten suchen selection1.clear selection1.add hybridShapeExtract1 selection1.Search "Topology.CGMVertex,sel" 'Scheitelpunkte messen if selection1.count2 <> 0 then    Set oSPAWorkbench = partDocument1.GetWorkbench("SPAWorkbench")    for i = 1 to selection1.count2       Set oRefPoint = selection1.item2(i).Reference       Set oMeasureable = oSPAWorkbench.GetMeasurable(oRefPoint)       oMeasureable.GetPoint oCoordinates       MsgBox oCoordinates(0) & " : " & oCoordinates(1) & " : " & oCoordinates(2)     next end if End Sub 
  Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        M.Ungericht Mitglied Student
  
        Beiträge: 9 Registriert: 14.05.2018 MS Windows 7 Professional Catia V5 6R2017 
                         | 
                        
                         
                                                 
                        erstellt am: 11. Jun. 2018 13:39       <-- editieren / zitieren -->           Unities abgeben:           
                        
  Hallo Bernd, danke für deine Antwort. Leider habe ich das Problem, dass mir bei start des Makros an der Stelle
  Code:
  sStatus = selection1.SelectElement2(sFilter, "bitte Kante zur Kontursuche wählen", False)
 
  immer ein Type Missmatch ausgegeben wird. sStatus ist als Variant und selection1 als Object deklariert, da ich in VBA programmiere. Im Forum habe ich auch keinen passenden Beitrag gefunden. Außerdem lassen sich die Befehle Part1.update und part1.updateobject ebenfalls nicht ausführen. Fehlermeldung :" Das Verfahren Update ist fehlgeschlagen" Ich hoffe du kannst mir nochmals helfen. Danke. Gruß Mark Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        bgrittmann Moderator Konstrukteur
         
  
        Beiträge: 12117 Registriert: 30.11.2006 CATIA V5R19 
                         | 
                        
                         
                                                 
                        erstellt am: 11. Jun. 2018 14:30       <-- editieren / zitieren -->           Unities abgeben:            Nur für M.Ungericht  
                        
  Servus Bei dir läuft der Code als CATScript durch? Dimensioniere mal sFilter als Variant. Bist du außerhalb einer Skizze? Kannst du das Part händisch aktualisieren? Schon mal mit einer einfachen Skizze (eine nur eine geschlossene Kontur) probiert? Oder wie sieht deine Skizze aus? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        M.Ungericht Mitglied Student
  
        Beiträge: 9 Registriert: 14.05.2018 MS Windows 7 Professional Catia V5 6R2017 
                         | 
                        
                         
                                                 
                        erstellt am: 12. Jun. 2018 07:11       <-- editieren / zitieren -->           Unities abgeben:           
                        
  Hallo Bernd,  der sFilter war es, danke. Jetzt läuft das Makro ohne Probleme durch. Danke für deine Hilfe!   Wenn ich jetzt dann noch die Sortierfunktionen erfolgreich eingebracht hab kann ich das Thema abschließen. Gruß Mark Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        bgrittmann Moderator Konstrukteur
         
  
        Beiträge: 12117 Registriert: 30.11.2006 CATIA V5R19 
                         | 
                        
                         
                                                 
                        erstellt am: 13. Jun. 2018 09:01       <-- editieren / zitieren -->           Unities abgeben:            Nur für M.Ungericht  
                        
  Servus Was meinst du mit sortieren der Punkte? Die Reihenfolge (gemäß meines Kurztest) sollte doch stimmen. Die "richtige" Richtung zu bestimmen wird da schon schwerer. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                       
 
                        M.Ungericht Mitglied Student
  
        Beiträge: 9 Registriert: 14.05.2018 MS Windows 7 Professional Catia V5 6R2017 
                         | 
                        
                         
                                                 
                        erstellt am: 13. Jun. 2018 09:45       <-- editieren / zitieren -->           Unities abgeben:           
                        
  Hallo Bernd, Die Reihenfolge stimmt, aber da ich dem Bediener ermöglichen will, von einem beliebig ausgesuchten Punkt zu starten musste ich die Werte in ein Array schreiben, den Bediener einen Punkt selektieren lassen und anschließend das Array umsortieren, so dass der Punkt dann am Anfang des Arrays steht aber die Reihenfolge weiter stimmt. Nach mehrmaligem testen habe ich festgestellt, dass die Richtung, in der die Kontur immer im Uhrzeigersinn auf Scheitelpunkte untersucht wird, jedenfalls war es bei mir nach 20 Testdurchläufen mit unterschiedlichen Skizzen so. Deshalb muss ich dass Array einfach einmal umsortieren, um die Reihenfolge entgegen des Uhrzeigersinns zu haben.  Ich habe ein zweidimensionales Array gewählt, um x und y Koordinaten zusammen zu halten. Hier der Codeausschnitt:
  Code:
  '---Umsortieren des erstellten Arrays, da die Werte im Uhrzeigersinn ausgelesen werden---         Dim temp1, temp2 As Double         Dim top, bottom As Integer         top = AnzahlWerte         bottom = LBound(Werte)         While bottom < top             temp1 = Werte(bottom, 1)             temp2 = Werte(bottom, 2)             Werte(bottom, 1) = Werte(top, 1)             Werte(bottom, 2) = Werte(top, 2)             Werte(top, 1) = temp1             Werte(top, 2) = temp2             bottom = bottom + 1             top = top - 1         Wend         ReDim sFilter(0)         sFilter(0) = "AnyObject"
         '---Startpunkt für Durchnummerierung bzw. Buchstabenvergabe auswählen---         sStatus = selection1.SelectElement2(sFilter, "Bitte Startpunkt auswählen", False)         If sStatus <> "Normal" Then             MsgBox "Makro wird beendet"             Exit Sub         End If         Set Startpunkt = selection1.Item2(1)         Set oRefPoint = Startpunkt.Reference         Set refpoint1 = Bezugspunkt 'Vorher festgelegt         Set oMeasureable = oSPAWorkbench.GetMeasurable(oRefPoint)         oMeasureable.GetMinimumDistancePoints refpoint1, oCoordinates                  Dim StartpunktCoords(1)         StartpunktCoords(0) = oCoordinates(3) - oCoordinates(0)          StartpunktCoords(1) = oCoordinates(4) - oCoordinates(1)                  '---Position des Startpunkts im aktuellen Array feststellen---         Dim Position As Integer         For i = 1 To AnzahlWerte             If StartpunktCoords(0) = Werte(i, 1) Then                 If StartpunktCoords(1) = Werte(i, 2) Then                     Position = i                     Exit For                 End If             End If         Next i                  '---Werte nach Startpunkt in neuem Array sortieren---         Dim WerteSortiert(1 To 30, 1 To 2) As Double         Dim s As Integer         i = 1         For s = Position To AnzahlWerte             WerteSortiert(i, 1) = Werte(s, 1)             WerteSortiert(i, 2) = Werte(s, 2)             i = i + 1         Next s         For s = 1 To (Position - 1)             WerteSortiert(i, 1) = Werte(s, 1)             WerteSortiert(i, 2) = Werte(s, 2)             i = i + 1         Next s
  
  Einiges ist bestimmt noch Verbesserungsfähig, aber ich denke das werde ich mit der Zeit hinbekommen. Gruß Mark Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  |