Извлечение новых координат геометрии, масштабированной в AutoCAD - PullRequest
0 голосов
/ 05 февраля 2020

Это продолжение моего предыдущего поста здесь

У меня 2D-геометрия, созданная с использованием следующего кода, ref .

(defun graph ( pts sls tls )

    (   (lambda ( l )
            (foreach x l (text (cdr x) (itoa (car x)) 0.0 1))
            (mapcar
               '(lambda ( a b / p q r )
                    (setq p (cdr (assoc a l))
                          q (cdr (assoc b l))
                          r (angle p q)
                    )
                    (entmake (list '(0 . "LINE") (cons 10 p) (cons 11 q) '(62 . 8)))
                    (text
                        (mapcar '(lambda ( x y ) (/ (+ x y) 2.0)) p q)
                        (rtos (distance p q) 2)
                        (if (and (< (* pi 0.5) r) (<= r (* pi 1.5))) (+ r pi) r)
                        2
                    )
                )
                sls tls
            )
        )
        (mapcar 'cons (vl-sort (append sls tls) '<) pts)
    )
)
(defun text ( p s a c )
    (entmake
        (list
           '(0 . "TEXT")
            (cons 10 p)
            (cons 11 p)
            (cons 50 a)
            (cons 01 s)
            (cons 62 c)
           '(40 . 2)
           '(72 . 1)
           '(73 . 2)
        )
    )
)

Ввод:

(graph
   '((75 25) (115 45) (90 60) (10 5) (45 0) (45 55) (0 25))
   '(1 1 1 1 2 2 3 4 4 5 6)
   '(2 3 4 5 3 6 6 5 7 7 7)
)

Полученное изображение

enter image description here

масштабируется в AutoCAD с коэффициентом 10.

Любые предложения о том, как получить координаты XY после масштабирования, будут действительно полезны.

В заключение, я даю входные координаты и хочу, чтобы выходные данные были координатами и длинами между координатами масштабированного geometry.

Из того, что я понимаю из предложений, предложенных в предыдущем посте, масштабирование можно выполнить с помощью матрицы масштабирования в самом коде вместо использования команды SCALE в GUI AutoCAD. Но я не уверен, как это должно быть реализовано.

1 Ответ

1 голос
/ 05 февраля 2020

Как я отметил в комментариях к вашему другому вопросу, предоставление набора точек для функции и затем применение операции масштабирования внутри функции только для того, чтобы затем получить полученные масштабированные точки из функции, выглядит как хвост виляет собакой .

Гораздо лучшим подходом было бы масштабирование точек до подачи их в функцию; таким образом, функция не требует модификации, и у вас уже есть набор масштабированных точек, составляющих вашу сеть.

Масштабирование относительно начала координат действительно просто: просто умножьте каждую из координат точки на коэффициент масштабирования, например:

(defun c:test ( / lst scl )
    (setq lst '((75 25) (115 45) (90 60) (10 5) (45 0) (45 55) (0 25))
          scl 0.1
    )
    (graph
        (mapcar '(lambda ( x ) (mapcar '* x (list scl scl))) lst)
       '(1 1 1 1 2 2 3 4 4 5 6)
       '(2 3 4 5 3 6 6 5 7 7 7)
    )
    (princ)
)

В зависимости от желаемого внешнего вида вы также можете настроить высоту текстовых объектов, созданных функцией, что можно сделать, изменив значение группы DXF 40 здесь:

'(40 . 2) ;; <--- text height = 2
...