新浪博客

LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段

2021-01-07 16:47阅读:
写在最前面:
我希望我的这些记录会在将来给同样琢磨这些内容苦于无同道者的朋友们一些帮助。
大方向上总有很多人同行,细分的需求或方向缺越来越少。当网上搜索到的资料无法回答的我问题的时候,可能是我没有接触到一些真正有用的资料和老师,亦或者就是我触碰到了这一细分方向的边界了。
CAD图元数据存储的结构无从得知,寻找规律的过程说白了也就是控制变量找不同的过程。
查阅了大量网上的资料,并没有发现有人关心CAD图元数据存储结构是怎样的。但是我想实现的单元格值属性的修改则必须首先了解其数据结构。
我不知道这个需求能不能实现,之所以题目叫做第一阶段,也是我并没有绝对的信心达到第二阶段的程度吧?所以先把这一部分的内容记录下来,而非等到最后,呈现一个完整的内容。
也许再过一个月我会转而投向读取数据,创建列表,写入CAD生成表格的阵营。甚至更糟的情况是,可能我会彻底放弃LISP对表格需求的实现。
以下内容记录的是EXCEL与AUTOCAD表格数据交互的一些测试,以及对AUTOCAD中图元数据存储格式的一些猜测和规律总结。
excel公式测试:



模型空间中亮显,打印预览发现(1 1)和(2 1)没有区别。 LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段 LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段


CAD公式及数据类型测试:
CAD中也可以进行数据类型的修改;
方法一:通过属性面板“内容-数据类型-常规/小数/角度/文字/日期/整数/点/百分比/货币”(但方法一只能修改到数据类型层级,具体如小数精度的设置只能选择具体
单元格右键修改。);
方法二:选择具体单元格,“右键-数据格式-小数-精度-0.00”。
excel数据单元格格式进入CAD测试:
1) 若excel中“单元格格式-数字”设置为“常规”的小数例如“77.77”或“88.8”选择性粘贴进入CAD采用“选择性粘贴-粘贴-AutoCAD图元”则默认转化为CAD中0.0000精度的小数格式;若采用“选择性粘贴-粘贴链接-AutoCAD图元”则仍为原有精度;
2) 若excel中“单元格格式-数字”设置为“数值”的小数,则选择性粘贴进入CAD采用“选择性粘贴-粘贴-AutoCAD图元”则仍然为原有精度;若采用“选择性粘贴-粘贴链接-AutoCAD图元”则也为原有精度。
excel数据单元格格式进入CAD的联合属性列表测试:


1联合属性列表提取方式:
1.1主要思路:
首先使用entsel函数提取出(<图元名:ent1> 点坐标列表)
再使用entget函数提取出图原名为<图元名:ent1>的图元的联合属性列表。
1.2代码实现:
[Visual LISP 控制台]
_$(setq ent1 (entsel))
(<图元名: 7ff471251280> (-1480.56 152.589 0.0))
_$(setq ent1_data (entget (car ent1)))
((-1 . <图元名: 7ff471251280>) (0 . 'ACAD_TABLE') ...))
用一行代码表示也可为:
[Visual LISP 控制台]
_$(setq ent1_data (entget (car (entsel))))
1.3总结:
entsel函数根据AutoCAD界面中选取图元,获取图元的名称、位置信息;entget函数根据图元名称获取图元的联合属性信息。
2 存储值:
不论CAD底层数据中存储的是(汉字、字母、符号、数字)的任意组合,其点阵列表的群码均为1;只有(纯数字)时群码才为140。纯数字时存储值信息前的点阵列表会出现(90 . 2)或(90 . 4)字样,初步判断为: LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段 LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段
但代码4不在上图范围内,而其余共用群码90的内容又不太符合该处信息。
后根据不同数据类型该值不同,判断群码90可能为数值类型代号。
初步猜测:
nil 0
int 1
real 2
str 4
EXCEL表格作为AutoCAD图元导入CAD的表格获取联合属性列表中不含有空单元格的属性点阵列表信息;
CAD“绘图-表格”生成表格编辑内容的空单元格获取的联合属性列表中包含空单元格的联合属性。只不过其中的属性值要么为空值,要么为默认值。
LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段 LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段
EXCEL导入的(汉字、字母、符号)字体属性出现在群码1和302,(数字)字体属性出现在群码300和302
3 字高:
不论(纯数字)还是(汉字、字母、符号、数字)的任意组合,其字高点阵列表群码均为140,该处于(纯数字)时的存储值群码冲突,替换群码时如何处理存在问题。
LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段 LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段
4 字体:
CAD中“绘图-表格”生成表格编辑内容若创建时确定了表格的样式,则单元格的联合属性列表中不会包含字体相关的内容。
LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段 LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段
在MLEADER群码组中300含义为“默认多行文字内容”,TABLE群码组中300含义为“属性定义的字符串值,对每个属性定义重复一次,并仅适用于块类型单元格”。
认为前者可能性更大(因为在CAD中“绘图-表格”生成表格编辑内容获取的联合属性列表中群码为300的点阵列表为空,而EXCEL导入CAD的表格获取的联合属性列表中群码为300的点阵列表中有“等线”这样的excel表格默认字体字样)。
不论(汉字)还是(字母、符号、数字)CAD中“绘图-表格”生成表格编辑内容获取的联合属性列表中群码为300的点阵列表均为空,除了real型的数据,图中为“4.55”。real型即使CAD中创建,群码300的点阵列表中仍会有猜测为控制real型数据精度的信息。
LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段 LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段
LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段 LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段
LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段 LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段
字体相关属性信息的存储形式一般为\\f+字体文件名(不包含拓展名)
总结一下,主要导致属性信息存储位置不同的因素有以下几点:
一、数据类型不同导致:
1、int
2、real
3、str(汉字或字母/符号)
二、操作方式不同导致:
1、使用CAD内部创建表格
1.1 使用了表格样式创建直接从空表开始编辑内容(群码300)
1.2 使用表格样式创建表格后,编辑内容时设置字体(群码1、300、302)
2、由excel导入表格(群码1、300、302)
2.1 数据类型不同导致的精度不同(CAD模型空间)
2.2 选择性粘贴方式不同导致的精度不同(CAD模型空间)

我的更多文章

下载客户端阅读体验更佳

APP专享