using Autodesk.Revit.DB; using Autodesk.Revit.UI; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace KMBIM.Revit.Tools.Cmd.BomTable { public partial class FormBom : System.Windows.Forms.Form { UIDocument uidoc = null; IList attlst = null; SortedList myCategories = new SortedList(); public Dictionary> SchCategories = new Dictionary>(); public FormBom(UIDocument udoc) { InitializeComponent(); uidoc = udoc; } private void FormBom_Load(object sender, EventArgs e) { this.KeyPreview = true; Document doc = uidoc.Document; Categories categories = doc.Settings.Categories; foreach (Category c in categories) { myCategories.Add(c.Name, c); } listBox_source.Items.Clear(); foreach (Category c in categories) { if (c.AllowsBoundParameters) listBox_source.Items.Add(c.Name); } } private void button1_Click(object sender, EventArgs e) { string item = listBox_source.SelectedItem.ToString(); if (item == "") return; listBox_target.Items.Add(item); listBox_source.Items.Remove(item); var category = myCategories[item]; SchCategories.Add(category.Id, new List()); } private void listBox_target_SelectedIndexChanged(object sender, EventArgs e) { string item = listBox_target.SelectedItem.ToString(); if (item == "") return; Transaction t = new Transaction(uidoc.Document, "Adding Schedules"); t.Start(); listBox_attribute.Items.Clear(); listBox_selAtt.Items.Clear(); var category = myCategories[item]; ViewSchedule schedule = ViewSchedule.CreateSchedule(uidoc.Document, new ElementId(category.Id.IntegerValue), ElementId.InvalidElementId); attlst = schedule.Definition.GetSchedulableFields(); foreach (SchedulableField schedulableField in schedule.Definition.GetSchedulableFields()) { //Judge if the FieldType is ScheduleFieldType.Instance. if (schedulableField.FieldType == ScheduleFieldType.Instance) { //Get ParameterId of SchedulableField. ElementId parameterId = schedulableField.ParameterId; listBox_attribute.Items.Add(schedulableField.GetName(uidoc.Document).ToString()); } } foreach(var row in SchCategories[category.Id]) { listBox_selAtt.Items.Add(row.GetName(uidoc.Document)); } uidoc.Document.Delete(schedule.Id); t.Commit(); } private void button2_Click(object sender, EventArgs e) { string item = listBox_target.SelectedItem.ToString(); if (item == "") return; listBox_source.Items.Add(item); listBox_target.Items.Remove(item); SchCategories.Remove(myCategories[item].Id); } private void button4_Click(object sender, EventArgs e) { string category_name = listBox_target.SelectedItem.ToString(); string item = listBox_attribute.SelectedItem.ToString(); if (item == "") return; if (category_name == "") return; listBox_selAtt.Items.Add(item); listBox_attribute.Items.Remove(item); var row = attlst .Cast() .SingleOrDefault(i => i.GetName(uidoc.Document) == item); if (row != null) SchCategories[myCategories[category_name].Id].Add(row); } private void button3_Click(object sender, EventArgs e) { string category_name = listBox_target.SelectedItem.ToString(); string item = listBox_selAtt.SelectedItem.ToString(); if (item == "") return; if (category_name == "") return; listBox_attribute.Items.Add(item); listBox_selAtt.Items.Remove(item); var row = attlst .Cast() .SingleOrDefault(i => i.GetName(uidoc.Document) == item); if (row != null) SchCategories[myCategories[category_name].Id].Remove(row); } private void button_up_Click(object sender, EventArgs e) { MoveItem(-1, listBox_selAtt); } private void button_down_Click(object sender, EventArgs e) { MoveItem(1, listBox_selAtt); } public void MoveItem(int direction, ListBox listBox) { // Checking selected item if (listBox.SelectedItem == null || listBox.SelectedIndex < 0) return; // No selected item - nothing to do int originIndex = listBox.SelectedIndex; // Calculate new index using move direction int newIndex = listBox.SelectedIndex + direction; // Checking bounds of the range if (newIndex < 0 || newIndex >= listBox.Items.Count) return; // Index out of range - nothing to do object selected = listBox.SelectedItem; // Removing removable element listBox.Items.Remove(selected); // Insert it in new position listBox.Items.Insert(newIndex, selected); // Restore selection listBox.SetSelected(newIndex, true); string item = listBox_target.SelectedItem.ToString(); var category = myCategories[item]; // KDCS.Utils.Util.Swap(SchCategories[category], originIndex, newIndex); } private void listBox_attribute_SelectedIndexChanged(object sender, EventArgs e) { //listBox_selAtt.Items.Clear(); } private void listBox_source_SelectedIndexChanged(object sender, EventArgs e) { } private void FormBom_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { this.DialogResult = DialogResult.Cancel; } else if (e.KeyCode == Keys.Enter) { this.DialogResult = DialogResult.OK; } } } }