在 AutoCAD 的 Lisp 与 C# 交互中,Lisp 数据类型与对应的类型码(TypeCode)及 C# 类型存在明确映射关系。以下是常见类型的对应表:
Lisp数据类型 | 类型码(TypeCode) | 对应的C#类型 | 说明 |
---|---|---|---|
整数(Integer) | 5003 | short |
16位整数 |
整数(Long) | 5010 | int |
32位整数 |
实数(Real) | 5001 | double |
双精度浮点数 |
字符串(String) | 5005 | string |
文本字符串 |
选择集(SelectionSet) | 5007 | ObjectId (选择集ID) |
代表一组对象的集合,需解析获取内部ID |
对象ID(ObjectId) | 5006 | ObjectId |
单个对象在数据库中的唯一标识符 |
点(Point) | 5009 | Point3d / Point2d |
三维/二维点坐标 |
列表(List) | 5000 | ResultBuffer / TypedValue[] |
由多个TypedValue组成的列表 |
图元名(Entity name) | 5006 | ObjectId |
与ObjectId等价,Lisp中显示为ename |
空值(Nil) | 5002 | null |
空值 |
关键类型说明:
5006(ObjectId)
Lisp 中通过ssname提取的单个对象 ID(如(ssname ss 0))属于此类型。
C# 中直接转换为ObjectId类型:(ObjectId)tv.Value。
5007(选择集)
Lisp 中通过ssget获取的选择集整体属于此类型(如ss变量)。
C# 中需先转换为选择集 ID(ObjectId),再通过事务打开选择集提取内部对象 ID。
数值类型区分
5003(short)、5010(int)、5001(double)分别对应不同精度的数值,转换时需匹配类型码。
代码中判断示例:
csharp
foreach (TypedValue tv in tvs)
{
switch (tv.TypeCode)
{
case 5006: // ObjectId
ObjectId id = (ObjectId)tv.Value;
break;
case 5007: // 选择集
ObjectId ssId = (ObjectId)tv.Value;
// 解析选择集...
break;
case 5001: // double
double value = (double)tv.Value;
break;
// 其他类型判断...
}
}
掌握这些对应关系可以准确解析 Lisp 传递的参数,避免类型不匹配导致的错误。
private static ResultBuffer BuildLispDataStructure(List<List<Pair<ObjectId, string>>> groupedResults)
{
ResultBuffer rb = new ResultBuffer();
// 完全扁平化处理:遍历所有分组和所有对象,不添加任何分组括号
// 所有"对象-级别"对直接作为顶级元素并列存在
foreach (var group in groupedResults)
{
foreach (var pair in group)
{
// 每个"对象-级别"对作为独立子列表,直接添加到结果中
rb.Add(new TypedValue((int)LispDataType.ListBegin));
rb.Add(new TypedValue((int)LispDataType.ObjectId, pair.First)); // 对象ID
rb.Add(new TypedValue((int)LispDataType.Int32, int.Parse(pair.Second))); // 级别
rb.Add(new TypedValue((int)LispDataType.ListEnd));
}
}
// 整个结果没有外层分组括号,所有子列表完全并列
return rb;
}
传递选择集; 定义MYC命令,直接传递整个选择集(类型码5007)给C#
(DEFUN C:myc (/ ss)
(setvar "cmdecho" 0)
(princ "\n请选择多段线:")
(setq ss (ssget '((0 . "LWPOLYLINE")))) ; 获取选择集(类型码5007)
(if (and ss (> (sslength ss) 0))
(progn
(princ (strcat "\n已选择 " (itoa (sslength ss)) " 个多段线,开始处理..."))
; 直接传递整个选择集和精度值给C#
; 选择集参数类型为5007,精度值为5001
(fixyuanhuanselectver2 ss)
)
(princ "\n未选择任何多段线,操作取消")
)
(setvar "cmdecho" 1)
(princ)
)
传递objectid(DEFUN C:myc(/ I LST OBJL1 outlist)
(setvar "cmdecho" 0)
;;; (file_1)
(print "\n请选择多义线:")
(setq objl1(ssget '((0 . "lwpolyline"))))
(if objl1
(progn
(setq i 0 outlist null)
(repeat (sslength objl1)
(if (= i 0)
(setq outlist (list (ssname objl1 i)))
(setq outlist (append outlist(list (ssname objl1 i))))
)
(setq i (+ i 1))
)
(doubletext outlist)
)
)
(princ)
)