AutoCAD .Net二次开发之JIG动态绘制详解

AutoCAD平台动态绘制分两种,单实体绘制EntityJig和多实体绘制DrawJig,需要自己自定义类去继承。(本人的理解全放在了代码注释中,请详看注释)

EntityJig(单实体绘制)

class MyLineJig : EntityJig//使用此基类来实现动态绘制只可以绘制一个实体{//基类EntityJig中有一个关键的成员变量Entity,也就是要绘制到模型空间的临时图形,在绘制完成后将其添加到模型空间以及数据库,既完成了动态绘制public MyLineJig(Point3d _basePt) : base(new Line(_basePt, _basePt))//在构造之前调用基类构造为基类成员Entity初始化{m_AcquirePoint = _basePt;}public static bool StartDrag()//调用此方法开始绘制{Document doc = Application.DocumentManager.MdiActiveDocument;Point3d startPt = Point3d.Origin;PromptStatus promptStatus = GetPoint("", ref startPt);//需自己实现(获取用户输入点)if (promptStatus != PromptStatus.OK)return false;MyLineJig lineJig = new MyLineJig(startPt);PromptResult PR = doc.Editor.Drag(lineJig);//开始绘制if (PR.Status != PromptStatus.OK)return false;AppendEntityToModalSpace(doc, lineJig.Entity);//需自己实现(将实体添加进模型空间)return true;}protected override SamplerStatus Sampler(JigPrompts prompts)//提取输入数据并处理(鼠标移动时一定频率调用){JigPromptPointOptions JPPO = new JigPromptPointOptions();//定义点绘制的配置类JPPO.Message = "\n选择点";PromptPointResult PR = prompts.AcquirePoint(JPPO);//当鼠标未移动时,程序会在这里阻塞,直到鼠标移动,提取出当前鼠标位置,继续往下运行if (PR.Status != PromptStatus.OK){return SamplerStatus.Cancel;}if (PR.Value.DistanceTo(((Line)Entity).EndPoint) < 0.000001f)//若当前鼠标位置离上一次绘制的位置很近,返回NoChange,不让系统去调用Update去刷新//此举是为了减少刷新频率,避免绘制时的闪烁//(需要注意的是Jig绘制刚开始和结束的瞬间, 即便Sampler返回的是NoChange,也会调用Update)return SamplerStatus.NoChange;m_AcquirePoint = PR.Value;//更新数据,返回OK,告诉系统,数据已整理好,需要刷新return SamplerStatus.OK;}protected override bool Update()//刷新(方法中应写对Base.Entity的更改,Sampler返回OK时调用),(在开始绘制时即便Sampler返回NoChange也会调用,绘制的是圆时应避免给圆的半径赋值零,圆实体会退化成点){((Line)Entity).EndPoint = m_AcquirePoint;//利用绘制好的点去改变实体属性(EntityJig内部实现会把Entity成员绘制到模型空间)return true;}private Point3d m_AcquirePoint;//保存提取出来的鼠标位置}

DrawJig(多实体绘制)

    //DrawJig没有了Entity成员,需要自己定义绘制的实体的成员变量class MyDoubleLineJig : DrawJig{public MyDoubleLineJig(Point3d _basePt){line_1 = new Line();line_2 = new Line();m_BasePt = _basePt;m_gap = 10.0f;}public static bool StartDraw(){Document doc = Application.DocumentManager.MdiActiveDocument;Point3d startPt = Point3d.Origin;PromptStatus promptStatus = GetPoint("\n输入起点", ref startPt);//需自己实现(获取用户的点输入)if (promptStatus != PromptStatus.OK)return false;MyDoubleLineJig lineJig = new MyDoubleLineJig(startPt);PromptResult PR = doc.Editor.Drag(lineJig);if (PR.Status != PromptStatus.OK)return false;AppendEntityToModalSpace(doc, lineJig.line_1);//需自己实现(将实体添加进模型空间)AppendEntityToModalSpace(doc, lineJig.line_2);return true;}protected override SamplerStatus Sampler(JigPrompts prompts){JigPromptPointOptions m_JPPO = new JigPromptPointOptions();m_JPPO.Message = "\ninput end point";m_JPPO.UserInputControls = (UserInputControls.Accept3dCoordinates | UserInputControls.NullResponseAccepted | UserInputControls.AnyBlankTerminatesInput);PromptPointResult PR = prompts.AcquirePoint(m_JPPO);if (PR.Status != PromptStatus.OK)return SamplerStatus.Cancel;Point3d pt = PR.Value;if (PR.Value == m_AcquirePt)return SamplerStatus.NoChange;m_AcquirePt = PR.Value;return SamplerStatus.OK;}//与Entity最大不同的在这里(Update->WorldDraw)protected override bool WorldDraw(WorldDraw draw){Vector3d lineV = m_AcquirePt - m_BasePt;Vector3d perpV = lineV.RotateBy(Math.PI / 2.0f, Vector3d.ZAxis);perpV = perpV.GetNormal() * m_gap;line_1.StartPoint = m_BasePt + perpV;line_2.StartPoint = m_BasePt - perpV;line_1.EndPoint = m_AcquirePt + perpV;line_2.EndPoint = m_AcquirePt - perpV;line_1.WorldDraw(draw);//需要调用WorldDraw将想要绘制的实体绘制到模型空间line_2.WorldDraw(draw);return true;}Line line_1;Line line_2;Point3d m_BasePt;Point3d m_AcquirePt;double m_gap;}

AutoCAD .Net二次开发之JIG动态绘制详解相关推荐

  1. AutoCAD .Net二次开发之Editor选择集

    AutoCAD .Net二次开发之Editor选择集 PickFirst选择集 一般选择集 选择集过滤SelectionFilter Editor的路径: Autodesk.AutoCAD.Appli ...

  2. pythonfor循环案例教程_python开发之for循环操作实例详解,pythonfor实例详解

    python开发之for循环操作实例详解,pythonfor实例详解 本文实例讲述了python开发之for循环操作.分享给大家供大家参考,具体如下: 下面是我做的一些学习记录供大家参考: #基本的f ...

  3. Android高级开发之【RxJava】详解(附项目源码)

    文章大纲 一.什么是RxJava 二.为什么要用RxJava 三.RxJava使用详解 四.项目源码下载 一.什么是RxJava Rx(Reactive Extensions)是一个库,用来处理事件和 ...

  4. JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)

    HttpServletResponse简介 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象 request和re ...

  5. Linux/Unix开发之make和makefile详解

     无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以 ...

  6. JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(下)(各种乱码、验证码、重定向和转发)

    HttpServletRequest获取请求头信息  (1)获取客户机请求头 String getHeader(String name) Enumeration<String> getHe ...

  7. C#进行Visio二次开发之Web查看Visio图纸

    前面介绍的Visio开发知识,都是基于Winform的Visio的开发知识,图纸的展示都是基于Winform方式展示的.但很多时候,如果能够通过Web方式可以查看最新的图纸信息,那么系统将更加趋向完美 ...

  8. C#进行MapX二次开发之MapX基础知识

    C#进行MapX二次开发之MapX基础知识 MapX的主要技术特点 (1). 以表(Table)的形式组织信息 每一个表都是一组MapInfo文件,这些文件组成了地图文件和数据库文件.为使用MapIn ...

  9. C#进行Visio二次开发之Shape的Data1、Data2、Data3的用处

    我们知道,Visio的Shape对象有有3个比较特别的属性,分别是Data1.Data2.Data3,平常我们很少用到它,因为我们如果需要属性的话,可能会通过ShapeSheet的Customed P ...

最新文章

  1. linux光驱驱动目录,linux下挂载光驱
  2. 20145202马超 《Java程序设计》第六周学习总结
  3. 防火墙认证的类型——Vecloud
  4. rsa 加密 js php,security.js+RSA做出加密功能
  5. vue 筛选组件_记一个复杂组件(Filter)的从设计到开发
  6. 细数sass安装中遇到的坑
  7. 正则匹配括号里面的内容不包括括号_python正则表达式
  8. mysql 5.1版本无innodb trx_MySQL 5.7: Innodb 事务子系统优化-阿里云开发者社区
  9. php 删除相对应的id,PHP 在下面这个留言板代码中加入删除按钮,每一个删除按钮删除相对应一行数据,这怎么弄...
  10. 状态模式java 在线投票_Java 状态模式
  11. NGINX 实现反向代理负载均衡服务器
  12. win7禁用powershell_简述Windows 7中的Windows PowerShell功能
  13. Spring IOC的三种主要注入方式?
  14. 基于canny的边缘检测算法:
  15. java中的displaytag类_java-如何在displaytag中以xlsx扩展名导出Excel文...
  16. 【信息论】信源与信源熵(三)
  17. C++使用Socks5协议进行代理上网(四)
  18. Restricted RPS
  19. Udacity 人工智能编程基础 - 课程目录
  20. 给定一个数组,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择某一天买入这只股票,并选择在未来的一个不同的日子卖出该股票。【LeetCode Hot 100】

热门文章

  1. MSP432P4控制智能车基础教学(一)
  2. 圆桌问题 二分多重匹配+输出解
  3. 周记-20201012
  4. unity笔记,如何做一个帅气的大招过场动画。
  5. QSettings 介绍
  6. Android智能下拉刷新框架-SmartRefreshLayout
  7. Supermarket | 贪心 + 并查集
  8. 男女经济独立还是AA制?
  9. 使用js实现拖拽功能(附具体实现代码)
  10. 怎么用键盘打出希腊字母啊?