414249149 发表于 2024-9-17 10:34:35

求助,实现不按回车按默认绘制

求助,希望大神帮忙修改下代码
要求:
1、输入命令后不按回车即可按默认值去绘制/输入自定义值按回车后绘制
2、绘制完成后给绘制对象编组

(defun c:HFF ( / p0 p1 p2 radius angle1 angle2 angle_diff arc1 arc2 weld_height)
;; 保存当前图层
(setq current_layer (getvar "CLAYER"))

;; 创建或设置图层为“HF焊缝”,颜色为1
(if (not (tblsearch "LAYER" "HF焊缝"))
    (command "_.layer" "_make" "HF焊缝" "_color" "1" "HF焊缝" "")
    (setvar "CLAYER" "HF焊缝")
)

;; 保护变量设置,确保正交模式和对象捕捉开启
(setq osnap (getvar "osmode"))
(setq ortho (getvar "orthomode"))
(setvar "osmode" 3) ; 开启对象捕捉
(setvar "orthomode" 1) ; 开启正交模式

;; 提示输入焊缝高度,默认值为4
(setq weld_height (getint "\n指定焊缝剖面角点或直接输入焊缝高度<默认4>: "))
(if (null weld_height) (setq weld_height 4))

;; 选择原点
(setq p0 (getpoint "\n请选择原点: "))

;; 选择第1个点,不画线
(setq p1 (getpoint p0 "\n请选择第1个点: "))

;; 自动回到原点并选择第2个点,不画线
(setq p2 (getpoint p0 "\n请选择第2个点: "))

;; 计算角度
(setq angle1 (angle p0 p1))
(setq angle2 (angle p0 p2))

;; 计算角度差
(setq angle_diff (abs (- angle1 angle2)))

;; 如果角度差大于180度,则调整角度方向
(if (> angle_diff pi)
    (progn
      (setq temp angle1)
      (setq angle1 angle2)
      (setq angle2 temp)
    )
)

;; 绘制以p0为圆心的半径为1到weld_height的圆弧
(setq radius 1)
(while (<= radius weld_height)
    ;; 创建顺时针方向的圆弧
    (setq arc1 (entmakex (list
                           '(0 . "ARC")
                           (cons 10 p0)            ; 圆心
                           (cons 40 radius)      ; 半径
                           (cons 50 angle1)      ; 起始角度
                           (cons 51 angle2)      ; 结束角度
                         )))
   
    ;; 创建逆时针方向的圆弧
    (setq arc2 (entmakex (list
                           '(0 . "ARC")
                           (cons 10 p0)            ; 圆心
                           (cons 40 radius)      ; 半径
                           (cons 50 angle2)      ; 起始角度
                           (cons 51 angle1)      ; 结束角度
                         )))
   
    ;; 删除较长的圆弧
    (if (> (vlax-curve-getdistatparam arc1 (vlax-curve-getendparam arc1))
         (vlax-curve-getdistatparam arc2 (vlax-curve-getendparam arc2)))
      (entdel arc1)
      (entdel arc2))

    (setq radius (1+ radius))
)

;; 还原变量设置
(setvar "osmode" osnap)
(setvar "orthomode" ortho)

;; 重新生成视图
(command "_.regen")
(princ)
)

qazxswk 发表于 2024-9-17 10:34:36

本帖最后由 qazxswk 于 2024-9-19 23:18 编辑

414249149 发表于 2024-9-19 21:48
谢谢,解决了一个问题
后面编组是很简单的事情呀。不过很少用到编组,一般是生成块。上面的代码,我已经修改,绘制完成后给绘制对象编组。

qazxswk 发表于 2024-9-17 22:38:29

本帖最后由 qazxswk 于 2024-9-19 23:17 编辑

修改了一下,输入命令后,可以直接画,按S键,设置新值。


(defun c:HFF( / p0 p1 p2 radius angle1 angle2 angle_diff arc1 arc2 xun ss lastent)
;; 保存当前图层
(setq current_layer (getvar "CLAYER"))

;; 创建或设置图层为“HF焊缝”,颜色为1
(if (not (tblsearch "LAYER" "HF焊缝"))
    (command "_.layer" "_make" "HF焊缝" "_color" "1" "HF焊缝" "")
    (setvar "CLAYER" "HF焊缝")
)

;; 保护变量设置,确保正交模式和对象捕捉开启
(setq osnap (getvar "osmode"))
(setq ortho (getvar "orthomode"))
(setvar "osmode" 3) ; 开启对象捕捉
(setvar "orthomode" 1) ; 开启正交模式
(or weld_height (setq weld_height 4)) ;;焊缝高度,默认值为4
(setq ss (ssadd))(setq lastent (entlast))
(setq xun t)
(while xun
(initget 0 "S")
    ;; 选择原点
(setq p0 (getpoint "\n请选择原点或[设置焊缝高度(S)]: "))
(if (= p0 "S")
    (setq weld_height (getint (strcat "\n输入焊缝新高度<当前值" (rtos weld_height) ">: ")))
   (setq xun nil)
))
;; 选择第1个点,不画线
(setq p1 (getpoint p0 "\n请选择第1个点: "))

;; 自动回到原点并选择第2个点,不画线
(setq p2 (getpoint p0 "\n请选择第2个点: "))

;; 计算角度
(setq angle1 (angle p0 p1))
(setq angle2 (angle p0 p2))

;; 计算角度差
(setq angle_diff (abs (- angle1 angle2)))

;; 如果角度差大于180度,则调整角度方向
(if (> angle_diff pi)
    (progn
      (setq temp angle1)
      (setq angle1 angle2)
      (setq angle2 temp)
    )
)

;; 绘制以p0为圆心的半径为1到weld_height的圆弧
(setq radius 1)
(while (<= radius weld_height)
    ;; 创建顺时针方向的圆弧
    (setq arc1 (entmakex (list
                           '(0 . "ARC")
                           (cons 10 p0)            ; 圆心
                           (cons 40 radius)      ; 半径
                           (cons 50 angle1)      ; 起始角度
                           (cons 51 angle2)      ; 结束角度
                         )))
   
    ;; 创建逆时针方向的圆弧
    (setq arc2 (entmakex (list
                           '(0 . "ARC")
                           (cons 10 p0)            ; 圆心
                           (cons 40 radius)      ; 半径
                           (cons 50 angle2)      ; 起始角度
                           (cons 51 angle1)      ; 结束角度
                         )))
   
    ;; 删除较长的圆弧
    (if (> (vlax-curve-getdistatparam arc1 (vlax-curve-getendparam arc1))
         (vlax-curve-getdistatparam arc2 (vlax-curve-getendparam arc2)))
      (entdel arc1)
      (entdel arc2))

    (setq radius (1+ radius))
)
(while (setq lastent(entnext lastent)) (ssadd lastent ss))
(command "-group" "C" "*" "" ss "")
;; 还原变量设置
(setvar "osmode" osnap)
(setvar "orthomode" ortho)

;; 重新生成视图
(command "_.regen")
   (princ)
)

xyp1964 发表于 2024-9-18 12:53:29

居然能把osnap当作变量……

414249149 发表于 2024-9-19 21:48:24

qazxswk 发表于 2024-9-17 22:38
修改了一下,输入命令后,可以直接画,按S键,设置新值。

谢谢,解决了一个问题

414249149 发表于 2024-9-19 23:50:15

qazxswk 发表于 2024-9-17 10:34
后面编组是很简单的事情呀。不过很少用到编组,一般是生成块。上面的代码,我已经修改,绘制完成后给绘制 ...

嗯,我在论坛找到一段代码把编组的问题解决了

414249149 发表于 2024-9-20 10:24:58

xyp1964 发表于 2024-9-18 12:53
居然能把osnap当作变量……

菜鸟一个,请版主多多指教:lol
页: [1]
查看完整版本: 求助,实现不按回车按默认绘制