;;; ----------------------------------- ;;; Nur TESTFUNKTION ;;; ----------------------------------- (defun c:test (/ ename givenpt curve-obj) (setq ename (car (entsel "\nPline wählen:")) curve-obj (vlax-ename->vla-object ename) ) (get-side ename) ) ;;;************************************************************** ;;; Benutzereingabe für Offsetrichtung ;;; Argumente: ename - Ename der Pline ;;; Rückgabe: "LINKS" oder "RECHTS" ;;;************************************************************** (defun get-side (ename / ang arrowsleft arrowsright bbmax bbmin bkspt endpara grval isright obj oldisright oldviewpara para templen viewpara) (vl-load-com) (setq obj (vlax-ename->vla-object ename)) ;; Boundingbox für Zoom (vla-getboundingbox obj 'bbmin 'bbmax) (setq bbmin (vlax-safearray->list bbmin) bbmax (vlax-safearray->list bbmax) ) ;; Pfeile berechnen (setq para (+ (vlax-curve-getstartparam obj) 0.5) endpara (vlax-curve-getendparam obj) ) (while (< para endpara) (setq ang (angle '(0.0 0.0) (vlax-curve-getfirstderiv obj para)) bkspt (trans (vlax-curve-getpointatparam obj para)0 1) arrowsleft (cons (list bkspt (+ ang (* 0.5 pi))) arrowsleft) arrowsright (cons (list bkspt (- ang (* 0.5 pi))) arrowsright) para (1+ para) ) ) ;; Textausgabe (princ "\nBearbeitungsseite angeben:") ;;----------------- ;; Grread Steuerung ;;----------------- (while (/= 3 (car (setq grval (grread t)))) (setq grval (cadr grval)) (cond ;;--------------------- ;; Zoom auf Objekt (doubleclick mittlere Taste) ;;--------------------- ((= 39 grval) (command "_ZOOM" "_W" bbmin bbmax) (command "_ZOOM" "0.8x") (setq oldviewpara nil)) ;;--------------------- ;; Grafische Auswertung ;;--------------------- ((listp grval) ;; Werte für aktuelle Cursorpos berechnen (setq viewpara (pt_getviewpara) templen (/ (car viewpara) 15) isright (is-pt-right obj (trans grval 1 0)) ) ;; Bildschirm neu zeichnen, wenn nötig (if (or (pt_isviewchanged oldviewpara) (/= isright oldisright)) (progn (redraw) ;; Pfeile zeichnen (if isright (foreach arrow arrowsright (grdraw-arrow (car arrow) (cadr arrow) templen 1)) (foreach arrow arrowsleft (grdraw-arrow (car arrow) (cadr arrow) templen 1)) ) ) ) ;; aktuelle werte sichern (setq oldviewpara viewpara oldisright isright ) ) ;;Wenn andere Grread Rückgabe, Bildschirm neu aufbauen (t (redraw) (setq oldviewpara nil)) ) ;cond ) ;while ;;Rückgabe (redraw) (if isright "RECHTS" "LINKS" ) ) ;;;-------------------------------- ;;; überprüft, ob sich der Zoomfactor oder die Zoomposition geändert hat ;;;-------------------------------- (defun pt_isviewchanged (oldviewpara /) (not (or (equal (getvar "VIEWSIZE") (car oldviewpara)) (equal (getvar "VIEWCTR") (last oldviewpara))) ) ) ;;;-------------------------------- ;;; Holt Viewparameter (viewsize viewctr) ;;;-------------------------------- (defun pt_getviewpara (/) (list (getvar "VIEWSIZE") (getvar "VIEWCTR"))) ;;;------------------------------ ;;; is-pt-right - NUR FÜR LINE oder PLINE OHNE BULGES !!! ;;; Argumente: curve-obj - VlaObj von Polyline ;;; point - Zu prüfender Punkt ;;; Rückgabe: T - Punkt liegt rechts der Kontur ;;; nil - Punkt liegt links der Kontur ;;; ACHTUNG: Wenn Punkt genau auf dem Objekt liegt ist die Rückgabe nicht sicher definiert !!! ;;; -> vorher prüfen ob Punkt auf Objekt liegt !!! ;;;------------------------------ (defun is-pt-right (curve-obj point / angle1 closestpara closestpnt endpara firstderiv startpara) (setq startpara (vlax-curve-getstartparam curve-obj) endpara (vlax-curve-getendparam curve-obj) closestpnt (vlax-curve-getclosestpointto curve-obj point) closestpara (vlax-curve-getparamatpoint curve-obj closestpnt) angle1 (angle '(0.0 0.0) (vlax-curve-getfirstderiv curve-obj closestpara)) ) (cond ;; Wenn Closestpt = Eck ((and (equal closestpara (fix closestpara)) (/= startpara closestpara) (/= endpara closestpara)) (minusp (deltaang angle1 (angle '(0.0 0.0) (vlax-curve-getfirstderiv curve-obj (1- closestpara))))) ) ;; Wenn Closestpt = Mittendrin oder Start/Endpunkt (t (minusp (deltaang angle1 (angle closestpnt point)))) ) ) ;;;---------------------------------------------------------- ;;; Zeichnet mit Grdraw einen Pfeil ;;; Argumente: Startpt - Pfeilstartpunkt im BKS ;;; ang - Winkel ;;; len - Länge des Pfeils ;;; color - Farbe ;;;---------------------------------------------------------- (defun grdraw-arrow (startpt ang len color / p2 p3 p4 sinmat cosmat) (setq sinmat (* len (sin ang)) cosmat (* len (cos ang)) ) (setq p2 (polar startpt ang len) p3 (polar p2 (- ang 2.8) (* len 0.3)) p4 (polar p2 (+ ang 2.8) (* len 0.3)) ) (grvecs (cons color (list startpt p2 p2 p3 p2 p4)) ) ) ;;;----------------------------- ;;; Hilfsfunktion ;;; Winkel differenz -> Ergebnis zwischen -pi und +pi (-180 und 180 Grad) ;;;----------------------------- (defun deltaang (ang1 ang2 / ang) (setq ang (- ang2 ang1)) (cond ((equal 0.0 ang 10e-6) 0.0) ((equal pi ang 10e-6) pi) ((> ang pi) (- ang (* pi 2.0))) ((<= ang (- pi)) (+ ang (* pi 2.0))) (t (eval ang)) ) ) ;|«Visual LISP© Format Options» (150 2 1 2 nil " " 100 20 1 1 0 T nil nil T) ;*** KEINEN Text unterhalb des Kommentars hinzufügen! ***|;