Lisp 与 C# 交互中,类型码(TypeCode)的映射关系

在 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)

)

相关推荐
周杰伦_Jay15 小时前
【主流开发语言深度对比】Python/Go/Java/JS/Rust/C++评测
开发语言·python·golang
ldmd28416 小时前
Go语言实战:入门篇-5:函数、服务接口和Swagger UI
开发语言·后端·golang
光子物联单片机16 小时前
C语言基础开发入门系列(八)C语言指针的理解与实战
c语言·开发语言·stm32·单片机·mcu
是苏浙16 小时前
零基础入门C语言之文件操作
c语言·开发语言
盈电智控16 小时前
体力劳动反而更难被AI取代?物联网科技如何守护最后的劳动阵地
开发语言·人工智能·python
隔壁阿布都16 小时前
Spring Boot中的Optional如何使用
开发语言·spring boot·python
小龙报16 小时前
《C语言疑难点 --- C语内存函数专题》
c语言·开发语言·c++·创业创新·学习方法·业界资讯·visual studio
张人玉17 小时前
WPF 数据绑定与转换器详解
c#·wpf·light
国服第二切图仔17 小时前
Rust开发实战之简单游戏开发(piston游戏引擎)
开发语言·rust·游戏引擎
主宰者17 小时前
WPF CalcBinding简化判断逻辑
c#·.net·wpf