AutoCAD中程序创建Ribbon界面执行AutoCAD命令

简介:


在基于AutoCAD做二次开发时,常见的教程讲的都是在DLL中定义一些自定义命令,然后通过netload命令加载这个DLL,通过执行自定义命令的方式来执行我们的自定义功能。这样的方式在在学习中是显得很简单,但用在正式产品中就显得太业余了,没有专业精神。当然更professional的当然是和AutoCAD一样,提供一些基于Ribbon的用户界面来调用我们的自定义功能才好。多啰嗦一句,这个方法同样适用基于AutoCAD的其他产品,比如Map 3D和Civil 3D。下面就讲讲如何实现创建Ribbon用户界面。

 

首先了解一下Ribbon的概念,下图是AutoCAD的一个Ribbon界面截图,它有一些Tab组成,比如Home,Insert等等;在一个Tab里面又有不同的Panel组成,即竖线分割的部分;panel里面就是button了,这些button来执行具体的功能。不是很准确,我理解大概就是这样回事了。:)

image

 

下面来通过程序创建一个tab,在这个tab里面加两个panel,在panel里面放两个button来执行自定义的AutoCAD命令。

新建一个class类库工程,需要添加的引用包括:

acmgd

acdbmgd

acCoreMgd(对于AutoCAD 2013)

acCui

AcWindows

AdWindows

下面是代码片段:

 

    
    private const string MY_TAB_ID = "MY_TAB_ID";

    [CommandMethod("addMyRibbon")]
    public void createRibbon()
    {
      Autodesk.Windows.RibbonControl ribCntrl =
                Autodesk.AutoCAD.Ribbon.RibbonServices.RibbonPaletteSet.RibbonControl;
      //can also be Autodesk.Windows.ComponentManager.Ribbon;     

      //add the tab
      RibbonTab ribTab = new RibbonTab();
      ribTab.Title = "My custom tab";
      ribTab.Id = MY_TAB_ID;
      ribCntrl.Tabs.Add(ribTab);

      //create and add both panels
      addPanel1(ribTab);
      addPanel2(ribTab);

      //set as active tab
      ribTab.IsActive = true;
    }

    private void addPanel2(RibbonTab ribTab)
    {
      //throw new NotImplementedException();
    }

    private void addPanel1(RibbonTab ribTab)
    {
      //throw new NotImplementedException();
    }

 

通过这些代码,应该已经可以创建一个空白的Tab,并把他设置当前活动Tab,如图:

image

 

现在往这个Tab里面添加一个Panel,然后加入一个button来执行我的自定义命令。

 

    private const string MY_TAB_ID = "MY_TAB_ID";

    [CommandMethod("addMyRibbon")]
    public void createRibbon()
    {
      Autodesk.Windows.RibbonControl ribCntrl =
                Autodesk.AutoCAD.Ribbon.RibbonServices.RibbonPaletteSet.RibbonControl;
      //can also be Autodesk.Windows.ComponentManager.Ribbon;     

      //add the tab
      RibbonTab ribTab = new RibbonTab();
      ribTab.Title = "My custom tab";
      ribTab.Id = MY_TAB_ID;
      ribCntrl.Tabs.Add(ribTab);

      //create and add both panels
      addPanel1(ribTab);
      addPanel2(ribTab);

      //set as active tab
      ribTab.IsActive = true;
    }

    private void addPanel2(RibbonTab ribTab)
    {
      //create the panel source
      RibbonPanelSource ribPanelSource = new RibbonPanelSource();
      ribPanelSource.Title = "Edit Registry";

      //create the panel
      RibbonPanel ribPanel = new RibbonPanel();
      ribPanel.Source = ribPanelSource;
      ribTab.Panels.Add(ribPanel);

      //create button1
      RibbonButton ribButtonDrawCircle = new RibbonButton();
      ribButtonDrawCircle.Text = "My Draw Circle";
      ribButtonDrawCircle.ShowText = true;
      //pay attention to the SPACE after the command name
      ribButtonDrawCircle.CommandParameter = "DrawCircle ";
      ribButtonDrawCircle.CommandHandler = new AdskCommandHandler();

      ribPanelSource.Items.Add(ribButtonDrawCircle);

    }

    private void addPanel1(RibbonTab ribTab)
    {
      //throw new NotImplementedException();
    }

    [CommandMethod("DrawCircle")]
    public void DrawCircle()
    {
      //画个圆,实现在此略去,这不是这篇blog的重点。
    }

注意上面的代码中我定义了一个ribButtonDrawCircle,指定他的CommandParameter为我的自定义命令名“DrawCircle”,并且指定他的CommandHandler 是AdskCommandHandler。这里的AdskCommandHandler是一个自定义的类,需要实现System.Windows.Input.ICommand接口。实现的方法就是在Execute时把commandParameter发送到AutoCAD命令行窗口执行。代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.Windows;


namespace AutoCAD_Debugger
{
  class AdskCommandHandler : System.Windows.Input.ICommand
  {
    public bool CanExecute(object parameter)
    {
      return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
      //is from Ribbon Button
      RibbonButton ribBtn = parameter as RibbonButton;
      if (ribBtn != null)
      {
        //execute the command 
        Autodesk.AutoCAD.ApplicationServices.Application
          .DocumentManager.MdiActiveDocument
          .SendStringToExecute(
             (string)ribBtn.CommandParameter, true, false, true);
      }
    }
  }
}

 

执行结果如下图。注意如果你在测试是发现你的button只是把命令字符串发送到了AutoCAD命令行但没有执行,必须按回车才能执行,那你多半是忽略了CommandParameter 后面那个空格!

image

 

好了,基本过程应该就是这样,当然我们还可以为button添加图标,让他更好看一点。下来峻祁连将再介绍如何让AutoCAD自动就自动加载这个Ribbon菜单,这个就更方便了,敬请期待。

作者: 峻祁连
邮箱:junqilian@163.com 
出处: http://junqilian.cnblogs.com 
转载请保留此信息。




本文转自峻祁连. Moving to Cloud/Mobile博客园博客,原文链接:http://www.cnblogs.com/junqilian/archive/2012/06/18/2553662.html ,如需转载请自行联系原作者
相关文章
结合iconworkshop,创建ribbon界面
mfc实现的程序中,ribbon界面是主流,比较适合测量类项目。几个修改图标的小技巧:1、现有的bmp,可以直接修改 在好几个地方,已经将IDB_*和显示效果对接清楚了,直接修改这里的bmp,就可以起到效果。
1074 0
|
6月前
|
JSON 负载均衡 Java
Spring Cloud Ribbon:负载均衡的服务调用
Spring Cloud Ribbon:负载均衡的服务调用
103 0
|
12天前
|
负载均衡 监控 网络协议
SpringCloud之Ribbon使用
通过以上步骤,就可以在Spring Cloud项目中有效地使用Ribbon来实现服务调用的负载均衡,提高系统的可靠性和性能。在实际应用中,根据具体的业务场景和需求选择合适的负载均衡策略,并进行相应的配置和优化,以确保系统的稳定运行。
39 15
|
12天前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
31 5
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
3月前
|
负载均衡 算法 Java
SpringCloud之Ribbon使用
通过 Ribbon,可以非常便捷的在微服务架构中实现请求负载均衡,提升系统的高可用性和伸缩性。在实际使用中,需要根据实际场景选择合适的负载均衡策略,并对其进行适当配置,以达到更佳的负载均衡效果。
61 13
|
5月前
|
负载均衡 算法 Java
Spring Cloud Netflix 之 Ribbon
Spring Cloud Netflix Ribbon是客户端负载均衡器,用于在微服务架构中分发请求。它与RestTemplate结合,自动在服务发现(如Eureka)注册的服务之间进行调用。配置包括在pom.xml中添加依赖,设置application.yml以连接Eureka服务器,并在配置类中创建@LoadBalanced的RestTemplate。通过这种方式,当调用如`/user/userInfoList`的接口时,Ribbon会自动处理到多个可用服务实例的负载均衡。