云线弧长根据图框指定倍数变化
本帖最后由 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)
)
强!!学习学习。
页:
[1]