找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2178|回复: 7

[表格] 返回Table合并单元格的范围

[复制链接]

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-7-5 10:00:58 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::Table:GetMergeRange
调用格式: (XD::Table:GetMergeRange table ROW COL)
参数说明: Table = 表格图元名
ROW = 单元格行数,从0起算
COL = 单元格列数,从0起算
返回值: \'(最小行数 最大行数 最小列数 最大列数)
若单元格为非合并单元格,则返回 nil
函数简介: 返回指定单元格所属合并单元格的范围
函数来源: 原创
函数作者: 牢固
适用版本: XDRX API 
最后更新时间: 2013-07-05
备注: 该函数功能同 xdrx_table_getmergeRange 函数,因CAD2006以下版本不支持CAD2008以上的getmergeRange函数,故提供此函数定义
矩阵函数见高飞讲堂:http://bbs.xdcad.net/forum.php?mod=viewthread&tid=667494&ctid=14
演示图片: -

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. (defun XD::Table:GetMergeRange                           (TABLE ROW           COL            /             GETCELLID
  2.                                   INSPT           ROWS            COLS     R
  3.                                   ROWHEIGHTS            C             B
  4.                                   YL           COLWIDTHS             XL
  5.                                   CELLID   MINROW   MAXROW   MINCOL
  6.                                   MAXCOL el mat invmat dxf11 dxf210
  7.                                  )
  8. ;;计算所属单元格ID
  9. (defun        GetCellId (row col)
  10.    (xdrx_table_HitTest
  11.      table
  12.      (xdrx_point_transform
  13.      (mapcar '+
  14.              inspt
  15.              (list (nth COL xl) (nth ROW yl) 0)
  16.              (list (* 0.5 (nth COL ColWidths))
  17.                    (* -0.5 (nth ROW RowHEIGHTs))
  18.                    0
  19.              )
  20.      )    invmat
  21.        )
  22.      '(0 0 1)
  23.      5.0
  24.      5.0
  25.    )
  26. )
  27.   (if (xdrx_table_IsMergedCell TABLE ROW COL)
  28.     (progn
  29.       (setq inspt                 (cdr (assoc 10 (setq el (entget table))))
  30.           dxf11         (cdr (assoc 11 el))
  31.           ang         (atan (cadr dxf11) (car dxf11))
  32.           dxf210 (cdr (assoc 210 el))
  33.           mat         (MAT:Rotation3D InsPt dxf210 (- ang))
  34.           invmat (xdrx_matrix_inverse mat)
  35.           rows         (XDRX_TABLE_NUMROWS table)
  36.           cols         (xdrx_table_NumColumns table)
  37.     )
  38.       (setq rows (fix (XDRX_TABLE_NUMROWS table))
  39.             cols (fix (xdrx_table_NumColumns table))
  40.             r         -1
  41.       )
  42.       (repeat rows
  43.         (setq RowHEIGHTs
  44.                (cons (XDRX_TABLE_RowHEIGHT table (setq r (1+ r)))
  45.                      RowHEIGHTs
  46.                )
  47.         )
  48.       )
  49.       ;;各行的行高
  50.       (setq RowHEIGHTs
  51.              (reverse RowHEIGHTs)
  52.             c -1
  53.       )
  54.       ;;yl = 各行的Y坐标
  55.       (setq b  0
  56.             yl (mapcar '(lambda (x) (setq b (- b x)))
  57.                        (reverse (cdr (reverse (cons 0 RowHEIGHTs))))
  58.                )
  59.       )
  60.       (repeat cols
  61.         (setq
  62.           ColWidths
  63.            (cons (xdrx_table_ColumnWidth table (setq c (1+ c)))
  64.                  ColWidths
  65.            )
  66.         )
  67.       )
  68.       ;;xl = 各列的Y坐标
  69.       (setq b  0
  70.             xl (mapcar '(lambda (x) (setq b (+ b x)))
  71.                        (reverse (cdr (reverse (cons 0 ColWidths))))
  72.                )
  73.       )
  74.       ;;各列的列宽
  75.       (setq ColWidths (reverse ColWidths))
  76.       (setq CellId (GetCellId Row col)
  77.             minRow Row
  78.             maxRow Row
  79.             minCol Col
  80.             maxCol Col
  81.       )
  82.       ;;计算单元最小行数
  83.       (while (and (>= (1- minRow) 0)
  84.                   (xdrx_table_IsMergedCell TABLE (1- minRow) COL)
  85.                   (equal CellId (GetCellId (1- minRow) col))
  86.                   )
  87.         (setq minRow (1- minRow))
  88.         )
  89.       ;;计算单元最大行数
  90.       (while (and (< (1+ maxRow) (fix (xdrx_table_NumRows table)))
  91.                   (xdrx_table_IsMergedCell TABLE (1+ maxRow) COL)
  92.                   (equal CellId (GetCellId (1+ maxRow) col))
  93.                   )
  94.         (setq maxRow (1+ maxRow))
  95.         )
  96.       ;;计算单元最小列数
  97.       (while (and (>= (1- minCol) 0)
  98.                   (xdrx_table_IsMergedCell TABLE Row (1- minCol))
  99.                   (equal CellId (GetCellId Row (1- minCol)))
  100.                   )
  101.         (setq minCol (1- minCol))
  102.         )
  103.       ;;计算单元最大列数
  104.       (while (and (< (1+ maxCol) (fix (xdrx_table_NumColumns table)))
  105.                   (xdrx_table_IsMergedCell TABLE Row (1+ maxCol))
  106.                   (equal CellId (GetCellId Row (1+ maxCol)))
  107.                   )
  108.         (setq maxCol (1+ maxCol))
  109.         )
  110.       ;;返回值 '(最小行数 最大行数 最小列数 最大列数)
  111.       (list minRow maxRow minCol maxCol)
  112.     )
  113.   )
  114. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-7-5 12:40:52 | 显示全部楼层
G版,研究了下函数,发现xdrx_table_selectSubRegion 可以替代高版本的GetMergeRange函数,你试下下面函数。

  1. (defun XD::Table:GetMergeRange (tb ROW COL / box coord ecs pt1 pt2 xdir zdir)
  2.   (if (and
  3.         (xdrx_table_isMergedCell tb ROW COL)
  4.         (setq box (xdrx_table_GetCellExtents tb ROW COL))
  5.       )
  6.     (progn
  7.       (setq box (cadr box)
  8.             pt1 (car box)
  9.             pt2 (caddr box)
  10.             ecs (xdrx_matrix_ecs2wcs tb)
  11.             coord (xdrx_matrix_getcoordsystem ecs)
  12.             zDir (last coord)
  13.             xDir (cadr coord)
  14.       )
  15.       (xdrx_table_selectSubRegion tb pt1 pt2 zDir xDir 5.0 5.0 1 0 1)
  16.     )
  17.   )
  18. )

点评

非常不错,短小精悍!  详情 回复 发表于 2013-7-5 14:09

评分

参与人数 1D豆 +5 收起 理由
牢固 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

 楼主| 发表于 2013-7-5 14:09:34 | 显示全部楼层
XDSoft 发表于 2013-7-5 12:40
G版,研究了下函数,发现xdrx_table_selectSubRegion 可以替代高版本的GetMergeRange函数,你试下下面函数 ...

非常不错,短小精悍!{:soso_e179:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-7-6 18:40:30 | 显示全部楼层
这个函数可以不用LISP了,直接在ARX里面提供通用的了。

xdrx_table_getMergeRange

点评

发现IsMergedCell方法是可以直接输出合并单元格的范围的!  详情 回复 发表于 2013-7-7 15:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

 楼主| 发表于 2013-7-7 15:51:50 | 显示全部楼层
XDSoft 发表于 2013-7-6 18:40
这个函数可以不用LISP了,直接在ARX里面提供通用的了。

xdrx_table_getMergeRange

发现IsMergedCell方法是可以直接输出合并单元格的范围的!

点评

呵呵,是的,修改了代码,发给你了。 (xdrx_table_ismergedcell (entlast) 3 3) (3 4 2 4)  详情 回复 发表于 2013-7-7 16:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-7-7 16:15:32 | 显示全部楼层
牢固 发表于 2013-7-7 15:51
发现IsMergedCell方法是可以直接输出合并单元格的范围的!

呵呵,是的,修改了代码,发给你了。

(xdrx_table_ismergedcell (entlast) 3 3)
(3 4 2 4)


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-12-30 18:58:30 | 显示全部楼层
谢谢各位大佬
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-5-9 12:15:15 | 显示全部楼层
厉害厉害。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 01:32 , Processed in 0.189433 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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