已解决:使用VLISP去除表格单元格文字格式
本帖最后由 作者 于 2010-6-27 22:43:44 编辑 <br /><br /> <p>从Excel中粘贴进AutoCAD的表格对象中的单元格文字常常带有格式,很不方便。</p><p> </p>
<p>一个一个去很麻烦。写了一个程序可以去掉MTEXT格式。利用以前mccad提供的Regexp代码。</p>
<p> </p>
<p>现在的问题是,如果表格中有公式就有大问题。试了多种方法都不成。(我在AutoCAD 2010中测试)</p>
<p> </p>
<p>附件提供测试图和程序。求高手解决。</p><p><br/></p><p>------------------</p><p>已解决, 完整解决方案在12楼。</p><p><br/></p> <p>提供个思路看看对秋大侠有没帮助</p>
<p>选定要复制的区域后 ctrl+c</p>
<p>“选择性粘贴”选“数值”再确定</p>
<p>或者通过记事本转一道</p>
<p>这样选定区域内就没有公式了</p> 不知需要什么效果
一个用于修改特定块属性的程序
<p>鼠标左键点击table一个cell的中部空白处,不放松,拉出区域后放开鼠标,即可编辑选中区域cells的字体颜色等</p> 我需要保留公式。<div><br/></div><div>去除所有的MTEXT覆盖,包括含公式的单元格。</div><div><br/></div><div>现在是一运行程序,即使不对含公式的单元格操作,含公式的格子也会变成 ####</div> 试试这个(defun c:tt (/ e)
(if (setq e (car (entsel)))
(entmod
(mapcar (function (lambda (x / code)
(setq code (car x))
(if (member code '(1 300 302))
(cons code (mtext2text (cdr x)))
x
)
)
)
(entget e)
)
)
)
(princ)
)
看来还是非常特殊的东西,难道公式又不能通过程序来搞,真被桌子搞晕掉。 本帖最后由 作者 于 2010-6-27 20:07:51 编辑 <br /><br /> mccad发表于2010-6-26 22:33:00static/image/common/back.gif看来还是非常特殊的东西,难道公式又不能通过程序来搞,真被桌子搞晕掉。
<p>公式就是 FIELD,Table Dxf 中的 344 实体就是FIELD,FIELD 的 DXF 中 360 实体的 DXF 可以找到公式的表达式 </p>
<p> </p>
<p><font face="Verdana">_$ (setq el (entget (car (entsel))))<br/>((-1 . <图元名: 7ffffbd30e0>) (0 . "ACAD_TABLE") (330 . <图元名: 7ffffbf9820>) (5 . "86") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "WALL") (100 . "AcDbBlockReference") (2 . "*T2") (10 1.20988e+006 699580.0 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0) (100 . "AcDbTable") (280 . 0) (342 . <图元名: 7ffffbf9de0>) (343 . <图元名: 7ffffbd39c0>) (11 1.0 0.0 0.0) (90 . 22) (91 . 11) (92 . 5) (93 . 3) (94 . 0) (95 . 0) (96 . 0) (280 . 1) (281 . 1) (141 . 321.667) (141 . 320.556) (141 . 323.889) (141 . 321.111) (141 . 143.333) (141 . 143.333) (141 . 321.667) (141 . 276.667) (141 . 276.667) (141 . 276.667) (141 . 276.667) (142 . 645.337) (142 . 645.273) (142 . 744.463) (142 . 744.463) (142 . 744.463) (171 . 1) (172 . 0) (173 . 0) (174 . 0) (175 . 1) (176 . 1) (91 . 262183) (178 . 0) (145 . 0.0) (170 . 4) (63 . 0) (64 . 0) (283 . 1) (140 . 100.0) (92 . 0) (301 . "CELL_VALUE") (93 . 4) (90 . 4) <font style="BACKGROUND-COLOR: #ffff00">(1 . "{\\f宋体|b0|i0|c134;\\C7;总建筑面积")</font> (94 . 0) (300 . "")<font style="BACKGROUND-COLOR: #ffff00"> </font><font color="#ff00ff"><font style="BACKGROUND-COLOR: #ffff00">(302 . "{\\f宋体|b0|i0|c134;\\C7;总建筑面积")</font> </font>(304 . "ACVALUE_END") (171 . 1) (172 . 0) (173 . 0) (174 . 0) (175 . 1) (176 . 1) (91 . 262183) (178 . 0) (145 . 0.0) (170 . 6) (63 . 0) (64 . 0) (283 . 1) (140 . 100.0) (92 . 0) (301 . "CELL_VALUE") (93 . 4) (90 . 2) (140 . 44916.0) (94 . 0) <font style="BACKGROUND-COLOR: #ffff00">(300 . "%lu2%tf[{\\f宋体|b0|i0|c134;\\C7;]") (302 . "{\\f宋体</font><font style="BACKGROUND-COLOR: #ffff00">|b0|i0|c134;\\C7;44916.00") </font></font> ......</p>
<p> </p>
<p><font face="Verdana">_$ (setq lst (vl-remove-if-not '(lambda (x) (= (car x) 344)) el))<br/>((344 . <图元名: 7ffffbd38e0>) (344 . <图元名: 7ffffbd3900>) (344 . <图元名: 7ffffbd3920>) (344 . <图元名: 7ffffbd3940>) (344 . <图元名: 7ffffbd3960>) (344 . <图元名: 7ffffbd3980>) (344 . <图元名: 7ffffbd39a0>))<br/>_$ <br/></p>
<p><font face="Verdana">_$ (entget (cdar lst))<br/>((-1 . <图元名: 7ffffbd38e0>) (0 . "FIELD") (5 . "10E") (102 . "{ACAD_REACTORS") (330 . <图元名: 7ffffbd4970>) (102 . "}") (330 . <图元名: 7ffffbd4970>) (100 . "AcDbField") (1 . "_text") <font style="BACKGROUND-COLOR: #ffff00">(2 . "{\\fSimSun|b0|i0|c134|p2;\\C7;%<\\_FldIdx 0>%}") </font>(90 . 1) <font style="BACKGROUND-COLOR: #ffff00">(360 . <图元名: 7ffffbd38f0>)</font> (97 . 0) (91 . 63) (92 . 0) (94 . 13) (95 . 2) (96 . 0) (300 . "") (93 . 0) (7 . "ACFD_FIELD_VALUE") (93 . 3) (90 . 0) (94 . 0) (300 . "") (302 . "") (304 . "ACVALUE_END") (301 . "") (98 . 0))<br/>_$ </font></p>
<p> </p>
<p><font face="Verdana">_$ (entget (cdr (assoc 360 (entget (cdar lst)))))<br/>((-1 . <font style="BACKGROUND-COLOR: #ffff00"><图元名: 7ffffbd38f0</font>>) (0 . "FIELD") (330 . <图元名: 7ffffbd38e0>) (5 . "10F") (100 . "AcDbField") (1 . "AcExpr")<font color="#ff00ff"> (2 . "\\AcExpr (B2*B3) \\f \"%lu2\"")</font> (90 . 0) (97 . 0) (91 . 63) (92 . 0) (94 . 59) (95 . 2) (96 . 0) (300 . "") (93 . 1) (6 . "ACAD_ROUNDTRIP_2008_FIELD_EVALOPTION") (93 . 0) (90 . 1) (91 . 63) (94 . 0) (300 . "") (302 . "") (304 . "ACVALUE_END") (7 . "ACFD_FIELD_VALUE") (93 . 4) (90 . 2) (140 . 598880.0) (94 . 0) (300 . "%lu2") (302 . "598880.00") (304 . "ACVALUE_END") (301 . "598880.00") (98 . 9))<br/></font></p>
<p></font> </p> 搞定。ActiveX方式没有办法。只能用dxf方式。
(defun massoc (key alist / x nlist)(foreach x alist (if(eq key (car x)) (setq nlist (cons (cdr x) nlist)) ))(reverse nlist))
(defun c:tt (/ e ent flist1 flist2 flist f)(if (setq e (car (entsel))) (entmod (mapcar (function(lambda(x / code) (setq code (car x)) (if (member code '(1 3 300 302)) (cons code (mtext2text (cdr x))) x ) ) ) (setq ent (entget e)) ) )) ;entmod;; 第一层Field(setq flist1 (massoc 344 ent));; 第二层Field(setq flist2 (massoc 360 (apply 'append (mapcar 'entget flist1))))(setq flist (append flist1 flist2))(foreach f flist (entmod (mapcar (function(lambda(x / code) (setq code (car x)) (if (member code '(2)) (cons code (mtext2text (cdr x))) x ) ) (entget f) ) ) ))
(vl-cmdf "updatefield" e "") (princ)) ActiveX 应该也可以,改 Mtext FieldCode,可能没有 Entmode 方便