提取在 AutoCAD 中缩放的几何体的新坐标
Extracting the new coordinates of a geometry scaled in AutoCAD
这是我之前 post
的后续
我使用以下代码创建了一个二维几何体,。
(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)
)
生成的图像
在 AutoCAD 中按 10 倍缩放。
关于如何在缩放后获取 XY 坐标的任何建议都将非常有帮助。
综上所述,我给出了输入坐标,并希望输出是缩放几何体坐标之间的坐标和长度。
根据我在之前 post 中提供的建议中的理解,可以通过在代码本身中使用缩放矩阵而不是在 AutoCAD 的 GUI 中使用 SCALE
命令来完成缩放.但是,我不确定这必须如何实施。
正如我在对您的其他问题的评论中指出的那样,向函数提供一组点,然后在函数内应用缩放操作,然后才必须从函数中获取结果缩放点,就像 the tail wagging the dog.
一个更好的方法是在之前缩放点将它们提供给函数;这样,该函数就不需要修改,并且您已经拥有构成网络的一组缩放点。
相对于原点的缩放非常简单:只需将每个点坐标乘以比例因子即可,例如:
(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
这是我之前 post
我使用以下代码创建了一个二维几何体,
(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)
)
生成的图像
在 AutoCAD 中按 10 倍缩放。
关于如何在缩放后获取 XY 坐标的任何建议都将非常有帮助。
综上所述,我给出了输入坐标,并希望输出是缩放几何体坐标之间的坐标和长度。
根据我在之前 post 中提供的建议中的理解,可以通过在代码本身中使用缩放矩阵而不是在 AutoCAD 的 GUI 中使用 SCALE
命令来完成缩放.但是,我不确定这必须如何实施。
正如我在对您的其他问题的评论中指出的那样,向函数提供一组点,然后在函数内应用缩放操作,然后才必须从函数中获取结果缩放点,就像 the tail wagging the dog.
一个更好的方法是在之前缩放点将它们提供给函数;这样,该函数就不需要修改,并且您已经拥有构成网络的一组缩放点。
相对于原点的缩放非常简单:只需将每个点坐标乘以比例因子即可,例如:
(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