Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Polylinien - Stützpunkte vor und nach Pickpunkt

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:  Polylinien - Stützpunkte vor und nach Pickpunkt (1766 mal gelesen)
Geos
Mitglied
Vermessungstechniker i.R.


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

Beiträge: 1017
Registriert: 21.09.2001

ACAD Map 2010, Win 7 Pro
eigene Lisp's<P>HW: Core i7 860, 2.8 GHz
3.3 GB, NVIDIA GeForce GTS 250

erstellt am: 07. Sep. 2007 07:29    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

Servus

In einem früheren Programm hab ich "mühsam" die beide Stützpunkte einer (LW-)Polylinie (ausgerundet oder gerade) ermitttelt.
Jetzt bin ich wieder drauf gestossen und dachte, dass es mit "v-irgendwas" bessere Möglichkeiten geben könnte.
In einem Beitrag hier wurde auf "(vlax-curve..." verwiesen (geht das auch bei "geraden" Polylinien?  ). Damit habe ich es zwar geschafft, den Anfangs- und Endpunkt, bzw. den Fusspunkt des PickPunktes zu ermitteln, aber an die 2 Stützpunkte, bzw. die Bogendaten (falls der angeklickte Teil einer ist) zu kommen, habe ich nicht geschafft. (Vielleicht liegts auch an den mangelnden Englischkenntnissen.)
Vielleicht mag da jemand Nachhilfe geben?

Danke

------------------
Schöne Grüße
Ernst

www.geopaint.at

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 07. Sep. 2007 08:03    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 Geos 10 Unities + Antwort hilfreich

Hallo Ernst,
die vlax-curve-Funktionen sind gar nicht so schlimm, wie sie aussehen. Ich habe Dir mal ein auskommentiertes Beispiel für LWPOLYLINIEN geschrieben. Es werden die Koordinaten der nächstgelegenen Stützpunkte einer LW-Polylinie zu einem Pickpunkt zurückgegeben.
Code:

(defun c:test ( / )
  (vl-load-com)
  (if (and (setq obj(car (entsel "\nLWPOLYLINE wählen:")))
  (=(cdr(assoc 0 (entget obj)))"LWPOLYLINE"))
    (progn
      ;;;Koordinatenliste
      (setq koord (mapcar 'cdr
  (vl-remove-if '(lambda(A)
  (/= (car A) 10))(entget obj))))
      ;;;Stationswert an die Koordinaten anhängen
      (setq koord (mapcar '(lambda(A)
    (list(vlax-curve-getdistatpoint
    (vlax-ename->vla-object obj)A)A))koord))
      (if (setq pickpkt (getpoint "\Pickpunkt:"))
(progn
  ;;;auch dem Pick Punkt eine Station geben
  (setq pickstat (vlax-curve-getdistatpoint
  (vlax-ename->vla-object obj)
  (vlax-curve-getClosestPointTo
    (vlax-ename->vla-object obj)pickpkt)))
  ;;;sortieren der Koordinatenliste nach dem kleinsten Stationsabständen zu pickstat
  (setq koord (vl-sort koord'(lambda(e1 e2)
  (<(abs(- pickstat (car e1)))(abs(- pickstat (car e2)))))))
  (list (cadr(car koord))(cadr(cadr koord))))
(alert "kein Pickpunkt")))
    (alert "keine LWPOLYLINE")))

------------------
viele Grüße

Jörn

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 07. Sep. 2007 08:12    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 Geos 10 Unities + Antwort hilfreich

(defun c:PLSEGINFO ( / PL-OBJ PKT PARAM PRE SUF ) 
  (if(and(setq PL-OBJ(entsel "\nPolyliniensegment wählen : "))
        (setq PKT(cadr PL-OBJ))
        (setq PL-OBJ (car PL-OBJ))
        (setq PL-OBJ(cond                                        ;_ VLA-OBJEKT erzeugen
                      ((=(type PL-OBJ) 'VLA-OBJECT) PL-OBJ)
                      ((=(type PL-OBJ) 'Ename) (vlax-ename->vla-object PL-OBJ))   
                    )
        )       
        (setq PKT  (vlax-curve-getClosestPointTo PL-OBJ PKT))
        (setq PARAM(vlax-curve-getparamAtPoint PL-OBJ PKT))
        (setq PRE(vlax-curve-getpointatparam PL-OBJ (fix PARAM)))
        (setq SUF(vlax-curve-getpointatparam PL-OBJ (1+(fix PARAM))))       
    )
    (progn     
      (princ (strcat "\n KLICKPUNKT        : "(vl-princ-to-string  PKT)))
      (princ (strcat "\n SEGMENT-STARTPUNKT : "(vl-princ-to-string  PRE)))
      (princ (strcat "\n SEGMENT-ENDPUNKT  : "(vl-princ-to-string  SUF)))
      (princ)
    ) 
  ) 
)


für die Bogendaten guck dir die Methode getbulge des Polylinienobjektes an

------------------
  - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

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

Geos
Mitglied
Vermessungstechniker i.R.


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

Beiträge: 1017
Registriert: 21.09.2001

ACAD Map 2010, Win 7 Pro
eigene Lisp's<P>HW: Core i7 860, 2.8 GHz
3.3 GB, NVIDIA GeForce GTS 250

erstellt am: 07. Sep. 2007 18:29    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

Grüß Euch

@Jörn
Ich hab wie Du auch erst eine Punkteliste ermittelt, aber dann mit ssnamex den Index des Punktes geholt.

Code:
(defun plist (ename / elist geschlossen pktlist)
  (setq elist (entget ename))
  (setq geschlossen (cdr (assoc 70 eliste)))
  (setq pktlist nil)
  (while elist
    (if (/= (caar elist) 10)
      (setq elist (cdr elist))
      (progn
        (setq pktlist (append pktlist (list (cdr (assoc 10 elist)))))
        (setq elist (cdr elist))
      )
    )
  )
  pktlist
)
;-----------
(defun polypkte (ppkt pktlist /
                x1 pktanzvppkt #panz x1 pktanzvppkt p1 p2)
  (setq #panz (length pktlist))
  (setq x1 (ssnamex (ssget ppkt)))
  (setq pktanzvppkt (caddar x1))
  (if (< (- (length pktlist) 1) pktanzvppkt)
    (setq pktanzvppkt (- pktanzvppkt 1))
  )
  (repeat pktanzvppkt
    (setq p1 (car pktlist))
    (setq pktlist (cdr pktlist))
    (setq p2 (car pktlist))
  )
  (list p1 p2)
)

Geht aber eben nur mit LW-Polys. Aber Deinen Vorschlag kann man gut für einen Längenschnitt etc. gebrauchen 

@Thomas

  (setq PARAM(vlax-curve-getparamAtPoint PL-OBJ PKT))

Das liefert also einen "Punkt-Index" (also sowas wie 4.Pkt in der Linie) zurück. Ich nehme an, die Nachkommawerte sind ein Prozentsatz - Strecke PRE-PKT von Strecke PRE-SUF.
Wahrscheinlich hätte ich es durchschaut, wenn die Funktion eine Ganzzahl geliefert hätte.

Und was getbulge betrifft - auch der Suche danach lande ich immer in der VBA-Hilfe   

Jedenfalls schönen Dank Euch beiden!

------------------
Schöne Grüße
Ernst

www.geopaint.at

[Diese Nachricht wurde von Geos am 07. Sep. 2007 editiert.]

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 08. Sep. 2007 09:48    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 Geos 10 Unities + Antwort hilfreich

Hallo Ernst,

Zitat:

Geht aber eben nur mit LW-Polys. Aber Deinen Vorschlag kann man gut für einen Längenschnitt etc. gebrauchen

Die Einschränkung auf eine LWPOLYLINE ist nur vorhanden, weil die Koordinatenliste einer POLYLINE aus den VERTEX'es abgeleitet wird.(ich dachte als Beispiel reicht erstmal LW-Poly)
Dann mußt Du eben noch ein "IF" einbauen:

(IF (=(cdr(assoc 0(entget obj)))"POLYLINE")
  (setq koord (koord_aus_poly obj))
  (setq koord (koord_aus_lwpoly obj)))

Sobald die Koordinatenliste erstellt ist (egal ob Poly oder LW-Poly) dann können die vlax-curve-Funktionen verwendet werden.

------------------
viele Grüße

Jörn

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

Geos
Mitglied
Vermessungstechniker i.R.


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

Beiträge: 1017
Registriert: 21.09.2001

ACAD Map 2010, Win 7 Pro
eigene Lisp's<P>HW: Core i7 860, 2.8 GHz
3.3 GB, NVIDIA GeForce GTS 250

erstellt am: 08. Sep. 2007 13: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

Hallo Jörn

Wie gesagt, eine Lösung, die die Polylinien unterscheidet und dann auf verschiedenen Wegen zum Ergebnis kommt, habe ich ja, aber eben aus dem vorigen Jahrtausend  mit "normalem" Lisp.

Der Hauptgrund für meine Frage war, zusätzliche Möglichkeiten mit den vl-Funktionen kennenlernen (was muß man übergeben, was liefern sie zurück ...).
Dabei geht's mir vor allem darum, an die Daten der "komplizierteren" Acad-Objekte - zB. Blöcke/Attribute, oder in diesem Beispiel eben Polylinienabschnitte - zu kommen oder diese einfacher zu bearbeiten oder zu erstellen.

Axels Kochbuch hat mich gelehrt, dass universelle Funktionen brauchbarer sind. Diese Erfahrungen habe ich auch beim Anpassen meiner Programme an geänderte Bedingungen gemacht. Dabei trachte ich nun danach, meine Funktionen in diese Richtung zu verbessern.

Beispielsweise hab ich aus CADmiums PLSEGINFO folgende Funktion gebaut - übernimmt ein Polylinienobjekt und gibt die Stützpunktkoord. vor und nach dem Pickpunkt, sowie den Pickpunkt (exakt auf der Linie) selbst zurück:

Code:

(defun f#krdpolyseg (#polyobj / #vlaplobj #pkt #param)
  (setq #vlaplobj
    (cond
      ((=(type (car #polyobj)) 'VLA-OBJECT) (car #polyobj))
      ((=(type (car #polyobj)) 'Ename) (vlax-ename->vla-object (car #polyobj)))
    )
  )
  (setq #pkt (vlax-curve-getClosestPointTo #vlaplobj (cadr #polyobj)))
  (setq #param (vlax-curve-getparamAtPoint #vlaplobj #pkt))
  (list
    (vlax-curve-getpointatparam #vlaplobj (fix #param))
    (vlax-curve-getpointatparam #vlaplobj (1+(fix #param)))
    #pkt
  )
)


Aber Achtung:
die Funktion akzeptiert ohne murren auch Linien oder Bögen, auch das Ergebnis scheint korrekt (Liste mit 3 Punkten) aber die Koordinaten stimmen nicht.
siehe unten

------------------
Schöne Grüße
Ernst

www.geopaint.at

[Diese Nachricht wurde von Geos am 09. Sep. 2007 editiert.]

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 08. Sep. 2007 17:05    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 Geos 10 Unities + Antwort hilfreich

Hallo Ernst,
na das ist ja auch für mich mal ein Grund mich ins neue Jahrtausend zu begeben, der Funktion "vlax-curve-getpointatparam" hatte ich bisher (leider) nie besonders viel Beachtung geschenkt, jetzt aber.
Schönes Wochenende

------------------
viele Grüße

Jörn

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

Geos
Mitglied
Vermessungstechniker i.R.


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

Beiträge: 1017
Registriert: 21.09.2001

ACAD Map 2010, Win 7 Pro
eigene Lisp's<P>HW: Core i7 860, 2.8 GHz
3.3 GB, NVIDIA GeForce GTS 250

erstellt am: 09. Sep. 2007 12:21    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

Servus Jörg

Zitat:
...der Funktion "vlax-curve-getpointatparam" hatte ich bisher (leider) nie besonders viel Beachtung geschenkt...

Ich auch nicht - all den vl-Funktionen nicht. Zum einen, weil's keine deutsche Beschreibung gibt (wennst nur 3/4 verstehst is es mühsam ; ) und zum anderen sind's die langen Funktionsnamen.

(cdr(assoc 8 (entget(car(entsel)))))
is halt leichter zu merken und eben nur halb so lang wie
(vlax-get-property (vlax-ename->vla-object (car (entsel))) 'Layer).

Aber einige davon eröffnen auch neue Möglichkeiten und werden dadurch interessant - siehe oben.

Übrigens:
obige Funktion akzeptiert ohne murren auch Linien oder Bögen, auch das Ergebnis scheint korrekt (Liste mit 3 Punkten) aber die Koordinaten stimmen nicht.
Hab daher noch eine Sicherung eingebaut:

Code:

(defun f#krdpolyseg (#polyobj / #vlaplobj #pkt #param)
  (setq #vlaplobj
    (cond
      ((=(type (car #polyobj)) 'VLA-OBJECT) (car #polyobj))
      ((=(type (car #polyobj)) 'Ename) (vlax-ename->vla-object (car #polyobj)))
    )
  )
  (if
    (member
      (vlax-get-property #vlaplobj 'ObjectName)
      '("AcDbPolyline" "AcDb2dPolyline" "AcDb3dPolyline")
    )
    (progn
      (setq #pkt (vlax-curve-getClosestPointTo #vlaplobj (cadr #polyobj)))
      (setq #param (vlax-curve-getparamAtPoint #vlaplobj #pkt))
      (list
        (vlax-curve-getpointatparam #vlaplobj (fix #param))
        (vlax-curve-getpointatparam #vlaplobj (1+(fix #param)))
        #pkt
      )
    )
  )
)

------------------
Schöne Grüße
Ernst

www.geopaint.at

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 09. Sep. 2007 22:26    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 Geos 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von Geos:
... und zum anderen sind's die langen Funktionsnamen.


Wenn Ihr in der VL-Entwicklungsumgebung arbeitet, dann hilft bei den langen Funktionsnamen die Apropos-Funktionalität. Einfach beginnen den Funktionsnamen zu schreiben und dann mittendrin mal Shift+Strg+Leer drücken. Je nach dem, wieviel von dem Funktionsnamen bereits geschrieben ist, wird dieser vervollständigt, ein Kontextmenü angezeigt, in dem die möglichen Funktionen gelistet sind (aus dem man den den gesuchten auswählen kann, oder eine Liste aller möglichen Funktionsnamen gezeigt.

Ist echt hilfreich diese Hilfe. Könnt es ja mal testen mit

vl-
vl-file
vl-filename-b

Grüße Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.

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

Geos
Mitglied
Vermessungstechniker i.R.


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

Beiträge: 1017
Registriert: 21.09.2001

ACAD Map 2010, Win 7 Pro
eigene Lisp's<P>HW: Core i7 860, 2.8 GHz
3.3 GB, NVIDIA GeForce GTS 250

erstellt am: 10. Sep. 2007 07: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

Danke für den Tipp, Holger.
Ich verwende eigentlich UltraEdit - benutze aber manchmal "Text im Editor prüfen".

------------------
Schöne Grüße
Ernst

www.geopaint.at

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