| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Effiziente Datenmigration trifft nahtlose Systemintegration , ein Anwenderbericht
|
Autor
|
Thema: Lotfußpunkt erstellen (1682 mal gelesen)
|
oandres Mitglied
Beiträge: 80 Registriert: 24.05.2004 Windows XP Acad 2004
|
erstellt am: 02. Mrz. 2005 09:59 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte das Erstellen eines Lotfußpunktes etwas vereinfachen. Bisherige Vorgehensweise: -Konstruktionslinie erstellen, welche die beiden Endpunkte der gedachten Linie verbindet -Konstruktionslinie / Winkel / Bezug / 90° erstellen die rechtwinklig auf der anderen Klinie steht -KLinie durch Lotpunkt zeichnen -Punkt im Schnittpunkt der beiden KLinien erstellen Von einem anderen Programm (Straps) kenne ich eine einfachere Methode: - Lotpunkt anklicken - Anfangspunkt der Linie anklicken - Endpunkt der Linie anklicken - Lotfußpunkt wird entsprechend konstruiert Gibt es eine Möglichkeit diese komfortable Methode in Acad zu realisieren ?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 AutoCAD 2.5 - 2025, Civil 3D, MAP 3D, ACADM, ACA Inventor Prof. 2025, AIP 4-2025 Win 11
|
erstellt am: 02. Mrz. 2005 10:46 <-- editieren / zitieren --> Unities abgeben: Nur für oandres
Der Weg über die Konstruktionslinie scheint mir etwas umständlich. Soll eine neue Linie (Ordinate) von einem beliebigen Anfangspunkt Lotrecht auf eine bestehende Linie gefällt werden, nimmt man dazu den Objektfang LOT Eingetippt etwa so: Zitat:
Befehl: LINIE Ersten Punkt angeben: Startpunkt picken Nächsten Punkt angeben oder [Zurück]: LOT nach bestehende Linie anpickenNächsten Punkt angeben oder [Zurück]:
------------------ Mit freundlichem Gruß Udo Hübner ---------- Der versteckte Fehler bleibt nie unentdeckt. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 02. Mrz. 2005 11:16 <-- editieren / zitieren --> Unities abgeben: Nur für oandres
Hi, ich hab' mal in meinen Lisp-Altbeständen gegrast und 'ne Lotlinien Funktion gefunden die ich um PLine-Funktionalität erweitert hatte... Nicht elegant programmiert aber funzt :-) Ist halt' alter Code *schäm* Das Ausgangsprogramm "lotlin" ist nicht von mir, habe aber auch k.A. mehr wo das her ist... Code:
(VL-LOAD-COM);;;PROGRAMM : LOTLIN.LSP ;;;ZWECK : Lotrechte Linie ;;;Autor : ise ;;;Datum : 26.06.96 ;; Erweiterung für Plinesupport Marc Scherer ;;;----------------MAIN (defun C:LOTLIN (/ P1 P2 TYP WIN PT PT1 PH OBJ PF L PINTER ELEM ALT-OSMODE) (princ "\nZeichnen einer Senkrechten.") (setq ELEM (nentsel "\nSenkrechte auf... (Polylinie oder Linie wählen): " ) ;_ end of nentsel ) ;_ end of setq (if ELEM (progn (setq OBJ (entget (car ELEM)) TYP (cdr (assoc 0 OBJ)) ) ;_ end of setq (if (eq TYP "VERTEX") (setq OBJ (entget (cdr (assoc 330 OBJ))) TYP (cdr (assoc 0 OBJ)) ) ;_ end of setq ) ;_ end of if (if (wcmatch TYP "*LINE") (progn (setq ALT-OSMODE (getvar "osmode")) (setvar "OSMODE" 0) (cond ((eq TYP "LINE") (setq P1 (cdr (assoc 10 OBJ)) P2 (cdr (assoc 11 OBJ)) WIN (angle P1 P2) ) ;_ end of setq ) (t (setq WIN (CALCULATE-ANGLE (cdr (assoc -1 OBJ)) (cadr ELEM) (cadr ELEM) ) ;_ end of CALCULATE-ANGLE ) ;_ end of setq ) ) ;_ end of cond (setq PF (getpoint "\nFußpunkt: ") PH (polar PF (+ WIN (* 0.5 pi)) 0.1) PT (getpoint "\nEntfernung picken oder SPACE/ENTER für Längeneingabe: " ) ;_ end of getpoint ) ;_ end of setq (if PT (progn (setq PT1 (polar PT WIN 0.1) PINTER (inters PF PH PT PT1 NIL) ) ;_ end of setq ) ;_ end of progn (progn (setq L (getreal "\nLänge: ") PT (getpoint "\Seite für Lotrechte wählen: ") PT1 (polar PT WIN 0.1) PINTER (inters PF PH PT PT1 NIL) WIN (angle PF PINTER) PINTER (polar PF WIN L) ) ;_ end of setq ) ;_ end of progn ) ;_ end of if (command "_.line" PF PINTER "") (setvar "osmode" ALT-OSMODE) ) ;_ end of progn (princ "\nObjekt ist keine Polylinie oder Linie !") ) ;_ end of if ) ;_ end of progn (princ "\nKein Objekt gepickt!") ) ;_ end of if (princ) ) ;_ end of defun ;;; Berechnet den Winkel des Pline-Segments ;;; -> Obj = Elementname ;;; -> Pkt = Pickpunkt auf Element ;;; -> Inspkt = Punkt auf dem Objekt. (defun CALCULATE-ANGLE (OBJ PKT INSPKT / PKTLST WNKL) (setq OBJ (->VLA-OBJECT OBJ) PKTLST (VERTEX-SUCHEN OBJ (vlax-curve-getclosestpointto OBJ INSPKT)) ) ;_ end of setq (if (IS-AT-START? OBJ PKT) (setq WNKL (angle (car PKTLST) (cadr PKTLST))) (setq WNKL (angle (cadr PKTLST) (car PKTLST))) ) ;_ end of if ;;; (setq wnkl (- wnkl (/ (* 2 pi) 4))) ;;; (list (polar inspkt wnkl 1.5) wnkl) ) ;_ end of defun ;;; ermittelt, ob der Pickpunkt näher am Start-oder End-Punkt des linearen Objekts war ;;; das ist wichtig für die Abstandsberechnung (gegen oder in Objektrichtung rechnen?) ;;; -> Obj = Elementname ;;; -> Pkt = Pickpunkt auf Element (defun IS-AT-START? (OBJ PKT /) (< (2P-DIST OBJ PKT (START-PKT? OBJ)) ;_ Ist der Pickpunkt näher am Startpunkt? (2P-DIST OBJ PKT (END-PKT? OBJ)) ) ;_ end of < ) ;_ end of defun ;;; Endpunkt in WKS für lineares Objekt ermitteln (defun END-PKT? (ENAME /) (vlax-curve-getendpoint (->VLA-OBJECT ENAME)) ) ;_ end of defun ;;; Startpunkt in WKS für lineares Objekt ermitteln (defun START-PKT? (ENAME /) (vlax-curve-getstartpoint (->VLA-OBJECT ENAME)) ) ;_ end of defun ;;; Berechnung der Länge zwischen zwei Punkten ;;; die auf einer Polylinie liegen ;;; -> Punkt1, Punkt2 und Elementname ;;; <- Länge zwischen diesen Punkten (defun 2P-DIST (ENAME PT1 PT2 /) (setq ENAME (->VLA-OBJECT ENAME)) (abs (- (vlax-curve-getdistatpoint ENAME (vlax-curve-getclosestpointto ENAME PT1 ) ;_ end of vlax-curve-getclosestpointto ) ;_ end of vlax-curve-getDistAtPoint (vlax-curve-getdistatpoint ENAME (vlax-curve-getclosestpointto ENAME PT2 ) ;_ end of vlax-curve-getClosestPointTo ) ;_ end of vlax-curve-getdistatpoint ) ;_ end of - ) ;_ end of abs ) ;_ end of defun ;;; Funktion zum Aufinden der Stützpunkte zwischen denen der übergebene Punkt liegt. ;;; Prinzip: ;;; "Alle Vertices in Entfernungen umrechnen, ;;; den gewählten Punkt ebenso, und dann sehen, wo er dazwischen liegt." ;;; -> Punkt, Ename ;;; <- Liste mit zwei Punkten (WCS) in Laufrichtung des linearen Elementes ;;; Oder aber nil (z.B. Punkt nicht auf Polyline) ;;; d.h. (car "Liste") = 1. Punkt und (cadr "Liste") = 2. Punkt ;;; Nicht Funktional bei geschlossener Polylinie (defun VERTEX-SUCHEN (ENAME PUNKT / ABSTAENDE DERABSTAND DERDAVOR LASTINLIST LASTPT PKTNACH PKTVOR RETVAL=NIL!!!! ) (setq ENAME (->VLA-OBJECT ENAME) ABSTAENDE (mapcar (function (lambda (VERTEX) (vlax-curve-getdistatpoint ENAME VERTEX) ) ;_ end lambda ) ;_ end function ;;; (mapcar 'cdr ;;; (vl-remove-if-not ;;; (function (lambda (PAIR) (= (car PAIR) 10))) ;;; (entget ENAME) ;;; ) ;_ end vl-remove-if-not ;;; ) ;_ end mapcar (GET-PL-POINTS ENAME) ) ;_ end mapcar DERABSTAND (vlax-curve-getdistatpoint ENAME PUNKT) ) ;_ end setq (if (and ABSTAENDE DERABSTAND) ;_ Wenn beide Werte ermittelt werden konnten... (progn (setq LASTINLIST (last ABSTAENDE) ;_ Sichern des letzten Wertes, für geschlossene PL! DERDAVOR (nth (- (length ABSTAENDE) 2) ABSTAENDE) ;_ Sichern des vorletzten Wertes, wenn PT auf letztem Punkt ) ;_ end of setq (while ABSTAENDE (if (> (cadr ABSTAENDE) DERABSTAND) (setq PKTVOR (car ABSTAENDE) PKTNACH (cadr ABSTAENDE) ABSTAENDE NIL ) ;_ end setq (setq ABSTAENDE (cdr ABSTAENDE)) ;_ end of setq ) ;_ end if ) ;_ end while ;;; Achtung, Bug in "vlax-curve-getpointatdist" der letzte Punkt wird ;;; nicht zurückgegeben. Darum Umweg über "vlax-curve-getEndPoint", ;;; wenn der letzte Punkt nicht korrekt wiedergegeben wird. ;;; Alt: ;;; (list (vlax-curve-getpointatdist Ename PKTVOR) ;;; (vlax-curve-getpointatdist Ename PKTNACH) ;;; ) ;_ end list (cond ((= DERABSTAND LASTINLIST) ;_ Wenn der Punkt exakt auf dem letzten Punkt liegt... (list (vlax-curve-getpointatdist ENAME DERDAVOR) (vlax-curve-getendpoint ENAME) ) ;_ end of list ) ((> DERABSTAND LASTINLIST) ;_ Handling für geschlossene Polyline ! (list (vlax-curve-getpointatdist ENAME LASTINLIST) (vlax-curve-getstartpoint ENAME) ) ;_ end of list ) (t (list (vlax-curve-getpointatdist ENAME PKTVOR) (if (not (setq LASTPT (vlax-curve-getpointatdist ENAME PKTNACH) ) ;_ end of setq ) ;_ end of not (setq LASTPT (vlax-curve-getendpoint ENAME)) LASTPT ) ;_ end of if ) ;_ end list ) ) ;_ end of cond ) ;_ end of progn RETVAL=NIL!!!! ) ;_ end of if ) ;_ end defun
;;; Funktion gibt Ename zurück, wenn Lisp-Objekt oder vla-Objekt ;;; übergeben worden sind. Ansonsten nil (defun ->ENAME (ENAME /) (cond ((= (type ENAME) 'VLA-OBJECT) (vlax-vla-object->ename ENAME)) ((= (type ENAME) 'ENAME) ENAME) (t NIL) ) ;_ end of cond ) ;_ end of defun ;;; Funktion gibt vla-Objekt zurück, wenn Lisp-Objekt oder vla-Objekt ;;; übergeben worden sind. Ansonsten nil (defun ->VLA-OBJECT (ENAME /) (cond ((= (type ENAME) 'ENAME) (vlax-ename->vla-object ENAME)) ((= (type ENAME) 'VLA-OBJECT) ENAME) (t NIL) ) ;_ end of cond ) ;_ end of defun ;;; Liste mit Polylinienpunkten zurückgeben. ;;; -> Elementname ;;; <- Punktliste (defun GET-PL-POINTS (ENAME /) (setq ENAME (->ENAME ENAME)) (if (= (cdr (assoc 0 (entget ENAME))) "LWPOLYLINE") (GET-LW-PL-POINTS ENAME) (GET-HW-PL-POINTS ENAME) ) ;_ end of if ) ;_ end of defun ;;; Sub-Sub-Function für "GET-PL-POINTS" ;;; Handling für POLYLINE (defun GET-HW-PL-POINTS (ENAME / EDATA PTLISTE) (setq ENAME (->ENAME ENAME)) (while (= (cdr (assoc 0 (setq EDATA (entget (entnext ENAME))))) "VERTEX" ) ;_ end of = (setq PTLISTE (cons (cdr (assoc 10 EDATA)) PTLISTE) ENAME (entnext ENAME) ) ;_ end of setq ) ;_ end of while (reverse PTLISTE) ) ;_ end of defun ;;; Sub-Sub-Function für "GET-PL-POINTS" ;;; Handling für LWPOLYLINE (defun GET-LW-PL-POINTS (ENAME /) (setq ENAME (->ENAME ENAME)) (mapcar 'cdr (vl-remove-if-not (function (lambda (PAIR) (= (car PAIR) 10)) ) ;_ end of function (entget ENAME) ) ;_ end of vl-remove-if-not ) ;_ end of mapcar ) ;_ end of defun
(princ)
... ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oandres Mitglied
Beiträge: 80 Registriert: 24.05.2004 Windows XP Acad 2004
|
erstellt am: 02. Mrz. 2005 11:47 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von CAD-Huebner: Der Weg über die Konstruktionslinie scheint mir etwas umständlich. Soll eine neue Linie (Ordinate) von einem beliebigen Anfangspunkt Lotrecht auf eine bestehende Linie gefällt werden, nimmt man dazu den Objektfang LOT
Es soll keine Linie gezeichnet werden sondern ein Punkt auf einer imaginären Linie, von der ich Anfangs- und Endpunkt angebe. Die "Lot-Fang-Methode" war/ist mir bekannt...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oandres Mitglied
Beiträge: 80 Registriert: 24.05.2004 Windows XP Acad 2004
|
erstellt am: 02. Mrz. 2005 11:53 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für Deine Mühe. Könntest Du (oder ein anderer der Lispler ) vielleicht das ganze um die Option erweitern/ändern, dass nur ein Punkt auf der gedachten Linie gesetzt wird ? Ansonsten hab ich trotzdem Verwendung für das Lisp und die U's dafür sind unterwegs Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 02. Mrz. 2005 13:11 <-- editieren / zitieren --> Unities abgeben: Nur für oandres
(DEFUN c:lfp ( / gp1 gp2 lp ) (SETQ gp1 (GETPOINT "\nGeradenpunkt 1") gp2 (GETPOINT "\nGeradenpunkt 2") lp (GETPOINT "\nLotpunkt") ) (INTERS gp1 gp2 lp (POLAR lp (+ (ANGLE gp1 gp2) (/ pi 2)) 1) nil) ) transparent als punktfang aufrufen (z.b.: _line 'lfp usw.) ciao georg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3336 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 02. Mrz. 2005 22:53 <-- editieren / zitieren --> Unities abgeben: Nur für oandres
Hi, der Objektfang "Lot" kann, und das scheint weitgehend unbekannt zu sein, auch für den Anfangspunkt einer Linie verwendet werden: Wird "Lot" für die erste Punkteingabe genutzt, schaltet AutoCAD automatisch in den Objektfangmodus "versetztes Lot". Hat man einen Punkt mit diesem Objektfang auf der "Basis"-Linie gewählt, wählt man den Punkt, von dem das Lot gefällt werden soll und fertig. Leider gibt AutoCAD zu dieser Eingabeart erst ab Rel. 2005 ein grafisches Feedback, aber es funktioniert auch in früheren Versionen. Jetzt könnte man für die ursprüngliche Frage, nämlich auf diese Art und Weise ein Lot VON einer Linie erzeugen und sowohl Anfangs- als auch Endpunkt bestimmen, zum Beispiel ein Makro wie dieses basteln: ^C^C_line;_per;\\;_lengthen;_dy;(entlast);\; Gruß CADchup
------------------ www.cadditions.de [Diese Nachricht wurde von CADchup am 02. Mrz. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oandres Mitglied
Beiträge: 80 Registriert: 24.05.2004 Windows XP Acad 2004
|
erstellt am: 03. Mrz. 2005 07:43 <-- editieren / zitieren --> Unities abgeben:
@cadchup: Es handelt sich dabei leider um eine imaginäre Linie, von der nur Anfangs- und Endpunkt existieren. Der Tipp mit dem Objektfang "Lot" ist mir übrigens neu, aber seeeehr hilfreich. Danke dafür Gibts auch noch eine Möglichkeit, von zwei Punkten ein Lot abzusetzen ? Stelle mir das so vor: Punkt 1 anwählen, Punkt zwei anwählen (von dem aus das Lot abgesetzt werden soll und dann den Abstand eingeben (Vorzeichen bestimmt die Richtung). Beispiel: Von einer imaginären Linie die durch die beiden Punkte verläuft bzw. deren Anfangs und Endpunkte soll ein lotrechter Punkt x Einheiten über dem 2. Punkt abgesetzt werden. Bisher habe ich das so gemacht: - Klinie durch die beiden Punkte - Klinie / Abstand / x - Klinie / Winkel / Bezug / 90° - entsprechenden Punkt Picken - Punkt an dem Schnittpunkt erstellen - Klinien wieder löschen Gruß Olli Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 03. Mrz. 2005 09:01 <-- editieren / zitieren --> Unities abgeben: Nur für oandres
sowas ? (defun C:LOT ( / PKT2 PKT2 ABSTAND W) (if (and(setq PKT1 (getpoint "\nBasispunkt 1: ")) (setq PKT2 (getpoint "\nBasispunkt 2: ")) (numberp(setq ABSTAND (getreal "\nAbstand zu PKT2 :"))) ) (progn (if (< ABSTAND 0) (setq W (/ pi -2)) (setq W (/ pi 2)) ) (command "_line" PKT2 (POLAR PKT2 (+ (ANGLE PKT1 PKT2) W) ABSTAND) "") ) ) ) ------------------ - 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 |
oandres Mitglied
Beiträge: 80 Registriert: 24.05.2004 Windows XP Acad 2004
|
erstellt am: 03. Mrz. 2005 09:11 <-- editieren / zitieren --> Unities abgeben:
|
ghostdriver Mitglied Zeichner
Beiträge: 13 Registriert: 01.03.2005 ACAD 2002 WIN XP
|
erstellt am: 03. Mrz. 2005 13:35 <-- editieren / zitieren --> Unities abgeben: Nur für oandres
|
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3336 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 03. Mrz. 2005 14:03 <-- editieren / zitieren --> Unities abgeben: Nur für oandres
Ich glaube, jetzt hab' ich verstanden um was es geht. Hier CADmiums geändertes Lisp. Er möge mir verzeihen, dass ich in seinem Code rumwurschtelte. Code:
(defun C:LOT (/ PKT2 PKT2 ABSTAND OSSI) (if (and (setq PKT1 (getpoint "\nBasispunkt 1: ")) (setq PKT2 (getpoint "\nBasispunkt 2: ")) (progn (initget 3) (setq ABSTAND (getdist "\nAbstand zu PKT2 :")) ) ) (progn (setq OSSI (getvar "OSMODE")) (setvar "OSMODE" 0) (entmake (list '(0 . "POINT") (cons 10 (polar PKT2 (+ (angle PKT1 PKT2) (/ pi 2)) ABSTAND) ) ) ) (setvar "osmode" OSSI) ) ) )
Gruß CADchup
------------------ www.cadditions.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 03. Mrz. 2005 14:07 <-- editieren / zitieren --> Unities abgeben: Nur für oandres
|
oandres Mitglied
Beiträge: 80 Registriert: 24.05.2004 Windows XP Acad 2004
|
erstellt am: 03. Mrz. 2005 18:28 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank an Cadchup, das Lisp funktioniert einwandfrei @alle: Dieses Forum ist einfach einmalig. Hilfsbereitschaft und Kompetenz wohin das Auge blickt Weiter so... Vielleicht kann ich ja (wenn ich CAD-mässig mal "groß" bin) anderen Usern ebenso kompetent helfen... doch davor steht die Hürde dieser seltsamen Programmiersprache :} Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |