| |
| 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: Schnittpunkt ermitteln (2987 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: 23. Jan. 2012 11:38 <-- editieren / zitieren --> Unities abgeben:
Ich habe hier eine Funktion gechrieben, die ermittel ob zwei Linien parallel verlaufen. Ich hätte gern noch den Abstand der Linien, falls sie parallel sind, in var di ausgegeben. Ich bräuchte also die Distance vom Anfangspunkt der Linie 1 lotrecht auf die Linie 2. Wie könnte man das in di einbauen? Code:
(defun c:Demo ( / l1 l2 w1 w2 di) (while (not (and (setq l1 (car (entsel "\nSelect line 1: "))) (wcmatch (cdr (assoc 0 (entget l1))) "LINE"))) (princ "\nNo line select") ) (while (not (and (setq l2 (car (entsel "\nSelect line 2: "))) (wcmatch (cdr (assoc 0 (entget l2))) "LINE"))) (princ "\nNo line select") ) (progn (cond ((= (setq erg (- (setq win1 (angle (cdr (assoc 10 (entget l1))) (cdr (assoc 11 (entget l1))))) (setq win2 (angle (cdr (assoc 10 (entget l2))) (cdr (assoc 11 (entget l2))))) ) ) 0) (setq di (distance (cdr (assoc 10 (entget l1))) (cdr (assoc 10 (entget l2))))) (alert (strcat "Lines parallel\nDistance: " (rtos di 2 2))) ) ((/= erg 0) (alert "Lines no parallel") ) ) ) )
------------------ 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: 23. Jan. 2012 11:56 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Ermittelt den Abstand von PKT3 zu der von PKT1, PKT2 beschriebenen Gerade ..... ganz allgemein gehalten (defun DT:IS-POINT? ( PKT ) (if(=(type PKT)'VARIANT) (setq PKT (vlax-variant-value PKT))) (if(=(type PKT)'SAFEARRAY)(setq PKT (vlax-safearray->list PKT))) (if(and(=(type PKT)'LIST)(vl-every 'numberp PKT)) (cond ((= 2 (vl-list-length PKT)) (list(car PKT)(cadr PKT) 0.0)) ((= 3 (vl-list-length PKT)) PKT) ) ) ) (defun DT:ABSTAND-GERADE-PUNKT (PKT1 PKT2 PKT3 / V1 V2 VP) (if(and(setq PKT1(DT:IS-POINT? PKT1)) (setq PKT2(DT:IS-POINT? PKT2)) (setq PKT3(DT:IS-POINT? PKT3)) (setq V1 (mapcar '- PKT3 PKT1)) (setq V2 (mapcar '- PKT2 PKT1)) (setq VP (list (-(*(cadr V1)(caddr V2)) (*(caddr V1)(cadr V2))) (-(*(caddr V1)(car V2)) (*(car V1)(caddr V2))) (-(*(car V1)(cadr V2)) (*(cadr V1)(car V2))) ) ) (>(distance '(0.0 0.0 0.0) V2)) ) (/(distance '(0.0 0.0 0.0) VP)(distance '(0.0 0.0 0.0) V2)) ) )
------------------ - 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 |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 23. Jan. 2012 12:45 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat:
[code] ((= (setq erg (- (setq win1 (angle (cdr (assoc 10 (entget l1))) (cdr (assoc 11 (entget l1))))) (setq win2 (angle (cdr (assoc 10 (entget l2))) (cdr (assoc 11 (entget l2))))) ) ) 0)
Vorsicht: bei parallelen Linien kann da nicht nur 0 herauskommen, sondern auch Pi. Sinnvoll ist es, sich eine Bibliothek von passenden mathematischen Funktionen zu basteln, mit deren Hilfe Du dann schnell die jeweilige Frage klären kannst, ohne das Rad jedesmal neu erfinden zu müssen. Das Schöne ist, dass AutoCAD schon mit einer Bibliothek sehr nützlicher Funktionen daherkommt. Im konkreten Fall verstecken sich diese in der Programmdatei GEOMCAL.ARX, über die Handhabung erfährst Du in der Onlinehilfe unter Stichwort "KAL" bzw "CAL". Da gibt's auch schon fertige Funktionen für den Abstand zwischen Punkt und Gerade, der Dir natürlich auch den Abstand zweier Geraden gibt (cal "DPL(p1,p2,p3)"), wenn ich mich richtig erinnere 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: 23. Jan. 2012 13:57 <-- editieren / zitieren --> Unities abgeben:
Mit cal muss ich mich etwas näher beschäftigen, hab auf die Schnelle nicht den Durchblick erhalten. Für var di hab ich jetzt folgendes eingesetzt und funktioniert soweit (setq di (distance (setq p1 (cdr (assoc 10 (entget l1)))) (inters p1 (polar p1 (+ win1 (/ pi 2)) 1) (cdr (assoc 10 (entget l2))) (cdr (assoc 11 (entget l2))) nil) ) ) ------------------ Gruss Dirk 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: 23. Jan. 2012 15:42 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Servus DD! Zitat: Original erstellt von cadplayer:
(cond ((= (setq erg (- (setq win1 (angle (cdr (assoc 10 (entget l1))) (cdr (assoc 11 (entget l1))))) (setq win2 (angle (cdr (assoc 10 (entget l2))) (cdr (assoc 11 (entget l2))))) ) ) 0)
Da würde ich lieber mit EQUAL vergleichen als mit = Ciao Georg ------------------ http://www.xxx-tausend.info 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: 24. Jan. 2012 12:34 <-- editieren / zitieren --> Unities abgeben:
Code:
(defun c p ( / l1 l2 w1 w2 erg di) (while (not (and (setq l1 (car (entsel "\nSelect line 1: "))) (wcmatch (cdr (assoc 0 (entget l1))) "LINE"))) (princ "\nNo line select") ) (while (not (and (setq l2 (car (entsel "\nSelect line 2: "))) (wcmatch (cdr (assoc 0 (entget l2))) "LINE"))) (princ "\nNo line select") ) (progn (cond ((equal (setq win1 (angle (cdr (assoc 10 (entget l1))) (cdr (assoc 11 (entget l1))))) (setq win2 (angle (cdr (assoc 10 (entget l2))) (cdr (assoc 11 (entget l2))))) 0) (setq di (distance (setq p1 (cdr (assoc 10 (entget l1)))) (inters p1 (polar p1 (+ win1 (/ pi 2)) 1) (cdr (assoc 10 (entget l2))) (cdr (assoc 11 (entget l2))) nil) ) ) (alert (strcat "Lines parallel\nDistance: " (rtos di 2 2))) ) ((/= erg 0) (alert "Lines no parallel") ) ) ) )
phanominal, das hatte ich auch noch nicht: obwohl die var "erg" nicht klar definiert ist, erfüllt sie den Zweck (bloss ungleich 0 von was) ------------------ 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: 24. Jan. 2012 13:07 <-- 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: 24. Jan. 2012 13:22 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer:
phanominal, das hatte ich auch noch nicht: obwohl die var "erg" nicht klar definiert ist, erfüllt sie den Zweck (bloss ungleich 0 von was)
erg = nil wenn nicht deklariert (/= erg 0) --> T somit ist die Bedingung immer erfüllt erg deklariert (alles außer 0) (/= erg 0) --> T erg deklariert mit 0 (/= erg 0) --> NIL und dann schau dir nochmal cond in der Hilfe an! oder teste unter cond mal als erstes auf ((/= erg 0)(alert "Lines no parallel")) ... klar? ------------------ 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: 22. Feb. 2012 10:00 <-- editieren / zitieren --> Unities abgeben:
Mein Versuch mit cal eine Berechnung durchzuführen funktioniert soweit Code:
(defun c p ( / l1 l2 l1a l1e l2a l2e l1wi l2wi di) (while (not (and (setq l1 (car (entsel "\nSelect line 1: "))) (wcmatch (cdr (assoc 0 (entget l1))) "LINE"))) (princ "\nNo line select") ) (while (not (and (setq l2 (car (entsel "\nSelect line 2: "))) (wcmatch (cdr (assoc 0 (entget l2))) "LINE"))) (princ "\nNo line select") ) (if (not c:cal)(arxload "geomcal")) (setq l1a (cdr (assoc 10 (entget l1))) l1e (cdr (assoc 11 (entget l1))) l2a (cdr (assoc 10 (entget l2))) l2e (cdr (assoc 11 (entget l2))) ) (progn (cond ((= (setq l1wi (cal "ang (l1a,l1e)")) (setq l2wi (cal "ang (l2a,l2e)"))) (setq di (distance l1a (inters l1a (polar l1a (+ (* l1wi (/ pi 180)) (/ pi 2)) 1) l2a l2e nil); inters )) (alert (strcat "Lines parallel\nDistance: " (rtos di 2 2))) ) ((/= l1wi l2wi T) (alert "Lines not parallel ") ) ) ) )
------------------ Gruss Dirk 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: 23. Feb. 2012 13:47 <-- editieren / zitieren --> Unities abgeben:
((/= l1wi l2wi T) (alert "Lines not parallel ") (if (= (- (* l1wi (/ pi 180)) (* l2wi (/ pi 180))) (- (* 90 (/ pi 180)))) (alert "Lines right angled") ) ) Wenn ich gern prüfen möchte ob die Linien rechtwinklig zueinander stehen, tritt der Fall auf das 90Grad entweder 1.5708rad oder -1.5708rad entspricht. Kann mir einer sagen wie ich das richtig einbauen muss? Eigentlich dürfte es ja keine Rolle spielen ob die Einheiten auf Grad oder Gon in der Zeichnung liegen. ------------------ 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: 23. Feb. 2012 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 23. Feb. 2012 13:57 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, ich würde Dir einen anderen Ansatz empfehlen: bei zueinander senkrechten Linien ist das Skalarprodukt der Richtungsvektoren 0. Z.B. so: Code: ; Skalarprodukt von Vektoren (ist 0, wenn v1 senkrecht zu v2) (defun v_scal (v1 v2 / n m) (setq m 0) (foreach n (mapcar '* v1 v2) (setq m (+ m n))) )
Grüsse, Henning------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de 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: 23. Feb. 2012 15:58 <-- editieren / zitieren --> Unities abgeben:
@cadmium Ja mein Ansatz ist nicht so umsetzbar, wie ich schrieb - da nicht immer der Fall eintritt dass 2 aufeinander stossende Linien 1.5708rad sind, was ich nicht verstehe - ich akzeptiere es halt @Henning Elegant, wenn ich in die formel (v_scal l1wi l2wi) einsetze kommt ; error: bad argument type: listp 0.0 Was bedeutet das? ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 23. Feb. 2012 17:00 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Was bedeutet das?
Du übergibst ZAHLEN, die Funktion erwartet aber VEKTOREN. Um den Richtungsvektor einer Linie zu bekommen subtrahierst Du (vereinfacht dargestellt) den Anfangs- vom Endpunkt: Code: ; Subtraktion von Vektoren (defun v_sub (v1 v2 / ) (mapcar '- v1 v2) )
Grüsse, Henning------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de 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: 24. Feb. 2012 09:07 <-- editieren / zitieren --> Unities abgeben:
Zum einen habe ich jetzt festgestellt, das Linien parallel sein können, aber gegenläufig zueinander gezeichnet ein können. Dann ergibt die Formel ((equal (setq l1wi (cal "ang (l1a,l1e)")) (setq l2wi (cal "ang (l2a,l2e)"))) => nil (Lines not parallel) Diesen Fall muss ich noch mit einbauen, sicherlich ist das über Vektorenrechnung zu lösen. Nur habe ich keine Erfahrung damit Wenn ich die Punkte l1a und l1e in die Formel (setq v1 (v_sub l1a l1e)) einsetze erhalte ich z.b. (-5.02524 0.0 0.0) Was stellt diese Liste dar ? Das gleiche mache ich mit den Punkten l2a und l2e und gebe die var v1 v2 an (v_scal v1 v2) und erhalte z.b -23.4573 Was stellt dieser Wert dar? Sorry, dass hier vllt. Mathegrundlagen angesprochen werden - war nicht Thema in meiner Ausbild.
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 24. Feb. 2012 10:33 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
hallo dirk, siehe fuers skalarprodukt http://de.wikipedia.org/wiki/Skalarproduktdamit kannst du natuerlich auch parallele linien herausfinden (ueber berechnung des winkels zweier vektoren - ergebnis waere entweder 0 oder pi). Zitat: Wenn ich die Punkte l1a und l1e in die Formel (setq v1 (v_sub l1a l1e)) einsetze erhalte ich z.b. (-5.02524 0.0 0.0) Was stellt diese Liste dar ?
das ist der richtungsvektor der linie.
Zitat: Das gleiche mache ich mit den Punkten l2a und l2e und gebe die var v1 v2 an (v_scal v1 v2) und erhalte z.b -23.4573 Was stellt dieser Wert dar?
negativer wert: stumpfer winkel positiver wert: spitzer winkel winkel = 0: rechtwinklig gruss marco ------------------ Marco Heuer www.arc-aachen.de Airport Office 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: 24. Feb. 2012 12:57 <-- editieren / zitieren --> Unities abgeben:
Danke Marco für den Hinweis, der sehr hilfreich ist. Wenn die Vektoren v1 v2 parallel sind, dann ergibt v1xv2= positiver Wert oder v1xv2= negativer Wert Bedingung1) v1xv2 = v1v2 (Ergebnis positiv) oder v1xv2 = -v1v2 (Ergebnis negativ) ; Linien parallel Bedingung2) v1xv2 = 0 ; Linien senkrecht Gleichzeitig gilt wenn der Wert negativ ist = stumpfer Winkel und wenn der Wert postiv ist = spitzer Winkel Das wiederspricht aber Bedingung1 Ich glaube ich verstehe es nicht richtig?
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 24. Feb. 2012 13:41 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 24. Feb. 2012 13:47 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
skalarprodukt: va*vb=|va|*|vb|*cos(va,vb)=a*b*cos(alpha) mit va,vb ... vektoren |va|,|vb|,a,b laenge des jeweiligen vektors alpha ... winkel zwischen a und b wenn va*vb=0 stehen beide vektoren senkrecht zueinander. wenn va*vb<>0 habe ich einen spitzen bzw. stumpfen winkel. "spezialfall" fuer spitzen winkel ist ein 0-winkel. "spezialfall" fuer stumpfen winkel ist gestreckter winkel. durch umformen der obrigen gleichung kann ich den cosinus der winkels alpha bzw (va,vb) ermitteln cos(va,vb)=(va*vb)/|va|*|vb| wenn dieser wert 0 oder pi ist, sind beide linien parallel. gruss marco
------------------ Marco Heuer www.arc-aachen.de Airport Office 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: 24. Feb. 2012 15:03 <-- editieren / zitieren --> Unities abgeben:
Skalar sehe ich wie eine x-beliebige Konstante für 2 Vektoren Wie bekomme ich alpha raus, wenn cos(va,vb)=(va*vb)/|va|*|vb| cos (länge a,länge b) = (vektor a * vektor b) / (länge a * länge b) Muss ich etwa die Linienlängen noch ermitteln Mir ist klar dass bei parallelen Linien alpha 0 ist. Bsp va = (1 1 0) vb = (2 2 0) |va| ist damit die Linienlänge a gemeint ? |vb| ist damit die Linienlänge b gemeint ? alpha ? Mein Ansatz ist jetzt folgender
Code:
(setq l1a (cdr (assoc 10 (entget l1))) ; Linie 1 Anfang l1e (cdr (assoc 11 (entget l1))) ; Linie 1 Ende l2a (cdr (assoc 10 (entget l2))) ; Linie 2 Anfang l2e (cdr (assoc 11 (entget l2))) ; Linie 2 Ende ll1 (distance l1a l1e) ; Länge Linie 1 ll2 (distance l2a l2e) ; Länge Linie 2 v1 (v_sub l1a l1e) ; Vektor Linie 1 v2 (v_sub l2a l2e) ; Vektor Linie 2 erg (v_scal v1 v2) ; Skalar der Vektoren v1 v2
Komme nicht weiter? ------------------ Gruss Dirk [Diese Nachricht wurde von cadplayer am 24. 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: 24. Feb. 2012 15:30 <-- editieren / zitieren --> Unities abgeben:
|
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 24. Feb. 2012 15:45 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
fortfuehrender code (nicht getestet) Code: (setq epsilon 0.0000000001) (cond ((equal erg 0.0 epsilon) ; linien senkrecht zueinander ) ((equal (abs (/ erg (* ll1 ll2))) 1.0 epsilon) ; linien parallel zueinander ('T ; liegen irgendwie zueinander ) )
------------------ Marco Heuer www.arc-aachen.de Airport Office 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: 27. Feb. 2012 08:23 <-- editieren / zitieren --> Unities abgeben:
Jetzt ist die Funktion perfekt - ich habe die Aussage parallel oder senkrecht und die Winkeldifferenz der Linien falls sie irgendwie zueinander liegen. Das war eine gigantische Hilfestellung, am liebsten würde ich hier gleich doppelt 10units vergeben. Vielen Dank für die unermüdliche Hilfe und Marco H für den Endschliff (mir schien es absolut kompliziert aber interessant mal mehr zu erfahren) u.a. mit Skalarprodukt. ------------------ Gruss Dirk 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: 18. Apr. 2012 10:27 <-- editieren / zitieren --> Unities abgeben:
Jetzt habe ich gesehen, dass Acad eigens eine Funktion hat die prüft ob Objekte parallel zueinander sind bzw. den Winkel anzeigt. Mein Gedanke ist nun, es wäre doch gut wenn der Auswurf "Lines are parallel" gleich noch die Distance angezeigt wird. Könnte man das in die Ausführung command einbauen ? Bei var p2 muss ich mir noch überlegen, wie ich den lotrechten punkt p2 vom punkt p1 auf das zuletzt gewählte Objekt erzeuge. Code:
(defun c pa () (princ "\nMesse Winkel zwischen Lines Polylines! \n\n") (command "_measuregeom" "_angle" (setq p1 (cadr (entsel "\nWähle 1. Objekt! "))) (cadr (entsel "\nWähle 2. Objekt! ")) ) (princ) (setq p2 '(0 0)) (princ "\nStrecke beträgt: ") (princ (distance p1 p2)) )
------------------ Gruss Dirk [Diese Nachricht wurde von cadplayer am 18. Apr. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 18. Apr. 2012 11:00 <-- 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: 18. Apr. 2012 11:25 <-- editieren / zitieren --> Unities abgeben:
U.a. weil (command "_measuregeom" "_angle" auch Polylinien auswertet und die Winkelauswertung unabhängig davon auswertet wie Linien und Polylinien zueinander gezeichnet sind. ------------------ Gruss Dirk 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: 18. Apr. 2012 17:24 <-- editieren / zitieren --> Unities abgeben:
Wie muss ich vorgehen, wenn ich Anfang und Ende vom gewählten Segment an der Polylinie abfragen möchte. Weil dann könnte ich zur Ermittlung des Abstandes so vorgehen Code:
;Rechnet den Abstand zwischen zwei gewählten Linien(if (not c:cal)(arxload "geomcal")) (setq obj (entget (car (entsel "\nWähle Linie1")))) (setq p1 (cdr (assoc 10 obj))) (setq p2 (cdr (assoc 11 obj))) (setq p3 (cadr (entsel "\nWähle Linie2"))) ;Rechnet den Winkel der 1. Linie und addiert 90grad dazu für die Lotrechte (setq lwi (+ (* (cal "ang (p1,p2)") (/ pi 180)) (/ pi 2))) ;Ermittelt den Punkt 4 aus der Lotrechte durch p3 zur Basis p1-p2 (setq p4 (polar p3 lwi 1)) (setq di (distance (cal "ill (p1,p2,p3,p4)") p3))
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 18. Apr. 2012 19:30 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
ungetestet so in der art (ohne fehlerabfangroutinen): Code: (mapcar 'set '(en pt) (entsel)) (setq vtx-lst (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget en)) ; aus deinem anderen beitrag, antwort von wronzky obj (vlax-ename->vla-object en) pt (vlax-curve-getClosestPointTo obj pt) first-seg (fix (vlax-curve-getParamAtPoint obj pt)) ; hier muss ueberprueft werden, ob es sich um den letzten vertex handelt pt1 (nth first-seg vtx-lst) pt2 (nth (1+ first-seg) vtx-lst))
------------------ Marco Heuer www.arc-aachen.de Airport Office 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: 19. Apr. 2012 08:30 <-- editieren / zitieren --> Unities abgeben:
Find ich klasse, insbesondere dass man immer wieder neue Kombinationen entdeckt. Beispielsweise (mapcar 'set '(en pt) (entsel)): smartset um schnell variablen zu definieren. Ich frage mich immer nur, wie ihr solche ausgeklügelte Konstruktionen herkriegt... Danke ------------------ Gruss Dirk 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: 27. Apr. 2012 14:20 <-- editieren / zitieren --> Unities abgeben:
Betrifft zwar nicht das Thema, aber kann ich auch das gewählte Segment einer Polylinie rauslöschen ohne die Linie aufbrechen zu müssen? Mein Ansatz wäre jetzt die gesamte Polylinie mittels entdel zu löschen und anschliessend anhand der gesammelten Vertexe neuzuzeichnen. ------------------ 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: 27. Apr. 2012 20:03 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 28. Apr. 2012 15:01 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo könnte man das mit den Parellel nicht auch so lösen. Wobei ich denke der resultierende fuzz kommt daher wenn Linien nich gleich lang sind (eine Ungenauigkeit). Wenn man die länge noch berücksichtigt sollte es auch gehen. Code: (defun c aral (/ li1 Xlist) (setq Xlist nil) (repeat 2 (setq li1 (entget (car (entsel)))) (command "_xline" (cdr (assoc 10 li1))(cdr (assoc 11 li1))"") (setq Xlist (cons (mapcar 'abs (assoc 11 (entget (entlast)))) Xlist)) (entdel (entlast)) ) (if (equal (nth 2(car Xlist))(nth 2(cadr Xlist)) 0.0000000000000002) (princ "\nParallel") (princ "\nnicht Parallel") ) (princ) )
------------------ 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: 03. Mai. 2012 14:34 <-- editieren / zitieren --> Unities abgeben:
@cadmium: Ja ist mir klar, Stützpunkte kann ich einfach löschen. Aber geht das auch gleich, dass ich ganze Liniensegmente aus der Polylinie rauslösche @Wolfgang: Ich hab deinen Code nicht ganz zum laufen gekriegt. Vielleicht kannst du nochmal kurz einwerfen, wie du dir das vorgestellt hast mit xline/entdel - kommt mir irgendwie merkwürdig vor. Zu meinem zusammengekritzelten: Ich würde gern einen sauberen Abschluss des progn am Ende finden. Gedacht war eigentlich abzufragen ob die Variablen für das 1. Objekt o1en und das 2. o2en vorhanden sind, um dann zu progn. Code:
(if (not c:cal)(arxload "geomcal")) (while (not (and (mapcar 'set '(o1en o1pt) (entsel "\nWähle 1. Objekt! ")) (cond ((= "LWPOLYLINE" (cdr (assoc 0 (entget o1en)))) (setq o1vtx (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget o1en) ) o1obj (vlax-ename->vla-object o1en) o1pt (vlax-curve-getClosestPointTo o1obj o1pt) o1seg (fix (vlax-curve-getParamAtPoint o1obj o1pt)) o1pt1 (cdr (nth o1seg o1vtx)) o1pt2 (cdr (nth (1+ o1seg) o1vtx)) ) ) ((= "LINE" (cdr (assoc 0 (entget o1en)))) (setq o1pt1 (cdr (assoc 10 (entget o1en))) o1pt2 (cdr (assoc 11 (entget o1en))) ) ) ) (mapcar 'set '(o2en o2pt) (entsel "\nWähle 2. Objekt! ")) (cond ((= "LWPOLYLINE" (cdr (assoc 0 (entget o2en)))) (setq o2vtx (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget o2en) ) o2obj (vlax-ename->vla-object o2en) o2pt (vlax-curve-getClosestPointTo o2obj o2pt) o2seg (fix (vlax-curve-getParamAtPoint o2obj o2pt)) o2pt1 (cdr (nth o2seg o2vtx)) o2pt2 (cdr (nth (1+ o2seg) o2vtx)) ) ) ((= "LINE" (cdr (assoc 0 (entget o1en)))) (setq o2pt1 (cdr (assoc 10 (entget o1en))) o2pt2 (cdr (assoc 11 (entget o1en))) ) ) ) ) ) ) (progn (setq o1wi (+ (* (cal "ang (o1pt1,o1pt2)") (/ pi 180)) (/ pi 2)) o2pt3 (polar o2pt o1wi 1) di (distance (cal "ill (o1pt1,o1pt2,o2pt,o2pt3)") o2pt) ) (command "_measuregeom" "_angle" o1pt o2pt) (princ "\nStrecke beträgt: ") (princ di) )
------------------ 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: 03. Mai. 2012 14:43 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 03. Mai. 2012 14:53 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Ich denke du bekommst es nicht zum laufen weil du den smilie mit kopiert hast. Code: (defun c:Paral (/ li1 Xlist) (repeat 2 (setq li1 (entget (car (entsel)))) (command "_xline" (cdr (assoc 10 li1))(cdr (assoc 11 li1))"") (setq Xlist (cons (mapcar 'abs (assoc 11 (entget (entlast)))) Xlist)) (entdel (entlast)) ) (if (equal (nth 2(car Xlist))(nth 2(cadr Xlist)) 0.0000000000000002) (princ "\nParallel") (princ "\nnicht Parallel") ) (princ) )
------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 die aus unerklärlichen Gründen aus dem System hier gelöscht wurden. [Diese Nachricht wurde von Meldin am 03. Mai. 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: 03. Mai. 2012 15:18 <-- editieren / zitieren --> Unities abgeben:
@wolfgang: Nein hab ich nicht, mir löscht es bei der Funktion die Polylinien, die ich auswähle @Thomas: Klar wusste nicht mehr, das _break auch 2 Punkte zulässt Bei der Funktion sollte es eigentlich das Segment rauslöschen. Ich hab nur ein Problem wie bekomme ich ein vla-objekt wieder in ein normales Lisp-objekt Code:
(defun C:www (/ ) (while (mapcar 'set '(en pt) (entsel "Breakobjekt wählen! ")) (if en (progn ((= "*POLYLINE" (cdr (assoc 0 (entget obj)))) (setq vtx (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget en) ) obj (vlax-ename->vla-object en) pt (vlax-curve-getClosestPointTo obj pt) seg (fix (vlax-curve-getParamAtPoint obj pt)) pt1 (cdr (nth seg vtx)) pt2 (cdr (nth (1+ seg) vtx)) ) (command "_BREAK" obj "_F" pt1 pt2) ) ) ) ) (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: 03. Mai. 2012 15:25 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Ich bin dabei auch von linien ausgegangen nicht aber von polylinien. Daher rührt der Fehler. ------------------ 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 |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 03. Mai. 2012 15:35 <-- 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: 04. Mai. 2012 08:21 <-- editieren / zitieren --> Unities abgeben:
Ich bekomme nachwievor die Fehlermeldung error: bad argument value: AutoCAD command: #<VLA-OBJECT IAcadLWPolyline2 0000000033164b88> In obj steht #<VLA-OBJECT IAcadLWPolyline2 0000000033164b88> Oder verstehe ich hier etwas falsch. vlax-vla-object->ename erstellt doch ein vla-objekt nicht ein Lisp-objekt ------------------ 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: 04. Mai. 2012 08:27 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Nein erstellt wird damit auch nichts du kannst das Objekt nur übergeben von Lisp nach AX und wieder zurück. ------------------ 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 |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 04. Mai. 2012 08:42 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
deine funktion muesste in etwa so ausschauen (ungetestet): Code: (defun C:www ( / en pt vtx obj pt pt1 pt2 seg ) (while (mapcar 'set '(en pt) (entsel "Breakobjekt wählen! ")) (if en (progn ((= "*POLYLINE" (cdr (assoc 0 (entget en)))) (setq vtx (vl-remove-if-not '(lambda (x) (= (car x) 10))(entget en)) obj (vlax-ename->vla-object en) pt (vlax-curve-getClosestPointTo obj pt) seg (fix (vlax-curve-getParamAtPoint obj pt)) pt1 (cdr (nth seg vtx)) pt2 (cdr (nth (1+ seg) vtx)) ) (command "_BREAK" en "_F" pt1 pt2) ) ) ) ) (princ) )
gruss marco ------------------ Marco Heuer www.arc-aachen.de Airport Office Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 04. Mai. 2012 08: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: 08. Mai. 2012 13:54 <-- editieren / zitieren --> Unities abgeben:
Zwei Routinen, die vielleicht das Leben erleichtern. No1) Löschen von Segmenten in Polylinien No2) Prüfe Polylinien und Linien auf Parallel und gebe den Abstand aus Damit ist der ewige Thread wohl zu Ende und ich danke allen Helferlein mit deren Einwürfen. Ich hoffe, ich habe niemanden vergessen, beim Punkte vergeben. ------------------ Gruss Dirk [Diese Nachricht wurde von cadplayer am 08. Mai. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 08. Mai. 2012 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|