(defun Movekuerzel ( TS PS / basept grpt ent obj objlist orthomode_temp POLpt TBpt vek) ; Übergabeparameter: ; TS = Auswahlsatz aus Text und Block (können auch mehr als zwei sein) ; PS = Elementname der Polylinie (in diesem Fall nur eine PL zulässig) ; Rückgabewert: irrelevant ; Koordinatenkonvention: ; getpoint gibt UCS zurück ; (assoc 10 ...) gibt WCS zurück ; (grread) gibt UCS zurück ; (vla-move) benötigt WCS ; d.h. alle Koordinaten werden zunächst als UCS verwaltet und für (vla-move) nach WCS ; transformiert: 1=User nach 0=World ; (vl-load-com) (setq orthomode_temp (getvar "orthomode")) (setvar "orthomode" 1) ; Initialisierungen: ; Twinset in Liste von VLA-Objekten umwandeln: (setq objlist (mapcar '(lambda (ent) (vlax-ename->vla-object ent)) (ss->list TS) ) ; Polylinie in VAL-Objekt umwandeln: obj (vlax-ename->vla-object PS) ; Koordinaten (WCS) von 3. und 4. Vertex holen: p3 (vlax-safearray->list (vlax-variant-value (vlax-get-property obj 'coordinate 2)) ) p4 (vlax-safearray->list (vlax-variant-value (vlax-get-property obj 'coordinate 3)) ) basept (trans p4 0 1) ; 4.Poly-Vertex ist auch der erste Basispunkt für ; Text- und Blockverschiebung (UCS) ) ; end setq (setq grpt (grread 't)) ; Typ-12-code für grread beseitigen (while (= 5 (car (setq grpt (grread 't)))) ; ; Die Verschiebung von Text/Block erfolgt jeweils von Cursorposition zu Cursorposition, ; während für die Polylinienstreckung der Verschiebevektor bei jeder neuen Cursorposition ; vom *allerersten* Ausgangspunkt aus berechnet werden muss. Daher zwei unterschiedliche ; Behandlungsweisen. Das kann man sicher noch eleganter zusammenfassen. ; ; aktuelle Cursorposition als 3D-Koordinaten darstellen für Polylinienstreckung (UCS): (setq POLpt (cadr grpt)) ; aktuelle Cursorposition als Ortho-3D-Koordinaten darstellen für Elementverschiebung (UCS): ; Y- (und Z-)Koordinaten im UCS bleiben fixiert, nur X ist variabel (setq TBpt (list (caadr grpt) (cadr basept) (caddr basept))) ; UCS ; ; Polylinie strecken: ; zuerst Verschiebevektor berechnen ; Der Verschiebevektor ist die Differenz zwischen p4 und der aktuellen Cursorposition (in WCS) ; p4 ist gleichzeitig der Ausgangspunkt der Verschiebung, wobei die Y-Koordinate fixiert wird (setq vek (mapcar '- (xucs>xywcs POLpt) p4)) ; WCS ; ; Vertexkoordinaten mit Vektor verrechen und ändern (WCS) (vlax-put-property obj 'coordinate 2 (vlax*point->variant (mapcar '+ p3 vek))) (vlax-put-property obj 'coordinate 3 (vlax*point->variant (mapcar '+ p4 vek))) ; Text und Block verschieben: (foreach obj objlist (vla-move obj (vlax-3d-point (trans basept 1 0)) (vlax-3d-point (trans TBpt 1 0)))) ; WCS (setq basept TBpt) ; neuen Basispunkt ein kleines Stückchen weiterschieben (UCS) ) ; end while (setvar "orthomode" orthomode_temp) ; (princ) ) ; end defun Movekuerzel ; ;;;;; neue Koordinaten der Polylinien-Vertices: (defun vlax*point->variant (pt / ) (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 0 (- (length pt) 1))) pt ) ) ) ; ;;;;; Auswahlsatz in Elementliste umwandeln: (defun ss->list (ss / i l) (setq i -1) (if ss (repeat (sslength ss) (setq l (cons (ssname ss (setq i (1+ i))) l))) ) (reverse l) ) ; ;;;;; UCS-Punkt von (x,y,z) nach (x,(const),0) umwandeln und nach WCS-Punkt (XW,YW,0) ;;;;; transformieren ;;;;; die konstante Y-Koordinate wird aus der UCS-Koordinate des 4. Vertex übernommen (defun xUCS>xyWCS (UCSpt / ) (trans (list (car UCSpt) (cadr (trans p4 0 1)) 0) 1 0) )