1 Jig介绍

讲Jig实例之前,先将Jig相关捋一捋。.net托管类(Managed Class) 封装了大部分 ObjectARX C++类。在.net中,Jig功能被封装在了一个父类(Jig)和两个子类(DrawJig、EntityJig),以及一些辅助类之中。

相比封装之前,封装之后的Jig类功能更为明确和细分,使用起来也更加方便,一般只需继承DrawJig和EntityJig两个类就可以实现较为复杂的Jig动作。

Jig里面有几个比较重要的函数:Sampler() 、WorldDraw() 、Update(),分属三个不同的类。了解和掌握它们的用法对于理解Jig的原理很有帮助。

先来看用户手册中关于Jig功能的描述:

Jig循环总体上分为四步,直译如下:

1)用户拖动鼠标。

2)根据鼠标动作得到几何参数值。

3)根据参数值更新实体数据。

4)用WorldDraw()函数重画实体。

除此之外,用户手册对于Jig的描述实在太少,对Jig类的成员函数Sampler() 、WorldDraw() 、Update()的描述更是没有,这也是为什么AutoCAD.net二次开发中Jig难学的原因。既然Jig类封装自ObjectARX C++ class,那就去ObjectARX 的参考文档里面去找,果不其然,还真的很详细。

Sampler() 函数的功能简单来讲就是实时得到通过键盘或鼠标输入的参数,即Jig循环的第2步,这些参数一般是与实体几何相关的。如果获得成功则返回Normal,否则返回NoChange、Cancel、Null。在自定义Jig类中需重写此函数以获得用户输入。

Update() 函数是在Sampler() 函数成功返回实体参数后执行,用于更新实体的数据,即Jig循环的第3步,同时也会进入第4步,调用WorldDraw()函数更新实体在显示设备上的显示。在自定义Jig类中需重写这两个函数用来更新实体显示,相比Update() 函数,WorldDraw()提供了图形设备接口参数,使用起来更方便,因此大多数人使用DrawJig类。下面代码中用到的自定义通用Jig类DrawJigFramework即继承自DrawJig类,关于DrawJigFramework的原理及实现详见后续博文。

2 Jig实例

下面展示的实例为采用Jig方式动态绘制标高尺,标尺左边的标高数据为刻度线处Y坐标,分四步输入全部参数后即可绘制出满足要求的标尺。

1)输入高程分节长度。

2)给出一点以确定标尺的最高高程。

3)给出一点以确定标尺的最低高程。

4)给出一点以确定标尺的水平位置。

3 主要代码

主要代码如下:

[CommandMethod("bat_bc")]
public void Sub16()
{double segmentLength = 10;if (InputHelper.GetDouble(ref segmentLength, "\n输入高程分节长度")){double dimScale = EntityHelper.GetActiveDatabase().Dimscale;DBTextSub dbTextSub1 = new DBTextSub();DBTextSub dbTextSub2 = new DBTextSub();Line line0 = new Line();Line line1 = new Line();Line line2 = new Line();Polyline polyline = new Polyline();DrawJigFramework djf = new DrawJigFramework();djf.JigEntity = new List<Entity>() { line0, line1, line2, polyline, dbTextSub1, dbTextSub2 };djf.JigPhases = new List<Phase>() {new PointPhase("\n给出一点以确定标尺的最高高程", false),new PointPhase("\n给出一点以确定标尺的最低高程", false),new PointPhase("\n给出一点以确定标尺的水平位置", false)};djf.JigUpdate = () =>{if (!djf.JigPhases[0].IsDone) return false;//返回假表示数据还未准备好先不画                    double x = ((Point3d)djf.JigPhases[0].Value).X;if (djf.JigPhases[1].IsDone) x = ((Point3d)djf.JigPhases[2].Value).X;double y1 = Math.Ceiling(((Point3d)djf.JigPhases[0].Value).Y / segmentLength) * segmentLength;double y2 = Math.Floor(((Point3d)djf.JigPhases[1].Value).Y / segmentLength) * segmentLength;dbTextSub1.TextString = y1.S0();dbTextSub1.Height = 3 * dimScale;dbTextSub1.AdjustAlignmentPoint(new Point3d(x - dbTextSub1.GetTextWidth() * 0.5 * dimScale - 4 * dimScale, y1, 0));dbTextSub2.TextString = y2.S0();dbTextSub2.Height = 3 * dimScale;dbTextSub2.AdjustAlignmentPoint(new Point3d(x - dbTextSub2.GetTextWidth() * 0.5 * dimScale - 4 * dimScale, y2, 0));//更新中轴线line0.StartPoint = new Point3d(x, y1, 0);line0.EndPoint = new Point3d(x, y2, 0);//更新上刻度线                line1.StartPoint = new Point3d(x - 3 * dimScale, y1, 0);line1.EndPoint = new Point3d(x, y1, 0);//更新下刻度线line2.StartPoint = new Point3d(x - 3 * dimScale, y2, 0);line2.EndPoint = new Point3d(x, y2, 0);//更新外框线polyline.Reset(false, 0);polyline.AddVertexAt(0, new Point2d(x - 3 * dimScale / 2, y1), 0, 0, 0);polyline.AddVertexAt(0, new Point2d(x + 3 * dimScale / 2, y1), 0, 0, 0);polyline.AddVertexAt(0, new Point2d(x + 3 * dimScale / 2, y2), 0, 0, 0);polyline.AddVertexAt(0, new Point2d(x - 3 * dimScale / 2, y2), 0, 0, 0);polyline.AddVertexAt(0, new Point2d(x - 3 * dimScale / 2, y1), 0, 0, 0);return true;};djf.JigEnding = () =>{double x = ((Point3d)djf.JigPhases[2].Value).X;double y1 = Math.Ceiling(((Point3d)djf.JigPhases[0].Value).Y / segmentLength) * segmentLength;double y2 = Math.Floor(((Point3d)djf.JigPhases[1].Value).Y / segmentLength) * segmentLength;double dy = y2 > y1 ? segmentLength : -segmentLength;double y = y1 + dy;while (y1 < y2 ? y < y2 : y > y2){//添加刻度线Line line = new Line();djf.JigEntity.Add(line);line.StartPoint = new Point3d(x - 3 * dimScale, y, 0);line.EndPoint = new Point3d(x, y, 0);//添加高程文字DBTextSub dbtext = new DBTextSub(y.S0(), 3 * dimScale);djf.JigEntity.Add(dbtext);dbtext.AdjustAlignmentPoint(new Point3d(x - dbTextSub1.GetTextWidth() * 0.5 * dimScale - 4 * dimScale, y, 0));y = y + dy;}y = y1;while (y1 < y2 ? y < y2 : y > y2){//添加左马赛克Polyline pl = new Polyline();djf.JigEntity.Add(pl);pl.AddVertexAt(0, new Point2d(x - 0.75 * dimScale, y), 0, 1.5 * dimScale, 1.5 * dimScale);pl.AddVertexAt(0, new Point2d(x - 0.75 * dimScale, y + dy), 0, 1.5 * dimScale, 1.5 * dimScale);y = y + 2 * dy;}y = y1 + dy;while (y1 < y2 ? y < y2 : y > y2){//添加右马赛克Polyline pl = new Polyline();djf.JigEntity.Add(pl);pl.AddVertexAt(0, new Point2d(x + 0.75 * dimScale, y), 0, 1.5 * dimScale, 1.5 * dimScale);pl.AddVertexAt(0, new Point2d(x + 0.75 * dimScale, y + dy), 0, 1.5 * dimScale, 1.5 * dimScale);y = y + 2 * dy;}return true;};djf.Jig2CurrentSpace();}
}

AutoCAD.net Jig实例1 动态标尺相关推荐

  1. ENSP配置 实例九 动态Nat配置

    ENSP配置 实例九 动态Nat配置 sy [Huawei]sy R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 ...

  2. python处理cad_python3读取autocad图形文件.py实例

    废话不多说,看代码吧! ''' 待完善. 此代码实现了,根据标注文本的 属性,数值,位置,及 容差, 去判断 设计 和 实测两图中的同一位置的尺寸. 如果是同一位置的尺寸,则进行比较, 并把结果存成表 ...

  3. python读取cad_python3读取autocad图形文件.py实例

    废话不多说,看代码吧! ''' 待完善. 此代码实现了,根据标注文本的 属性,数值,位置,及 容差, 去判断 设计 和 实测两图中的同一位置的尺寸. 如果是同一位置的尺寸,则进行比较, 并把结果存成表 ...

  4. python dwg文件 读取_python3读取autocad图形文件.py实例

    废话不多说,看代码吧! ''' 待完善. 此代码实现了,根据标注文本的 属性,数值,位置,及 容差, 去判断 设计 和 实测两图中的同一位置的尺寸. 如果是同一位置的尺寸,则进行比较, 并把结果存成表 ...

  5. AutoCAD .Net 使用 DrawJig 来动态地移动、旋转、缩放多个图元

    本实例展示使用 DrawJig 技术,动态交互模式地移动.旋转.缩放多个图元. 如下图所示: 翻译自: AutoCAD .NET: Use DrawJig to Dynamically Move Ro ...

  6. 在AutoCAD 2008发现了一个动态块的BUG

    前不久发现了一个AutoCAD 2008的BUG. 具体症状是这样的: 图形中存在动态块时,只要使用lisp函数: (entget (car (entsel "\nSelect Object ...

  7. python autocad显示_通过Python打开Autocad的新实例

    有人有在Autocad中使用Python的经验吗?我只是在尝试,作为一个测试,看看我是否可以通过Python打开一个新的Autocad实例,尽管PyAutocad工作得很好(如果您有其他建议,请随时提 ...

  8. AutoCAD .Net 入门实例

    以下以 VS2010 开发 AutoCAD2014 的实例来讲解. 一.新建项目 新建 C# 类库项目,.Net Framework选择4.0版本. 二.添加引用 添加引用: * accoremgd ...

  9. 超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等...

    超多经典 canvas 实例 普及:<canvas> 元素用于在网页上绘制图形.这是一个图形容器,您可以控制其每一像素,必须使用脚本来绘制图形. 注意:IE 8 以及更早的版本不支持 &l ...

最新文章

  1. 独立重复实验与二项分布
  2. linux看php安装路径,linux下查找php安装路径的方法是什么
  3. Fragment使用LocalBroadcastManager接收广播消息
  4. 远程桌面上的文件复制到本地
  5. 如何关闭SAP CRM中间件的delta download方式
  6. mysql 冷热表_Redis+MySQL冷热数据交换
  7. EFCore之命令行工具
  8. idea输入法候选区不跟随光标
  9. 打印菱形星号组合C程序
  10. 网络事件触发自己主动登录
  11. 刚刚,谷歌宣布TPU全面开放,AI芯片及云市场再迎变局
  12. phpstorm内网远程debug
  13. 一直跳动的按钮插件_关于Excel--Power Click插件的一些说明
  14. ESP8266-WIFI模块配置
  15. TIA Openness开发入门(2)
  16. 博德之门联机等待服务器响应,《博德之门》系列疑难解答
  17. 百度云OCR文字识别
  18. 详细解读php的命名空间(一)
  19. iOS ”打仙人掌“游戏一---游戏玩法实现
  20. 使用ajax模拟用户名是否被占用

热门文章

  1. vue列表左右箭头滑动_Vue实现点击箭头上下移动效果
  2. java jxl包_java利用JXL包操作Excel表
  3. 2023年美赛F题F奖思路复盘(附论文)
  4. python漏洞扫描模块_Hunter 是一款被动式漏洞扫描器
  5. Adobe Acrobat Pro中设置pdf背景颜色后出现白色的线解决办法
  6. 淘宝屏蔽百度3---为淘宝叫好
  7. 手机怎么测量物品高度?原理是什么?
  8. 测试、开发、运维等 IT 岗位薪酬体系大公开,你拖后腿了吗?
  9. 微信小程序接入腾讯云IM即时通讯(获取聊天历史记录开发步骤)
  10. 玩具、镜子还是艺术?聊聊VR的发展阶段