Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Polylinie Vertex entfernen

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 Vertex entfernen (502 mal gelesen)
otm
Mitglied
Bauingenieur


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

Beiträge: 171
Registriert: 26.08.2009

MS Win 10
AutoCAD Civil 3D 2023
VBA Enabler 2023
MS Access Database Enginge X64
MSO 365 (64bit)

erstellt am: 31. Mrz. 2022 14:50    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 Forum,

wie kann man aus einer Polylinie (LWPL) einen Punkt entfernen?

Konkret den Anfangspunkt, einen mittleren oder den Endpunkt, falls die Methoden unterschiedlich sind.
Alle gefundenen Beispiele sind in lisp, damit komme ich aber nicht weiter.
Quasi das Gegenteil von AddVertex.

Beispiel: Ich habe von einer PL alle Koordinaten ausgelesen und möchte die PL am Anfang um ein Delta kürzen.
Ist Delta > als das erste PL-Segment, muss ich den ersten Vertex entfernen und dann vom zweiten Element (Delta - Länge des 1.Elements) abziehen.

Beim Verlängern rechne ich nur die neue Koordinate des Anfangs-/Endpunkts aus und ändere die Koordinaten und fertig.

Aber wie kürze ich um eine Länge, die größer ist als das erste/letzte Element?

------------------
Grüße aus München
Christian

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

KlaK
Ehrenmitglied V.I.P. h.c.
Dipl. Ing. Vermessung, CAD- und Netz-Admin



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

Beiträge: 2682
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2022
Plateia, Canalis
Visual Basic

erstellt am: 01. Apr. 2022 14:14    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 otm 10 Unities + Antwort hilfreich

Hallo Christian,
Die Punkte (Vertex) der Polyline findest Du doch unter .Coordinates
Je nach Art der Polyline haben die Punkte zwei oder drei Elemente, das muß man bei der Erstellung / Veränderung berücksichtigen.
Diese Elemente hast Du ja schon für Deinen Vergleich herausgelesen.
Für solche Fälle habe ich eine globale Abfrage, damit braucht man für Bearbeitungsfunktionen nur eine Variante.
Code:

    Dim P1 As AcadObject    ' Polylinie
    Dim p1_Arr as Integer   ' Feldlänge Punkte
    Dim P1Coord As Variant  ' Koordinaten der Stützpunkte
    Dim P1_Count As Long    ' Anzahl der Stützpunkte

    P1Coord = P1.Coordinates  ' Das Koordinatenfeld der Polyline
    Select Case P1.EntityName
        Case "AcDb3dPolyline":
          p1_Arr = 3
        Case "AcDbLWPolyline":
          p1_Arr = 3
        Case "AcDbPolyline":
          p1_Arr = 2
    End Select
    P1_Count = (UBound(P1Coord) - p1_Arr + 1) / p1_Arr 'Anzahl der Punkte beginnend bei 0
    ' Alternativ:
    ' P1_Count = (UBound(P1Coord) + 1) / p1_Arr 'Anzahl der Punkte beginnend bei 1


Wenn Du jetzt um zwei Elemente kürzen möchtest, machst Du ein neues Array in der entsprechenden Größe

Code:

    Dim PLNeu_Coord As Variant
    DIM PLNeu_Count As Long
    PLNeu_Count = (P1_Count + 1 - 2) * p1_Arr - 1 ' P1_Count beginnt bei 0, deshalb Erhöhung um 1
                                                  ' und dann Abzug des Kürzungsbetrages (hier 2 Elemente)
    ' Alternativ :
    ' PLNeu_Count = (P1_Count - 2) * p1_Arr - 1
    ReDim PLNeu_Coord(0 To PLNeu_Count) As Double

Kopierst die bisherigen Werte zum Beispiel ab dem 3. Punkt (kürzen am Anfang) oder vom 1. bis drittletzten Punkt in das neue Array und ordnest das Array dem PL.Coordinates zu. Den neuen Anfangs- oder Endpunkt mußt Du natürlich auch noch entsprechend Deiner gewünschten Länge korrigieren.

Code:
P1.Coordinates = PLNeu_Coord

Noch ein P1.Update - fertig

Hoffe es hilft  
Grüße
Klaus  

[Diese Nachricht wurde von KlaK am 01. Apr. 2022 editiert.]

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

otm
Mitglied
Bauingenieur


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

Beiträge: 171
Registriert: 26.08.2009

MS Win 10
AutoCAD Civil 3D 2023
VBA Enabler 2023
MS Access Database Enginge X64
MSO 365 (64bit)

erstellt am: 04. Apr. 2022 21: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

Hallo Klaus,

und ob das hilft.

Ich wusste nicht, dass ich die Coordinates-Liste einfach nur neu befüllen muss, um Punkte zu löschen.
Vielen Dank.

------------------
Grüße aus München
Christian

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

KlaK
Ehrenmitglied V.I.P. h.c.
Dipl. Ing. Vermessung, CAD- und Netz-Admin



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

Beiträge: 2682
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2022
Plateia, Canalis
Visual Basic

erstellt am: 05. Apr. 2022 12:44    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 otm 10 Unities + Antwort hilfreich

Prima, dann setze ich den erledigt-Haken    

Grüße
Klaus  

Zitat:
Ich wusste nicht, dass ich die Coordinates-Liste einfach nur neu befüllen muss, um Punkte zu löschen.

Bei normalen Polylinien ist das so einfach, wenn noch Bögen dabei sind wird es etwas komplizierter 

[Diese Nachricht wurde von KlaK am 05. Apr. 2022 editiert.]

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

DraftsmanCAD
Mitglied


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

Beiträge: 9
Registriert: 08.12.2022

erstellt am: 02. Aug. 2023 08:07    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 otm 10 Unities + Antwort hilfreich

Guten Morgen Forum!
Ich war gerade dabei, ein Tool zu schreiben, das den ersten Vertex einer Polylinie entfernt und dann die Polylinie schließt. Dabei bin ich auf diesen Beitrag gestoßen und habe euren Code zusammenkopiert    . Allerdings bekomme ich einen Laufzeitfehler 5 "Ungültiger Prozeduraufruf oder ungültiges Argument". Kann mir jemand einen Tipp geben, wie ich das Problem beheben kann?

Code:
Sub PlineClose()

    Dim P1 As AcadObject    ' Polylinie
    Dim p1_Arr As Integer   ' Feldlänge Punkte
    Dim P1Coord As Variant  ' Koordinaten der Stützpunkte
    Dim P1_Count As Long    ' Anzahl der Stützpunkte
    Dim PLNeu_Coord As Variant
    Dim PLNeu_Count As Long

   
    For Each P1 In ThisDrawing.ModelSpace
   
   
    Select Case P1.EntityName
        Case "AcDb3dPolyline":
          p1_Arr = 3
          P1Coord = P1.coordinates  ' Das Koordinatenfeld der Polyline
          P1_Count = (UBound(P1Coord) - p1_Arr + 1) / p1_Arr 'Anzahl der Punkte beginnend bei 0
          PLNeu_Count = (P1_Count + 1 - 2) * p1_Arr - 1 ' P1_Count beginnt bei 0, deshalb Erhöhung um 1 und dann Abzug des Kürzungsbetrages (hier 2 Elemente)
          P1.coordinates = PLNeu_Coord
          P1.Closed
          P1.Update
         
        Case "AcDbLWPolyline":
          p1_Arr = 3
          P1Coord = P1.coordinates  ' Das Koordinatenfeld der Polyline
          P1_Count = (UBound(P1Coord) - p1_Arr + 1) / p1_Arr 'Anzahl der Punkte beginnend bei 0
          PLNeu_Count = (P1_Count + 1 - 2) * p1_Arr - 1 ' P1_Count beginnt bei 0, deshalb Erhöhung um 1 und dann Abzug des Kürzungsbetrages (hier 2 Elemente)
          P1.coordinates = PLNeu_Coord
          P1.Closed
          P1.Update
         
        Case "AcDbPolyline":
          p1_Arr = 2
          P1Coord = P1.coordinates  ' Das Koordinatenfeld der Polyline
          P1_Count = (UBound(P1Coord) - p1_Arr + 1) / p1_Arr 'Anzahl der Punkte beginnend bei 0
          PLNeu_Count = (P1_Count + 1 - 2) * p1_Arr - 1 ' P1_Count beginnt bei 0, deshalb Erhöhung um 1 und dann Abzug des Kürzungsbetrages (hier 2 Elemente)
          P1.coordinates = PLNeu_Coord
          P1.Closed
          P1.Update
         
    End Select
    Next
End Sub


Oh, ich habe die PLNeu_Coord noch nicht befüllt  
Wie schneide ich denn die ersten 2/3 Werte der P1.coordinates ab?

Danke schonmal für die Hilfe!

[Diese Nachricht wurde von DraftsmanCAD am 02. Aug. 2023 editiert.]

[Diese Nachricht wurde von DraftsmanCAD am 02. Aug. 2023 editiert.]

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

KlaK
Ehrenmitglied V.I.P. h.c.
Dipl. Ing. Vermessung, CAD- und Netz-Admin



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

Beiträge: 2682
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2022
Plateia, Canalis
Visual Basic

erstellt am: 02. Aug. 2023 08:40    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 otm 10 Unities + Antwort hilfreich

Hallo,
Zitat:
Original erstellt von DraftsmanCAD:
Oh, ich habe die PLNeu_Coord noch nicht befüllt  
Wie schneide ich denn die ersten 2/3 Werte der P1.coordinates ab?

[Diese Nachricht wurde von DraftsmanCAD am 02. Aug. 2023 editiert.]


Zumindest hast Du den ersten Fehler schon selber gefunden 
Zum Füllen einfach ab Wert 3/4 kopieren.
ABER : Ich würde zunächst mal prüfen ob die Polylinie nicht schon geschlossen ist und ob der letzte Wert auch wirklich dem ersten entspricht.
Darf man Fragen warum Du das machst? Warum muß der erste Punkt gelöscht werden und nicht der letzte? Warum überhaupt löschen? Selbst doppelte Punkte stören doch bei einer PL nicht.

Grüße
Klaus 

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

DraftsmanCAD
Mitglied


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

Beiträge: 9
Registriert: 08.12.2022

erstellt am: 02. Aug. 2023 09:23    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 otm 10 Unities + Antwort hilfreich

Ich habe eine Zeichnung mit tausenden Polylinien, wobei bei jeder Polylinie die Koordinaten des letzten Punktes exakt denen des ersten Punktes entsprechen. Leider ist keine der Linien geschlossen, was jedoch für die weitere Verarbeitung erforderlich ist. Ein einfaches Schließen aller Polylinien würde dazu führen, dass beispielsweise eine quadratische Fläche 5 Eckpunkte hätte (Punkt 1 und Punkt 5 hätten weiterhin die gleichen Koordinaten).

Um mögliche Fehler bei weiteren Berechnungen zu vermeiden, beabsichtige ich, entweder den ersten oder letzten Punkt zu löschen und anschließend die Polylinie zu schließen, um doppelte Punkte zu vermeiden.

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

KlaK
Ehrenmitglied V.I.P. h.c.
Dipl. Ing. Vermessung, CAD- und Netz-Admin



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

Beiträge: 2682
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2022
Plateia, Canalis
Visual Basic

erstellt am: 02. Aug. 2023 11:37    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 otm 10 Unities + Antwort hilfreich

Hm, eigentlich fällt mir nichts ein wo das ein Problem sein sollte. Selbst beim Shape-Polygon-Export kann man angeben dass solche Polylinien, die nicht als geschlossen markiert sind mit verwendet werden sollen. Für Schraffuren, Regionen oder Flächenberechnungen spielt das auch keine Rolle. Aber gut, kann man machen wenn man unbedingt diekorrekte Anzahl der Stützpunkte braucht.
Programm läuft jetzt?

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

DraftsmanCAD
Mitglied


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

Beiträge: 9
Registriert: 08.12.2022

erstellt am: 02. Aug. 2023 11:47    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 otm 10 Unities + Antwort hilfreich

Du kannst es gedanklich schon abhaken ;-) Danke Dir!

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