624777395 发表于 2024-10-19 11:02:48

云线弧长根据图框指定倍数变化

本帖最后由 624777395 于 2024-10-19 15:08 编辑


求助一下论坛的大佬们
这是参考“52幕墙设计大佬”的动态云线来改的。
52幕墙设计大佬原动态云线地址

我想要的是云线弧长为图框的指定倍数,但是这个倍数要可以设置的,能够记忆上次输入的数值,我希望在屏幕上要点击矩形第一点时,可以输入A,来进行设置“弧长为图框几倍”,求大佬们帮帮忙
下面是源代码:

(defun c:HY( / aa cdu ent jdu kk l msg os p0 p1 pa pb ss sss temp *error*)
; 定义错误处理函数
(defun *error*(msg)
    (setvar "cmdecho" temp)               ; 恢复命令回显设置
    (setvar "cecolor" ocolo)             ; 恢复颜色设置
    (setvar "clayer" oldlay)             ; 恢复图层设置
    (redraw)                           ; 刷新屏幕
    (if (> (setq os (getvar 'osmode)) 16383) (setvar 'osmode (- os 16384))) ; 如果对象捕捉模式大于16383则减去16384
    (princ msg)                        ; 输出错误消息
    (exit)                               ; 退出函数
    (princ)                              ; 再次输出
)

; 获取当前图层
(setq oldlay (getvar "clayer"))
; 获取命令回显状态
(setq temp (getvar "cmdecho"))
; 获取当前颜色
(setq ocolo (getvar "cecolor"))

; 如果“Rev.”图层不存在,则创建该图层
(if (null (tblsearch "layer" "Rev."))
      (command "layer" "n" "Rev." "c" "20" "Rev." ""))
    (setvar "clayer" "Rev.")          ; 设置当前图层为“Rev.”
(setvar "cecolor" "bylayer")         ; 设置当前颜色为“随层”

; 获取比例值,如果有默认值*scale1*,则提示用户输入新的比例值
(if *scale1*
       (setq scale (getreal (strcat "\n输入对应图框比例<" (rtos *scale1* 2 2) ">:")))
       (setq scale (getreal "\n输入对应图框比例:"))
)

; 如果用户没有输入新的比例值,则使用默认值*Scale*;否则使用用户输入的值
(if (null scale) (setq scale *scale1*) (setq *scale1* scale))


; 获取矩形的第一点和第二点
(if (and (setq pa (getpoint "\n矩形第一点"))
         (setq pb (getcorner pa "\n矩形第二点")))
      (progn
      (command "RECTANG" pa pb)         ; 绘制矩形
      (setq ss (entlast))               ; 获取最后绘制的对象
      (setq jdu (angle pa pb))          ; 获取两点连线的角度
      (setq cdu (* (distance pa pb) 0.99)) ; 获取两点连线的距离并乘以0.99
      (setq p0 (polar pa jdu cdu))      ; 计算新点位置
      )
    )

; 关闭命令回显
(setvar "cmdecho" 0)

; 如果没有获取到矩形的两个角点,则尝试从现有对象中获取
(if (not (and pa pb))
      (progn
      (setq sss (ssget ":E:S" '((0 . "line,LWPOLYLINE,circle,ARC,spline,ELLIPSE,")))) ; 选择符合条件的对象集
      (setq ss (ssname sss 0))            ; 获取对象集中的第一个元素
      )
    )

; 获取选定对象的信息
(setq ent (entget ss))
(setq aa nil)                           ; 初始化标记变量

; 当对象类型为5(即图块引用)时执行循环
(while (= 5 (car (setq kk (grread T 1 0))))
    (setq p1 (cadr kk))                   ; 获取图块中的一个点
    ; 如果p0为空,则计算一个默认位置
    (if (= p0 nil) (setq p0 (polar p1 pi 1)))
   
    ; 如果aa为真,则删除原对象
    (cond ((= aa t) (entdel ss)))
   
    ; 如果aa为真,则重新创建对象
    (if (= aa t) (progn (entmake ent) (setq ss (entlast))))

    ; 刷新屏幕
    (redraw)
   
    ; 在图形窗口中显示临时线段
    (grdraw p0 p1 1)
   
    ; 计算弧长为图框的4倍
      (setq l (* scale 4))
   
    ; 如果对象捕捉模式小于16384,则增加16384
    (if (< (setq os (getvar 'osmode)) 16384) (setvar 'osmode (+ os 16384)))
   
    ; 绘制云线
    (command "_revcloud" "A" l l "o" ss "n")
   
    ; 如果对象捕捉模式大于16383,则减去16384
    (if (> (setq os (getvar 'osmode)) 16383) (setvar 'osmode (- os 16384)))
   
    ; 更新最后绘制的对象
    (setq ss (entlast))
   
    ; 设置标记变量为真
    (setq aa t)
)

; 刷新屏幕
(redraw)

; 恢复颜色和图层设置
(setvar "cecolor" ocolo)
(setvar "clayer" oldlay)

; 恢复命令回显设置
(setvar "cmdecho" temp)

; 结束输出
(princ)
)




lxl304712346 发表于 2024-10-20 10:04:20

强!!学习学习。
页: [1]
查看完整版本: 云线弧长根据图框指定倍数变化