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)

)

相关推荐
ysdysyn8 分钟前
.NET 10深度解析:性能革新与开发生态的全新篇章
c#·.net
weixin_3077791336 分钟前
在Linux服务器上使用Jenkins和Poetry实现Python项目自动化
linux·开发语言·python·自动化·jenkins
润 下36 分钟前
C语言——深入解析C语言指针:从基础到实践从入门到精通(四)
c语言·开发语言·人工智能·经验分享·笔记·程序人生·其他
Empty_77740 分钟前
Python编程之常用模块
开发语言·网络·python
小火柴12343 分钟前
利用R绘制箱线图
开发语言·r语言
wheeldown1 小时前
【Linux】Linux 进程通信:System V 共享内存(最快方案)C++ 封装实战 + 通信案例,4 类经典 Bug 快速修复
linux·运维·服务器·开发语言
小年糕是糕手1 小时前
【数据结构】双向链表“0”基础知识讲解 + 实战演练
c语言·开发语言·数据结构·c++·学习·算法·链表
将车2441 小时前
C++实现二叉树搜索树
开发语言·数据结构·c++·笔记·学习
梵得儿SHI1 小时前
Java 反射机制核心类详解:Class、Constructor、Method、Field
java·开发语言·反射·class·constructor·java反射·java反射机制
hbqjzx2 小时前
记录一个自动学习的脚本开发过程
开发语言·javascript·学习