Displaying Properties in Dockpane

Displaying Properties in Dockpane

Anonymous
Not applicable
2,113 Views
7 Replies
Message 1 of 8

Displaying Properties in Dockpane

Anonymous
Not applicable

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)
{

}

}
}

0 Likes
2,114 Views
7 Replies
Replies (7)
Message 2 of 8

jeremytammik
Autodesk
Autodesk

In general, in a dockable panel, you are in a modeless context. Therefore, you are not in a valid Revit API context and lack access to the Revit API, let alone the active document. You can work around that by implementing an external event to obtain a valid Revit API context and communicate from the dockable panel back to the Revit API:

 

https://thebuildingcoder.typepad.com/blog/about-the-author.html#5.28

 



Jeremy Tammik
Developer Technical Services
Autodesk Developer Network, ADN Open
The Building Coder

Message 3 of 8

Anonymous
Not applicable

Hi jeremy,

Please help me with which external event to use as I am new to revit I have no idea of external events.Thanks 

0 Likes
Message 4 of 8

jeremy_tammik
Alumni
Alumni

Dear Lallu,

 

Please read all there is to know about external events in the discussions I already pointed out:

 

https://thebuildingcoder.typepad.com/blog/about-the-author.html#5.28

 

Those discussion include just about all I or anyone else knows about this.

 

Best regards and Happy New Year!

 

Jeremy

 

Jeremy Tammik Developer Advocacy and Support + The Building Coder + Autodesk Developer Network + ADN Open
Message 5 of 8

Anonymous
Not applicable

Happy new year.Sorry for the late reply as I'm busy with some other project in autocad. Now again coming to revit I have studied all the article related to external events.Help me with some sample code solution.

 

 

 

Regards

Palanivelan

0 Likes
Message 6 of 8

Revitalizer
Advisor
Advisor

Hi,

 

the problem may be that the focus is lost:

https://forums.autodesk.com/t5/revit-api-forum/bring-focus-to-graphical-view/m-p/8245732#M33222

 

Revitalizer




Rudolf Honke
Software Developer
Mensch und Maschine





0 Likes
Message 7 of 8

reylorente1
Collaborator
Collaborator

Hola,Llegaste a una solucion? 

Hi, did you find a solution?

 

0 Likes
Message 8 of 8

reylorente1
Collaborator
Collaborator

TypeTypeEs tEEEEEEEEEEEEEEqqqqqqInstanceInstance

0 Likes