Bentley Communities
Bentley Communities
  • Site
  • User
  • Site
  • Search
  • User
  • Welcome
  • Products
  • Support
  • About
  • More
  • Cancel
中国BDN社区
  • Welcome to Bentley Communities
  • Bentley's Communities
  • 中国BDN社区
  • Cancel
中国BDN社区
中国BDN社区-威客 LearnDgnTool-02_DgnPrimitiveTool的使用_交互式放置圆
    • Sign In
    • 中国BDN社区-威客
    • +iTwin.js编程
    • +MicroStation CONNECT版SDK的新变化
    • +MicroStation编程技巧
    • +OpenRoads中国版平台开发指南
    • +ORD SDK二次开发编程
    • +一步步学习ABD-CE开发
    • +一步步学习MicroStation CE Addin开发
    • 一步步学习MicroStation CE MDL开发
    • +一步步学习ProjectWise编程
    • 中国优先社区二次开发精华帖汇总
    • -学习Microstation交互式工具开发
      • LearnDgnTool-01_DgnTool介绍
      • LearnDgnTool-02_DgnPrimitiveTool的使用_交互式放置圆
      • LearnDgnTool-03_DgnPrimitiveTool的使用_交互式放置线串
      • LearnDgnTool-04_DgnPrimitiveTool的使用_交互式放置三棱柱
      • LearnDgnTool-05_DgnElementSetTool详解
      • LearnDgnTool-06_DgnElementSetTool的使用_修改元素颜色
      • LearnDgnTool-07_DgnElementSetTool的使用_移动元素
      • LearnDgnTool-08_ToolSetting窗口
      • LearnDgnTool-09_DgnElementSetTool经典样例
      • 求Geopak场地开挖的线条压平工具
    • +过期帖,留存仅供参考
    • +非Bentley社区分享的文章
    • C#、C/C++相关的编程知识汇总
    • C#如何实现元素关联Link Set?有做过相关需求的老师指教一下吗

     
     Questions about this article, topic, or product? Click here. 

    LearnDgnTool-02_DgnPrimitiveTool的使用_交互式放置圆

    DgnPrimitiveTool是直接从DgnTool派生下来的一个类,提供了最基本的放置元素的逻辑。如果我们要实现的交互式工具在使用过程 中,不需要用户选择某些元素来完成操作的话,最好是从这个类派生我们自己的类来实现我们的交互式工具,我们首先通过一个放置圆的工具来看一下其最简单的用法。

    5557.LearnDgnTool_Ver1.7z

    上面的链接实现了交互式放置圆的工具,下载后将压缩包中的文件解压到新建的“LearnDgnTool”文件夹下。编译后在“Mdlapps”下生成“LearnDgnTool.dll”和“LearnDgnTool.ma”文件。打开任意Dgn文件后,执行Key-in命令:mdl load LearnDgnTool;LearnDgnTool PlaceCircle后,激活我们的工具。现在在视图中移动我们的鼠标,会看到光标处有一个圆会随着光标移动。通过单击鼠标左键,会看到在点击处会有一个圆生成。

    接下来看一下我们的工具是如何实现的,打开“…\LearnDgnTool\LearnDgnTool.cpp”,在“LearnDgnTool PlaceCircle”命令函数里边我们调用了PlaceCircleTool类的静态成员函数InstallNewInstance。PlaceCircleTool是我们从DgnPrimitiveTool派生的一个类,这个类的声明和实现分别在“…\LearnDgnTool\ PlaceCircleTool.h”和“…\LearnDgnTool\ PlaceCircleTool.cpp”文件中。在InstallNewInstance函数中我们通过“new”运算符创建了一个PlaceCircleTool的实例,紧接着通过返回的指针调用了InstallTool来启动我们的工具。InstallTool函数后台会执行很多操作,会调用一些DgnTool中定义的函数,这些函数中有两个虚函数是我们在写交互式工具类中经常用到的,分别是_OnInstall和_OnPostInstall,函数声明如下图所示:

    从注释我们可以看到_OnInstall是在我们的工具类真正成为当前工具之前被调用的,只有_OnInstall返回true我们的工具类才会被激活成为当前工具,如果返回false的话就不能被激活,这就给了我们一个机会去判断满足特定条件时我们的工具才能使用。例如注释中举的例子,某些工具只能在3D Model中才能使用,实现这些工具类时,我们就可以在_OnInstall函数中通过“ACTIVEMODEL->Is3d()”判断是否是在3D Model中。而_OnPostInstll则是在我们的工具真正激活成为当前工具之后调用的,这个时候我们就可以做一些初始化的事情了。例如如果你的工具需要一个界面让用户输入一些参数,而你又不想用Bentley提供的定义界面的方式来定制你的窗体的话,你可以通过混合编程借助于VS可视化定制界面的功能利用.Net WinForm来设计你的窗体。这个时候就可以在_OnPostInstall里边实例化你的窗体,并附加到ToolSettings窗口上去,当然这种方式需要你对混合编程比较了解才可以。我们的工具中没有需要输入的参数,所以不需要使用窗体,后面的版本中我会给大家一个通过混合编程定制界面的例子。我们这里在_OnPostInstall函数里边只是启动动态绘制,启动动态绘制后光标在视图中移动时,我们重写的_OnDynamicFrame函数会被不停地调用,通过参数“DgnButtonEventCR ev”可以获取鼠标当前所在点,我们在这里动态绘制用户如果输入确认点后放置出来的效果。

                   _OnPostInstall执行完后我们的工具就真正被激活了,接下来用户在视图中单击鼠标左键时我们重写的_OnDataButton函数就会被调用。在这个函数里边,同样地我们可以通过函数参数“DgnButtonEventCR ev”来获取用户输入的点,我们在用户输入的点处生成一个圆并添加到Model中。单击鼠标右键时,我们重写的_OnResetButton函数会被调用,我们只是简单地调用了_OnReinitialize函数。这个函数会调用_OnRestartTool函数,我们重写的_OnRestartTool函数直接调用了InstallNewInstance函数来重启工具。至此我们的第一个例子就全部完成了。

    • Share
    • History
    • More
    • Cancel
    • HongQiang Guo Created by Bentley Colleague HongQiang Guo
    • When: Mon, Sep 23 2019 10:42 PM
    • HongQiang Guo Last revision by Bentley Colleague HongQiang Guo
    • When: Wed, Nov 27 2019 2:30 AM
    • Revisions: 5
    • Comments: 0
    Recommended
    Related
    Communities
    • Home
    • Getting Started
    • Community Central
    • Products
    • Support
    • Secure File Upload
    • Feedback
    Support and Services
    • Home
    • Product Support
    • Downloads
    • Subscription Services Portal
    Training and Learning
    • Home
    • About Bentley Institute
    • My Learning History
    • Reference Books
    Social Media
    •    LinkedIn
    •    Facebook
    •    Twitter
    •    YouTube
    •    RSS Feed
    •    Email

    © 2023 Bentley Systems, Incorporated  |  Contact Us  |  Privacy |  Terms of Use  |  Cookies