| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: tatsächlicher Winkel einer Linie (2626 / mal gelesen)
|
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003
|
erstellt am: 15. Nov. 2017 15:03 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, die Frage hört sich wahrscheinlich trivial an, aber ich bin seit Jahren aus der Lispprogrammierung raus und muss jetzt wieder loslegen. Ich suche eine Möglichkeit den tatsächlichen Winkel einer Linie zu bekommen. Wenn ich mir die mit _list anschaue zeigt mir die Kiste den Winkel in der xy-Ebene an. Genau diesen Winkel würde ich gern über Lisp ermitteln um damit weiter zu arbeiten. Mir (angle Punkt1 Punkt2) komme ich da nicht weiter da dieses Ergebnis ja davon abhängt in welcher Reihenfolge ich die zwei Punkte ermittle. D.h. der kann mal Beispielsweise 45° oder auch 225° haben. Ich hoffe ich habe mich verständlich ausgedrückt. ------------------ Grüße Jörg man hat nie Zeit es richtig zu machen, aber immer genug Zeit es nochmals zu machen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 15. Nov. 2017 15:12 <-- editieren / zitieren --> Unities abgeben: Nur für jörg.jwd
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 15. Nov. 2017 15:25 <-- editieren / zitieren --> Unities abgeben: Nur für jörg.jwd
|
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003
|
erstellt am: 15. Nov. 2017 15:29 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von CADwiesel: geht per (vla-get-angle vla-object) oder per (angle startpunkt endpunkt)
...sorry von vl-irgendwas habe ich leider keinen Plan. Das gab's zu meiner Zeit noch nicht. Mit deine zweiten Idee komme ich leider nicht weiter da in dem Fall der Winkel davon abhängt in welcher Reihenfolge die zwei Punkte definiert werden. ------------------ Grüße Jörg man hat nie Zeit es richtig zu machen, aber immer genug Zeit es nochmals zu machen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003 Win7-64,Win10-64 SWX 2010/11/12/13/14/15/16/17/18,19,20,21,22 Immer das aktuellste SP Autodesk Product Design Suite Standard 2020 DraftSight Énterprise 2021SP2 CIM Database 11.3 32GB RAM. NVIDIA Quadro P1000
|
erstellt am: 15. Nov. 2017 15:34 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von CADmium: (if(and(setq L(entget(car(entsel "Line:"))))(=(cdr(assoc 0 L))"LINE"))(*(/(angle(cdr(assoc 10 L))(cdr(assoc 11 L)))PI)180))
Hallo Thomas, so hab ich's ja versucht. Allerdings liefert mir das Ergebnis auch mögliche zwei Winkel abhängig davon ob die Linie z.B. von unten nach oben gezeichnet wurde oder umgekehrt. Zum Verständnis für alle: ich versuche momentan eine kleine Routine zu schreiben die mir Symetrielinien zwischen zwei Linien zeichnet. ------------------ Grüße Jörg man hat nie Zeit es richtig zu machen, aber immer genug Zeit es nochmals zu machen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 15. Nov. 2017 16:23 <-- editieren / zitieren --> Unities abgeben: Nur für jörg.jwd
etwas primi : (defun C:SYMLINE(/ L1 L2 P11 P12 P13 P21 P22 P23) (if(and(setq L1(entget(car(entsel "\nLinie 1:"))))(=(cdr(assoc 0 L1))"LINE") (setq L2(entget(car(entsel "\nLinie 2:"))))(=(cdr(assoc 0 L1))"LINE") (setq P11(cdr(assoc 10 L1)))(setq P12(cdr(assoc 11 L1)))(setq P13(mapcar '*(mapcar '+ P11 P12)'( 0.5 0.5 0.5))) (setq P21(cdr(assoc 10 L2)))(setq P22(cdr(assoc 11 L2)))(setq P23(mapcar '*(mapcar '+ P21 P22)'( 0.5 0.5 0.5))) ) (if(<(distance P11 P21)(distance P11 P22)) (command "_line" (mapcar '* (mapcar '+ P11 P21) '(0.5 0.5 0.5)) (mapcar '* (mapcar '+ P12 P22) '(0.5 0.5 0.5))"" ) (command "_line" (mapcar '* (mapcar '+ P11 P22) '(0.5 0.5 0.5)) (mapcar '* (mapcar '+ P12 P21) '(0.5 0.5 0.5))"" ) ) ) ) ------------------ Also ich finde Unities gut ... und andere sicher auch --------------------------------------- - 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 |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 15. Nov. 2017 16:30 <-- editieren / zitieren --> Unities abgeben: Nur für jörg.jwd
oder so Code: (defun getMitte (/ lineA lineB LU RO LINE) (if (and (setq lineA (vlax-ename->vla-object (car (entsel)))) (setq LineB (vlax-ename->vla-object (car (entsel)))) (setq LU (mapcar '+ (vlax-curve-getstartpoint lineA) (vlax-curve-getclosestpointto LineB (vlax-curve-getstartpoint lineA) ) ;_ end of vlax-curve-getclosestpointto ) ;_ end of mapcar ) ;_ end of setq (setq LU (mapcar '/ LU '(2.0 2.0 2.0))) (setq RO (mapcar '+ (vlax-curve-getendpoint lineA) (vlax-curve-getclosestpointto LineB (vlax-curve-getendpoint lineA) ) ;_ end of vlax-curve-getclosestpointto ) ;_ end of mapcar ) ;_ end of setq (setq RO (mapcar '/ RO '(2.0 2.0 2.0))) ) ;_ end of and (setq LINE (vl-catch-all-apply 'vla-addline (list (vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object) ) ;_ end of vla-get-activedocument ) ;_ end of vla-get-ModelSpace (vlax-3d-point LU) (vlax-3d-point RO) ) ;_ end of list ) ;_ end of vl-catch-all-apply ) ;_ end of setq ) ;_ end of if )
------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003
|
erstellt am: 16. Nov. 2017 08:02 <-- editieren / zitieren --> Unities abgeben:
@CADwiesel: wie ich oben schon geschrieben habe sind vl-Routinen für mich böhmische Dörfer Für mein CAD-Programm (DraftSight) wohl auch (siehe Bild). Trotzdem Danke für deine Bemühungen. @Thomas: die Idee mit dem Mittelpunkt zwischen den Endpunkten hatte ich auch. Sieht auch gut aus wenn die Endpunkte nicht allzu weit auseinander liegen. Stimmt aber auch da nicht. Ich hab dir mal einen Screenshot dazu angehängt wo's eindeutig wird. Hab mein Programm auch soweit hinbekommen dass es "fast richtig" funktioniert, nur wenn die beiden Linien weit auseinander liegen stimmt der Winkel im Ergebnis nicht (um 90° verdreht). Werde mal weiterkämpfen und melden wenn's geklappt hat. Auch dir trotzdem Danke für deine Bemühungen. ------------------ Grüße Jörg man hat nie Zeit es richtig zu machen, aber immer genug Zeit es nochmals zu machen [Diese Nachricht wurde von jörg.jwd am 16. Nov. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 16. Nov. 2017 09:50 <-- editieren / zitieren --> Unities abgeben: Nur für jörg.jwd
Hallo Jörg, da hat es wohl Interpretationsunterschiede zum Begriff "Symmetrielinie" gegeben. Ich hätte es auch wie Thomas (CADmium) interpretiert. Aber zu Deiner Interpretation fällt mir folgendes ein: Den Schnittpunkt Deiner beiden Linien und damit einen Punkt der gesuchten findest Du mit (inters ...) Von diesem Punkt aus ermittels Du mit (angle ...) die Winkel zu jeweils einem Punkt der beiden Linien (egal welcher) und der Mittelwert von beiden gibt Dir den Winkel Deiner gesuchten Linie. Mit (polar ...) kannst Du Dir dann einen zweiten Punkt berechnen und die Linie zeichnen. HTH Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 16. Nov. 2017 10:29 <-- editieren / zitieren --> Unities abgeben: Nur für jörg.jwd
(defun C:SYMLINE(/ L1 L2 P11 P12 P21 P22 S W1 W2 W OLDOSMODE GETW) (defun GETW(W) (if(numberp W) (progn (setq W(*(-(abs W)(* 6.283185307(fix(/(abs W)6.283185307))))(if(< W 0) -1.0 1.0))) (if(>(abs W) 3.141592654)(setq W (- W (* 6.283185307 (if(< W 0) -1.0 1.0))))W) (if(<= W 0)(+ W 3.141592654)W) ) ) ) (if(and(setq L1(entget(car(entsel "\nLinie 1:"))))(=(cdr(assoc 0 L1))"LINE") (setq L2(entget(car(entsel "\nLinie 2:"))))(=(cdr(assoc 0 L1))"LINE") (setq P11(cdr(assoc 10 L1)))(setq P12(cdr(assoc 11 L1))) (setq P21(cdr(assoc 10 L2)))(setq P22(cdr(assoc 11 L2))) ) (if(and(or(setq S(inters P11 P12 P21 P22 nil)) (setq S(mapcar '* (mapcar '+ P11 P21) '(0.5 0.5 0.5))) ) (setq W1(GETW(angle P11 P12))) (setq W2(GETW(angle P21 P22))) (setq W(*(+ W1 W2)0.5)) (setq P1(polar S W 1000)) (setq P2(polar S (+ W PI ) 1000)) ) (progn (setq OLDOSMODE (getvar "OSMODE")) (setvar "OSMODE" 0) (command "_line" P1 P2 "") (setvar "OSMODE" OLDOSMODE) ) ) ) ) aber auch da gibt es noch Interpretationsspielraum .. man könnte noch die Klickunkte auswerten usw ... ------------------ Also ich finde Unities gut ... und andere sicher auch --------------------------------------- - 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 |
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003
|
erstellt am: 16. Nov. 2017 12:52 <-- editieren / zitieren --> Unities abgeben:
So, geschafft *schwitz*. Zitat: Original erstellt von spider_dd: Hallo Jörg, Den Schnittpunkt Deiner beiden Linien und damit einen Punkt der gesuchten findest Du mit (inters ...) Von diesem Punkt aus ermittels Du mit (angle ...) die Winkel zu jeweils einem Punkt der beiden Linien (egal welcher) und der Mittelwert von beiden gibt Dir den Winkel Deiner gesuchten Linie. Mit (polar ...) kannst Du Dir dann einen zweiten Punkt berechnen und die Linie zeichnen.HTH Gruß Thomas
@Spider_dd: diese Idee war schon fast so umgesetzt Ähnlich wie das Prog von Cadmium. Einzig die Idee gleich den Winkel zum gemeinsamen Schnittpunkt der beiden Linien zu benutzen ist mir nicht gekommen. Zitat: Original erstellt von CADmium:
aber auch da gibt es noch Interpretationsspielraum .. man könnte noch die Klickunkte auswerten usw ...
@CADmium Dein Programm ist mit dem meinen fast identisch und bringt den gleichen Fehler wie meins. Wenn die beiden Linien in verschiedenen Richtungen (die eine von unten nach oben und die andere von oben nach unten)gezeichnet sind ist der resultierende Winkel leider um 90° verdreht. Genau dieses Problem hat mich veranlasst diesen Thread aufzumachen (schlussendlich mit Erfolg). Ich möchte mich bei allen nochmals herzlich bedanken für die guten Tipps. Ü's sind unterwegs. ------------------ Grüße Jörg man hat nie Zeit es richtig zu machen, aber immer genug Zeit es nochmals zu machen [Diese Nachricht wurde von jörg.jwd am 16. Nov. 2017 editiert.] [Diese Nachricht wurde von jörg.jwd am 16. Nov. 2017 editiert.] [Diese Nachricht wurde von jörg.jwd am 17. Nov. 2017 editiert.] 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. Nov. 2017 13:16 <-- editieren / zitieren --> Unities abgeben: Nur für jörg.jwd
Hallo ich hätte es so gemacht. Code: (defun c:syml (/) (setq LI1 (car (entsel))) (setq LI2 (car (entsel))) (setq OOSMODE (getvar "OSMODE")) (setvar "OSMODE" 0) (setq LI1S (getpropertyvalue LI1 "StartPoint")) (setq LI1E (getpropertyvalue LI1 "EndPoint")) (setq LI2S (getpropertyvalue LI2 "StartPoint")) (setq LI2E (getpropertyvalue LI2 "EndPoint")) (setq ItersPT (inters LI1S LI1E LI2S LI2E nil) ) (command "klinie" ItersPT (polar ItersPT (/ (+ (if(<=(angle ItersPT LI1S)(angle ItersPT LI1E)) (angle ItersPT LI1S) (angle ItersPT LI1E)) (if(<=(angle ItersPT LI2S)(angle ItersPT LI2E)) (angle ItersPT LI2S) (angle ItersPT LI2E)) ) 2 ) (getpropertyvalue LI2 "Length") ) "" ) (setvar "OSMODE" OOSMODE) )
------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 16. Nov. 2017 19:53 <-- editieren / zitieren --> Unities abgeben: Nur für jörg.jwd
Zitat: Original erstellt von jörg.jwd: Hallo zusammen,die Frage hört sich wahrscheinlich trivial an, aber ich bin seit Jahren aus der Lispprogrammierung raus und muss jetzt wieder loslegen. Ich suche eine Möglichkeit den tatsächlichen Winkel einer Linie zu bekommen. Wenn ich mir die mit _list anschaue zeigt mir die Kiste den Winkel in der xy-Ebene an. Genau diesen Winkel würde ich gern über Lisp ermitteln um damit weiter zu arbeiten. Mir (angle Punkt1 Punkt2) komme ich da nicht weiter da dieses Ergebnis ja davon abhängt in welcher Reihenfolge ich die zwei Punkte ermittle. D.h. der kann mal Beispielsweise 45° oder auch 225° haben. Ich hoffe ich habe mich verständlich ausgedrückt.
Ich verstehe den Wortsinn Deine Aussage, aber der beruht auf Unkenntnis der mathematischen Sachlage. Eine Linie bzw eine Gerade hat erst mal gar keinen Winkel, sondern ist durch zwei Punkte vollständig definiert. Für einen Winkel aber brauchst Du mindestens drei Punkte, nämlich einen Scheitelpunkt, und zwei Punkte, zwischen denen gegen den Uhrzeigersinn über den Scheitelpunkt dann ein Winkel definiert ist. Eine Linie hat also nur dann einen Winkel, wenn man die Linie in Bezug zu irgend etwas setzt, das dann die Interpretation der drei Punkte erlaubt, zwischen denen der Winkel aufgespannt ist. Für eine Linie im kartesischen Raum gibt man deshalb sinnvollerweise den Winkel IN der XY-Ebene an, UND den Winkel AUS der XY-Ebene. Das sind dann auch gleich die bekannten Koordinatenangaben, die man für jeden Punkt im kartesischen System eindeutig benennen kann, und die in AutoCAD trivialerweise durch "@ABSTAND<WINKEL" (für 2D, also IN der XY-Ebene) oder "@ABSTAND<WINKEL<WINKEL" als Zylinderkoordinaten eingegeben werden können. Und natürlich ergibt sich da jeweils ein anderer Winkel, je nachdem von welchem Endpunkt aus man beginnt. In AutoCAD ist eine Linie aber tatsächlich eindeutig durch Startpunkt und Endpunkt definiert. Der Startpunkt findet sich unter dem DXF-Gruppencode 10, der Endpunkt unter DXF-Gruppencode 11. Es gibt da also eine Nomenklatur, die Dir zeigt, ob die Linie nun 45° in der XY-Ebene liegt, oder 315°. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 17. Nov. 2017 09:06 <-- editieren / zitieren --> Unities abgeben: Nur für jörg.jwd
Hallo Jörg, ich hab mir das alles hier mal durchgelesen und bin zu dem Ergebnis gekommen dass es um Winkel geht die nicht größer oder gleich 180° sind. Wenn der Winkel z.B. 225° ist soll 45° verwendet werden. Sollte ich das richtig verstanden haben dann einfach 180 abziehen wenn der Winkel größer oder gleich 180° ist. Also:
Code: (if (>= w 180.0) (setq w (- w 180.0)) )(
Sollte ich das nicht richtig verstanden haben ... dann nicht. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de 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: 17. Nov. 2017 09:17 <-- editieren / zitieren --> Unities abgeben: Nur für jörg.jwd
Im grunde ja das probelm siehst du wenn du das prog von cadmium nimmst und 2 rechtwinklige linien zeichnest ich habe den fehler in meinem code etwas umgangen. Die abhängigkeit der Linien zu einander ist das Problem linie von links nach rechts 0 grad von r nach l 180 und wie liegt dann die 2te linie von oben nach unten 270 grad oder von u nach o 90 grad. ------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003
|
erstellt am: 17. Nov. 2017 12:56 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, schön dass ihr immer noch an meinem Problem "knabbert" Wie ich hier bereits geschrieben habe ich mein Problem bereits gelöst. ------------------ Grüße Jörg man hat nie Zeit es richtig zu machen, aber immer genug Zeit es nochmals zu machen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |