在块的在位编辑器中,用LISP程序框选时,就容易选择到块外的图元,这时因为是在块的编辑器中,所以LISP程序执行不成功。如何让LISP程序在块的在位编辑器中,(用REFEDIT命令,打开块的在位编辑)可以选择不到块外的图元,顺利的选择编辑啊?多谢!
网友答: 2025年了,这个问题好像一直么有解决
网友答:
可能这个问题,用LISP是无解吧。网友答:
要有解,只能用命令反应器监控refedit命令,触发时记录当前entlast为标记图元。Refedit命令会复刻(克隆)块内图元在当前图块插入位置,所有的图元都是新建的,其ID都在标记图元后面,包括后继用户自己新画的。而所有不属于块内工作集的图元,其ID都在标记图元之前。网友答:
本帖最后由 自贡黄明儒 于 2025-8-29 12:52 编辑
手工操作了一下,你可以通过
(command "_.copyhist"),最后一次命令来判断,写程序也可以 实现
网友答:
网友答:
在位编辑器本论坛的全部解决方案
https://www.cnblogs.com/JJBox/p/11185185.html网友答: (hasworkset ent)
理论上Autocad2013-2025,为啥不是压缩包,因为编译后的压缩包过小,无法上传.

网友答: 2025年了,这个问题好像一直么有解决
网友答:
可能这个问题,用LISP是无解吧。网友答:
要有解,只能用命令反应器监控refedit命令,触发时记录当前entlast为标记图元。Refedit命令会复刻(克隆)块内图元在当前图块插入位置,所有的图元都是新建的,其ID都在标记图元后面,包括后继用户自己新画的。而所有不属于块内工作集的图元,其ID都在标记图元之前。网友答:
本帖最后由 自贡黄明儒 于 2025-8-29 12:52 编辑 手工操作了一下,你可以通过
(command "_.copyhist"),最后一次命令来判断,写程序也可以 实现
网友答:

- (defun C:save-refedit-handle (reactor params)
- (setenv "reflast"
- (IF (= (strcase (car params)) "REFEDIT")
- (cdr (assoc 5 (entget (entlast))))
- ""
- )
- )
- )
- (vlr-add (setq *refedit-reactor*
- (vlr-command-reactor
- "RefEditReactor"
- '((:vlr-commandWillStart . C:save-refedit-handle)
- )
- )
- )
- )
专用车研发 发表于 2025-8-28 09:29
2025年了,这个问题好像一直么有解决
在位编辑器本论坛的全部解决方案
https://www.cnblogs.com/JJBox/p/11185185.html网友答: (hasworkset ent)
理论上Autocad2013-2025,为啥不是压缩包,因为编译后的压缩包过小,无法上传.

- // 定义 Lisp 函数 "hasworkset",支持图元名或图元名列表作为参数
- [LispFunction("hasworkset")]
- public static object HasWorkSet(ResultBuffer args)
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- Database db = doc.Database;
- try
- {
- // 参数校验
- if (args == null)
- {
- ed.WriteMessage("\n错误:缺少图元参数");
- return false;
- }
- // 解析参数(单个图元名 + 可选标志)
- TypedValue[] argArray = args.AsArray();
- ObjectId entityId = ObjectId.Null;
- bool includingErased = false;
- // 第一个参数:图元名
- if (argArray[0].TypeCode == (int)LispDataType.ObjectId)
- {
- entityId = (ObjectId)argArray[0].Value;
- }
- else
- {
- ed.WriteMessage("\n错误:第一个参数必须为图元名");
- return false;
- }
- // 第二个参数(可选):是否包含已删除图元
- if (argArray.Length > 1)
- {
- includingErased = Convert.ToBoolean(
- argArray[1].Value.ToString().ToUpper() == "T"
- );
- }
-
- // 核心逻辑:检查工作集
- ObjectId ltId = Application.LongTransactionManager.CurrentLongTransactionFor(doc);
- if (ltId.IsNull) return false;
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- LongTransaction longTr = (LongTransaction)tr.GetObject(ltId, OpenMode.ForRead);
- if (longTr == null) return false;
- return longTr.WorkSetHas(entityId, includingErased);
- }
- }
- catch (Autodesk.AutoCAD.Runtime.Exception ex)
- {
- ed.WriteMessage($"\n运行时错误: {ex.Message}");
- return false;
- }
- }