| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Punkte mit Linien verbinden (2590 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 07. Feb. 2012 14:40 <-- editieren / zitieren --> Unities abgeben:
Ich habe eine Zeichnung in der points mit Punktnummer als text stehen Ich möchte gern diese Punkte entsprechend der Nummerierung verbinden durch Linien, oder 3d polylines Meine Ansatz ist der erst festzulegen in welchem Abstand x/y der Punkt vom Text liegt und anschliessend in der Auswahl aller Punkte und Texte die Liste für den Linienpunkt zu schreiben Danach soll eine 3dpolyline entsprechend fortlaufender Nummerierung gezeichnet werden Meine Frage ist: wie kann ich den Linienpunkt der in ent steht mit seiner dazugehörigen Nummer, die in pnr steht in eine Liste legen Code:
; Auswahl von Linienpunkt (e1) und dazugehöriger Punktnr. e2 (princ "\nDefinition for line-point-selection") (while (not (and (setq e1 (car (entsel "\nSelect point ! "))) (wcmatch (cdr (assoc 0 (entget e1))) "POINT") ) ) (princ "\nNo point select") ) (while (not (and (setq e2 (car (entsel "\nSelect text ! "))) (wcmatch (cdr (assoc 0 (entget e2))) "TEXT") ) ) (princ "\nNo text select") ) ;Ermittelt den Abstand vom Textursprung (pnr) zum Linienpunkt (pkt)(if (setq pkt (cdr (assoc 10 (entget e1)))) (if (setq pnr (cdr (assoc 10 (entget e2)))) (setq l1 (list (cdr (assoc 1 (entget e2))) (+ (car pnr) (setq dpx (- (car pkt) (car pnr)))) (+ (cadr pnr) (setq dpy (- (cadr pkt) (cadr pnr)))) ) ) ) ) ; Ausfahl aller Punktnummern (Texte) und Linienpunkte (princ "\nSelect drawing area") (setq ss (ssget '((0 . "POINT,TEXT"))) i 0) (if ss (progn (repeat (sslength ss) (setq ent (entget (ssname ss i))) (if ent (cdr (assoc 0 ent)) "TEXT") (setq elist (list (cdr (assoc 1 ent)))) (if ent (cdr (assoc 0 ent)) "POINT") (setq elist (cons (list (cdr (assoc 10 ent))))) )))))
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 07. Feb. 2012 14:43 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Bisschen kompliziert? Schreibt die Blöcke mit den Punktnummern raus, lade das in Excel und sortiere anhand der Punktnummer. Anschließend löscht du die Punktnummer und holst dir die Koordinatenliste mittels Script und vorgestelltem "_3dpoly" wieder rein. Fertig. ------------------ Grüsse Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 07. Feb. 2012 14:59 <-- editieren / zitieren --> Unities abgeben:
|
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 07. Feb. 2012 15:17 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 07. Feb. 2012 15:33 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: ... Meine Frage ist: wie kann ich den Linienpunkt der in ent steht mit seiner dazugehörigen Nummer, die in pnr steht in eine Liste legen ...
siehe dotted pair in der Entwicklerhilfer und dan mit vl-sort... sortieren
Anstelle von entsel die Punkte mit ssget einsammeln, den zugehörigen Text über ein Fenster am Punkt fangen und prüfen und dann dotted...
------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." -Lots of irritating superfluous parentheses!- Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 07. Feb. 2012 15:41 <-- editieren / zitieren --> Unities abgeben:
Ich stimme dir überein, dass es eine Möglichkeit ist die Koord der Textpunkte auszulesen. Nur die z-koord steckt im Punkt. Daran scheitert das Vorhaben. (Allerdings 2dimensional ist es ok) In meinem code habe ich die delta koord. der Texte bezgl. der Punkte rausgeschrieben. Kann es vllt funktionieren, wenn ich jetzt anhand der Koord.differenz zw. Punkt und Text den Punkt raussuche. ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 07. Feb. 2012 15:57 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: ... In meinem code habe ich die delta koord. der Texte bezgl. der Punkte rausgeschrieben. Kann es vllt funktionieren, wenn ich jetzt anhand der Koord.differenz zw. Punkt und Text den Punkt raussuche. ...
dein code sieht super aus
ssget bietet dir einige "sel-method" an - siehe Entwicklerhilfe Du hast die Koordinaten der Punkte, nimm einen Punkt und dessen Koordinaten, dann rechne dir zwei Koordinaten aus in denen dein Text liegt und filtere dir gleich die Texte raus, prüfe diesen Auswahlsatz. Wenn er die Prüfung nicht besteht (weil nil oder mehr als 1) dann zoome zum Punkte und lasse den Text mittels entsel fangen oder vergib ne Nummer 99999+1. ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." -Lots of irritating superfluous parentheses!- Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 08. Feb. 2012 07:03 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Was ich aber noch nicht verstehe: Warum verwendest du nicht das fertige LISP-File aus meinem verlinkten Beitrag? (Natürlich ist es schön eigene Erfolge zu erzielen - mir fehlt leider jedoch meist die Zeit dazu...) ------------------ Grüsse Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 13. Feb. 2012 13:01 <-- editieren / zitieren --> Unities abgeben:
@tunnelbauer: Ich suche nach einer Vereinfachung um die Punkte mit 3dpolyline zu verbinden, dass nach Möglichkeit in der Zeichnung @Dorfy: Jetzt habe ich mir mal Gedanken gemacht, wie ich das vllt umsetzen kann von dir In tdata sollte eigentlich die Punktnummer zu finden sein, es wird aber immer nur der Punkt gefunden. Nur ist die selection methode bissel komplizert - geht das auch einfacher ? Im Anschluss wäre mein nächster Schritt eine neue Liste zu erzeugen, wo die Punktnummer mit der Koordinate zu finden ist. Code:
; Zur Ermittlung vom Textabstand zum Punkt(defun option () (progn (while (not (and (setq e1 (entget (car (entsel "\nSelect point ! ")))) (wcmatch (cdr (assoc 0 e1)) "POINT") (setq e2 (entget (car (entsel "\nSelect text ! ")))) (wcmatch (cdr (assoc 0 e2)) "TEXT") ) ) (princ "\nNot correct") (princ) ) ) ) ;Selectiere Punkte und dazugehörige Texte
(defun sel () (princ "\nSelect drawing area") (setq dx (- (car (cdr (assoc 10 e2))) (car (cdr (assoc 10 e1))))); Differenz Punktnummer (setq dy (- (cadr (cdr (assoc 10 e1))) (cadr (cdr (assoc 10 e2))))); zum Punkt (if (setq ss (ssget '((0 . "POINT")))) (progn (setq i 0) (repeat (sslength ss) (setq ename (ssname ss i)) (setq edata (entget ename)) (cond ((= (cdr (assoc 0 edata)) "POINT") (foreach n1 edata (cond ((= (car n1) 10) (setq plist (cons (cdr n1) plist)); Koordinaten aller Punkte in eine Liste (setq tname (ssname (ssget "c" (list (+ (- (caar plist) 0.01) dx) (+ (- (cadar plist) 0.01) dy)); suche Text im Ausschnit (list (+ (caar plist) dx 0.35) (+ (cadar plist) dy 0.13)); links unten nach rechts oben ) 0)) (setq tdata (cdr (assoc 1 (entget tname)))) (setq i (1+ i)) ) ) ) ) ) ))))
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 13. Feb. 2012 14:27 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
dann nimm mal nicht das Element "0" sondern 1 bzw schau dir dein selection set genauer an ggef ist dein "Fenster" um den Punkt zuklein Ps du kannst gleich auf Texte filtern lassen ;-) ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." -Lots of irritating superfluous parentheses!- Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 13. Feb. 2012 16:52 <-- editieren / zitieren --> Unities abgeben:
Danke funktioniert jetzt perfekt. Ich komme jetzt nicht richtig weiter mit foreach soll eine Liste aus pnr und pkt erstellt werden. als test probierte ich (foreach n1 edata (princ edata)) und jups kommen alle Punkte das möchte ich gern in die var plist schreiben - weiss nicht wie das geht! dann sollte in die plist noch die pnr eingefügt werden. Kann mir einer weiter helfen? Code:
;Selectiere Punkte und dazugehörige Texte(defun sel () (princ "\nSelect drawing area") (setq dx (- (car (cdr (assoc 10 e2))) (car (cdr (assoc 10 e1))))); Differenz Punktnummer (setq dy (- (cadr (cdr (assoc 10 e1))) (cadr (cdr (assoc 10 e2))))); zum Punkt (if (setq ss (ssget '((0 . "POINT")))) (progn (setq i 0) (repeat (sslength ss) (setq ename (ssname ss i)) (setq edata (entget ename)) (setq pkt (assoc 10 edata)) (setq pnr (ssname (ssget "c" (list (- (+ (car pkt) dx) 0.03) (+ (cadr pkt) dy)); suche Text im Ausschnit (list (+ (car pkt) dx 0.35) (+ (cadr pkt) dy 0.13)); links unten nach rechts oben '((0 . "TEXT")) ) 0) ) (setq pnr (cdr (assoc 1 (entget pnr)))) (foreach n1 (cdr pkt) (setq plist (cons (cdr n1) pkt)) ) ) ) ) )
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 13. Feb. 2012 21:16 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
in deiner repeat schleife gehst du die Punkte durch und suchst dir den Text im näheren Umfeld (Fehlerbetrachtung iwan noch bedenken --> kein Text, mehr als ein Text...) somit hast du Punktnummer und Koordinaten --> die "kleine Liste" (punktnummer . (koordlist)) (ich würde ihmo auf cons zurückgreifen... für die kl. Liste) diese kleinen Listen hängst du dann munter aneinander mittels cons oder append ( (punktnummer1 . (koordlist1)) (punktnummer2 . (koordlist2)) (punktnummer3 . (koordlist3)) ... (punktnummern . (koordlistn)) ) am Ende der repeat-Schleife könnte eine derartig Liste entstehen ... andere ggf bessere Herangehensweisen sind natürlich immer möglich ... eine Liste mit vielen "kleinen" Listen.... hier schießt du mit der großen Kanonoe zum sortieren drauf... hatten wir erst das Thema ;-) (mapcare und lambda und vl-sort... oder so) ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." -Lots of irritating superfluous parentheses!- Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 14. Feb. 2012 10:10 <-- editieren / zitieren --> Unities abgeben:
(setq plist (cons (cons (atoi pnr) pkt) plist)) liefert mir ((1830 158139.0 6.4271e+006 18.5165) (1831 158139.0 6.4271e+006 18.5373) (1829 158139.0 6.4271e+006 19.185)) (vl-sort plist '< ); hier müsste ich sagen, dass nach dem ersten element (pnr) sortiert weren soll. Mit mapcar und lambda etwas zu konstruieren steigt über meinen Horizont (mapcar '(lambda (x) (+ 1 x)) (list 1 2 3)) leuchtet mir ein, reicht mir aber nicht für mein Vorhaben Wenn ich die Funktion aufdrusel (lambda (x) (+ 1 x)) => #<SUBR @000000003da647c8 -lambda-> (mapcar '(lambda (x) (+ 1 x)) (list 1 2 3)) => (2 3 4)
Bezogen auf mein Vorhaben: Wie muss ich denken wenn das Argument (x) nun die Punktnummer sein soll ... (denke ich falsch???
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 14. Feb. 2012 10:23 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 14. Feb. 2012 10:50 <-- editieren / zitieren --> Unities abgeben:
Ergebnis: (vl-sort (mapcar '(lambda (x) (car x)) plist) '< ) => (1829 1830 1831) Jetzt sind zwar die Punktnummern sortiert, wie bekomme ich die dazugehörigen Koordinaten wieder rein. Ziel soll es sein dass (erstmal) alle Punkte mir 3dpolyline verbunden werden. ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 14. Feb. 2012 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
(vl-sort plist '(lambda(e1 e2)(< (car e1)(car e1))) Hallo Dirk, habe das vohin ein bißchen schnell überflogen, also Du nimmst Vl-sort, die Variablen dazu sind e1 und e2. Weil Du den ganzen Listeneintrag übergibst kannst Du für die Punktnummer als erstes Element (car e1) und (car e2) nehmen. ------------------ viele Grüße
Jörn http://www.bosse-engineering.com [Diese Nachricht wurde von joern bosse am 14. Feb. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 14. Feb. 2012 12:12 <-- editieren / zitieren --> Unities abgeben:
Es ist sieht so einleuchtend aus, aber selbst so etwas zu basteln braucht Erfahrung. Was ich nicht ganz verstehe, wie lambda weiss dass e2 der Rest der Liste ist. Man kann irgendwie lambda schlecht prüfen! ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 14. Feb. 2012 12:43 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 14. Feb. 2012 12:56 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: Es ist sieht so einleuchtend aus, aber selbst so etwas zu basteln braucht Erfahrung. Was ich nicht ganz verstehe, wie lambda weiss dass e2 der Rest der Liste ist. Man kann irgendwie lambda schlecht prüfen!
Der Debug-Hinweis wird Dir da nicht weiter helfen. Das LAMBDA weiss das einfach deshalb, weil das VL-SORT so programmiert ist, dass es eine Liste und eine Vergleichsfunktion übernimmt. Am LAMBDA ist nix geheimnisvoll - es ist eine anonym definierte Funktion. Du kannst das, was im LAMBDA definiert wird, auch ganz genau so mit DEFUN definieren und dann genau so an das VL-SORT übergeben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 14. Feb. 2012 15:27 <-- editieren / zitieren --> Unities abgeben:
Danke für eure Beiträge - es Bedarf noch ein wenig übung mit mapcar/lambda&Co Da kann man echt zaubern. Vllt. krieg ich´s auch noch hin Punktlücken zu finden, um das zeichnen der 3dpolyline zu unterbrechen. ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |