如何让LISP程序可以区分选择的图元是不是在块的在位编辑器中?
在块的在位编辑器中,用LISP程序框选时,就容易选择到块外的图元,这时因为是在块的编辑器中,所以LISP程序执行不成功。如何让LISP程序在块的在位编辑器中,(用REFEDIT命令,打开块的在位编辑)可以选择不到块外的图元,顺利的选择编辑啊?多谢!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",支持图元名或图元名列表作为参数
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.TypeCode == (int)LispDataType.ObjectId)
{
entityId = (ObjectId)argArray.Value;
}
else
{
ed.WriteMessage("\n错误:第一个参数必须为图元名");
return false;
}
// 第二个参数(可选):是否包含已删除图元
if (argArray.Length > 1)
{
includingErased = Convert.ToBoolean(
argArray.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;
}
}
页:
[1]