| |
| KISTERS 3DViewStation: Mit Modellbasiertem Design zum Modellbasierten Unternehmen (MBE), eine Pressemitteilung
|
Autor
|
Thema: Eckpunkte von Geometrie entgegen Uhrzeigersinn messen (1323 / 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: 12005 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: 12005 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: 12005 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: 12005 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: 12005 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 |