Displaying Properties in Dockpane

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
I have displayed the dockpane in revit using external command and after dispalying dockpane Im trying to bind the tyep and instance properties in dockpane I have kept tabcontrol in dockpane.But the expection occurs while selecting the element active view is no graphical so pickobject cannot be used..Help me to bind the properties data as Im new to revit api..Thanks in advance.. Here is my code..and screenshot
namespace DockableDialog
{
[Transaction(TransactionMode.Manual)]
public class Ribbon : IExternalApplication
{
public Result OnStartup( UIControlledApplication a )
{
a.CreateRibbonTab( "DOCK" );
RibbonPanel DockPanel = a.CreateRibbonPanel( "DOCK", "DOCK" );
string path = Assembly.GetExecutingAssembly().Location;
PushButtonData pushButtonRegisterDockableWindow = new PushButtonData( "RegisterDockableWindow", "RegisterDockableWindow", path, "DockableDialog.RegisterDockableWindow" );
pushButtonRegisterDockableWindow.LargeImage = GetImage( Resources.green.GetHbitmap() );
pushButtonRegisterDockableWindow.AvailabilityClassName = "DockableDialog.AvailabilityNoOpenDocument";
PushButtonData pushButtonShowDockableWindow = new PushButtonData( "Show DockableWindow", "Show DockableWindow", path, "DockableDialog.ShowDockableWindow" );
pushButtonShowDockableWindow.LargeImage = GetImage( Resources.red.GetHbitmap() );
PushButtonData pushButtonHideDockableWindow = new PushButtonData( "Hide DockableWindow", "Hide DockableWindow", path, "DockableDialog.HideDockableWindow" );
pushButtonHideDockableWindow.LargeImage = GetImage( Resources.orange.GetHbitmap() );
PushButtonData pushButtonShowProperties = new PushButtonData("Show Properties", "Show Properties", path, "DockableDialog.ShowProperties");
pushButtonShowProperties.LargeImage = GetImage(Resources.green.GetHbitmap());
RibbonItem ri1 = DockPanel.AddItem( pushButtonRegisterDockableWindow );
RibbonItem ri2 = DockPanel.AddItem( pushButtonShowDockableWindow );
RibbonItem ri3 = DockPanel.AddItem( pushButtonHideDockableWindow );
RibbonItem ri4 = DockPanel.AddItem(pushButtonShowProperties);
return Result.Succeeded;
}
public Result OnShutdown( UIControlledApplication a )
{
return Result.Succeeded;
}
private System.Windows.Media.Imaging.BitmapSource GetImage( IntPtr bm )
{
System.Windows.Media.Imaging.BitmapSource bmSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( bm,IntPtr.Zero,System.Windows.Int32Rect.Empty,System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions() );
return bmSource;
}
}
public class AvailabilityNoOpenDocument : IExternalCommandAvailability
{
public bool IsCommandAvailable(UIApplication a, CategorySet b)
{
if (a.ActiveUIDocument == null)
{
return true;
}
return true;
//if (a.Application.Product == ProductType.Structure) return false;
//if (a.Application.Product == ProductType.MEP) return false;
//if (b.IsEmpty) return true;
//Categories allCats = a.ActiveUIDocument.Document.Settings.Categories;
//Category cat = allCats.get_Item(BuiltInCategory.OST_Walls);
//if (b.Contains(cat)) return true;
//cat = allCats.get_Item(BuiltInCategory.OST_Windows);
//if (b.Contains(cat)) return true;
//cat = allCats.get_Item(BuiltInCategory.OST_Stairs);
//if (b.Contains(cat)) return true;
//return false;
}
}
/// <summary>
/// Register your dockable dialog
/// </summary>
[Transaction( TransactionMode.Manual )]
public class RegisterDockableWindow : IExternalCommand
{
MainPage m_MyDockableWindow = null;
public Result Execute( ExternalCommandData commandData, ref string message, ElementSet elements )
{
DockablePaneProviderData data = new DockablePaneProviderData();
MainPage MainDockableWindow = new MainPage();
m_MyDockableWindow = MainDockableWindow;
//MainDockableWindow.SetupDockablePane(me);
data.FrameworkElement = MainDockableWindow as System.Windows.FrameworkElement;
data.InitialState = new DockablePaneState();
data.InitialState.DockPosition = DockPosition.Tabbed;
data.InitialState.TabBehind = DockablePanes.BuiltInDockablePanes.ProjectBrowser;
DockablePaneId dpid = new DockablePaneId(new Guid("{D7C963CE-B7CA-426A-8D51-6E8254D21157}"));
// DockablePaneId dpid = new DockablePaneId(Guid.NewGuid());
commandData.Application.RegisterDockablePane( dpid, "AEC Dockable Window", MainDockableWindow as IDockablePaneProvider );
commandData.Application.ViewActivated += new EventHandler<ViewActivatedEventArgs>( Application_ViewActivated );
return Result.Succeeded;
}
private void Application_ViewActivated( object sender, ViewActivatedEventArgs e )
{
m_MyDockableWindow.lblProjectName.Content = e.Document.ProjectInformation.Name;
}
}
[Transaction( TransactionMode.ReadOnly )]
public class ShowDockableWindow : IExternalCommand
{
public Result Execute(ExternalCommandData commandData,ref string message,ElementSet elements )
{
DockablePaneId dpid = new DockablePaneId(new Guid("{D7C963CE-B7CA-426A-8D51-6E8254D21157}"));
//DockablePaneId dpid = new DockablePaneId(Guid.NewGuid());
DockablePane dp = commandData.Application.GetDockablePane(dpid);
dp.Show();
return Result.Succeeded;
}
}
[Transaction(TransactionMode.ReadOnly)]
public class ShowProperties : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiapp = commandData.Application;
UIDocument uiDoc = uiapp.ActiveUIDocument;
Document doc = uiDoc.Document;
Reference pickedRef = null;
Selection selobj = uiapp.ActiveUIDocument.Selection;
pickedRef = selobj.PickObject(ObjectType.Element, "Select");
Element element = doc.GetElement(pickedRef);
FamilyInstance fmlInst = element as FamilyInstance;
ElementId id = element.GetTypeId();
ElementType type = doc.GetElement(id) as ElementType;
var elemen = doc.GetElement(element.GetTypeId());
MainPage pageDisplay = new MainPage();
if (fmlInst == null)
{
var t = type.Parameters;
var wallParam = element.Parameters;
List<PropertiesDetails> Parameters = new List<PropertiesDetails>();
List<Details> tparameters = new List<Details>();
foreach (Parameter wallPara in t)
{
Details param = new Details();
var parameterName = wallPara.Definition.Name;
string parameterNam = wallPara.AsValueString();
param.name = parameterName;
param.nam = parameterNam;
tparameters.Add(param);
}
pageDisplay.Assign(tparameters);
foreach (Parameter wallParameters in wallParam)
{
PropertiesDetails paramdetails = new PropertiesDetails();
var name = wallParameters.Definition.Name;
string nam = wallParameters.AsValueString();
paramdetails.PropertyName = name;
paramdetails.PropertyValue = nam;
Parameters.Add(paramdetails);
}
pageDisplay.Assign1(Parameters);
}
else
{
var symbol = doc.GetElement(id) as FamilySymbol;
var param = element.Parameters;
List<Details> tparamdetails1 = new List<Details>();
List<PropertiesDetails> familyparameters = new List<PropertiesDetails>();
/// var c = element.symbol;
foreach (Parameter tparam in symbol.Parameters)
{
Details tparamdetails = new Details();
var name = tparam.Definition.Name;
string nam = tparam.AsValueString();
tparamdetails.name = name;
tparamdetails.nam = nam;
tparamdetails1.Add(tparamdetails);
}
pageDisplay.Assign(tparamdetails1);
foreach (Parameter finstparameter in param)
{
PropertiesDetails paramdetails = new PropertiesDetails();
var name = finstparameter.Definition.Name;
string nam = finstparameter.AsValueString();
paramdetails.PropertyName = name;
paramdetails.PropertyValue = nam;
familyparameters.Add(paramdetails);
}
//pageDisplay.Assign1(familyparameters);
//DockablePaneId dpid = new DockablePaneId(new Guid("{D7C963CE-B7CA-426A-8D51-6E8254D21157}"));
////DockablePaneId dpid = new DockablePaneId(Guid.NewGuid());
//DockablePane dp = commandData.Application.GetDockablePane(dpid);
//dp.Show();
}
return Result.Succeeded;
}
}
public class Details
{
public string name { get; set; }
public string nam { get; set; }
}
public class PropertiesDetails
{
public string PropertyName { get; set; }
public string PropertyValue { get; set; }
}
[Transaction( TransactionMode.ReadOnly )]
public class HideDockableWindow : IExternalCommand
{
public Result Execute( ExternalCommandData commandData, ref string message, ElementSet elements )
{
DockablePaneId dpid = new DockablePaneId(new Guid("{D7C963CE-B7CA-426A-8D51-6E8254D21157}"));
// DockablePaneId dpid = new DockablePaneId(Guid.NewGuid());
DockablePane dp = commandData.Application.GetDockablePane( dpid );
dp.Hide();
return Result.Succeeded;
}
}
}
xaml -
<Page x:Class="DockableDialog.Forms.MainPage"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib"
Title="Dockable Dialogs" Height="600" Width="600"
x:Name="DockableDialogs" Background="LightGray" Loaded="DockableDialogs_Loaded">
<Grid>
<!--<TabControl>
<TabItem Header="Type Parameter">
<Label Content="Content goes here..." />
</TabItem>
<TabItem Header="InstanceParameter" />
<TabItem Header="Details" />
</TabControl>-->
<DockPanel Height="500" Width="550">
<TabControl Name="Sample" Width="540">
<TabItem Header="Type Parameter">
<DataGrid Name="DataGrid" AutoGenerateColumns="False" Margin="10,10,10,10" HorizontalAlignment="Left" Width="500" >
<DataGrid.Columns>
<DataGridTextColumn Header="Parameter" Width="300" Binding="{Binding name}" />
<DataGridTextColumn Header="Value" Width="200" Binding="{Binding nam}" />
</DataGrid.Columns>
</DataGrid>
</TabItem>
<TabItem Header="Instance Parameter" >
<DataGrid Name="DataGrids" AutoGenerateColumns="False" Margin="10,10,-20,10" HorizontalAlignment="Left" Width="300" >
<DataGrid.Columns>
<DataGridTextColumn Header="Parameter" Width="150" Binding="{Binding PropertyName}" />
<DataGridTextColumn Header="Value" Width="150" Binding="{Binding PropertyValue}" />
</DataGrid.Columns>
</DataGrid>
</TabItem>
</TabControl>
</DockPanel>
<Label Content="Label" Height="26" HorizontalAlignment="Left" Margin="25,24,0,0" Name="lblProjectName" VerticalAlignment="Top" Width="176" />
</Grid>
</Page>
xaml.cs-
namespace DockableDialog.Forms
{
public partial class MainPage : Page, Autodesk.Revit.UI.IDockablePaneProvider
{
public static MainPage myMainWindow;
public MainPage()
{
InitializeComponent();
myMainWindow = this;
}
public void Assign(List<Details> properties)
{
DataGrid.ItemsSource = properties;
}
public void Assign1(List<PropertiesDetails> properties)
{
DataGrids.ItemsSource = properties;
}
public void SetupDockablePane(Autodesk.Revit.UI.DockablePaneProviderData data)
{
data.FrameworkElement = this as FrameworkElement;
data.InitialState = new Autodesk.Revit.UI.DockablePaneState();
data.InitialState.DockPosition = DockPosition.Tabbed;
data.InitialState.TabBehind = Autodesk.Revit.UI.DockablePanes.BuiltInDockablePanes.ProjectBrowser;
}
private void DockableDialogs_Loaded(object sender, RoutedEventArgs e)
{
}
}
}