using Autodesk.Revit.DB; using KDCS.Utils; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace KMBIM.Revit.Tools.Cmd.Hanger { public partial class FormHangerPlacement : System.Windows.Forms.Form { public enum EnumHangePlacementTypeCmd { Single, // 단독 Multi // 다중 } internal NumberFormatter numberFormatter; public double MEPCurveSize { get; set; } // <= Size public double HangerSpacing { get; set; } public double DistanceFromJoint { get; set; } public List ListFamily { get; set; } public EnumAnchorInstallBase AnchorInstallBase { get; set; } List listLevel; public int MyProperty { get; set; } private Autodesk.Revit.DB.Document Document { get; set; } public string PathFamily { get; set; } public EnumHangePlacementTypeCmd HangePlacementCmdType { get; set; } public Level Level { get; set; } public FormHangerPlacement(Autodesk.Revit.DB.Document doc) { InitializeComponent(); Document = doc; numberFormatter = new NumberFormatter(NumberFormatter.Unit.Metric); radioButtonInstallTypeStructure.Checked = true; } private bool GetValues(bool disp=true) { bool rc = true; double result = 0d; if (numberFormatter.ParseValue("5000", ref result)) { MEPCurveSize = result; } else rc = false; if (numberFormatter.ParseValue(textBoxHangerSpacing.Text, ref result)) { HangerSpacing = result; } else { if(disp) MessageBox.Show("입력값을 확인하십시오!"); rc = false; } if (numberFormatter.ParseValue(this.textBoxDistanceFromJoint.Text, ref result)) { DistanceFromJoint = result; } else { if(disp) MessageBox.Show("입력값을 확인하십시오!"); rc = false; } if (PathFamily == null) { if(disp) MessageBox.Show("자동 배치할 행거를 선택하십시오!"); rc = false; } if (radioButtonInstallTypeStructure.Checked) AnchorInstallBase = EnumAnchorInstallBase.Structrual; else AnchorInstallBase = EnumAnchorInstallBase.Level; return rc; } private void buttonPlacement_Click(object sender, EventArgs e) { if (GetValues() == false) { this.DialogResult = DialogResult.None; return; } HangePlacementCmdType = EnumHangePlacementTypeCmd.Multi; if(radioButtonInstallTypeStructure.Checked) Reg.setReg("AnchorInstallBase", EnumAnchorInstallBase.Structrual.ToString()); else Reg.setReg("AnchorInstallBase", EnumAnchorInstallBase.Level.ToString()); Reg.setReg("textBoxHangerSpacing", textBoxHangerSpacing.Text); Reg.setReg("textBoxDistanceFromJoint", textBoxDistanceFromJoint.Text); } private void AddRow(ref ListView lvw, int image_index, string item_title, params string[] subitem_titles) { // Make the item. ListViewItem new_item = lvw.Items.Add(item_title, 1); // Set the item's image index. new_item.ImageIndex = image_index; // Make the sub-items. for (int i = subitem_titles.GetLowerBound(0); i <= subitem_titles.GetUpperBound(0); i++) { new_item.SubItems.Add(subitem_titles[i]); } } private void FormHangerPlacementAuto_Load(object sender, EventArgs e) { this.KeyPreview = true; // 패밀리 이미지 설정 ListFamily = new List(); lvwHangers.LargeImageList = imageListHangers; string location = Util.GetKMBIMLibraryFolder("\\Libraries\\Hanger"); var versionNumber = this.Document.Application.VersionNumber.ToString(); var files = Util.GetLibrary("Libraries\\Hanger\\" + versionNumber, false); int i = 0; this.imageListHangers.Images.Clear(); foreach (string family_filename in files) { string fname = Path.Combine(location, string.Copy(family_filename)); string path = fname + ".png"; ListFamily.Add(family_filename); if (!File.Exists(path)) { path = Path.Combine(location, "NoImage.png"); } if (File.Exists(path)) { FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); Image original = Image.FromStream(fileStream); fileStream.Close(); this.imageListHangers.Images.Add(path, original); AddRow(ref lvwHangers, i++, family_filename); } } lvwHangers.View = System.Windows.Forms.View.Tile; // 레벨 정의 listLevel = new List(); foreach (Autodesk.Revit.DB.Level item in new Autodesk.Revit.DB.FilteredElementCollector(Document).OfCategory(BuiltInCategory.OST_Levels).OfType()) { if (item != null) { listLevel.Add(item); } } listLevel.Sort(new LevelComparer()); listLevel.Reverse(); HangerFamily hangerFamily = new HangerFamily(null); comboBoxLevel.Items.Clear(); comboBoxLevel.Items.Add("가장 가까운 레벨"); foreach(var level in listLevel){ comboBoxLevel.Items.Add(level); } comboBoxLevel.DisplayMember = "Name"; if (comboBoxLevel.Items.Count > 0) { var levelName = Reg.getReg("HangerBaseLevel"); if (string.IsNullOrEmpty(levelName) == false) { for (int iLevel = 0; iLevel < comboBoxLevel.Items.Count; iLevel++) { Level level = comboBoxLevel.Items[iLevel] as Level; if (level != null) { if (level.Name.CompareTo(levelName) == 0) { comboBoxLevel.SelectedIndex = iLevel; break; } } } if (comboBoxLevel.SelectedIndex < 0) comboBoxLevel.SelectedIndex = 0; }else comboBoxLevel.SelectedIndex = 0; } GetValues(false); string familyIndex = Reg.getReg("AutoHangerFamilyIndex"); if (!string.IsNullOrEmpty(familyIndex)) { int inx = 0; if (int.TryParse(familyIndex, out inx)) { if (inx < lvwHangers.Items.Count) { lvwHangers.Items[inx].Selected = true; lvwHangers.Select(); } } } else { if (lvwHangers.Items.Count > 0) { lvwHangers.Items[0].Selected = true; lvwHangers.Select(); } } string anchorInstallBase = Reg.getReg("AnchorInstallBase"); if (!string.IsNullOrEmpty(anchorInstallBase)) { if (anchorInstallBase.CompareTo(EnumAnchorInstallBase.Level.ToString()) == 0) this.radioButtonInstallTypeLevel.Checked = true; else this.radioButtonInstallTypeStructure.Checked = true; } string strHangerSpacing = Reg.getReg("textBoxHangerSpacing"); if (!string.IsNullOrEmpty(strHangerSpacing)) { textBoxHangerSpacing.Text = strHangerSpacing; } string strDistanceFromJoint = Reg.getReg("textBoxDistanceFromJoint"); if (!string.IsNullOrEmpty(strDistanceFromJoint)) { textBoxDistanceFromJoint.Text = strDistanceFromJoint; } } private void lvwHangers_SelectedIndexChanged(object sender, EventArgs e) { ListView.SelectedListViewItemCollection hangers = this.lvwHangers.SelectedItems; if (hangers.Count < 1) return; Reg.setReg("AutoHangerFamilyIndex", hangers[0].Index.ToString()); // Output the price to TextBox1. PathFamily = ListFamily[hangers[0].Index]; } private void buttonPlacementManual_Click(object sender, EventArgs e) { if (GetValues() == false) { this.DialogResult = DialogResult.None; return; } HangePlacementCmdType = EnumHangePlacementTypeCmd.Single; if (radioButtonInstallTypeStructure.Checked) Reg.setReg("AnchorInstallBase", EnumAnchorInstallBase.Structrual.ToString()); else Reg.setReg("AnchorInstallBase", EnumAnchorInstallBase.Level.ToString()); Reg.setReg("textBoxHangerSpacing", textBoxHangerSpacing.Text); Reg.setReg("textBoxDistanceFromJoint", textBoxDistanceFromJoint.Text); } private void comboBoxLevel_SelectedIndexChanged(object sender, EventArgs e) { Level = null; if (comboBoxLevel.SelectedIndex > 0) { Level = comboBoxLevel.Items[comboBoxLevel.SelectedIndex] as Level; if(Level!=null) Reg.setReg("HangerBaseLevel", Level.Name); else Reg.setReg("HangerBaseLevel", "-"); } } private void radioButtonInstallTypeLevel_CheckedChanged(object sender, EventArgs e) { comboBoxLevel.Enabled = true; } private void radioButtonInstallTypeStructure_CheckedChanged(object sender, EventArgs e) { comboBoxLevel.Enabled = false; } private void FormHangerPlacement_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { this.DialogResult = DialogResult.Cancel; } else if (e.KeyCode == Keys.Enter) { this.DialogResult = DialogResult.OK; } } private void textBoxHangerSpacing_KeyPress(object sender, KeyPressEventArgs e) { int keyCode = (int)e.KeyChar; if ((keyCode < 48 || keyCode > 57) && keyCode != 8 && keyCode != 46) e.Handled = true; if (keyCode == 46) { if (string.IsNullOrEmpty(textBoxHangerSpacing.Text) || textBoxHangerSpacing.Text.Contains('.') == true) e.Handled = true; } } private void textBoxDistanceFromJoint_KeyPress(object sender, KeyPressEventArgs e) { int keyCode = (int)e.KeyChar; if ((keyCode < 48 || keyCode > 57) && keyCode != 8 && keyCode != 46) e.Handled = true; if (keyCode == 46) { if (string.IsNullOrEmpty(textBoxDistanceFromJoint.Text) || textBoxDistanceFromJoint.Text.Contains('.') == true) e.Handled = true; } } } }