| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: Linie in Skizze erstellen (1514 / mal gelesen)
|
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 24. Apr. 2017 15:26 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe eine Skizze (verdreht im Raum) und möchte nun auf diese per 2D-Koordinaten eine Kontur erstellen. Wie muss ich das machen? [Diese Nachricht wurde von met am 24. Apr. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Walter Hogger Moderator Maschinenbauingenieur
Beiträge: 4008 Registriert: 06.10.2000 UG V2 bis UG V18 NX1 bis NX2312 ("NX23")
|
erstellt am: 24. Apr. 2017 15:40 <-- editieren / zitieren --> Unities abgeben: Nur für met
Hallo met, Skizzen sind stets planar. Vermutlich liegt deine Skizze auf einer räumlichen Ebene oder einem räumlichen Koordinatensystem. Wenn du die Skizzenebene selektierst und <F8> drückst, dann solltest du normal auf die Skizze blicken (keine Verzerrung mehr dabei). Dann könntest du dein WCS so platzieren, dass X-Y ebenfalls in dieser Ebene liegt und dann kannst du 2D-Koordinaten abfragen oder Punkte erstellen. So deutlich ist dein Ziel nicht formuliert. Gruß
------------------ Walter Hogger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 24. Apr. 2017 16:10 <-- editieren / zitieren --> Unities abgeben:
Hallo und Danke für die schnelle Antwort. Ich habe das WCS auf die Skizze ausgerichtet, muss ich die curves vielleicht anders erstellen als mit
Code: myPart.Curves.CreateLine(stpt, endpt)
Hier mein Beispiel: Erstellt einen Text auf der Skizze mit dem Namen "Skizze_Text" Code: ' NX 5.0.6.3 ' Journal created by met on Tue Apr 11 10:42:12 2017 Mitteleuropäische Sommerzeit ' Option Strict Off Imports System Imports NXOpen Module NXJournal000 Sub Main()
Dim theSession As Session = Session.GetSession() Dim workPart As Part = theSession.Parts.Work Dim displayPart As Part = theSession.Parts.Display NX_CreateText("Test", New Drawing.Font("Arial", 10), "Skizze_Text", workPart) End Sub Function NX_CreateText(text As String, font As Drawing.Font, mySketchName As String, myPart As Part, Optional mySession As Session = Nothing, Optional myUfSession As UF.UFSession = Nothing) As Boolean If mySession Is Nothing Then mySession = NXOpen.Session.GetSession() If myUfSession Is Nothing Then myUfSession = NXOpen.UF.UFSession.GetUFSession() Dim path As New Drawing.Drawing2D.GraphicsPath(System.Drawing.Drawing2D.FillMode.Alternate) Dim curves As New Collections.ArrayList Dim zero As New Drawing.Point(0, 0) Dim format As Drawing.StringFormat = Drawing.StringFormat.GenericDefault path.AddString(text, font.FontFamily, font.Style, font.SizeInPoints, zero, format) Dim bounds As Drawing.RectangleF = path.GetBounds() Dim gdi As New Drawing.Drawing2D.GraphicsPathIterator(path) gdi.Rewind() Dim origin() As Double = {bounds.Left, bounds.Bottom} Dim mySketch As Sketch = Nothing Try For Each tmpFeature As Features.Feature In myPart.Features If tmpFeature.Name = mySketchName Then mySketch = CType(tmpFeature, Features.SketchFeature).Sketch End If Next Catch ex As Exception End Try If Not IsNothing(mySketch) Then myPart.WCS.SetCoordinateSystem(myPart.CoordinateSystems.CreateCoordinateSystem(mySketch.Origin, mySketch.Orientation, True)) For iSubPath As Integer = 0 To gdi.SubpathCount - 1 Dim mySubPaths As Integer Dim IsClosed As Boolean Dim subPathStartIndex, subPathEndIndex As Integer Dim stpt As New Point3d Dim endpt As New Point3d mySubPaths = gdi.NextSubpath(subPathStartIndex, subPathEndIndex, IsClosed) Dim pointTypeStartIndex, pointTypeEndIndex As Integer Do Dim subPathPointType As Byte Dim numPointsFound As Integer = gdi.NextPathType(subPathPointType, pointTypeStartIndex, pointTypeEndIndex) Dim type As Drawing.Drawing2D.PathPointType = CType(subPathPointType, Drawing.Drawing2D.PathPointType) If type = Drawing.Drawing2D.PathPointType.Line Then NX_CreateLinearPath(pointTypeStartIndex, pointTypeEndIndex, path, origin, curves, myPart) ElseIf type = Drawing.Drawing2D.PathPointType.Bezier3 Then NX_CreateSplinePath(pointTypeStartIndex, pointTypeEndIndex, path, origin, curves, myUfSession) End If Loop While subPathEndIndex <> pointTypeEndIndex If IsClosed Then stpt.X = path.PathPoints(subPathStartIndex).X + origin(0) stpt.Y = -path.PathPoints(subPathStartIndex).Y + origin(1) stpt.Z = 0 endpt.X = path.PathPoints(subPathEndIndex).X + origin(0) endpt.Y = -path.PathPoints(subPathEndIndex).Y + origin(1) endpt.Z = 0 If Math.Abs(stpt.X - endpt.X) > 0.000001 Or Math.Abs(stpt.Y - endpt.Y) > 0.000001 Then curves.Add(myPart.Curves.CreateLine(stpt, endpt)) End If End If Next mySketch.Activate(Sketch.ViewReorient.True) mySketch.DeleteObjects(mySketch.GetAllGeometry) For Each Curve As DisplayableObject In curves Try mySketch.AddGeometry(Curve) Catch ex As Exception End Try Next mySketch.Deactivate(Sketch.ViewReorient.True, Sketch.UpdateLevel.Model) End If Return Nothing End Function Sub NX_CreateLinearPath(ByVal startIndex As Integer, ByVal endIndex As Integer, _ ByRef path As Drawing.Drawing2D.GraphicsPath, ByRef origin() As Double, _ ByRef curves As Collections.ArrayList, myPart As Part) Dim j As Integer For j = startIndex To endIndex - 1 Dim stpt As New Point3d Dim endpt As New Point3d stpt.X = path.PathPoints(j).X + origin(0) stpt.Y = -path.PathPoints(j).Y + origin(1) stpt.Z = 0 endpt.X = path.PathPoints(j + 1).X + origin(0) endpt.Y = -path.PathPoints(j + 1).Y + origin(1) endpt.Z = 0 curves.Add(myPart.Curves.CreateLine(stpt, endpt)) Next End Sub Sub NX_CreateSplinePath(ByVal startIndex As Integer, ByVal endIndex As Integer, _ ByRef path As Drawing.Drawing2D.GraphicsPath, ByRef origin() As Double, _ ByRef curves As Collections.ArrayList, ByRef myUfSession As UF.UFSession) Dim j As Integer For j = startIndex To endIndex - 1 Step 3 Dim poles(3, 3) As Double Dim k As Integer For k = 0 To 3 poles(k, 0) = path.PathPoints(j + k).X + origin(0) poles(k, 1) = -path.PathPoints(j + k).Y + origin(1) poles(k, 2) = 0 poles(k, 3) = 1 Next Dim knots() As Double = {0, 0, 0, 0, 1, 1, 1, 1} Dim spl As UF.UFCurve.Spline Dim spline As Tag Dim num_states As Integer Dim states() As UF.UFCurve.State = Nothing spl.start_param = 0 spl.end_param = 1 spl.is_rational = 0 spl.num_poles = 4 spl.order = 4 spl.knots = knots spl.poles = poles myUfSession.Curve.CreateSpline(spl, spline, num_states, states) curves.Add(Utilities.NXObjectManager.Get(spline)) Next End Sub End Module
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Walter Hogger Moderator Maschinenbauingenieur
Beiträge: 4008 Registriert: 06.10.2000 UG V2 bis UG V18 NX1 bis NX2312 ("NX23")
|
erstellt am: 24. Apr. 2017 16:32 <-- editieren / zitieren --> Unities abgeben: Nur für met
Au weia, bei mir kommen alle Beiträge von den unterschiedlichen Foren-Bereichen rein. Ich hatte übersehen, das deiner aus der Programmierer-Ecke stammt. SORRY! Meine Antwort war für die interaktive Vorgehensweise gedacht. Mit NXOpen kenn' ich mich leider nicht aus, das machen meine Kollegen. Vielleicht liest das der Michael? ;-) Gruß ------------------ Walter Hogger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2704 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 24. Apr. 2017 17:02 <-- editieren / zitieren --> Unities abgeben: Nur für met
Zitat: Original erstellt von Walter Hogger: Vielleicht liest das der Michael? ;-)
Er hat's gelesen :-) Aber das "Au weia" bleibt auch hier nicht aus:
Warum gehst Du erst über GDI bzw. System.Drawing ? Das hat mit NX erstmal nichts zu tun. > 100 Zeilen Code so mal schnell zu überblicken und ggfs. zu korrigieren ist nicht drin, sorry.
Die Empfehlung lautet, den gewünschten Ablauf aufzuzeichnen, möglichst nur das Notwendige. Beim Sketch ist jedenfalls einiges mehr zu machen als bei einer einfachen Linie. Steht aber alles in einer Aufzeichnung drin. Gruß, Michael ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit seltner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 25. Apr. 2017 07:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Michael, sorry... hier mal etwas kompakter :-) Ich möchte in einer ausgewählten Skizze, einzelne Linien hinzufügen. - die Skizze kann irgendwo im Raum sein (deshalb habe ich das WCS auf die Skizze ausgerichtet) - ich möchte nun Linien mit 2D-Koordinaten auf der Skizze erzeugen (nicht mit Welt-Koordinaten) Hier mein Versuch:
Code: Option Strict Off Imports System Imports NXOpen Module NXJournal300 Sub Main() Dim theSession As Session = Session.GetSession() Dim workPart As Part = theSession.Parts.Work Dim displayPart As Part = theSession.Parts.Display Dim mySketch As Sketch = Nothing
Try For Each tmpFeature As Features.Feature In workPart.Features If tmpFeature.Name = "Skizze_Text" Then mySketch = CType(tmpFeature, Features.SketchFeature).Sketch End If Next Catch ex As Exception End Try If Not IsNothing(mySketch) Then workPart.WCS.SetCoordinateSystem(workPart.CoordinateSystems.CreateCoordinateSystem(mySketch.Origin, mySketch.Orientation, True)) Dim curves As New Collections.ArrayList curves.Add(workPart.Curves.CreateLine(New Point3d(0, 0, 0), New Point3d(100, 0, 0))) curves.Add(workPart.Curves.CreateLine(New Point3d(100, 0, 0), New Point3d(100, 50, 0))) curves.Add(workPart.Curves.CreateLine(New Point3d(100, 50, 0), New Point3d(0, 0, 0))) mySketch.Activate(Sketch.ViewReorient.True) mySketch.DeleteObjects(mySketch.GetAllGeometry) For Each Curve As DisplayableObject In curves Try mySketch.AddGeometry(Curve) Catch ex As Exception End Try Next mySketch.Deactivate(Sketch.ViewReorient.True, Sketch.UpdateLevel.Model) End If End Sub End Module
Erstellt werden die Linien aber auf absolute Koordinaten und nicht auf der Ebene der Skizze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2704 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 25. Apr. 2017 09:51 <-- editieren / zitieren --> Unities abgeben: Nur für met
Hallo met, das sieht zwar schon besser aus, aber Code: workPart.Curves.CreateLine
wird in einem Sketch m.W. nicht funktionieren. Es braucht in jedem Fall einen Sketch*Builder, die Methode, um darin eine Linie zu erzeugen hab' ich jetzt nicht auswendig parat. Daher nochmal: Journal Aufzeichnen !Gruß, Michael So kommt's, wenn man glaubt, etwas aus dem Gedächtnis heraus beantworten zu können Code: workPart.Curves.CreateLine
ist die richtige Methode, zuvor fehlt aber ein BeginTaskEnvironment. Auch den Sketch*Builder braucht man nicht bei einem existierenden Sketch. Was aber nach wie vor gilt: NX weiss besser, wie es tickt und daher führt eine Aufzeichnung zur Lösung. ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit seltner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 25. Apr. 2017 14:35 <-- editieren / zitieren --> Unities abgeben:
Hallo, zeichnet mir leider nur das auf :-( Zur Info: Ich arbeite mit NX5, da wir noch auf TCE9.1.3 hängen... Code: ' NX 5.0.6.3 ' Journal created by met on Tue Apr 25 14:28:19 2017 Mitteleuropäische Sommerzeit ' Option Strict Off Imports System Imports NXOpenModule NXJournal2222 Sub Main() Dim theSession As Session = Session.GetSession() Dim workPart As Part = theSession.Parts.Work Dim displayPart As Part = theSession.Parts.Display Dim markId1 As Session.UndoMarkId markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Redefine Feature") Dim markId2 As Session.UndoMarkId markId2 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Redefine Feature") Dim sketchFeature1 As Features.SketchFeature = CType(workPart.Features.FindObject("SKETCH(26)"), Features.SketchFeature) sketchFeature1.MakeCurrentFeature() theSession.BeginTaskEnvironment() Dim markId3 As Session.UndoMarkId markId3 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Enter Sketcher") theSession.DeleteUndoMarksUpToMark(markId3, Nothing, False) Dim markId4 As Session.UndoMarkId markId4 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Enter Sketcher") Dim sketch1 As Sketch = CType(workPart.Sketches.FindObject("SKETCH_001"), Sketch) sketch1.Activate(Sketch.ViewReorient.True) theSession.DeleteUndoMarksUpToMark(markId4, Nothing, True) theSession.DeleteUndoMarksUpToMark(markId4, Nothing, False) Dim markId5 As Session.UndoMarkId markId5 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Open Sketch") theSession.DeleteUndoMarksUpToMark(markId5, Nothing, False) Dim markId6 As Session.UndoMarkId markId6 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Enter Sketcher") Dim markId7 As Session.UndoMarkId markId7 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Profile short list") Dim markId8 As Session.UndoMarkId markId8 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, "Curve") theSession.SetUndoMarkVisibility(markId8, "Curve", Session.MarkVisibility.Visible) Dim startPoint1 As Point3d = New Point3d(20.15, 48.441154273188, 87.5025403784439) Dim endPoint1 As Point3d = New Point3d(14.15, 48.441154273188, 87.5025403784439) Dim line1 As Line line1 = workPart.Curves.CreateLine(startPoint1, endPoint1) theSession.ActiveSketch.AddGeometry(line1, Sketch.InferConstraintsOption.InferNoConstraints) Dim geom1 As Sketch.ConstraintGeometry geom1.Geometry = line1 geom1.PointType = Sketch.ConstraintPointType.None geom1.SplineDefiningPointIndex = 0 Dim sketchGeometricConstraint1 As SketchGeometricConstraint sketchGeometricConstraint1 = theSession.ActiveSketch.CreateHorizontalConstraint(geom1) theSession.ActiveSketch.Deactivate(Sketch.ViewReorient.True, Sketch.UpdateLevel.SketchOnly) theSession.DeleteUndoMarksSetInTaskEnvironment() theSession.EndTaskEnvironment() Dim nErrs1 As Integer nErrs1 = theSession.UpdateManager.DoUpdate(markId2) sketchFeature1.MakeCurrentFeature() theSession.DeleteUndoMark(markId2, Nothing) End Sub End Module
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2704 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 25. Apr. 2017 16:26 <-- editieren / zitieren --> Unities abgeben: Nur für met
Meine "Älteste" ist die NX6, da sieht die Aufzeichnung aber sehr ähnlich aus. Nur das Constraint hab' ich weggelassen. Tut sich was, wenn Du es wieder ablaufen lässt ? Sollte m.E. funktionieren. Vorher sollte die schon erzeugte Linie gelöscht oder durch ein UNDO entfernt werden. ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit seltner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 27. Apr. 2017 10:13 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, hier die Lösung: UFSession.Csys.MapPoint Code: Option Strict Off Imports System Imports NXOpen Module NXJournal300 Sub Main() Dim theSession As Session = Session.GetSession() Dim workPart As Part = theSession.Parts.Work Dim displayPart As Part = theSession.Parts.Display Dim mySketch As Sketch = Nothing
Try For Each tmpFeature As Features.Feature In workPart.Features If tmpFeature.Name = "Skizze_Text" Then mySketch = CType(tmpFeature, Features.SketchFeature).Sketch End If Next Catch ex As Exception End Try If Not IsNothing(mySketch) Then workPart.WCS.SetCoordinateSystem(workPart.CoordinateSystems.CreateCoordinateSystem(mySketch.Origin, mySketch.Orientation, True)) Dim p1 As New Point3d(0, 0, 0) Dim p2 As New Point3d(50, 0, 0) Dim p3 As New Point3d(100, 50, 0) Dim curves As New Collections.ArrayList curves.Add(workPart.Curves.CreateLine(NX_WCS2Abs(p1), NX_WCS2Abs(p2))) curves.Add(workPart.Curves.CreateLine(NX_WCS2Abs(p2), NX_WCS2Abs(p3))) curves.Add(workPart.Curves.CreateLine(NX_WCS2Abs(p3), NX_WCS2Abs(p1)))
mySketch.Activate(Sketch.ViewReorient.True) mySketch.DeleteObjects(mySketch.GetAllGeometry) For Each Curve As DisplayableObject In curves Try mySketch.AddGeometry(Curve) Catch ex As Exception End Try Next mySketch.Deactivate(Sketch.ViewReorient.True, Sketch.UpdateLevel.Model) End If End Sub Function NX_WCS2Abs(myPoint As Point3d, Optional myUfSession As UF.UFSession = Nothing) As Point3d If myUfSession Is Nothing Then myUfSession = NXOpen.UF.UFSession.GetUFSession() Dim result As New Point3d() Dim p1(2), p2(2) As Double p1(0) = myPoint.X p1(1) = myPoint.Y p1(2) = myPoint.Z myUfSession.Csys.MapPoint(UF.UFConstants.UF_CSYS_ROOT_WCS_COORDS, p1, UF.UFConstants.UF_CSYS_ROOT_COORDS, p2) result.X = p2(0) result.Y = p2(1) result.Z = p2(2) Return result End Function End Module
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Techniker/in Arbeitsvorbereitung Konstruktion Produktion | Die Weisig Maschinenbau GmbH ist ein freundliches Familienunternehmen des Maschinen- und Fahrzeugbaus mit einem vielfältigen Produktprogramm. Seit über 50 Jahren fertigen wir in Alfeld (Leine) Straßenbaumaschinen, hochwertige Bürocontainer und Baustellenwagen. Wir fertigen neben Serienprodukten insbesondere kundenindividuelle Lösungen, womit wir uns in unserem Kundenkreis den Ruf einesverlässlichenund kompetenten Partners erar beiten konnten.... | Anzeige ansehen | Feste Anstellung |
|
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2704 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 27. Apr. 2017 17:17 <-- editieren / zitieren --> Unities abgeben: Nur für met
Hallo met, Ostern ist zwar vorbei ... aber das ist jetzt schon ein Überraschungsei. Es ging Dir um's Mapping ? Die Linie war da, nur an einer falschen Position ? Das hättest Du auch gleich sagen können ... kostet min. 5 U's extra Michael ------------------ Ein Mensch wird laut, wenn er was will; wenn er's erst hat, dann wird er still; Das "Danke" ist, nach alter Sitte, Weit seltner als das "Bitte, Bitte". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|