找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: Free-Lancer

[已解决] 大家合力写个开源的EXCEL-CAD如何

[复制链接]
 楼主| 发表于 2013-6-7 09:08:50 | 显示全部楼层
绘制边框线
  1. ;;绘制表格边框线
  2. ;;参数: lst ---- ((p1 p2) (p3 p4) ... (pn-1 pn)
  3. ;;说明: obj 在主程序定义,可以是 Modelspace Blockdef Paperspace
  4. (defun fy:Addline (lst)
  5.   (mapcar '(lambda (x)
  6.       (vla-addline
  7.         obj
  8.         (vlax-3d-point (car x))
  9.         (vlax-3d-point (cadr x))
  10.       )
  11.     )
  12.    lst
  13.   )
  14. )

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

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2013-6-7 11:20:11 | 显示全部楼层
Free-Lancer 发表于 2013-6-7 09:01
继续, 先写一个优化 Cell 边框的函数, 读取 Cell 边框坐标(仅有边框线部分), 将这些坐标构造一个表, 用下 ...

[pcode=lisp,true]
(defun c:tt (/ ExcApp RetLst Wkbk Sht UsedRange Cells Font)
  (vl-load-com)
  (alert "需要先打开被操作的Excel文件")
  (setq ExcApp (vl-catch-all-apply 'vlax-get-object (list "Excel.Application"))
RetLst nil
  )
  (if (not (vl-catch-all-error-p ExcApp))
    (progn
      (setq Wkbk (vl-catch-all-apply 'vlax-get-property (list ExcApp 'ActiveWorkbook)))
      (if (vl-catch-all-error-p Wkbk)
(vlax-release-object ExcApp)
(progn
   (setq Sht   (vlax-get-property Wkbk 'ActiveSheet)
  UsedRange (vlax-get-property Sht 'UsedRange)
  Cells     (vlax-get-property UsedRange 'Cells)
   )
   (vlax-for Item Cells
     (setq Font (vlax-get-property Item 'Font))
     (setq
       RetLst
        (cons
   (cons
     (vlax-get-property Item 'Address :vlax-true :vlax-true 1)
       (mapcar
         'vlax-variant-value
         (mapcar
    'vlax-get-property
           (list Font Font Font Font Font Font Font Font Font
          Font Item Item Item Item Item
    )
    (list 'Bold 'Color 'FontStyle 'Italic 'Name 'Size 'Strikethrough 'Subscript 'Superscript
          'Underline 'Value  'Height 'HorizontalAlignment 'VerticalAlignment 'Width
           )
         )
              )
   )
          RetLst
        )
     )
     (mapcar 'vlax-release-object (list Item Font))
   )
   (mapcar 'vlax-release-object (list ExcApp Wkbk Sht UsedRange Cells))
)
      )
    )
  )
  (reverse RetLst)
)
[/pcode]
我现在只能到这里了,有时间再完成

点评

大致看了下,不能一股脑的都读出来,那样不利于后期在Lisp中处理,我的想法是按列读取 Cells ,形成两个表,一个记录边线,另外一个记录文字。 对边线表,子表为每个单元格,元素为横线和竖线的坐标,属于合并后  详情 回复 发表于 2013-6-7 21:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2013-6-7 11:26:37 | 显示全部楼层
当然,如果你已经搞定了,就没必要继续发源码,反正我也不需要。

点评

还没有搞定吗,其实这个程序我也不用!  发表于 2013-6-7 11:44
取消限制,去看看  详情 回复 发表于 2013-6-7 11:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-6-7 11:35:15 | 显示全部楼层
ayl1004 发表于 2013-6-7 11:26
当然,如果你已经搞定了,就没必要继续发源码,反正我也不需要。

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

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2013-6-7 11:36:45 | 显示全部楼层
发个我写的操作Excel的函数
  1. (defun GetExcelData (ExcFile   Bianhao         /           ExcObj    WBKs
  2.                      XlsFile   ActSht         Range           Cells     return
  3.                      return0   EveryRow         First
  4.                     )
  5.   (setq ExcObj    (vlax-get-or-create-object "Excel.Application")
  6.         WBKs         (vlax-get-property ExcObj 'WorkBooks)
  7.         XlsFile         (vlax-invoke-method WBKs 'open ExcFile)
  8.         ActSht         (vlax-get-property XlsFile 'ActiveSheet)
  9.         Range         (vlax-get-property ActSht 'usedRange)
  10.         EveryRow (vlax-get-property Range 'Rows)
  11.         return         nil
  12.         First         nil
  13.   )
  14.   (vlax-for item EveryRow
  15.     (setq return (cons (vlax-get-property item 'Cells) return))
  16.   )
  17.   (setq return (reverse return))
  18.   (while (and return (/= First Bianhao))
  19.     (setq return0 nil)
  20.     (vlax-for item (car return)
  21.       (setq return0 (cons (vlax-get-property item 'value2) return0))
  22.     )
  23.     (setq First (vlax-variant-value (last return0))
  24.             return (cdr return)
  25.     )
  26.   )
  27.   (vlax-invoke-method WBKs 'close)
  28.   (mapcar 'vlax-release-object
  29.           (list ExcObj WBKs XlsFile ActSht Range EveryRow)
  30.   )
  31.   (if (= First Bianhao)
  32.     (mapcar 'vlax-variant-value (reverse return0))
  33.   )
  34. )

点评

站长帮忙取消了  详情 回复 发表于 2013-6-7 11:38

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2013-6-7 11:38:52 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-6-7 11:41 编辑
ayl1004 发表于 2013-6-7 11:36
发个我写的操作Excel的函数

站长帮忙取消了,初步想法是按行/列读取 cell,将 文字构造一个表,边框线构造一个表,读完 sheet 后再进行后期处理,写字和绘制表格线

点评

我的想法是根据address和每个方框的长、宽,然后输入插入点来绘制方框。难点是字体,另外的都简单  详情 回复 发表于 2013-6-7 12:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2013-6-7 12:29:21 | 显示全部楼层
Free-Lancer 发表于 2013-6-7 11:38
站长帮忙取消了,初步想法是按行/列读取 cell,将 文字构造一个表,边框线构造一个表,读完 sheet 后再进 ...

我的想法是根据address和每个方框的长、宽,然后输入插入点来绘制方框。难点是字体,另外的都简单

点评

字体在开始那个 VBA 中有处理方式,还没有研究这个,Excel的控制符和 AutoCAD 的还是有区别,实在不行就用正则表达式处理  详情 回复 发表于 2013-6-7 14:33
你说的难点是字体,能具体说说吗?  详情 回复 发表于 2013-6-7 13:19
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2013-6-7 12:39:10 | 显示全部楼层
本帖最后由 ayl1004 于 2013-6-7 12:40 编辑

这是我对MText的了解,也是没完成的,不过论坛上有Lee的程序了。
  1. (defun FindCtrl        (ChrLst)
  2.   (if (cadr ChrLst)
  3.     (if        (= (car ChrLst) "\")
  4.       (cons (strcat "\" (cadr ChrLst)) (FindCtrl (cddr ChrLst)))
  5.       (cons (car ChrLst) (FindCtrl (cdr ChrLst)))
  6.     )
  7.     ChrLst
  8.   )
  9. )
  10. (defun GetAllSubLsts (PreLst SttItem EndItem / TmpLst TorNil RetLst)
  11.   (setq        TmpLst nil
  12.         TorNil 0
  13.         RetLst nil
  14.   )
  15.   (while (setq Item (car PreLst))
  16.     (setq TmpLst (append TmpLst (list Item))
  17.           PreLst (cdr PreLst)
  18.     )
  19.     (cond
  20.       ((member Item SttItem) (setq TorNil (1+ TorNil)))
  21.       ((member Item EndItem) (setq TorNil (1- TorNil)))
  22.       (t nil)
  23.     )
  24.     (if        (= TorNil 2)
  25.       (setq TorNil 1)
  26.     )
  27.     (if        (= TorNil -1)
  28.       (setq TorNil 0)
  29.     )
  30.     (if        (= TorNil 0)
  31.       (setq RetLst (append RetLst (list TmpLst))
  32.             TmpLst nil
  33.       )
  34.     )
  35.   )
  36.   (if TmpLst
  37.     (append
  38.       RetLst
  39.       (mapcar 'list (vl-remove-if (function (lambda (x) (member x SttItem))) TmpLst))
  40.     )
  41.     RetLst
  42.   )
  43. )
  44. (defun c:SetMTextAtLineEditor (/ Ename EList String ChrLst StrLst)
  45.   (if (and (setq Ename (car (entsel)))
  46.            (= (cdr (assoc 0 (setq EList (entget Ename)))) "MTEXT")
  47.       )
  48.     (progn
  49.       (setq String (cdr (assoc 1 EList))
  50.             ChrLst (vl-string->list String)
  51.             ChrLst (mapcar 'chr ChrLst)
  52.       )
  53.       
  54.       (setq ChrLst (FindCtrl ChrLst))
  55.       
  56.       (setq StrLst (GetAllSubLsts ChrLst '("\\A" "\\C" "\\F" "\\H" "\\Q" "\\T" "\\W") '(";"))
  57.             ChrLst (mapcar (function (lambda (x) (apply 'strcat x))) StrLst)
  58.             StrLst (mapcar 'car (vl-remove-if (function (lambda (x) (member (car x) '("\\A" "\\C" "\\F" "\\H" "\\Q" "\\T" "\\W")))) StrLst))
  59.             StrLst (vl-remove-if (function (lambda (x) (member x '("{" "}"  "\\O" "\\o" "\\L" "\\l")))) StrLst)
  60.             StrLst (subst " " "\\~" (subst "\n" "\\P" (subst "\" "\\\" StrLst)))
  61.       )
  62.       (if (member "\\S" StrLst)
  63.         (setq StrLst (GetAllSubLsts StrLst '("\\S") '(";"))
  64.               StrLst (mapcar
  65.                        (function (lambda (x) (if (= (car x) "\\S") (vl-remove "/" (vl-remove  "#" (vl-remove "^" (vl-remove ";" (vl-remove "\\S" x))))) x)))
  66.                        StrLst
  67.                      )
  68.               StrLst (apply 'append StrLst)
  69.         )
  70.       )
  71.       (apply 'strcat StrLst)
  72.     )
  73.   )
  74. )

评分

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

查看全部评分

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-7 13:19:37 | 显示全部楼层
ayl1004 发表于 2013-6-7 12:29
我的想法是根据address和每个方框的长、宽,然后输入插入点来绘制方框。难点是字体,另外的都简单

你说的难点是字体,能具体说说吗?

点评

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

使用道具 举报

 楼主| 发表于 2013-6-7 14:33:42 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-6-7 15:07 编辑
ayl1004 发表于 2013-6-7 12:29
我的想法是根据address和每个方框的长、宽,然后输入插入点来绘制方框。难点是字体,另外的都简单

字体在开始那个 VBA 中有处理方式,还没有研究这个,Excel的控制符和 AutoCAD 的还是有区别,实在不行就用正则表达式处理
  1. Sub wz()
  2. Char = RTrim(Left(c.Characters.Caption, 256))
  3. If Char <> Empty Then
  4.    textStr = ""
  5.    For j = 1 To Len(Char)
  6.       If c.Characters(j, 1).Font.Underline = xlUnderlineStyleNone Then
  7.         cpt = c.Characters(j, 1).Caption
  8.         sonstr = ForeFontStr(c, j)
  9.         tempstr = ""
  10.         Do While j + 1 <= Len(Char)
  11.            sonstr1 = ForeFontStr(c, j + 1)
  12.            If sonstr1 = sonstr Then
  13.               j = j + 1
  14.              tempstr = tempstr + c.Characters(j, 1).Caption
  15.         Else
  16.              Exit Do
  17.         End If
  18.         Loop
  19.            textStr = textStr + "{" + sonstr + cpt + tempstr + "}"
  20.          Else
  21.            cpt = c.Characters(j, 1).Caption
  22.            sonstr = ForeFontStr(c, j)
  23.            tempstr = ""
  24.            Do While j + 1 <= Len(Char)
  25.                sonstr1 = ForeFontStr(c, j + 1)
  26.                If sonstr1 = sonstr Then
  27.                   j = j + 1
  28.                  tempstr = tempstr + c.Characters(j, 1).Caption
  29.           Else
  30.             Exit Do
  31.           End If
  32.          Loop
  33.             textStr = textStr + "{\L" + sonstr + cpt + tempstr + "\l}"
  34.       End If
  35.      Next j
  36.    End If
  37. End Sub
  38. '下面函数控制字体本身属性
  39. Function ForeFontStr(m As Range, u As Integer) As String
  40. a1 = "\F" + m.Characters(u, 1).Font.Name + ";" '字体
  41. a2 = IIf(m.Characters(u, 1).Font.Superscript = True, "\H0.33x;\A2;", "") '上脚标
  42. a3 = IIf(m.Characters(u, 1).Font.Subscript = True, "\H0.33x;\A0;", "") '下脚标
  43. a4 = IIf(m.Characters(u, 1).Font.FontStyle = "倾斜", "\Q18;", "") '倾斜
  44. a5 = IIf(m.Characters(u, 1).Font.FontStyle = "加粗", "\W1.2;", "") '加粗
  45. a6 = IIf(m.Characters(u, 1).Font.FontStyle = "加粗 倾斜", "\W1.2;\Q18;", "") ' 加粗倾斜
  46. ForeFontStr = a1 + a2 + a3 + a4 + a5 + a6
  47. End Function







点评

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

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2013-6-7 17:46:05 | 显示全部楼层
Lispboy 发表于 2013-6-7 13:19
你说的难点是字体,能具体说说吗?

就是Font对象的属性,要慢慢测试

点评

得到文字了,和CAD当前的字体(或者指定一个字体),也得到了框的长度、高度,算下文字写多大的宽度不就解决了吗?  详情 回复 发表于 2013-6-7 18:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2013-6-7 17:48:10 | 显示全部楼层
Free-Lancer 发表于 2013-6-7 14:33
字体在开始那个 VBA 中有处理方式,还没有研究这个,Excel的控制符和 AutoCAD 的还是有区别,实在不行就 ...

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-7 18:23:21 | 显示全部楼层
ayl1004 发表于 2013-6-7 17:46
就是Font对象的属性,要慢慢测试

得到文字了,和CAD当前的字体(或者指定一个字体),也得到了框的长度、高度,算下文字写多大的宽度不就解决了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-6-7 18:57:33 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2013-6-7 18:58 编辑

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

使用道具 举报

 楼主| 发表于 2013-6-7 21:08:01 | 显示全部楼层
ayl1004 发表于 2013-6-7 11:20
(defun c:tt (/ ExcApp RetLst Wkbk Sht UsedRange Cells Font)
  (vl-load-com)
  (alert "需要先打 ...

大致看了下,不能一股脑的都读出来,那样不利于后期在Lisp中处理,我的想法是按列读取 Cells ,形成两个表,一个记录边线,另外一个记录文字。

对边线表,子表为每个单元格,元素为横线和竖线的坐标,属于合并后没有线的不记录,这个线段表供fy:sortln使用

文字表,记录字串和字串的坐标,这个可以供单独的写字程序调用。

遍历 Cells 部分好办,目前还需要准备几个函数,
1 文字格式处理(把Excel控制符改为AutoCAD规则的控制符)
2 写字程序
3 对单个cell 获取需求信息的函数

点评

现在绘制表格是没问题了,就是字符串中单个字符的样式,不知道Excel是怎么处理的  详情 回复 发表于 2013-6-7 22:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 02:01 , Processed in 0.490400 second(s), 66 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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