| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Polylinien Segmente (2710 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: 13. Dez. 2011 14:07 <-- editieren / zitieren --> Unities abgeben:
Ich versuche gerade einen Code zu entschlüsseln, der mir die Winkel der Segmente einer Polylinie ausgibt. Code:
(setq curve (car (entsel))) (setq idx 0) (repeat (fix (1- (vlax-curve-getendparam curve))) (setq ang (angle '(0 0) (vlax-curve-getFirstDeriv curve idx))) ; (+ idx 0.005) (print "Angle of segment #") (princ idx) (princ " is ") (princ ang) (princ " radians.") (setq idx (1+ idx)) ) (princ)
Beziehen sich die Winkel auf den Punkt 0,0? Weil ich nach der Formel 180/pi*rad-wert auf einen anderen Winkel in Grad komme Bsp. 0.6417 rad = 36.7667 grad ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 13. Dez. 2011 14:21 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 13. Dez. 2011 14:27 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 13. Dez. 2011 20:28 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 14. Dez. 2011 14:42 <-- 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: 16. Dez. 2011 11:58 <-- editieren / zitieren --> Unities abgeben:
Handelt sich nicht ums Thema - was bedeutet denn, wenn der Cursor mit dem Symbol erscheint... Man muss dann die Zeichnung erst zwischenspreichern, dann verschwindet es wieder. Wenn man dann wieder zwischen Zeichnung und vlide-Editor hin und her wechselt kommt das Symbol wieder. Gibt es eine Erklärung dafür ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 16. Dez. 2011 17:06 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo, das geschieht meistens dann wenn irgend etwas in abfrage steht oder ich meine auch als warte Zeichen wenn etwas noch bearbeitet wird, z.B. gebe in Editor mal (getpoint) ein und führe es aus. Der Editor wird dann automatisch in den ACAD Arbeitsbereich wechseln um da auf deine Eingabe zu warten. Wechsel nun ohne eine Eingabe zu machen mit Hilfe der Task-leiste wider in den Editor dann wirst du sehen das der Cursor im Editor dieses Symbol aufweist. Abbrechen kannst du es dann nur wenn du in ACAD eine Eingabe machst oder ESC drückst. Daher denke ich das irgendetwas in irgendwelchen Codezeilen hängt. ------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 die aus unerklärlichen Gründen aus dem System hier gelöscht wurden. 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: 20. Dez. 2011 12:00 <-- editieren / zitieren --> Unities abgeben:
|
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 20. Dez. 2011 12:06 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
man kann sich recht schnell was bauen vlax-curve-... sollte dich zur Lösung führen... vlax-curve-GetDistAtPoint vlax-curve-getClosestPointTo vlax-curve-getStartParam vlax-curve-getEndParam vlax-curve-getDistAtParam ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 20. Dez. 2011 12:08 <-- 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: 20. Dez. 2011 13:56 <-- editieren / zitieren --> Unities abgeben:
(setq ent (car (entsel)) obj (vlax-ename->vla-object ent) stpt (vlax-curve-getStartPoint obj) ept (vlax-curve-getendPoint obj) plpt (vlax-curve-getClosestPointTo obj (getpoint "\nSelect point on line\n")) dist (vlax-curve-getDistAtParam obj xxx) ) (princ dist) Ich weiss eben nicht weiter, ist mein Gedankengang bis hierher richtig? ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 20. Dez. 2011 14:09 <-- 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: 20. Dez. 2011 14:10 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
naja fast versuch mal Code: (vlax-curve-getDistAtPoint (vlax-ename->vla-object (car (entsel))) (getpoint))
(ungetestet)so nun will ich aber Abstand von Punkt auf Objekt bis Punkt auf Objekt sehen ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." 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: 20. Dez. 2011 14:46 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 20. Dez. 2011 17:21 <-- 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: 21. Dez. 2011 10:25 <-- editieren / zitieren --> Unities abgeben:
Sorry hab´s erst jetzt als Aufforderung verstanden Sicher kann man hier noch einiges kürzen Code:
(defun PolylinePickpoint () (setq obj (vlax-ename->vla-object (car (entsel)))) (setq plpt1 (getpoint "\nPick point on line! ")) (setq dis (vlax-curve-getDistAtPoint obj plpt1)) ) (defun PolylineDistance () (setq obj (vlax-ename->vla-object (car (entsel)))) (setq plpt1 (getpoint "\nPick point 1 on line! ")) (setq plpt2 (getpoint "\nPick point 2 on line! ")) (setq a1 (vlax-curve-getDistAtPoint obj plpt1)) (setq a2 (vlax-curve-getDistAtPoint obj plpt2)) (setq dis (- a2 a1)) ) (defun c m () ; measure polyline (initget "plp pld") (setq aw (getkword "\nDistance from 0 [plp] or Distance from 2 points on line [pld] ? ")) (cond ((= aw "plp") (PolylinePickpoint) (command "_.text" "s" "txt" plpt1 1 "" (rtos dis 2 2)) ) ((= aw "pld") (PolylineDistance) (command "_.text" "s" "txt" plpt1 1 "" (rtos dis 2 2)) ) ) ) (princ)
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 21. Dez. 2011 11:36 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Ich würde noch ein osmode von z.B. 2650 einbauen damit man auch die linie trifft, ich weis nur nicht ob das für dich relevant ist. ------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 die aus unerklärlichen Gründen aus dem System hier gelöscht wurden. 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: 21. Dez. 2011 14:17 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
nur mal ein paar Anregungen bzw Gedanken von mir beim Überfliegen der Zeilen Code: (defun PolylinePickpoint () ;variablen rücksetzen (setq obj (vlax-ename->vla-object (car (entsel))));prüfen der Bedingungen (and... (setq plpt1 (getpoint "\nPick point on line! ")) (setq dis (vlax-curve-getDistAtPoint obj plpt1)) );ggf Fehlermeldung (or(and... (princ Fehler blabla (defun PolylineDistance ();variablen rücksetzen (setq obj (vlax-ename->vla-object (car (entsel))));prüfen der Bedingungen (and... (setq plpt1 (getpoint "\nPick point 1 on line! ")) (setq plpt2 (getpoint "\nPick point 2 on line! ")) (setq a1 (vlax-curve-getDistAtPoint obj plpt1)) (setq a2 (vlax-curve-getDistAtPoint obj plpt2)) ;ggf Fehlermeldung (or(and... (princ Fehler blabla (setq dis (- a2 a1));kann negativ werden max-min betrachten ) (defun c:Dim () ;variablen rücksetzen (initget "plp pld") (setq aw (getkword "\nDistance from 0 [plp] or Distance from 2 points on line [pld] ? "));aw festen wert mitgeben bei Abbruch durch RM (cond ;; ((or(not aw)... ((= aw "plp") (PolylinePickpoint);sub's abfangen bietet sich an (command "_.text" "s" "txt" plpt1 1 "" (rtos dis 2 2));txt vorhanden? );besser entmake oder vla-add... ((= aw "pld") (PolylineDistance) (command "_.text" "s" "txt" plpt1 1 "" (rtos dis 2 2)) ) ) ) (princ) ;in die Function?!
------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." 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: 29. Dez. 2011 14:25 <-- editieren / zitieren --> Unities abgeben:
Code: (defun *error* (errmsg) ;;; (if (or (/= (cdr (assoc 0 (cdr (entget ent)))) "LWPOLYLINE") ;;; (/= ent) ;;; ) (princ "\nNo polyline select\n") (princ errmsg) (princ) ;;; ) )(defun PolylinePickpoint () (while (not (setq ent (car (entsel)))) *error*) (progn (repeat (setq i (length (entget ent))) (while (not (setq dis (vlax-curve-getDistAtPoint ent (setq plpt1 (getpoint "\nPick point on line! "))))) ) (entmake (list '(0 . "TEXT") (cons 8 (getvar"clayer")) (cons 10 plpt1) (cons 40 (getvar "textsize")) '(50 . 0.0) (cons 1 (rtos dis 2 2)) ) ) ) ) )
Zwei Fragen:In dem code läuft die *error* funktion nicht richtig. Ich möchte erreichen, dass wenn keine Polylinie oder nichts gewählt wird, die Error-meldung "No polyline select" kommt. Es habert am Einsatz von Wenn-Oder-Schleifen Weiter unten ist mir noch aufgefallen, dass die Repeat-schleife nur begrenzt ausgeführt wird. Mein Versuch den Wert in i reinzuschreiben und dann hochzählen lassen mit (setq i (1+ i)) wurde nicht angenommen. ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 29. Dez. 2011 15:22 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Ich versuche mal so wenig wie möglich hin zu schauen und dennoch eine hilfreiche Antwort zu leisten: Die *error*-Funktion ist dafür da das im *error*-Fall alles in geordneten Bahnen abläuft, zB. Variablen zurückgesetzt werden etc. und nicht für irgendwelche Alert-Spielereien, wenn du nur einen Dialog haben möchtest mit Text, dann nehme dafür ALERT (alert "Hallo Welt") ERROR = ABBRUCH = ENDE (normalerweise) (while (not(and (setq ent (car(entsel "\n(LW)Polylinie auswählen: "))) (wcmatch (cdr(assoc 0 (entget ent))) "LWPOLYLINE") ) ) (princ "\nEs wurde keine Polylinie gewählt") ) Was das Repeat angeht: 1.) dieses "(setq i (1+ i))" hast du nicht im geposteten Code stehen !? Sowas macht es dann nun unnötig komplizierter zu helfen im Forum 2.) die Angabe der Schleifenanzahl wird nur einmal gelesen, es würde dir SO eh nichts nutzen (progn(setq i 3)(repeat i (setq i 55)(alert (itoa i)))) 3.) "(repeat (setq i (length (entget ent)))" Keine Ahnung was das soll, aber das kann einfach nicht richtig sein.. Ich würde ja als Tip geben zunächst mal jede Funktion einzeln zu erkunden und nicht 10 auf einmal - von denen dann nur jede zweite richtig angewendet wird. Leider kann ich mir anhand von diesen Zeilen noch nicht mal denken was da warum wie oft durchlaufen werden soll. ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) 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: 30. Dez. 2011 09:15 <-- editieren / zitieren --> Unities abgeben:
Code:
(defun PolylinePickpoint () (while (not(and (setq ent (car(entsel "\nSelect Polyline: "))) (wcmatch (cdr(assoc 0 (entget ent))) "LWPOLYLINE") ) ) (princ "\nNo Polyline select ") ) (setq i 1) (progn (while (repeat i (while (not (setq dis (vlax-curve-getDistAtPoint ent (setq plpt1 (getpoint "\nPick point on line! "))))) ) (entmake (list '(0 . "TEXT") (cons 8 (getvar"clayer")) (cons 10 plpt1) (cons 40 (getvar "textsize")) '(50 . 0.0) (cons 1 (rtos dis 2 2)) ) ) (setq i (1+ i)) ) ) ) )
So sollte es funktionieren - Danke für die Hilfestellung ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 30. Dez. 2011 11:40 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Ja das funktioniert, hier noch ein paar (unnötige) Zeilen entfernt (blöder Kommentar steht dahinter) Code:
(defun PolylinePickpoint ( / ent plpt1 dis) ; die 3 Variablen als lokal deklariert (while (not(and (setq ent (car(entsel "\nSelect Polyline: "))) (wcmatch (cdr(assoc 0 (entget ent))) "LWPOLYLINE") ) ) (princ "\nNo Polyline select") );;; (setq i 1) ; setze i=1 ;;; (progn ; fasse nachfolgend nur eine einzige Sache(repeat) "zusammen" ;;; (while ; wiederhole den repeat-part solange wie dort "(setq i (1+ i))" am Ende steht, also endlos. ;;; (repeat i ; Durchlaufe nachfolgendes nur ein einziges Mal (while (setq plpt1 (getpoint "\nPick point on line: ")) (if (setq dis (vlax-curve-getDistAtPoint ent plpt1 )) (entmake (list '(0 . "TEXT") ;;; (cons 8 (getvar"clayer")) ohne Angabe = immer der aktuelle (cons 10 plpt1) (cons 40 (getvar "textsize")) '(50 . 0.0) (cons 1 (rtos dis 2 2)) ) ) (princ"\n< Pickpoint wasn´t on line >") ) ) ;;;(setq i (1+ i)) ; erhöhe den nie wieder benötigten Wert von i um 1 ;;;) ;;; ) ;;; ) (princ) )
------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) [Diese Nachricht wurde von cadffm am 30. Dez. 2011 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: 30. Dez. 2011 12:41 <-- editieren / zitieren --> Unities abgeben:
Super - vielen Dank für deine Mühe (if (setq dis (vlax-curve-getDistAtPoint ent plpt1 )) (entmake... (princ"\n< Pickpoint wasn´t on line >") Verstehe ich es richtig Bei der If-schleife wird mit vlax-curve-getDistAtPoint gleich geprüft ob der gew. Punkt auf der Polylinie liegt ansonsten Fehlermeldg princ
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 30. Dez. 2011 13:00 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
AutoCAD/VLisp-Hilfe zu vlax-curve-getDistAtPoint vlax-curve-getDistAtPoint erwartet 2 Argumente: 1. curve-obj (The VLA-object to be measured.) 2. point (A 3D point list (in WCS) on curve-obj)
Rückgabe der Funktion: A real number if successful otherwise nil. Also: Wenn die Funktion nil zurückgibt lag der Punkt nicht auf dem angegebenen Objekt, wenn der Punkt aber auf dem Objekt lag kommt als Rückgabe eine (real)Zahl. Somit habe ich gesagt: Wenn 'wahr'(wahr ist alles was nicht nil ist) dann 'Textobjekt', wenn nicht: Textausgabe (if (setq dis (vlax-curve-getDistAtPoint ent plpt1 )) (entmake... (princ"\n< Pickpoint wasn´t on line >") Und wünsche noch einen angenehmen Rutsch ins neue Jahr und verabscheu mich
------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) 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: 30. Dez. 2011 15:22 <-- editieren / zitieren --> Unities abgeben:
|