查看: 4540|回复: 11

求助~二次开发中,怎么在Revit中添加窗体?

[复制链接]

发表于 2011-5-17 19:14:42 | 显示全部楼层 |阅读模式
用VS2008开发插件,往Revit中添加一些窗体,就像这个图片这样的~要怎么弄呢?开发指南上也没有说啊,是要先在VS2008中创建一个窗体,再编写代码添加吗?~不懂,求助~
窗体.png
回复

使用道具 举报

 楼主| 发表于 2011-5-17 19:16:45 | 显示全部楼层
本帖最后由 幽落 于 2011-5-17 19:17 编辑

啊对了,在工具栏上有显示这个~
工具栏.png
回复 支持 反对

使用道具 举报

发表于 2011-5-18 08:14:35 | 显示全部楼层
本帖最后由 revitapi 于 2011-5-18 08:15 编辑

我晕,那是Ribbon
要学习二次开发吗?
到我论坛来吧。

Revit 2011 二次开发之Ribbon
Revit 2011之后取消了菜单和工具条,全部使用Ribbon即按钮组,如图



步骤一:
新建类库项目Ribbon
修改命名空间为HY
修改Class1.cs为Ribbon.cs用来控制按钮显示
添加一个类AddInCommand.cs用来响应命令

步骤二:
引入类库
RevitAPI.dll
RevitAPIUI.dll
System.Windows.Forms;
PresentationCore
WindowBase

Ribbon.csusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;
using System.Windows.Forms;
using System.Windows.Media.Imaging;

using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;

namespace HY
{
    [Transaction(TransactionMode.Automatic)]
    [Regeneration(RegenerationOption.Manual)]
    [Journaling(JournalingMode.NoCommandData)]
    public
class Ribbon : IExternalApplication
    {
        // 程序集路径

static
string AddInPath =
typeof(Ribbon).Assembly.Location;
        // 按钮图标目录

static
string ButtonIconsFolder = Path.GetDirectoryName(AddInPath);
        // uiApplication
        //static UIApplication uiApplication = null;

#region IExternalApplication Members
public Autodesk.Revit.UI.Result OnStartup(UIControlledApplication application)
        {
            try
            {
                CreateRibbonSamplePanel(application);

                return Autodesk.Revit.UI.Result.Succeeded;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Ribbon Sample");

                return Autodesk.Revit.UI.Result.Failed;
            }
        }

        public Autodesk.Revit.UI.Result OnShutdown(UIControlledApplication application)
        {
            return Autodesk.Revit.UI.Result.Succeeded;
        }

        #endregion
private
void CreateRibbonSamplePanel(UIControlledApplication application)
        {
            //RibbonPanel显示一个大按钮,图标为第一个按钮的图标

string firstPanelName =
"Ribbon 实例";//面板底部文字提示
            RibbonPanel ribbonSamplePanel = application.CreateRibbonPanel(firstPanelName);

            #region 创建墙和结构墙
//RibbonPanel(面板)->SplitButton(按钮组)->PushButton(按钮)
            SplitButtonData splitButtonData =
new SplitButtonData("NewWallSplit", "创建墙");//按钮数据,按钮组显示的文字为第一个按钮的文字
            SplitButton splitButton = ribbonSamplePanel.AddItem(splitButtonData) as SplitButton;//添加到面板

            //PushButton pushButton = splitButton.AddPushButton(new PushButtonData("WallPush", "普通墙", AddInPath, "Revit.SDK.Samples.Ribbon.CS.CreateWall"));
            //最后一个参数是执行按钮事件的响应类名
            PushButtonData pushButtonDataWall =
new PushButtonData("WallPush", "普通墙", AddInPath, "HY.CreateWall");
            PushButton pushButton = splitButton.AddPushButton(pushButtonDataWall);
            //大图标,小图标
            pushButton.LargeImage =
new BitmapImage(new Uri(Path.Combine(ButtonIconsFolder, "CreateWall.png"), UriKind.Absolute));
            pushButton.Image =
new BitmapImage(new Uri(Path.Combine(ButtonIconsFolder, "CreateWall-S.png"), UriKind.Absolute));
            //提示文字,提示图片
            pushButton.ToolTip =
"Creates a partition wall in the building model.";
            pushButton.ToolTipImage =
new BitmapImage(new Uri(Path.Combine(ButtonIconsFolder, "CreateWallTooltip.bmp"), UriKind.Absolute));

            //按钮组里第二个按钮
            pushButton = splitButton.AddPushButton(new PushButtonData("StrWallPush", "结构墙", AddInPath, "HY.CreateStructureWall"));
            pushButton.LargeImage =
new BitmapImage(new Uri(Path.Combine(ButtonIconsFolder, "StrcturalWall.png"), UriKind.Absolute));
            pushButton.Image =
new BitmapImage(new Uri(Path.Combine(ButtonIconsFolder, "StrcturalWall-S.png"), UriKind.Absolute));

            #endregion

            ribbonSamplePanel.AddSeparator();
        }
    }
}

AddInCommand.csusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows.Forms;

using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;

namespace HY
{
    [Transaction(TransactionMode.Automatic)]
    [Regeneration(RegenerationOption.Manual)]
    [Journaling(JournalingMode.NoCommandData)]
    public
class CreateWall : IExternalCommand
    {
        public Result Execute(ExternalCommandData revit,ref
string message,ElementSet elements)
        {
            MessageBox.Show("创建墙");

            return Autodesk.Revit.UI.Result.Succeeded;
        }
    }

    [Transaction(TransactionMode.Automatic)]
    [Regeneration(RegenerationOption.Manual)]
    public
class CreateStructureWall : CreateWall
    {
    }
}

Ribbon.addin<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
<AddIn Type="Application">
<Name>External Tool</Name>
<Assembly>F:\Ribbon\Ribbon\bin\Debug\Ribbon.dll</Assembly>
<ClientId>cb5c768a-dc2f-4289-a803-58ee5afc5708</ClientId>
<FullClassName>HY.Ribbon</FullClassName>
</AddIn>
</RevitAddIns>

参考上篇:http://www.cnblogs.com/greatverve/archive/2011/03/08/revit-api-begin.html
源码:http://files.cnblogs.com/greatverve/Ribbon.rar

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2011-5-18 08:16:42 | 显示全部楼层
如果要显示一个窗体,可以这样。
Execute()
{
Form1 form1 = new Form1();
form1.Show();
}
回复 支持 反对

使用道具 举报

发表于 2011-5-18 08:21:23 | 显示全部楼层
Revit 2011二次开发“弹出对话框,得到输入的值”
新建一个窗体FrmDlg.cs

编辑框txtVal
按钮btnOk using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace RevitCodes
{
   
public
partial
class FrmDlg : Form
    {
        
public
string Val
        {
            
get { return txtVal.Text; }
            
set { txtVal.Text = value; }
        }
        
public FrmDlg()
        {
            InitializeComponent();
        }

        
private
void btnOk_Click(object sender, EventArgs e)
        {
            
this.DialogResult = DialogResult.OK;
        }
    }
}


调用 #region 弹出对话框,得到输入的值
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public
class GetDialogValue : IExternalCommand
{
   
public Result Execute(ExternalCommandData commandData, ref
string messages, ElementSet elements)
    {
        FrmDlg frmDlg
=
new FrmDlg();
        frmDlg.ShowDialog();
        
if (frmDlg.DialogResult == DialogResult.OK)
        {
            MessageBox.Show(
"得到的值为:\n"
+ frmDlg.Val);
        }
        frmDlg.Dispose();
        
return Result.Succeeded;
    }
}
#endregion




凡事以大气象去面对,优秀是一种习惯。


回复 支持 反对

使用道具 举报

发表于 2011-5-18 09:39:30 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-18 10:11:15 | 显示全部楼层
高手~感激~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-18 10:15:48 | 显示全部楼层
利用插件能不能调用图元的属性啊?Revit有自己的数据库吗?图元的各种属性参数都是在哪存储呢?
比如,搜索所有墙类型的材质,然后在插件的窗体中显示这些材质的信息~
回复 支持 反对

使用道具 举报

发表于 2011-5-18 10:55:30 | 显示全部楼层
回复 幽落 的帖子

这个和cad不一样。不是图元的属性,而是族参数。
搜索墙类型的材质,在我看来是api中的过滤器,
过滤族类型,族类别,族实例,族符号。
FamilyType,FamilySymbol,FamilyInstance等..
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-5-18 12:16:06 | 显示全部楼层
那如何利用C#代码调用Revit的族中的信息呢?~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则