andyhua 发表于 2014-8-28 09:57:36

如何让LISP程序可以区分选择的图元是不是在块的在位编辑器中?

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

专用车研发 发表于 2025-8-28 09:29:39

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

qazxswk 发表于 2025-8-29 10:46:43

可能这个问题,用LISP是无解吧。

kozmosovia 发表于 2025-8-29 11:11:29

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

自贡黄明儒 发表于 2025-8-29 11:29:50

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

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

kozmosovia 发表于 2025-8-29 16:15:07

(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-29 16:56:38

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

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

edata 发表于 2025-8-29 17:56:54

(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]
查看完整版本: 如何让LISP程序可以区分选择的图元是不是在块的在位编辑器中?