【问题标题】:Extracting the new coordinates of a geometry scaled in AutoCAD提取在 AutoCAD 中缩放的几何图形的新坐标
【发布时间】:2020-05-20 22:22:20
【问题描述】:

这是我之前帖子here的后续内容

我使用以下代码创建了一个 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)
)

生成的图像

在 AutoCAD 中按 10 倍缩放。

任何关于如何在缩放后获得 XY 坐标的建议都会很有帮助。

总之,我给出了输入坐标,并希望输出是缩放几何坐标之间的坐标和长度。

根据我从上一篇文章中提供的建议中了解到的情况,可以通过在代码本身中使用缩放矩阵而不是在 AutoCAD 的 GUI 中使用 SCALE 命令来完成缩放。但是,我不确定如何实施。

【问题讨论】:

    标签: geometry lisp scaling autocad autolisp


    【解决方案1】:

    正如我在 cmets 中对您的另一个问题所指出的,向函数提供一组点,然后在函数内应用缩放操作,然后才必须从函数中获取结果缩放点就像 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
    

    【讨论】:

    • 非常感谢。我想知道是否可以将第 40 组的值减少到小于 2。例如,如果我设置 0.1 代替 2,我会收到此错误; error: misplaced dot on input
    • 不客气。是 - DXF 组 40 可以保存任何正数和非零数值 - 对于 0.1 的文本高度,您将使用 '(40 . 0.1)
    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2015-07-25
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多