You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

AutoCAD中AutoLisp实现图形长度按标量倍数缩放的技术问询

给你的AutoLisp几何图形添加缩放功能

嘿,我来帮你搞定这个缩放需求!你的原代码已经能生成2D图形,但要让所有节点坐标和长度标注都按标量x缩放,其实只需要对原代码做几处关键修改就行,下面是具体的思路和完整代码:

核心修改思路

你的代码里所有图形元素(节点、线段、标注)都是基于输入的pts坐标生成的,所以只要先把所有节点坐标按x倍缩放,后续的线段长度计算和标注就会自动跟着变成原来的x倍,不需要额外修改距离计算逻辑。另外,为了让文字标注在缩放后的图形里更协调,建议同时调整文字高度的缩放比例。

修改后的完整代码

; 带缩放功能的graph函数,新增参数x控制缩放比例
(defun graph ( pts sls tls x / scaled-pts )
    ; 先将所有节点坐标按x倍缩放
    (setq scaled-pts (mapcar '(lambda (pt) (mapcar '* pt (list x x))) pts))
    ( (lambda ( l )
        ; 标注节点编号(文字高度随缩放调整)
        (foreach x l (text (cdr x) (itoa (car x)) 0.0 (* 2 x)))
        ; 绘制线段并标注长度
        (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 x)
            )
        ) sls tls )
    ) (mapcar 'cons (vl-sort (append sls tls) '<) scaled-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)
                   (cons 40 c)  ; 用参数c作为文字高度,适配缩放比例
                   '(72 . 1)
                   '(73 . 2)
             )
    )
)

关键修改说明

  • 新增缩放参数x:在graph函数的参数列表里添加了x,用来传递缩放比例(比如x=10表示放大10倍)。
  • 节点坐标缩放:用mapcar遍历所有输入坐标,将每个点的x、y值分别乘以x,得到缩放后的坐标列表scaled-pts,后续所有图形绘制都基于这个缩放后的坐标。
  • 文字高度适配:把原代码中固定的文字高度'(40 . 2)改成了随缩放比例变化的(cons 40 c),调用时传入(* 2 x),这样文字高度会随图形缩放同步调整,避免缩放后文字过小或过大。
  • 自动长度标注:因为线段的两个端点已经是缩放后的坐标,(distance p q)计算出来的长度自然就是原长度的x倍,标注出来的数值也会自动正确。

使用示例

比如你要缩放10倍,调用方式就变成:

(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) 
       10)

这样生成的图形所有节点坐标、线段长度都会是原图形的10倍,标注的长度值也会同步放大。

内容的提问来源于stack exchange,提问作者Natasha

火山引擎 最新活动