Autor
|
Thema: Ausrichtung Circle2D (2534 mal gelesen)
|
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 03. Dez. 2012 21:34 <-- editieren / zitieren --> Unities abgeben:
Hallo CAD.de-Gemeinde, ich lese 2D-Elemente aus einem Sketch aus, darunter sind auch 2DCircle (also Kreise sowie Kreisbögen). Ich kann durch die ausgelesenen Anfangs- und Endunkte sowie den Radien die geschlossenen Kreise bestimmen. Bei Kreisbögen ist mir aber nicht genau klar zu welcher Seite die Öffnung des Kreises liegt. Aus welcher Eigenschaft im Circle2D-Object kann ich das Auslesen? Vielen Dank für Eure Hilfe mfG Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 05. Dez. 2012 17:31 <-- editieren / zitieren --> Unities abgeben:
Hallihallo, ich habe noch etwas herum probiert und bin jetzt der Meinung das man die Öffnung des Bogens nicht einfach als Eigenschaft auslesen kann (Bitte korrigieren falls ich mich Irre). Also müßte ich wohl die Öffnung des Bogens über Umwege bestimmen. Evtl. über eine Messung der Bogenlänge aber, was soll ich machen wenn die Bogenlänge genau die Hälfte ist des Kreisumfangs ist... Hat jemand eine andere Idee? vielen Dank schonmal mfG Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarkS. Mitglied NC-Programmierer/Anwendungsentwickler
Beiträge: 30 Registriert: 23.05.2012 Windows 7 SP1 64Bit AMD Opteron 6134 ATI FirePro V8800 32 GB Catia V5 R19/R20/R21 VB.NET 2010 Delphi 7
|
erstellt am: 05. Dez. 2012 19:14 <-- editieren / zitieren --> Unities abgeben: Nur für roccat
Hallo roccat, Wie soll das Ergebnis denn aussehen? Mein Ansatz würde so aussehen... 1. Mittelpunkt über Start und Endpunkt berechnen 2. Startpunkt 90° um den Mittelpunkt rotieren So kann man sich z.B. einen Vektor berechnen, der aus dem Bogen raus zeigt. Gruß Mark Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 05. Dez. 2012 20:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Mark, und Danke für deine Antwort. Zum Ergebnis: Ich möchte einen oder mehrere Umrisse aus einem Sketch auslesen und damit einen Maschinencode (G-Code) erzeugen. Siehe Bilder: Bild 1 – Linienzug im Sketch Bild 2 – Vorschauumriss, den ich im Programm generiere (Radien liegen im falschen Sektor) Bild 3 – ein Linienzug der zufällig richtig interpretiert wird Ich brauche also eine klare Definition der Radienöffnung. Zu deinem Vorschlag: Aus dem Circle2D-Object kann ich Problemlos den Startpunkt, Endpunkt, Mittelpunkt und Radius auslesen. Damit kann ich aber die Richtung nicht bestimmen. Wenn ich dich richtig Verstanden habe soll ich den Startpunkt 90° um den Mittelpunkt drehen und dann prüfen ob der Punkt auf dem Bogen liegt, oder? Es könnten aber auch sehr kleine Bögen entstehen bei denen der Punkt auch nicht mehr auf dem Bogen liegt. Ich habe in der Hilfe auch noch die Methoden GetCurvature und GetDerivatives gefunden, diese scheinen aber unter vba nicht zu funktionieren. Hat damit schon jemand Erfahrungen? mfG Mario
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: 05. Dez. 2012 22:00 <-- editieren / zitieren --> Unities abgeben: Nur für roccat
Servus Du könntest zB die Methode "GetParamExtents" nutzen um den Start- und Endwinkel (im Bogenmass) zu ermitteln, daraus kannst du wenn das noch nicht reicht noch mit "GetTangent" die Tangentenrichtung am Start- und Endpunkt ermitteln. Da die Methoden als "restricted" definiert sind muss du den Kreis als Variant oder Objekt definieren (siehe auch hier): Code: Dim circle2D As circle2D Set circle2D = geometricElements1.Item("Kreis.9")Dim Obj_circle2D As Variant Set Obj_circle2D = circle2D Dim circle_angle(1) As Variant Obj_circle2D.GetParamExtents circle_angle Dim direction_tangent1(1) As Variant Dim direction_tangent2(1) As Variant circle2D1.GetTangent circle_angle(0), direction_tangent1 circle2D1.GetTangent circle_angle(1), direction_tangent2
Gruß Bernd------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 05. Dez. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarkS. Mitglied NC-Programmierer/Anwendungsentwickler
Beiträge: 30 Registriert: 23.05.2012 Windows 7 SP1 64Bit AMD Opteron 6134 ATI FirePro V8800 32 GB Catia V5 R19/R20/R21 VB.NET 2010 Delphi 7
|
erstellt am: 06. Dez. 2012 00:50 <-- editieren / zitieren --> Unities abgeben: Nur für roccat
Hallo, mit dem Mittelpunkt meinte ich den Punkt zwischen Start und Endpunkt...nicht den Kreismittelpunkt. So kann man quasi ermitteln, wo die Öffnung liegt. Mit der Rotation kann man sich einen Vektor erzeugen, welcher aus dem Bogen raus zeigt. Dies wird Dir aber in diesem Fall nicht weiterhelfen. Das Problem liegt hier in der Auswahl des richtigen G-Codes(G2/G3). Die Bögen folgen dabei einer festen Regel...vom Startpunkt geht es entgegen dem Uhrzeigersinn zum Endpunkt. Dies ist genau die Stelle, wo man ansetzen kann. Durch einen Vergleich des letzten Punktes(Endpunkt der vorigen Geometrie) mit dem Startpunkt des darauf folgenden Bogens kann die Richtung ermittelt werden. Sind diese identisch, geht es im entgegen dem Uhrzeigersinn weiter...also G3. Wenn nicht, müssen Start- und Endpunkt getauscht werden und es geht im Uhrzeigersinn weiter...also G2. Entscheidend ist die Richtung, wie in den Bogen gefahren wird. Gruß Mark Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 06. Dez. 2012 06:34 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, hallo Mark, Danke für Eure Hilfe. @Bernd das könnte auch der Grund gewesen sein warum die GetCurvature und GetDerivatives Methoden nicht funktioniert haben. Das werde ich heute noch mal mit Variant versuchen. tausend Dank. @Mark ja, genau das ist mein Problem. Ich habe die G2/G3 Anweisung im Programm integriert, ich kann sie bloß noch nicht korrekt zuweisen. Ich habe die Geometrie bereits im Programm nach Start- und Endpunkte und nach Einzelkonturen in einem Array sortiert. Da ich aber die Mittelpunktbahn fräsen/gravieren möchte(also nicht G41/G42), kann es auch sein dass ich geöffnete Konturen habe. (z.B. nur einen Kreisbogen) Somit habe ich keinen letzen Punkt der vorhergehenden Kontur. Es wäre also wichtig allein aus dem Bogen die Info "ich verlaufe vom Startpunkt aus im Uhrzeigersinn oder entgegen" zu erhalten. Damit kann ich dann auch klar zwischen G2 und G3 entscheiden. Ich werde mal mit den Info´s bissl was versuchen, ich melde mich dann nochmal. tausend Dank mfG Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarkS. Mitglied NC-Programmierer/Anwendungsentwickler
Beiträge: 30 Registriert: 23.05.2012 Windows 7 SP1 64Bit AMD Opteron 6134 ATI FirePro V8800 32 GB Catia V5 R19/R20/R21 VB.NET 2010 Delphi 7
|
erstellt am: 06. Dez. 2012 16:35 <-- editieren / zitieren --> Unities abgeben: Nur für roccat
Hallo roccat, leider hält sich Catia nicht immer an die Regeln, wie ich es gestern erst angenommen hatte. Ich habe mal etwas mit der Funktion "GetParamExtents" rumgespielt, welche Bernd vorgeschlagen hatte. Vllt. hilft Dir der Ansatz etwas weiter... Code:
Function GetCircleGCode(circle2D1 As Variant, dStartX As Variant, dStartY As Variant) As StringDim coordCenter(1) Dim circle_angle(1) Dim dirVec(1) Dim pktStart(1) Dim pktEnd(1) Dim pktRot(1) circle2D1.GetCenter coordCenter circle2D1.GetParamExtents circle_angle 'Berechnung der Start-Endpunkte (entgegen Uhrzeigersinn) pktRot(0) = coordCenter(0) + circle2D1.Radius pktRot(1) = coordCenter(1) pktStart(0) = coordCenter(0) + (pktRot(0) - coordCenter(0)) * Cos(circle_angle(0)) - (pktRot(1) - coordCenter(1)) * Sin(circle_angle(0)) pktStart(1) = coordCenter(1) + (pktRot(0) - coordCenter(0)) * Sin(circle_angle(0)) + (pktRot(1) - coordCenter(1)) * Cos(circle_angle(0)) pktRot(0) = coordCenter(0) + circle2D1.Radius Y = coordCenter(1) pktEnd(0) = coordCenter(0) + (pktRot(0) - coordCenter(0)) * Cos(circle_angle(1)) - (pktRot(1) - coordCenter(1)) * Sin(circle_angle(1)) pktEnd(1) = coordCenter(1) + (pktRot(0) - coordCenter(0)) * Sin(circle_angle(1)) + (pktRot(1) - coordCenter(1)) * Cos(circle_angle(1)) 'Vergleichen mit Eingangsdaten If (Abs(dStartX - pktStart(0)) < 0.1) And (Abs(dStartX - pktStart(0)) < 0.1) Then ' berechneter Endpunkt = Endpunkt GetCircleGCode = "G3" ' und irgendwas Else ' berechneter Startpunkt = Endpunkt GetCircleGCode = "G2" ' und irgendwas End If End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 07. Dez. 2012 13:13 <-- editieren / zitieren --> Unities abgeben:
Hi Mark, tausend Dank für deine Mühe. Ich hatte gestern nicht allzuviel Zeit, hab bloß mal kurz versucht zu verstehen was du da berechnet hast. Ich glaube die if-Abfrage vergleicht zweimal den Anfangspunkt, ich glaube die zweite soll den Endpunkt vergleichen. Ich schau's mir am Wochenende noch mal in Ruhe an. Danke nochmal
mfG Mario
[Diese Nachricht wurde von roccat am 07. Dez. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 09. Dez. 2012 21:35 <-- editieren / zitieren --> Unities abgeben:
Hi, nach einigen Probieren ist hier mal meine Lösung. Ich Lese die Koordinaten für Anfangs und Endpunkt nicht mehr über ".EndPoint" und ".StartPoint" aus da diese je nach Erstellungsrichtung unterschiedlich sein können. Über ".GetParamExtents" bekommt man immer zuerst den kleinsten Winkel und dann den größeren Winkel zurück. Und dass immer Entgegen den Uhrzeigersinn. Somit habe ich die Richtung und über ".GetPointAtParam" lässt sich der Startpunkt und Entpunkt ermitteln. Danke nochmal Euch beiden für Eure Hilfe. Code: Function CheckDirection(MyCircle As Variant) As BooleanDim MyAngle(1) As Variant Dim MyXY1(1) As Variant Dim MyXY2(1) As Variant 'Start und Endwinkel holen MyCircle.GetParamExtents MyAngle 'Koordinaten am Startwinkel holen MyCircle.GetPointAtParam MyAngle(0), MyXY1 'Koordinaten am Endwinkel holen MyCircle.GetPointAtParam MyAngle(1), MyXY2
'Drehrichtung ist immer entgegen dem Uhrzeigersinn CheckDirection = True End Function
mfG Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |