| | |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| | |
 | Weiterbildung Konstrukteur/-in für SolidWorks , ein Kurs (bis zu 100% förderbar mit Bildungsgutschein)
|
|
Autor
|
Thema: SWX_API: Koordinaten umrechnen (3598 mal gelesen)
|
monti0505 Mitglied Ingenieur

 Beiträge: 33 Registriert: 16.07.2008
|
erstellt am: 25. Nov. 2008 17:14 <-- editieren / zitieren --> Unities abgeben:         
Hallo, habe das Problem, dass wenn ich in einer Zeichnung von einem Punkt die Koordinaten auslese, dass dann nicht das KO-System der Zeichnung, sondern anscheinend das KO-System des Punktes verwendet wird. Denn wenn ich in SWX Messe dann sind das andere Koordinaten als die die ich über das Makro bekomme. Ich habe zwar ähnliche Beiträge gefunden aber die haben mir nicht weitergeholfen. Ich verwende einen Sketchpoint den ich manuell in die Zeichnung setze und starte dann das Makro. Die Koordinaten vom Punkt werden geliefert aber wie gesagt es ist nicht das richtige KO-System. Das Makro habe ich z.T. aus der API-Hilfe (GetSketchPoints:Transform Sketch to Model Example (VB)), aber ich komme nicht bei der Umrechnung weiter. Im Code habe ich das auch nochmal etwas näher erläutert.
Code:
Dim swApp As SldWorks.SldWorks Dim selMgr As SldWorks.SelectionMgr Dim Model As SldWorks.ModelDoc2 Dim SketchPoints As Variant Dim SketchFeature As SldWorks.Feature Dim PointCoords(2) As Double Dim MathUtil As SldWorks.MathUtility Dim MathTrans As SldWorks.MathTransform Dim MathP As SldWorks.MathPoint Dim ModelSketchTransform As Variant Dim Feature As SldWorks.SketchPoint 'Connect the program to SolidWorks Set swApp = CreateObject("SldWorks.Application") Set Model = swApp.ActiveDoc 'Prepare the MathUtility Set MathUtil = swApp.GetMathUtility 'Get the SelectionMgr Set selMgr = Model.SelectionManager 'Get the Sketchpoint from the SelectionMgr
Set Feature = selMgr.GetSelectedObject6(1, -1) 'Feature ist ein Sketchpoint
PointCoords(0) = Feature.X PointCoords(1) = Feature.Y PointCoords(2) = Feature.Z Set MathP = MathUtil.CreatePoint(PointCoords)
'Display the point coordinates in relation to the sketch origin SketchPoints = MathP.ArrayData MsgBox SketchPoints(0) & ". " & SketchPoints(1) & ". " & SketchPoints(2) 'bis hier klappt, ich bekomme die Koordinaten des gesetzen Punkts in der Zeichnung, aber die Koordinaten beziehen sich auf das KO-Systems des Punktes selbst. Wenn ich aber in SWXSolidWorks per Hand messe werden die Koordinaten vom Model/Zeichnung genommen. 'Ab hier weiss ich dann nicht genau wie ich weitermachen soll, damit ich dem Multiplaytransform was "richtiges" übergeben kann. Set MathTrans = MathTrans.Inverse 'Multiply the point by the inverse transform 'MathP now refers to the point location in the model coordinates Set MathP = MathP.MultiplyTransform(MathTrans) 'Display the point coordinates in relation to the model origin SketchPoints = MathP.ArrayData MsgBox SketchPoints(0) & ", " & SketchPoints(1) & ", " & SketchPoints(2)
Hoffe mir kann jemand weiterhelfen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 25. Nov. 2008 17:53 <-- editieren / zitieren --> Unities abgeben:          Nur für monti0505
hi, du hast ja noch keine Transfomationsmatrix. Mit "Set MathTrans = MathTrans.Inverse" bildest du ja nur die inverse Matrix von "MathTrans". die ist aber noch nicht gefüllt bzw. die Einheitsmatrix. Schau dir doch mal die folgenden Funktionen an View::ModelToViewTransform und Sketch::ModelToSketchTransform Damit kannst du z.B. die Transformationsmatrix bekommen. Gruß Oliver
------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
monti0505 Mitglied Ingenieur

 Beiträge: 33 Registriert: 16.07.2008
|
erstellt am: 26. Nov. 2008 14:42 <-- editieren / zitieren --> Unities abgeben:         
Hallo , ich habe nun den Code etwas angepasst nach dem ich mir auch die oben empfohlenen Beispiele angeschaut habe. Allerdings bekomme ich immer noch nicht die gleichen Koordinaten wie in SWX in Zeichnung selbst (v.a. stimmt die Z-Koordinate nicht)  Ich habe mal Bilder dazugepackt und einen Teil des Code. Hoffe jemand sieht wo der Fehler ist. Erste MessageBox, ohne die Transformation (unten die SWX Koordinaten) Zweite MessageBox, mit der Transformation und die Punkte manuell auf 0,0,0 gesetzt (unten die SWX Koordinaten) Der Code ab der relevanten Zeile nach dem ersten Beitrag: Code:
SketchPoints = MathP.ArrayData MsgBox "X:" & SketchPoints(0) & vbNewLine & "Y:" & SketchPoints(1) & vbNewLine & "Z:" & SketchPoints(2) 'Erste Messagebox 'Get the model-to-sketch transform for this sketch PointCoords(0) = 0 'das habe ich erst dazugemacht nachdem es auch ohne diese Zeilen PointCoords(1) = 0 ' nicht die richtigen Koordinaten geliefert worden sind. PointCoords(2) = 0 Set MathP = MathUtil.CreatePoint(PointCoords) Set swMathTrans = swSketch.ModelToSketchTransform
'Get the inversion of the transform Set swMathTrans = swMathTrans.Inverse 'Multiply the point by the inverse transform 'MathP now refers to the point location in the model coordinates Set MathP = MathP.MultiplyTransform(swMathTrans) 'Display the point coordinates in relation to the model origin SketchPoints = MathP.ArrayData MsgBox "X:" & SketchPoints(0) * 1000# & vbNewLine & "Y:" & SketchPoints(1) * 1000# & vbNewLine & "Z:" & SketchPoints(2) * 1000# ' Zweite Messagebox
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 27. Nov. 2008 12:42 <-- editieren / zitieren --> Unities abgeben:          Nur für monti0505
Ich habe es irgendwie noch nicht verstanden welche Koordinaten du denn haben möchtest. Naja, und Wissen welche Funktion jetzt welche Transformation durchführt ist auch was anderes . Ich kann nur ein paar Vermutungen anstellen aber vielleicht helfen die ja weiter. Wenn du in einer Skizze (sketch) einen Punkt einfügst oder ausliest sind nur die x und y Werte relevant. Auch wenn das Objekt (sketchpoint) einen z-wert hat, liegt das nur daran das die Programmierer zu faul waren ein neues Objekt zu definieren (naja, es gibt auch noch ein paar andere Gründe). Eine Skizze hat eine bestimmte Lage(Ausrichtung) zum Bauteil, die in einer Matrix abgespeichert wird. Da eine Ansicht in einer Zeichnung auch eine Skizze hat, vermute ich, dass in der Matrix nicht die Lage zum Bauteil sondern die Lage zur Zeichnung steht. Set swActiveView = Model.ActiveDrawingView Set swViewSketch = swActiveView.GetSketch Set MathTrans = swViewSketch.ModelToSketchTransform Der Name „ModelToSketchTransform“ ist natürlich dann sehr irreführend, da eine Zeichnung ja kein Model ist. Aber auch hier waren die Programmierer wohl nur zu „faul“ eine neue Funktion zu schreiben. Es hätte sich ja auch nur der Name „SheetToSketchTransform“ geändert, der Inhalt bleibt ja gleich. mit Set MathTrans = MathTrans.Inverse Set MathP = MathP.MultiplyTransform(MathTrans) bekommst du also die Koordinaten bezogen auf deine Zeichnung(Blatt). Das ist zumindest das Ergebnis eines kleinen Testdurchlaufs bei mir. Allerdings gibt es auch noch die Funktionen View::GetViewXform bzw. View::GetXForm. Ob der Inhalt nun gleich ist mit der „ModelToSketchTransform“ der Skizze bzw. wo der Unterschied ist, weiß ich aber auch nicht. Warum du die Werte auf (0,0,0) setzt verstehe ich allerdings nicht. Wie soll da etwas herauskommen was mit deinem Punkt zutun hat. Gruß Oliver
------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
monti0505 Mitglied Ingenieur

 Beiträge: 33 Registriert: 16.07.2008
|
erstellt am: 27. Nov. 2008 17:19 <-- editieren / zitieren --> Unities abgeben:         
Hallo, also ich will die Koordinaten die mir SWX für den markierten Punkt anzeigt. Und dazu gehört auch der Z-Wert (in SWX wird für Z 20mm angezeigt). Wie im ersten Bild zu sehen bekomme ich aber bei der ersten Msgbox für Z = 0 raus. Die X und Y-Werte stimmen aber. Also habe ich das mit der Transformation versucht, zuerst ohne das Array mit 0en zu überschreiben, und als das nicht das gewünschte Ergebnis brachte (für X, Y und Z kam nicht der richtige Wert raus.), habe ich das mit 0en gefüllt, da ich dachte das ich den Punkt angeben muss der als Referenz dienen soll. Aber das hat leider auch nicht den korrekten Z-Wert geliefert und zusätzlich kam für X und Y auch nicht der richtige Wert raus. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 28. Nov. 2008 09:21 <-- editieren / zitieren --> Unities abgeben:          Nur für monti0505
hi, die frage ist ja, was sw gerade anzeigt. wenn du den punkt in der zeichnung(ansicht) erstellt hast stehen dort die koordinaten bezogen auf deine zeichnung. da die skizze zur zeichnung gehört, kannst du mit Set swActiveView = Model.ActiveDrawingView Set swViewSketch = swActiveView.GetSketch Set MathTrans = swViewSketch.ModelToSketchTransform dir die koordinaten berechnen. wurde der punkt aber im 3d erstellt, stehen dort die koordinaten bezogen auf den ursprung des bauteils. liest du den punkt aus, bekommst du aber nicht direkt diese koordinaten sondern wieder die parameter (x und y-wert) der skizze. das die ersten beiden werte bei dir stimmen ist nur zufall. deine skizze liegt halt in der x-y ebene und ist um 20mm in z verschoben. um die richtigen werte zu berechnen benötigst du also die transformationsmatrix der skizze im 3d und nicht der zeichnung. gruß oliver ------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
monti0505 Mitglied Ingenieur

 Beiträge: 33 Registriert: 16.07.2008
|
erstellt am: 29. Nov. 2008 12:39 <-- editieren / zitieren --> Unities abgeben:         
Hi, also die Koordinaten die da stehen (in den Bilder, wo auch der Z-Wert mit 20 mm angegeben ist) sind die Koordinaten des Punktes in 3d, also aus der Baugruppe. Wenn ich aber in der Zeichnung die Werte des Punktes auslese bekomme ich, wie du schon richtig sagst die Punkt-Koordinaten bezogen auf die Zeichnung, was ich aber nicht möchte. Also will ich diese Koordinaten umrechnen auf die Koordinaten/Ursprung der Baugruppe und genau das bekomme ich nicht hin. Hoffe, du hast jetzt verstanden was ich will und kannst mir evtl. noch einen Tipp geben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 29. Nov. 2008 14:29 <-- editieren / zitieren --> Unities abgeben:          Nur für monti0505
Zitat: Wenn ich aber in der Zeichnung die Werte des Punktes auslese bekomme ich, wie du schon richtig sagst die Punkt-Koordinaten bezogen auf die Zeichnung...
du bekommst meiner meinung eben nicht die koodinaten bezogen auf die zeichnung sondern bezogen auf die skizze in der der punkt erstellt wurde. versuche doch mal von da aus rückwärts zu rechnen. SketchPoint::GetSketch Sketch::ModelToSketchTransform jetzt hast du wahrscheinlih aber erstmal nur die koordinate bezogen auf das bauteil. wenn du eine baugruppe hast geht das spiel halt weiter. mit Component2::Transform2 bekomst du die lage des bauteils in der bauruppe und kannst die koordinaten wieder umrechnen. gruß oliver
------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
monti0505 Mitglied Ingenieur

 Beiträge: 33 Registriert: 16.07.2008
|
erstellt am: 01. Dez. 2008 11:18 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich habe es jetzt hinbekommen. Der Knackpunkt war, das ich das GetSketch für den Punkt anwenden muss. Hier das komplette Makro für die Community:
Code:
Option Explicit Dim swApp As SldWorks.SldWorks Dim selMgr As SldWorks.SelectionMgr Dim Model As SldWorks.ModelDoc2 Dim SketchPoints As Variant Dim SketchFeature As SldWorks.Feature Dim PointCoords(2) As Double Dim MathUtil As SldWorks.MathUtility Dim MathTrans As SldWorks.MathTransform Dim MathP As SldWorks.MathPoint Dim ModelSketchTransform As Variant Dim Feature As SldWorks.SketchPoint Dim swSheet As SldWorks.Sheet Dim swDraw As SldWorks.DrawingDoc Dim swModel As SldWorks.ModelDoc2 Dim swViewSketch As SldWorks.Sketch Dim swActiveView As SldWorks.View Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Sub main() 'Connect the program to SolidWork
Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swDraw = swModel Set selMgr = swModel.SelectionManager Set swSheet = swDraw.GetCurrentSheet Set swActiveView = swDraw.ActiveDrawingView ' Set swViewSketch = swActiveView.GetSketch Set Feature = selMgr.GetSelectedObject6(1, -1) 'SketchPoint PointCoords(0) = Feature.X PointCoords(1) = Feature.Y PointCoords(2) = Feature.Z Set swViewSketch = Feature.GetSketch '******DAS WAR DER KNACKPUNKT ******** Set MathUtil = swApp.GetMathUtility Set MathP = MathUtil.CreatePoint(PointCoords) 'Display the point coordinates in relation to the sketch origin 'swSketch.ModelToSketchTransform SketchPoints = MathP.ArrayData MsgBox "X:" & SketchPoints(0) & vbNewLine & "Y:" & SketchPoints(1) & vbNewLine & "Z:" & SketchPoints(2) 'Get the model-to-sketch transform for this sketch
Set MathTrans = swViewSketch.ModelToSketchTransform 'Get the inversion of the transform Set MathTrans = MathTrans.Inverse 'Multiply the point by the inverse transform 'MathP now refers to the point location in the model coordinates Set MathP = MathP.MultiplyTransform(MathTrans) 'Display the point coordinates in relation to the model origin SketchPoints = MathP.ArrayData ' MsgBox "X:" & SketchPoints(0) & vbNewLine & "Y:" & SketchPoints(1) & vbNewLine & "Z:" & SketchPoints(2) 'Koordinaten im 3D End Sub
Danke für deine Hilfe, das hat mir den Ansatz geliefert.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |