Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Polylinie modifizieren

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Polylinie modifizieren (1707 mal gelesen)
SchwedeNK
Mitglied
Holztechniker


Sehen Sie sich das Profil von SchwedeNK an!   Senden Sie eine Private Message an SchwedeNK  Schreiben Sie einen Gästebucheintrag für SchwedeNK

Beiträge: 43
Registriert: 19.05.2011

AutoCAD 2009 - 2018
Visual Studio Express 2010 / 2012 /2015
Windows 10 64 Bit
Windows 8.1 Pro 64 Bit

erstellt am: 17. Okt. 2013 15:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen!

Ich habe eine geschlossene Polylinie mit Bögen.
Ich will diese nun kopieren, den Start / Endpunkt aber selber setzen, beides an der gleichen Stelle. Polylinie ist somit nicht mehr geschlossen, sondern offen.
Zusätzlich will ich der Polylinie zusätzlich eine Richtung vorgeben.

Meine Vorgehensweise bislang ist, die Polylinie an einem Punkt zu brechen und über einen Vektor die Richtung vorzugeben.
Der angehängte Code funktioniert für ungeschlossene Polylinien, bei geschlossenen kommt mir immer der Startpunkt der Polylinie in die Quere, da beim Brechen von Polylinien immer nur bis zum Startpunkt gebrochen wird.

Hat jemand eine Idee, wie ich dieses Problem lösen kann?

Code:

      <CommandMethod("CNC_PLINE_TEST", CommandFlags.Modal)> _
        Public Shared Sub createBreakpoints()

            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor
            Dim ucs As Matrix3d = ed.CurrentUserCoordinateSystem
            Dim db As Database = HostApplicationServices.WorkingDatabase
            Dim id As ObjectId
            Dim ent As Entity
            Try
                Using tr As Transaction = db.TransactionManager.StartTransaction()
                    'Blocktablerecord  öffnen / schreiben
                    Dim btr As BlockTableRecord = DirectCast(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
                    ' Let the user select a curve
                    id = ed.GetEntity(vbLf & "Polylinie wählen: ").ObjectId
                    If id = ObjectId.Null Then
                        Return
                    End If
                    ent = DirectCast(tr.GetObject(id, OpenMode.ForRead, False), Entity)
                    If ent Is Nothing Then
                        Return
                    End If
                    ' Check that it is really a curve
                    Dim Curve As Polyline = TryCast(ent, Polyline)
                    If Curve Is Nothing Then
                        Return
                    End If
                    Dim breakPnt As Point3d        'ersten Brechpunkt wählen
                    breakPnt = ed.GetPoint(vbLf & "Startpunkt wählen: ").Value
                    Dim RichtungsPt As Point3d      'Richtungsvektor angeben
                    RichtungsPt = ed.GetPoint(vbLf & "Punkt auf Polylinie zur Richtungsbestimmung wählen: ").Value

                    breakPnt.TransformBy(ucs.Inverse())
                    ' Check that the point is on the curve
                    breakPnt = Curve.GetClosestPointTo(breakPnt, False)

                    Dim breakPoints As New Point3dCollection()
                    Dim newCurves As New DBObjectCollection()
                    ' Get the segments according to the trim points

                    breakPoints.Add(breakPnt)
                    newCurves = Curve.GetSplitCurves(breakPoints)

                    If newCurves Is Nothing Then
                        ed.WriteMessage(vbLf & "Fehler in der gewählten Kurve!")
                        Return
                    End If
                    ' Here we add the segments to the database with different colors
                    For i As Integer = 0 To newCurves.Count - 1
                        Dim pent As Polyline = TryCast(DirectCast(newCurves(i), Polyline), Polyline)

                        If pent.StartPoint <> breakPnt Then
                            ReversePolylineDirection(pent)
                        End If

                        pent.SetPropertiesFrom(ent)
                        pent.ColorIndex = i + 1
                        btr.AppendEntity(pent)
                        tr.AddNewlyCreatedDBObject(pent, True)
                    Next
                    ent.UpgradeOpen()

                    tr.Commit()

                End Using

            Catch ex As System.Exception
                ed.WriteMessage(ex.Message)
            End Try
        End Sub

        Private Structure PerVertexData
            Public pt As Point2d
            Public bulge As Double
            Public startWidth As Double
            Public endWidth As Double
        End Structure

        Public Shared Sub ReversePolylineDirection(ByVal pl As Polyline)

            Dim doc = Application.DocumentManager.MdiActiveDocument
            Dim ed = doc.Editor

         
            Dim tr = doc.TransactionManager.StartTransaction()
            Using tr
                If pl IsNot Nothing Then
                    ' Collect our per-vertex data
                    Dim vertData As New List(Of PerVertexData)(pl.NumberOfVertices)
                    For i As Integer = 0 To pl.NumberOfVertices - 1
                        Dim pvd As New PerVertexData()
                        pvd.bulge = (If(i > 0, pl.GetBulgeAt(i - 1), 0))
                        pvd.startWidth = (If(i > 0, pl.GetStartWidthAt(i - 1), 0))
                        pvd.endWidth = (If(i > 0, pl.GetEndWidthAt(i - 1), 0))
                        pvd.pt = pl.GetPoint2dAt(i)
                        vertData.Add(pvd)
                    Next
                    For i As Integer = 0 To pl.NumberOfVertices - 1
                        Dim pvd As PerVertexData = vertData(pl.NumberOfVertices - (i + 1))
                        pl.SetPointAt(i, pvd.pt)
                        pl.SetBulgeAt(i, -pvd.bulge)
                        pl.SetStartWidthAt(i, pvd.endWidth)
                        pl.SetEndWidthAt(i, pvd.startWidth)
                    Next
                End If
                tr.Commit()
            End Using
        End Sub



       

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Ingenieur Studio HOLLAUS
Mitglied
CAD / CAFM / GIS Beratung-Programmierung-Schulung


Sehen Sie sich das Profil von Ingenieur Studio HOLLAUS an!   Senden Sie eine Private Message an Ingenieur Studio HOLLAUS  Schreiben Sie einen Gästebucheintrag für Ingenieur Studio HOLLAUS

Beiträge: 1049
Registriert: 06.11.2008

Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks)
RKV .... CAFM+mehr
HMap ... Vermessung und Verkehr
OoC .... Raumplanung
CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)

erstellt am: 18. Okt. 2013 08:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für SchwedeNK 10 Unities + Antwort hilfreich

Zitat:
Ich will diese nun kopieren, den Start / Endpunkt aber selber setzen, beides an der gleichen Stelle. Polylinie ist somit nicht mehr geschlossen, sondern offen.
Zusätzlich will ich der Polylinie zusätzlich eine Richtung vorgeben.
Grundlegend für diese Wünsche (so ich diese richtig verstanden habe, das ist aber fraglich):
a) erzeuge die Polylinien neu, dann kannst Du die Punkte ordnen, wie Du diese brauchst. Kopieren und dann die VertexCollection dieser modifizieren ist definitiv langsamer (und auch noch umständlicher, ...glaube ich mal).
b) Startpunkt = Endpunkt mag vielleicht in einem Einzelfall sinnvoll sein, aber eigentlich hat Autodesk dafür die Polylinienoption "geschlossen" gebaut, und so sollte diese auch besser verwendet werden.
c) Die Polylinienrichtung folgt der Reihenfolge Deiner Vertizes, spricht also wieder für Punkt a)

------------------


www.cars4fun.at

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

SchwedeNK
Mitglied
Holztechniker


Sehen Sie sich das Profil von SchwedeNK an!   Senden Sie eine Private Message an SchwedeNK  Schreiben Sie einen Gästebucheintrag für SchwedeNK

Beiträge: 43
Registriert: 19.05.2011

AutoCAD 2009 - 2018
Visual Studio Express 2010 / 2012 /2015
Windows 10 64 Bit
Windows 8.1 Pro 64 Bit

erstellt am: 25. Okt. 2013 06:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Guten Morgen und vielen Dank für deine Anregung.

Den zusätzlichen Punkt hinzufügen kann ich problemlos.

Code:

Dim ptOnPline As Point3d = NewPline.GetClosestPointTo(breakPnt, False)
                    Dim param As Double = NewPline.GetParameterAtPoint(ptOnPline)
                    Dim Pt2 As Point2d = New Point2d(breakPnt.X, breakPnt.Y)
                    NewPline.AddVertexAt(System.Math.Floor(param) + 1, Pt2, 0, 0, 0)

Mit diesem Code bekomme ich alle Stützpunkte:

Code:

Public Shared Function getAllVertices(ByVal ent As Polyline) As Point2dCollection

            Dim verCollection As Point2dCollection = New Point2dCollection()
            Dim vertex As Point2d
            Dim i As Integer = 0
            For i = 0 To ent.NumberOfVertices - 1
                Vertex = ent.GetPoint2dAt(i)
                verCollection.Add(Vertex)
            Next
            Return verCollection

        End Function


Wie aber kann ich die Punktreihenfolge mit den Polyliniensegmente so ändern, dass der zusätzliche Punkt zum Startpunkt wird und die Form an sich nicht geändert wird?

Viele Grüße,

Schwede

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz