using System;
using System.Collections.Specialized;
using System.IO;
using System.Reflection;
using ZwSoft.ZwCAD.ApplicationServices;
using ZwSoft.ZwCAD.Customization;
using ZwSoft.ZwCAD.DatabaseServices;
using ZwSoft.ZwCAD.EditorInput;
using ZwSoft.ZwCAD.Runtime;
using ZwSoft.ZwCAD.Windows;
namespace CuiDemo
{
public class Class1
{
//设置CUI文件的名字,将其路径设置为当前运行目录
string cuiFile = GetProgramDir() + "\\MyCustom.cuix";
string menuGroupName = "MyCustom";//菜单组名
//获得活动文档
Document activeDoc = ZwSoft.ZwCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
public static string GetProgramDir()
{
string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
return directory;
}
public Class1()
{
//添加程序退出时事件处理
Application.QuitWillStart += new EventHandler(Application_QuitWillStart);
}
void Application_QuitWillStart(object sender, EventArgs e)
{
//由于触发此事件前文档已关闭,所以需通过模板重建,以便命令能够执行
Document doc = Application.DocumentManager.Add("acadiso.dwt");
//获取FILEDIA系统变量的值
object oldFileDia = Application.GetSystemVariable("FILEDIA");
//设置FILEDIA = 0,禁止显示文件对话框,这样可以通过程序输入文件名
Application.SetSystemVariable("FILEDIA", 0);
//获取主CUI
CustomizationSection mainCs = doc.GetMainCustomizationSection();
//如果存在指定的局部CUI文件,则进行卸载
if (mainCs.PartialCuiFiles.Contains(cuiFile))
doc.Editor.PostCommand("cuiunload " + menuGroupName + " ");
//doc.SendStringToExecute("cuiunload " + menuGroupName + " ", false, false, false);
//恢复FILEDIA系统变量的值
Application.SetSystemVariable("FILEDIA", oldFileDia);
}
[CommandMethod("AddMenu")]
public void AddMenu()
{
string currentPath = GetProgramDir();//当前运行目录
//装载局部CUI文件,若不存在,则创建
CustomizationSection cs = activeDoc.AddCui(cuiFile, menuGroupName);
//添加表示绘制直线、多段线、矩形和圆的命令宏
cs.AddMacro("直线", "^C^C_Line ", "ID_MyLine", "创建直线段: LINE", currentPath + "\\Image\\Line.BMP");
cs.AddMacro("多段线", "^C^C_Pline ", "ID_MyPLine", "创建二维多段线: PLINE", currentPath + "\\Image\\Polyline.BMP");
cs.AddMacro("矩形", "^C^C_Rectang ", "ID_MyRectang", "创建矩形多段线: RECTANG", currentPath + "\\Image\\Rectangle.BMP");
cs.AddMacro("圆", "^C^C_circle ", "ID_MyCircle", "用指定半径创建圆: CIRCLE", currentPath + "\\Image\\Circle.BMP");
//添加表示复制、删除、移动及旋转操作的命令宏
cs.AddMacro("复制", "^C^CCopy ", "ID_MyCopy", "复制对象: COPY", currentPath + "\\Image\\Copy.BMP");
cs.AddMacro("删除", "^C^CErase ", "ID_MyErase", "从图形删除对象: ERASE", currentPath + "\\Image\\Erase.BMP");
cs.AddMacro("移动", "^C^CMove ", "ID_MyMove", "将对象在指定方向上平移指定的距离: MOVE", currentPath + "\\Image\\Move.BMP");
cs.AddMacro("旋转", "^C^CRotate ", "ID_MyRotate", "绕基点旋转对象: ROTATE", currentPath + "\\Image\\Rotate.BMP");
//设置用于下拉菜单别名的字符串集合
StringCollection sc = new StringCollection();
sc.Add("MyPop1");
//添加名为“我的菜单”的下拉菜单,如果已经存在,则返回null
PopMenu myMenu = cs.MenuGroup.AddPopMenu("我的菜单", sc, "ID_MyMenu");
if (myMenu != null)//如果“我的菜单”还没有被添加,则添加菜单项
{
//从上到下为“我的菜单”添加绘制直线、多段线、矩形和圆的菜单项
myMenu.AddMenuItem(-1, "直线", "ID_MyLine");
myMenu.AddMenuItem(-1, "多段线", "ID_MyPLine");
myMenu.AddMenuItem(-1, "矩形", "ID_MyRectang");
myMenu.AddMenuItem(-1, "圆", "ID_MyCircle");
myMenu.AddSeparator(-1);//为菜单添加一分隔条
//添加一个名为“修改”的子菜单
PopMenu menuModify = myMenu.AddSubMenu(-1, "修改", "ID_MyModify");
//从上到下为“修改”子菜单添加复制、删除、移动及旋转操作的菜单项
menuModify.AddMenuItem(-1, "复制", "ID_MyCopy");
menuModify.AddMenuItem(-1, "删除", "ID_MyErase");
menuModify.AddMenuItem(-1, "移动", "ID_MyMove");
menuModify.AddMenuItem(-1, "旋转", "ID_MyRotate");
}
cs.LoadCui();//必须装载CUI文件,才能看到添加的菜单
}
[CommandMethod("AddToolbar")]
public void AddToolbar()
{
//装载局部CUI文件,若不存在,则创建
CustomizationSection cs = activeDoc.AddCui(cuiFile, menuGroupName);
//添加名为“我的工具栏”的工具栏
Toolbar barDraw = cs.MenuGroup.AddToolbar("我的工具栏");
if (barDraw == null)
return;
//为“我的工具栏”添加绘制直线、多段线、矩形和圆的按钮
barDraw.AddToolbarButton(-1, "直线", "ID_MyLine");
barDraw.AddToolbarButton(-1, "多段线", "ID_MyPLine");
barDraw.AddToolbarButton(-1, "矩形", "ID_MyRectang");
barDraw.AddToolbarButton(-1, "圆", "ID_MyCircle");
//添加名为“修改工具栏”的工具栏,用于弹出式工具栏
Toolbar barModify = cs.MenuGroup.AddToolbar("修改工具栏");
if (barDraw == null)
{
cs.LoadCui();//必须装载CUI文件,才能看到添加的菜单
return;
}
//为“修改工具栏”添加复制、删除、移动及旋转操作的按钮
return newPmi;//返回菜单项对象
}
/// <summary>
/// 为下拉菜单添加子菜单
/// </summary>
/// <param name="parentMenu">下拉菜单</param>
/// <param name="index">子菜单的位置</param>
/// <param name="name">子菜单的显示名称</param>
/// <param name="tag">子菜单的标识字符串</param>
/// <returns>返回添加的子菜单</returns>
public static PopMenu AddSubMenu(this PopMenu parentMenu, int index, string name, string tag)
{
PopMenu pm=null;//声明子菜单对象(属于下拉菜单类)
//如果菜单组中没有名称为name的下拉菜单
if (parentMenu.CustomizationSection.MenuGroup.PopMenus.IsNameFree(name))
{
//为子菜单指定显示名称、标识符和所属的菜单组,别名设为null
pm = new PopMenu(name, null, tag, parentMenu.CustomizationSection.MenuGroup);
//为子菜单指定其所属的菜单
PopMenuRef menuRef=new PopMenuRef(pm, parentMenu, index);
}
return pm;//返回子菜单对象
}
/// <summary>
/// 为菜单添加分隔条
/// </summary>
/// <param name="parentMenu">下拉菜单</param>
/// <param name="index">分隔条的位置</param>
/// <returns>返回添加的分隔条</returns>
public static PopMenuItem AddSeparator(this PopMenu parentMenu, int index)
{
//定义一个分隔条并返回
return new PopMenuItem(parentMenu, index);
}
/// <summary>
/// 添加工具栏
/// </summary>
/// <param name="menuGroup">工具栏所属的菜单组</param>
/// <param name="name">工具栏的显示名称</param>
/// <returns>返回添加的工具栏</returns>
public static Toolbar AddToolbar(this MenuGroup menuGroup, string name)
{
Toolbar tb=null;//声明一个工具栏对象
//如果菜单组中没有名称为name的工具栏
if (menuGroup.Toolbars.IsNameFree(name))
{
//为工具栏指定显示名称和所属的菜单组
tb = new Toolbar(name, menuGroup);
//设置工具栏为浮动工具栏
tb.ToolbarOrient = ToolbarOrient.floating;
//设置工具栏可见
tb.ToolbarVisible = ToolbarVisible.show;
}
return tb;//返回工具栏对象
}
/// <summary>
/// 向工具栏添加按钮
/// </summary>
/// <param name="parent">按钮所属的工具栏</param>
/// <param name="index">按钮在工具栏上的位置</param>
/// <param name="name">按钮的显示名称</param>
/// <param name="macroId">按钮的命令宏的Id</param>
/// <returns>返回工具栏按钮对象</returns>
public static ToolbarButton AddToolbarButton(this Toolbar parent, int index, string name, string macroId)
{
//创建一个工具栏按钮对象,指定其命令宏Id、显示名称、所属的工具栏和位置
ToolbarButton button=new ToolbarButton(macroId, name, parent, index);
return button;//返回工具栏按钮对象
}
/// <summary>
/// 向工具栏添加弹出式工具栏
/// </summary>
/// <param name="parent">工具栏所属的父工具栏</param>
/// <param name="index">弹出式工具栏在父工具栏上的位置</param>
/// <param name="toolbarRef">弹出式工具栏所引用的工具栏</param>
public static void AttachToolbarToFlyout(this Toolbar parent, int index, Toolbar toolbarRef)
{
//创建一个弹出式工具栏,指定其所属的工具栏和位置
ToolbarFlyout flyout=new ToolbarFlyout(parent, index);
//指定弹出式工具栏所引用的工具栏
flyout.ToolbarReference = toolbarRef.Name;
//引用的工具栏初始状态不可见
toolbarRef.ToolbarVisible = ToolbarVisible.show;
}
}
}