在块的在位编辑器中,用LISP程序框选时,就容易选择到块外的图元,这时因为是在块的编辑器中,所以LISP程序执行不成功。如何让LISP程序在块的在位编辑器中,(用REFEDIT命令,打开块的在位编辑)可以选择不到块外的图元,顺利的选择编辑啊?多谢!


网友答: 2025年了,这个问题好像一直么有解决

网友答: 可能这个问题,用LISP是无解吧。

网友答: 要有解,只能用命令反应器监控refedit命令,触发时记录当前entlast为标记图元。Refedit命令会复刻(克隆)块内图元在当前图块插入位置,所有的图元都是新建的,其ID都在标记图元后面,包括后继用户自己新画的。而所有不属于块内工作集的图元,其ID都在标记图元之前。

网友答: 本帖最后由 自贡黄明儒 于 2025-8-29 12:52 编辑

手工操作了一下,你可以通过
(command "_.copyhist"),最后一次命令来判断,写程序也可以 实现


网友答:
  1. (defun C:save-refedit-handle (reactor params)
  2.   (setenv "reflast"
  3.           (IF (= (strcase (car params)) "REFEDIT")
  4.             (cdr (assoc 5 (entget (entlast))))
  5.             ""
  6.           )
  7.   )
  8. )
  9. (vlr-add (setq *refedit-reactor*
  10.                 (vlr-command-reactor
  11.                   "RefEditReactor"
  12.                   '((:vlr-commandWillStart . C:save-refedit-handle)
  13.                    )
  14.                 )
  15.          )
  16. )


网友答:
专用车研发 发表于 2025-8-28 09:29
2025年了,这个问题好像一直么有解决

在位编辑器本论坛的全部解决方案
https://www.cnblogs.com/JJBox/p/11185185.html

网友答: (hasworkset ent)

理论上Autocad2013-2025,为啥不是压缩包,因为编译后的压缩包过小,无法上传.
  1. // 定义 Lisp 函数 "hasworkset",支持图元名或图元名列表作为参数
  2.         [LispFunction("hasworkset")]
  3.         public static object HasWorkSet(ResultBuffer args)
  4.         {
  5.             Document doc = Application.DocumentManager.MdiActiveDocument;
  6.             Editor ed = doc.Editor;
  7.             Database db = doc.Database;

  8.             try
  9.             {
  10.                 // 参数校验
  11.                 if (args == null)
  12.                 {
  13.                     ed.WriteMessage("\n错误:缺少图元参数");
  14.                     return false;
  15.                 }

  16.                 // 解析参数(单个图元名 + 可选标志)
  17.                 TypedValue[] argArray = args.AsArray();
  18.                 ObjectId entityId = ObjectId.Null;
  19.                 bool includingErased = false;

  20.                 // 第一个参数:图元名
  21.                 if (argArray[0].TypeCode == (int)LispDataType.ObjectId)
  22.                 {
  23.                     entityId = (ObjectId)argArray[0].Value;
  24.                 }
  25.                 else
  26.                 {
  27.                     ed.WriteMessage("\n错误:第一个参数必须为图元名");
  28.                     return false;
  29.                 }

  30.                 // 第二个参数(可选):是否包含已删除图元
  31.                 if (argArray.Length > 1)
  32.                 {
  33.                     includingErased = Convert.ToBoolean(
  34.                         argArray[1].Value.ToString().ToUpper() == "T"
  35.                     );
  36.                 }
  37.                
  38.                 // 核心逻辑:检查工作集
  39.                 ObjectId ltId = Application.LongTransactionManager.CurrentLongTransactionFor(doc);
  40.                 if (ltId.IsNull) return false;

  41.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  42.                 {
  43.                     LongTransaction longTr = (LongTransaction)tr.GetObject(ltId, OpenMode.ForRead);
  44.                     if (longTr == null) return false;
  45.                     return longTr.WorkSetHas(entityId, includingErased);
  46.                 }
  47.             }
  48.             catch (Autodesk.AutoCAD.Runtime.Exception ex)
  49.             {
  50.                 ed.WriteMessage($"\n运行时错误: {ex.Message}");
  51.                 return false;
  52.             }
  53.         }

  • 上一篇:批块 PK 命令-读取Excel数据,批量创建、填充动态
  • 下一篇:没有了