Вам нужно будет вычислить вектор между вершиной, которую вы sh выровняете, и целевой точкой, а затем преобразовать все вершины по одному и тому же вектору.
Например ( используя код из вашего другого вопроса ):
(defun c:moverect ( / a b c d e i p s v x )
(cond
( (not (setq s (ssget "_X" '((0 . "LWPOLYLINE") (90 . 4) (-4 . "&=") (70 . 1)))))
(princ "\nNo closed polylines found.")
)
( (setq p (getpoint "\nSpecify target point: "))
(setq p (trans p 1 (trans '(0 0 1) 1 0 t)))
(repeat (setq i (sslength s))
(setq i (1- i)
e (ssname s i)
x (entget e)
)
(mapcar 'set '(a b c d) (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) x)))
(if
(and
(equal (distance a b) (distance c d) 1e-8)
(equal (distance b c) (distance a d) 1e-8)
(equal (distance a c) (distance b d) 1e-8)
)
(progn
(setq v (mapcar '- p a))
(entmod
(mapcar
'(lambda ( x )
(if (= 10 (car x))
(cons 10 (mapcar '+ (cdr x) v))
x
)
)
x
)
)
)
)
)
)
)
(princ)
)
Однако обратите внимание, что вершина, выровненная с целевой точкой, будет зависеть от направления 2D-полилинии - вы можете включить тест, чтобы всегда выберите, скажем, нижнюю левую вершину для выравнивания - и тогда вам нужно будет решить, как обрабатывать повернутые прямоугольники.