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)

)

相关推荐
晔子yy2 小时前
【JAVA探索之路】从头开始讲透、实现单例模式
java·开发语言·单例模式
阿正的梦工坊7 小时前
JavaScript 微任务与宏任务完全指南
开发语言·javascript·ecmascript
知行合一。。。7 小时前
Python--05--面向对象(属性,方法)
android·开发语言·python
青梅橘子皮7 小时前
C语言---指针的应用以及一些面试题
c语言·开发语言·算法
浅时光_c8 小时前
3 shell脚本编程
linux·开发语言·bash
Evand J8 小时前
【三维轨迹目标定位,CKF+RTS,MATLAB程序】基于CKF与RTS平滑的三维非线性目标跟踪(距离+方位角+俯仰角)
开发语言·matlab·目标跟踪
今天又在写代码9 小时前
java-v2
java·开发语言
competes9 小时前
慈善基金投资底层逻辑应用 顶层代码低代码配置平台开发结构方式数据存储模块
java·开发语言·数据库·windows·sql
Ulyanov10 小时前
用Pyglet打造AI数字猎人:从零开始的Python游戏开发与强化学习实践
开发语言·人工智能·python
独自归家的兔10 小时前
OCPP 1.6 协议详解:StatusNotification 状态通知指令
开发语言·数据库·spring boot·物联网