using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using Autodesk.Revit.DB; using Autodesk.Revit.Creation; using Autodesk.Revit.DB.Structure; using System.Drawing.Imaging; using System.Windows; using System.Diagnostics; using System.IO; using KDCS.Utils; using Autodesk.Revit.DB.Plumbing; namespace KMBIM { public partial class Form_PipeRack : System.Windows.Forms.Form { public Autodesk.Revit.UI.ExternalCommandData revit; public Level level; public int m_Extend, m_Radidx = 0; public string m_LvlSet, m_LvlCurrent; public double m_MarginDist; private double m_offset; private Pipe m_MaxPipe = null, m_MinPipe = null; public double Offset { get { return m_offset; } set { m_offset = value; } } public Pipe MaxDiaPipe { get { return m_MaxPipe; } set { m_MaxPipe = value; } } public Pipe MinOffPipe { get { return m_MinPipe; } set { m_MinPipe = value; } } public Form_PipeRack() { InitializeComponent(); } private void Form_PipeRack_Load(object sender, EventArgs e) { this.KeyPreview = true; UIApplication uiapp = revit.Application; UIDocument uidoc = uiapp.ActiveUIDocument; Autodesk.Revit.DB.Document doc = uidoc.Document; Level level = doc.ActiveView.GenLevel; List levelList = null; if (level != null) { txt_CurrentLevel.Text = level.Name; m_LvlCurrent = level.Name; } else { txt_CurrentLevel.Text = "Unknown"; m_LvlCurrent = "Unknown"; } //레벨 가져오기 levelList = getLevel(); //레벨 리스트 목록 콤보박스 추가 foreach (Element l in levelList) { Level lvl = l as Level; combo_SetLevel.Items.Add(lvl.Name); } //파이프 레벨 Level PipeLevel = null; if (MinOffPipe != null) PipeLevel = MinOffPipe.ReferenceLevel; else PipeLevel = MaxDiaPipe.ReferenceLevel; if (PipeLevel != null) { foreach(Level lvl in levelList) { if (PipeLevel.Name == lvl.Name) { int idx = combo_SetLevel.FindString(lvl.Name); if (idx != -1) { combo_SetLevel.SelectedIndex = idx; break; } } } } else//파이프 레벨이 없으면 콤보박스 첫번쨰로 { combo_SetLevel.SelectedIndex = 0; } ////콤보박스 저장된 레벨 값 불러오기, 없으면 첫번쨰 레벨 //if (levelList.Count > 0)// //{ // if (Reg.getReg("DownPipeRack_Combo_SelLevel") == "") // { // Level lvl = levelList[0] as Level; // Reg.setReg("DownPipeRack_Combo_SelLevel", lvl.Name); // combo_SetLevel.SelectedIndex = 0; // } // else // { // string str_SelectLevel = Reg.getReg("DownPipeRack_Combo_SelLevel"); // foreach (Element elem in levelList) // { // Level lvl = elem as Level; // if (str_SelectLevel == lvl.Name) // { // int idx = combo_SetLevel.FindString(lvl.Name); // if (idx != -1) // { // combo_SetLevel.SelectedIndex = idx; // break; // } // } // else // combo_SetLevel.SelectedIndex = 0; // } // } //} //볼트 타입 if (Reg.getReg("Rack_Type") == "") { m_Radidx = 0; Reg.setReg("Rack_Type", "" + m_Radidx); } else { string str_RadIdx = Reg.getReg("Rack_Type"); m_Radidx = int.Parse(str_RadIdx); if (m_Radidx == 0) rad_guideShoe.Checked = true; else if (m_Radidx == 1) rad_Ubolt.Checked = true; else if (m_Radidx == 2) radNon.Checked = true; } //가대 말단 거리 if (Reg.getReg("Rack_MarginDist")!="" || Reg.getReg("Rack_MarginDist") != string.Empty) { m_MarginDist = Convert.ToDouble(Reg.getReg("Rack_MarginDist")); txt_RackMarginDist.Text = m_MarginDist.ToString(); } else { //가대 말단 거리 기본값 200 txt_RackMarginDist.Text = "200"; m_MarginDist = 200; } } //배치 Level 콤보박스 값 변경 private void combo_SetLevel_SelectedIndexChanged(object sender, EventArgs e) { m_Extend = combo_SetLevel.SelectedIndex; m_LvlSet = combo_SetLevel.SelectedItem.ToString(); //Reg.setReg("DownPipeRack_Combo_SelLevel", m_LvlSet); } //배치 Level 콤보박스 그리기 private void combo_SetLevel_DrawItem(object sender, DrawItemEventArgs e) { System.Windows.Forms.ComboBox cbx = sender as System.Windows.Forms.ComboBox; if (cbx != null) { e.DrawBackground(); if (e.Index >= 0) { StringFormat sf = new StringFormat(); sf.LineAlignment = StringAlignment.Center; sf.Alignment = StringAlignment.Far; Brush brush = new SolidBrush(cbx.ForeColor); if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) brush = SystemBrushes.HighlightText; e.Graphics.DrawString(cbx.Items[e.Index].ToString(), cbx.Font, brush, e.Bounds, sf); } } } //가대 말단 거리 텍스트박스 private void txt_RackMarginDist_TextChanged(object sender, EventArgs e) { if (txt_RackMarginDist.Text == "") return; if (txt_RackMarginDist.Text != "-") { m_MarginDist = Convert.ToDouble(txt_RackMarginDist.Text); Reg.setReg("Rack_MarginDist", txt_RackMarginDist.Text.ToString()); } } private void rad_guideShoe_CheckedChanged(object sender, EventArgs e) { m_Radidx = 0; Reg.setReg("Rack_Type", "" + m_Radidx); } private void rad_Ubolt_CheckedChanged(object sender, EventArgs e) { m_Radidx = 1; Reg.setReg("Rack_Type", "" + m_Radidx); } private void radNon_CheckedChanged(object sender, EventArgs e) { m_Radidx = 2; Reg.setReg("Rack_Type", "" + m_Radidx); } private void Form_PipeRack_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { //this.Close(); this.DialogResult = DialogResult.Cancel; } else if (e.KeyCode == Keys.Enter) { this.DialogResult = DialogResult.OK; } } private void txt_RackMarginDist_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(txt_RackMarginDist.Text) || txt_RackMarginDist.Text.Contains('.') == true) e.Handled = true; } } private List getLevel() { this.Hide(); UIApplication uiapp = revit.Application; UIDocument uidoc = uiapp.ActiveUIDocument; Autodesk.Revit.DB.Document doc = uidoc.Document; Autodesk.Revit.DB.View view = doc.ActiveView; ElementId levelId = null; List ElemList = new List(); Autodesk.Revit.DB.Parameter level = view.LookupParameter("Associated Level"); FilteredElementCollector lvlCollector = new FilteredElementCollector(doc); ICollection lvlCollection = lvlCollector.OfClass(typeof(Level)).ToElements(); foreach (Element l in lvlCollection) { Level lvl = l as Level; ElemList.Add(lvl); //MessageBox.Show("" + lvl.Name); } return ElemList; } } }