;; ╔══════════════════════════════════════════════════════════════════╗ ;; ;;; ║ 沿方向多重复制 (命令: ty3 - DCL对话框版) ║ ;; ;;; ║ 功能: 沿指定方向(终点仅定方向)按间距多重复制 ║ ;; ;;; ║ 更新: 集成DCL对话框,支持记住上次设置的间距和次数 ║ ;; ;;; ║ 限制: 无次数限制(可根据需要任意设置复制次数) ║ ;; ╚══════════════════════════════════════════════════════════════════╝ ;; 全局变量(记住上次设置) (if (null ty3_sp) (setq ty3_sp 200.0)) (if (null ty3_tms) (setq ty3_tms 20)) (DEFUN C:ty2 (/ ss pnt1 pnt2 ang i newpt old_osmode obj-list vla-obj new-obj dlg_result) ;; 1. 初始化 (setq old_osmode (getvar "OSMODE")) (setvar "OSMODE" 33) ;; 设置捕捉模式:端点+中点 ;; 加载 Visual LISP 扩展 (vl-load-com) ;; 2. 显示DCL对话框获取参数 (setq dlg_result (ty3_dialog)) (if (null dlg_result) (progn (princ "\n已取消操作。") (setvar "OSMODE" old_osmode) (princ) (exit) ) ) ;; 3. 选择对象 (princ "\n请选择要多重复制的对象ty2作者黄鲲: ") (setq ss (ssget)) (if (null ss) (progn (princ "\n未选择任何对象。") (setvar "OSMODE" old_osmode) (princ) (exit) ) ) ;; 将选择集转换为 VLA 对象列表 (setq obj-list '()) (foreach ename (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) (setq obj-list (cons (vlax-ename->vla-object ename) obj-list)) ) ;; 4. 获取方向 (终点仅用于确定角度) (setq pnt1 (getpoint "\n指定起点: ")) (if (null pnt1) (progn (princ "\n已取消。") (setvar "OSMODE" old_osmode) (princ) (exit) ) ) (setq pnt2 (getpoint pnt1 "\n指定方向点(终点): ")) (if (null pnt2) (progn (princ "\n已取消。") (setvar "OSMODE" old_osmode) (princ) (exit) ) ) ;; 计算角度 (setq ang (angle pnt1 pnt2)) ;; 5. 执行复制 (if (> ty3_sp 0.0001) (progn (setvar "OSMODE" 0) ;; 关闭捕捉 (setq i 0) ;; 大量复制提示 (if (> ty3_tms 100) (princ (strcat "\n提示: 将复制 " (itoa ty3_tms) " 次,请稍候...")) ) (princ "\n正在复制... ") (repeat ty3_tms (setq i (1+ i)) ;; 计算新位置:起点 + (间距 * 当前次数) (setq newpt (polar pnt1 ang (* i ty3_sp))) ;; 对每个选中的对象进行复制和移动 (foreach vla-obj obj-list (setq new-obj (vla-copy vla-obj)) (vla-move new-obj (vlax-3d-point pnt1) (vlax-3d-point newpt) ) ) ;; 进度显示(每10次显示一个数字) (if (= (rem i 10) 0) (princ (strcat "\n 已完成 " (itoa i) " 组...")) ) ) (princ (strcat "\n完成,共复制 " (itoa ty3_tms) " 组对象,间距 " (rtos ty3_sp 2 2))) ) (princ "\n错误: 间距必须大于 0。") ) ;; 6. 恢复环境 (setvar "OSMODE" old_osmode) (princ) ) ;; DCL对话框函数 (DEFUN ty3_dialog (/ dcl_id dcl_str temp_sp temp_tms dcl_file file result) (setq dcl_str "ty3_dialog : dialog { label = \"沿方向多重复制作者黄鲲,命令 ty2\"; spacer_1; : edit_box { key = \"sp\"; label = \"复制间距:\"; edit_width = 12; allow_accept = true; } spacer_1; : edit_box { key = \"tms\"; label = \"复制次数:\"; edit_width = 12; allow_accept = true; } spacer_1; : text { label = \"提示: 复制次数无限制\"; alignment = centered; } spacer_1; ok_cancel; }" ) ;; 方法1: 直接加载内存中的DCL (setq dcl_id (load_dialog dcl_str)) ;; 如果直接加载失败,使用临时文件 (if (< dcl_id 0) (progn (setq dcl_file (vl-filename-mktemp "ty3.dcl")) (setq file (open dcl_file "w")) (write-line dcl_str file) (close file) (setq dcl_id (load_dialog dcl_file)) (if (< dcl_id 0) (progn (princ "\n错误: 无法加载DCL对话框!") (exit) ) ) ) ) ;; 创建对话框 (if (not (new_dialog "ty3_dialog" dcl_id)) (progn (princ "\n错误: 无法创建对话框实例!") (unload_dialog dcl_id) (if dcl_file (vl-file-delete dcl_file)) (exit) ) ) ;; 显示当前值(从全局变量读取) (set_tile "sp" (rtos ty3_sp 2 2)) (set_tile "tms" (itoa ty3_tms)) ;; 设置焦点 (mode_tile "sp" 2) ;; 初始化临时变量 (setq temp_sp nil) (setq temp_tms nil) ;; 动作响应 (action_tile "sp" "(setq temp_sp $value)") (action_tile "tms" "(setq temp_tms $value)") (action_tile "accept" "(done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") ;; 显示对话框 (setq result (start_dialog)) ;; 清理 (unload_dialog dcl_id) (if (and dcl_file (findfile dcl_file)) (vl-file-delete dcl_file)) ;; 处理返回值并保存到全局变量 (if (= result 1) (progn ;; 间距 (if (and temp_sp (setq temp_val (atof temp_sp)) (> temp_val 0)) (setq ty3_sp temp_val) (princ (strcat "\n警告: 间距值无效,使用上次值: " (rtos ty3_sp 2 2))) ) ;; 次数(无上限) (if (and temp_tms (setq temp_int (atoi temp_tms)) (> temp_int 0)) (setq ty3_tms temp_int) (princ (strcat "\n警告: 次数值无效,使用上次值: " (itoa ty3_tms))) ) T ;; 返回成功 ) nil ;; 返回取消 ) ) (PRINC "\n命令 ty2 已加载 (DCL对话框版,记住上次设置,无次数限制)") (PRINC)