明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: hbxymx

[讨论] 净间距阵列修复

[复制链接]
发表于 昨天 17:22 | 显示全部楼层
本帖最后由 wutian7777jsj 于 2025-11-16 17:25 编辑

把第126行改下,考虑单行情况
(command "_.array" ss "" "_R" (atoi rows) (atoi cols) (if(= 1 (atoi rows)) col_dist row_dist) col_dist)
CAD的array命令对于单行单列运行数据输入流是有差异的

评分

参与人数 1金钱 +5 收起 理由
hbxymx + 5 赞一个!我小白一个,只会改带有中文注释部.

查看全部评分

回复

使用道具 举报

发表于 昨天 18:15 | 显示全部楼层
  1. ;;; 带记忆功能的矩形净间距阵列LISP
  2. (defun c:AW (/ dcl_content dcl_file dcl_id rows cols row_net col_net ss result bbox obj_width obj_height row_dist col_dist)
  3.     (vl-load-com)
  4.    
  5.     ;; 从注册表读取记忆值
  6.     (setq rows (get_reg "RectArrayNet" "Rows" "4"))
  7.     (setq cols (get_reg "RectArrayNet" "Cols" "4"))
  8.     (setq row_net (get_reg "RectArrayNet" "RowNet" "50"))
  9.     (setq col_net (get_reg "RectArrayNet" "ColNet" "50"))
  10.    
  11.     ;;; 定义DCL文件内容
  12.     (setq dcl_content (strcat
  13.         "rect_array_net : dialog {\n"
  14.         "    label = "矩形净间距阵列";\n"
  15.         "    spacer;\n"
  16.         "    : text { label = "阵列参数:"; }\n"
  17.         "    : row {\n"
  18.         "        : column {\n"
  19.         "            : edit_box {\n"
  20.         "                key = "rows";\n"
  21.         "                label = "Y行数:";\n"
  22.         "                value = "" rows "";\n"
  23.         "                edit_width = 8;\n"
  24.         "            }\n"
  25.         "            : edit_box {\n"
  26.         "                key = "cols";\n"
  27.         "                label = "X列数:";\n"
  28.         "                value = "" cols "";\n"
  29.         "                edit_width = 8;\n"
  30.         "            }\n"
  31.         "        }\n"
  32.         "        : column {\n"
  33.         "            : edit_box {\n"
  34.         "                key = "row_net";\n"
  35.                 "                label = "Y行间距:";\n"
  36.         "                value = "" row_net "";\n"
  37.         "                edit_width = 8;\n"
  38.         "            }\n"
  39.         "            : edit_box {\n"
  40.         "                key = "col_net";\n"
  41.         "                label = "X列间距:";\n"
  42.         "                value = "" col_net "";\n"
  43.         "                edit_width = 8;\n"
  44.         "            }\n"
  45.         "        }\n"
  46.         "    }\n"
  47.         "    spacer;\n"
  48.         "    : text { label = "说明: 净间距 = 对象之间的净空距离"; }\n"
  49.         "    : text { label = "阵列间距 = 对象尺寸 + 净间距"; }\n"
  50.         "    spacer;\n"
  51.         "    : row {\n"
  52.         "        : button {\n"
  53.         "            key = "accept";\n"
  54.         "            label = "确定";\n"
  55.         "            is_default = true;\n"
  56.         "        }\n"
  57.         "        : button {\n"
  58.         "            key = "cancel";\n"
  59.         "            label = "取消";\n"
  60.         "            is_cancel = true;\n"
  61.         "        }\n"
  62.     "    }\n"
  63.     "}\n"
  64.     ))
  65.    
  66.     ;; 创建临时DCL文件
  67.     (setq dcl_file (vl-filename-mktemp "rect_array_net.dcl"))
  68.     (setq f (open dcl_file "w"))
  69.     (write-line dcl_content f)
  70.     (close f)
  71.    
  72.     ;; 加载DCL文件
  73.     (setq dcl_id (load_dialog dcl_file))
  74.    
  75.     (if (not (new_dialog "rect_array_net" dcl_id))
  76.         (progn
  77.             (alert "无法加载对话框!")
  78.             (unload_dialog dcl_id)
  79.             (vl-file-delete dcl_file)
  80.             (exit)
  81.         )
  82.     )
  83.    
  84.     ;; 动作处理
  85.     (action_tile "accept"
  86.         "(progn
  87.             (setq rows (get_tile "rows"))
  88.             (setq cols (get_tile "cols"))
  89.             (setq row_net (get_tile "row_net"))
  90.             (setq col_net (get_tile "col_net"))
  91.             (done_dialog 1)
  92.         )"
  93.     )
  94.    
  95.     (action_tile "cancel" "(done_dialog 0)")
  96.    
  97.     ;; 显示对话框并处理结果
  98.     (setq result (start_dialog))
  99.     (unload_dialog dcl_id)
  100.     (vl-file-delete dcl_file)
  101.    
  102.     (if (= result 1)
  103.         (progn
  104.             ;; 保存到注册表
  105.             (put_reg "RectArrayNet" "Rows" rows)
  106.             (put_reg "RectArrayNet" "Cols" cols)
  107.             (put_reg "RectArrayNet" "RowNet" row_net)
  108.             (put_reg "RectArrayNet" "ColNet" col_net)
  109.             
  110.             ;; 选择对象
  111.             (if (setq ss (ssget))
  112.                 (progn
  113.                     ;; 获取选择集边界框
  114.                     (setq bbox (get_ss_bbox ss))
  115.                     (if bbox
  116.                         (progn
  117.                             ;; 计算对象尺寸
  118.                             (setq obj_width (- (caadr bbox) (caar bbox)))
  119.                             (setq obj_height (- (cadadr bbox) (cadar bbox)))
  120.                            
  121.                             ;; 计算阵列间距(对象尺寸 + 净间距)
  122.                             (setq row_dist (+ obj_height (atof row_net)))
  123.                             (setq col_dist (+ obj_width (atof col_net)))
  124.                            
  125.                             ;; 执行阵列 - 修复关键问题
  126.                             (command "_.-array" ss "" "_R"
  127.                                      (atoi rows) (atoi cols)
  128.                                      row_dist col_dist)
  129.                             (princ (strcat "\n创建了 " rows " 行 " cols " 列的矩形净间距阵列"))
  130.                             (princ (strcat "\n对象尺寸: " (rtos obj_width 2 2) " x " (rtos obj_height 2 2)))
  131.                             (princ (strcat "\n阵列间距: " (rtos col_dist 2 2) " x " (rtos row_dist 2 2)))
  132.                         )
  133.                         (princ "\n无法计算对象尺寸")
  134.                     )
  135.                 )
  136.                 (princ "\n未选择对象")
  137.             )
  138.         )
  139.     )
  140.     (princ)
  141. )

  142. ;;; 获取选择集边界框 - 修复版本
  143. (defun get_ss_bbox (ss / i ent minpt maxpt minx miny maxx maxy obj)
  144.     (if (and ss (> (sslength ss) 0))
  145.         (progn
  146.             (setq i 0)
  147.             (repeat (sslength ss)
  148.                 (setq ent (ssname ss i))
  149.                 (setq obj (vlax-ename->vla-object ent))
  150.                 (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list obj 'minpt 'maxpt))))
  151.                     (progn
  152.                         (setq minpt (vlax-safearray->list minpt))
  153.                         (setq maxpt (vlax-safearray->list maxpt))
  154.                         
  155.                         (if (= i 0)
  156.                             (progn
  157.                                 (setq minx (car minpt)
  158.                                       miny (cadr minpt)
  159.                                       maxx (car maxpt)
  160.                                       maxy (cadr maxpt))
  161.                             )
  162.                             (progn
  163.                                 (setq minx (min minx (car minpt))
  164.                                       miny (min miny (cadr minpt))
  165.                                       maxx (max maxx (car maxpt))
  166.                                       maxy (max maxy (cadr maxpt)))
  167.                             )
  168.                         )
  169.                     )
  170.                 )
  171.                 (setq i (1+ i))
  172.             )
  173.             (if (and minx maxx) ; 确保有有效的边界框
  174.                 (list (list minx miny) (list maxx maxy))
  175.             )
  176.         )
  177.     )
  178. )

  179. ;;; 注册表读写函数
  180. (defun get_reg (app key default / value)
  181.     (setq value (vl-registry-read (strcat "HKEY_CURRENT_USER\\Software\\AutoCAD\" app) key))
  182.     (if value value default)
  183. )

  184. (defun put_reg (app key value)
  185.     (vl-registry-write (strcat "HKEY_CURRENT_USER\\Software\\AutoCAD\" app) key value)
  186. )

评分

参与人数 1明经币 +1 金钱 +10 收起 理由
hbxymx + 1 + 10 很给力!

查看全部评分

回复

使用道具 举报

发表于 昨天 18:23 | 显示全部楼层
又是缺少函数: 错误: no function definition: GET_REG
回复

使用道具 举报

发表于 6 小时前 | 显示全部楼层
又是缺少函数: 错误: no function definition: GET_REG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-17 15:45 , Processed in 0.171952 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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