(defun c:rs( / aenderling punktliste restliste basispunkt diagonalpunkt laenge breite ausrichtung basisnummer lage mass1 mass2 punktlisteneu nummer punkt temp) ;;; Rechteck auswählen und die Ecken aus der Polylinieninfo in die Punktliste übernehmen (setq aenderling (entget (car (entsel "Rechteck wählen")))) (setq punktliste (list (cdr (assoc 10 (member '(39 . 0.0) aenderling))))) (setq restliste aenderling) (repeat 3 (setq restliste (cdr (member '(42 . 0.0) restliste))) (setq punktliste (append punktliste (list (cdr (assoc 10 restliste))))) ) ;;;Lage des Rechtecks ermitteln um festzulegen was Länge und was Breite ist (setq ausrichtung (/ (angle (nth 0 punktliste) (nth 1 punktliste)) pi)) (setq ausrichtung (- ausrichtung (atoi (rtos ausrichtung 2)))) ;;; Abmessungen ermitteln (if (and (<= 0.25 ausrichtung) (< ausrichtung 0.75)) (progn (setq laenge (distance (nth 0 punktliste) (nth 3 punktliste))) (setq breite (distance (nth 0 punktliste) (nth 1 punktliste))) (setq lage 1) ) (progn (setq laenge (distance (nth 0 punktliste) (nth 1 punktliste))) (setq breite (distance (nth 0 punktliste) (nth 3 punktliste))) (setq lage 0) ) ) ;;;anzeigen (princ (strcat "\nLänge " (rtos laenge) ", Breite " (rtos breite))) ;;;und nach neuem Wert fragen, Basispunkt darf nur xy-Wert haben (setq temp (getvar 'osmode)) (setvar 'osmode 1) ;jetzt wird der Fang Endpunkt benötigt (initget 1) (setq basispunkt (reverse (cdr (reverse(getpoint "\nBasispunkt auf dem Rechteck: "))))) (setvar 'osmode temp) ;alte Objektfangeinstellung wiederherstellen (princ (strcat "\nNeue Länge <" (rtos laenge) ">: ")) (setq laenge (laengeein laenge basispunkt)) (princ (strcat "\nNeue Breite <" (rtos breite) ">: ")) (setq breite (laengeein breite basispunkt)) ;;;Bestimmen welche Punktnummer der Basispunkt in der Liste hat (setq basisnummer (- (length punktliste) (length (member basispunkt punktliste)))) ;;;Wenn basisnummer + lage eine gerade Zahl ist wird zum nächsten Punkt die Länge aufgetragen (if (= 0 (rem (+ basisnummer lage) 2)) (progn (setq mass1 laenge) (setq mass2 breite) ) (progn (setq mass1 breite) (setq mass2 laenge) ) ) ;;; Punktliste umstellen so das der Basispunkt an erster Stelle steht (setq punktliste (append (member basispunkt punktliste) (reverse (cdr (member basispunkt (reverse punktliste)))))) ;;;Punkte umrechnen (setq punktlisteneu (list basispunkt)) ;;;Einstellungen für den nächsten Punkt vorbereiten (mapcar '(lambda (pkt) (apply '(lambda (pos mass) (setq punkt nil) ;;;Punktkoordinaten berechnen (mapcar '(lambda (koordinate) (apply '(lambda (xy winkelfunktion) (setq punkt (append punkt (list (+ (xy (nth pos punktlisteneu)) (* mass (winkelfunktion (angle (nth pos punktliste)(nth (+ pos 1) punktliste))) ) )) )) ) koordinate ) ) (list (list car cosinus)(list cadr sinus)) ) ;;;Ende der Punktkoordinaten (setq punktlisteneu (append punktlisteneu (list punkt))) pos mass ) pkt ) ) (list (list 0 mass1)(list 1 mass2)(list 2 mass1)) ) (setq punktlisteneu (mapcar '(lambda (punkt) (cons 10 punkt)) punktlisteneu)) (setq punktliste (mapcar '(lambda (punkt) (cons 10 punkt)) punktliste)) ;;; Jetzt müssen noch die alten Punktkoordinaten gegen die neuen getauscht (setq nummer 0) (repeat 4 (setq aenderling (subst (nth nummer punktlisteneu) (nth nummer punktliste) aenderling)) (setq nummer (+ 1 nummer)) ) ;;; und der Teil aktualisiert werden (entmod aenderling) (princ) );;; ende defun ;;; ;;;Die diversen Unterprogramme: ;;; ;;;Längenangaben einlesen mit Basispunkt für Mauseingabe und Vorschlag des alten Wertes (defun laengeein(alt basispunkt / neu) (if (not (setq neu (getdist basispunkt)))(setq neu alt)) neu ) ;;;Rest der Division (hier benötigt für die Vielfachen von pi und pi/2) (defun divrest( zahl durch / ganzzahl rest) (setq ganzzahl (atoi (rtos (/ zahl durch)))) (setq rest (- zahl (* ganzzahl durch))) ) ;;;Cosinus ohne Abweichung wo er eigendlich 0 sein sollte (defun cosinus(winkel / cosinus) (if (= (/ pi 2) (divrest winkel pi)) (setq cosinus 0) (setq cosinus (cos winkel)) ) ) ;;;Sinus ohne Abweichung wo er eigendlich 0 sein sollte (defun sinus(winkel / sinus) (if (= 0 (divrest winkel pi)) (setq sinus 0) (setq sinus (sin winkel)) ) )