// // (C) Copyright 2003-2019 by Autodesk, Inc. // // Permission to use, copy, modify, and distribute this software in // object code form for any purpose and without fee is hereby granted, // provided that the above copyright notice appears in all copies and // that both that copyright notice and the limited warranty and // restricted rights notice below appear in all supporting // documentation. // // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE // UNINTERRUPTED OR ERROR FREE. // // Use, duplication, or disclosure by the U.S. Government is subject to // restrictions set forth in FAR 52.227-19 (Commercial Computer // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. // using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; using Autodesk.Revit.DB; using Autodesk.Revit.UI; namespace Revit.SDK.Samples.UIAPI.CS { public partial class FurnitureFamilyDragAndDropForm : System.Windows.Forms.Form { public static BuiltInCategory FamilyCategory { get { return BuiltInCategory.OST_Furniture; } } private static FurnitureFamilyDragAndDropForm s_form; public static FurnitureFamilyDragAndDropForm GetTheForm(Document document) { if (s_form == null) { s_form = new FurnitureFamilyDragAndDropForm(document); } s_form.UpdateLoadedFamilies(); return s_form; } /// /// Display class for the external family file listbox. /// private class FamilyListBoxMember { public string FullPath; public string Name; public FamilyListBoxMember(string fullPath, string name) { FullPath = fullPath; Name = name; } public override String ToString() { return Name; } } private Document m_document; /// /// Construct and populate the form. /// /// private FurnitureFamilyDragAndDropForm(Document document) { InitializeComponent(); m_document = document; UpdateFamilyFileList(); } private void UpdateFamilyFileList() { // Visit each Revit library looking for Furniture families IDictionary libraryPaths = m_document.Application.GetLibraryPaths(); foreach (String libraryPath in libraryPaths.Values) { foreach (String directory in System.IO.Directory.EnumerateDirectories(libraryPath, "*Furniture", SearchOption.AllDirectories)) { foreach (String familyFile in System.IO.Directory.EnumerateFiles(directory, "*.rfa", SearchOption.AllDirectories)) { // Add each Furniture family to the listbox String fileName = Path.GetFileName(familyFile); FamilyListBoxMember member = new FamilyListBoxMember(familyFile, fileName); listBox1.Items.Add(member); } } } } private void UpdateLoadedFamilies() { ListView.ListViewItemCollection collection = listView1.Items; collection.Clear(); // Setup list view with loaded families ImageList imageList = new ImageList(); Size size = new Size(50, 50); imageList.ImageSize = size; FilteredElementCollector collector = new FilteredElementCollector(m_document); collector.OfCategory(FamilyCategory); collector.OfClass(typeof(FamilySymbol)); foreach (FamilySymbol familySymbol in collector.Cast()) { ListViewItem item = new ListViewItem(); item.Tag = familySymbol.Id; item.Text = familySymbol.Family.Name + "::" + familySymbol.Name; item.ToolTipText = "Drag to place instances of " + item.Text + " in the active document."; Bitmap bitmap = familySymbol.GetPreviewImage(size); if (bitmap != null) { imageList.Images.Add(bitmap); int index = imageList.Images.Count - 1; item.ImageIndex = index; } collection.Add(item); } listView1.LargeImageList = imageList; } // Drag action from list view private void listView_MouseMove(object sender, MouseEventArgs e) { if (System.Windows.Forms.Control.MouseButtons == MouseButtons.Left) { ListViewItem selectedItem = this.listView1.SelectedItems.Cast().FirstOrDefault(); if (selectedItem != null) { // Use custom Revit drag and drop behavior LoadedFamilyDropHandler myhanlder = new LoadedFamilyDropHandler(); UIApplication.DoDragDrop(selectedItem.Tag, myhanlder); } } } // Drag action from list box private void listBox1_MouseMove(object sender, MouseEventArgs e) { if (System.Windows.Forms.Control.MouseButtons == MouseButtons.Left) { FamilyListBoxMember member = (FamilyListBoxMember)listBox1.SelectedItem; // Use standard Revit drag and drop behavior List data = new List(); data.Add(member.FullPath); UIApplication.DoDragDrop(data); } } private void FurnitureFamilyDragAndDropForm_FormClosed(object sender, FormClosedEventArgs e) { s_form = null; } } /// /// Custom handler for placement of loaded family types /// public class LoadedFamilyDropHandler : IDropHandler { public void Execute(UIDocument document, object data) { try { ElementId familySymbolId = (ElementId)data; FamilySymbol symbol = document.Document.GetElement(familySymbolId) as FamilySymbol; if (symbol != null) { document.PromptForFamilyInstancePlacement(symbol); } } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { // user canceled the operation } } } }