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)

)

相关推荐
Dream achiever5 小时前
10.WPF布局
开发语言·c#·wpf
HyperAI超神经5 小时前
【TVM 教程】设置 RPC 系统
开发语言·网络·人工智能·python·网络协议·rpc·tvm
ajassi20005 小时前
开源 C# 快速开发(二)基础控件
开发语言·c#
遇见你的雩风5 小时前
【Golang】--- 函数深度解析
开发语言·golang
CryptoPP5 小时前
Go语言 对接全球股票K线API实战 - 以美股市场为例
开发语言·后端·golang
数据知道5 小时前
Go基础:模块化管理为什么能够提升研发效能?
开发语言·后端·golang·go语言
AI量化投资实验室5 小时前
今日策略:年化436%,回撤7%,夏普比5.28, deap因子挖掘重构,附python代码
开发语言·python·重构
O_o3816 小时前
QT多窗口跳转
开发语言·qt
DIY机器人工房6 小时前
关于如何让 Vosk 正确识别中文音频,核心是 使用 Vosk 中文模型 + 确保中文音频格式符合要求
开发语言·python