明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1581|回复: 13

[JIG] DrawJig模仿Move时能否不显示原对象

[复制链接]
发表于 2020-10-15 00:55 | 显示全部楼层 |阅读模式

用lisp可以轻松实现。
(defun C:TEST (/ DATA GRR GRRPT KEY LOOP OBJECTS PT SS)
  ;; by carrot1983 2020.09.29
  (setq SS (ssget))
  (setq PT (getpoint "\n指定点:"))
  (setq OBJECTS (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex SS)))))
  (setq LOOP t)
  (while LOOP
    (setq GRR (grread t 15 2))
    (setq KEY (car GRR))
    (setq DATA (cadr GRR))
    (cond ((= KEY 5)
           (setq GRRPT DATA)
           (foreach O OBJECTS
             (vla-move O (vlax-3d-point PT) (vlax-3d-point GRRPT))
           )
          ) ;_移动
          ((or (= KEY 3) (= DATA 13))
           (setq LOOP NIL)
          ) ;_3左击 13回车 表示确认
          ((member KEY '(12 25))
           (redraw)
           (setq LOOP NIL)
          ) ;_右键退出
    )
    (setq PT GRRPT) ;_新基点
  )
  (redraw)
)


如果用drawjig 怎么修改以下代码。实现不显示原对象?

public class MoveJig : DrawJig
    {
        protected Point3d basePt;
        protected Entity[] entities;

        public MoveJig(Entity[] entities, Point3d basePt)
        {
            this.entities = entities;
            this.basePt = basePt;
        }

        public Matrix3d Displacement { get; private set; }

        protected override SamplerStatus Sampler(JigPrompts prompts)
        {
            var options = new JigPromptPointOptions("\nSecond point: ");
            options.UserInputControls = UserInputControls.Accept3dCoordinates;
            options.BasePoint = basePt;
            options.UseBasePoint = true;
            options.Cursor = CursorType.RubberBand;
            var result = prompts.AcquirePoint(options);

            if (basePt.DistanceTo(result.Value) < Tolerance.Global.EqualPoint)
                return SamplerStatus.NoChange;

            Displacement = Matrix3d.Displacement(result.Value - basePt);
            return SamplerStatus.OK;
        }

        protected override bool WorldDraw(WorldDraw draw)
        {
            var geo = draw.Geometry;
            if (geo != null)
            {
                geo.PushModelTransform(Displacement);
                foreach (var ent in entities) geo.Draw(ent);
                geo.PopModelTransform();
            }
            return true;
        }
    }

        [CommandMethod("TEST", CommandFlags.UsePickSet)]
        public void Test()
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;

            var selection = ed.GetSelection();
            if (selection.Status != PromptStatus.OK) return;

            var ptResult = ed.GetPoint("\nBase point: ");
            if (ptResult.Status != PromptStatus.OK) return;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                Entity[] entities = new Entity[selection.Value.Count];
                for (int i = 0; i < selection.Value.Count; i++)
                {
                    entities[i] = (Entity)tr.GetObject(selection.Value[i].ObjectId, OpenMode.ForRead);
                }

                var jig = new MoveJig(entities, ptResult.Value.TransformBy(ed.CurrentUserCoordinateSystem));
                var result = ed.Drag(jig);

                if (result.Status == PromptStatus.OK)
                {
                    foreach (var ent in entities)
                    {
                        ent.UpgradeOpen();
                        ent.TransformBy(jig.Displacement);
                    }
                }
                tr.Commit();
            }
        }
    }
发表于 2020-10-17 13:27 来自手机 | 显示全部楼层
var geo = draw.Geometry;  if (geo != null)  {  //geo.PushModelTransform(Displacement);  foreach (var ent in entities)  ente. draw()  //geo.PopModelTransform();  }  return true;
发表于 2021-3-23 23:49 来自手机 | 显示全部楼层
carrot1983 发表于 2021-3-16 01:21
把原位置的先隐藏,这个我有思考过,但是,我看JIG的代码中没有这个东西。所以没头绪。

方法可行的 最近写了几段代码都是这样做的 如果要修改动态块参数 就要用deepclone  否则最终变换后夹点位置不对
发表于 2020-11-18 21:07 来自手机 | 显示全部楼层
本帖最后由 brainstorm 于 2020-11-18 23:29 编辑

找到办法了:
  • 假如 entityToBeJig 是要被jig的对象
  • 先克隆 entityToBeJig, 不要加入数据库
  • 设置entityToBeJig visible 属性为false
  • 然后用jig拖动新克隆的实体
  • 拖拽结束后,dispose新掉克隆的实体
  • 按实际效果变换entityToBeJig ,把可见性设为true
发表于 2020-10-15 16:51 | 显示全部楼层
个人见解:关键你这个是moveJig,不是CreatEntity,好像SamplerStatus过程在鼠标确定之前,你不能修改原始对象,
我觉得moveJig不显示原对象,有点难
楼下大神来解答
发表于 2020-10-15 19:35 来自手机 | 显示全部楼层
cad 自己的移动命令都显示 估计很难
 楼主| 发表于 2020-10-15 23:07 | 显示全部楼层
Lisp 轻松实现的功能,到.net的时候困难真不少。有没有高人出来指点一二。
发表于 2020-10-17 13:28 来自手机 | 显示全部楼层
这样行么 但是图元多的时候可能会慢
 楼主| 发表于 2020-10-26 23:04 | 显示全部楼层
brainstorm 发表于 2020-10-17 13:28
这样行么 但是图元多的时候可能会慢

一楼的代码就是这样子的。
发表于 2020-11-18 20:57 来自手机 | 显示全部楼层
找到办法了
发表于 2020-11-24 13:54 | 显示全部楼层
可以把原图像的透明度变成100%,这样就不显示了。:D
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 18:22 , Processed in 0.235749 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表