明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 389|回复: 1

[提问] 云线弧长根据图框指定倍数变化

[复制链接]
发表于 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)
)




评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 赞一个!

查看全部评分

发表于 2024-10-20 10:04:20 | 显示全部楼层
强!!学习学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-22 02:05 , Processed in 0.221873 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表