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; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Plumbing; using Autodesk.Revit.UI; using KDCS.Utils; using KMBIM.Revit.Tools.Cmd.Assembly; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace KMBIM { public partial class Form_Assembly : System.Windows.Forms.Form { public UIDocument m_uidoc = null; public Document m_doc = null; public AssemTblDataStorage AssemData = new AssemTblDataStorage(); public string m_AssemStr = null; public int m_TypeIdx = 0, m_PartsComboIdx = 0, m_ValpartsIdx = 0, m_AssemblyIdx, m_AttachComboIdx = 0; public double PipeDist = 0, Main2SubDist = 0, m_MainTotalDist = 0, m_SubTotalDist = 0; public string m_partsName, m_AttachName; public List m_NonSymbolLst = new List(); public List info_ValSymLst = new List(); public List info_AttSymLst = new List(); public List NonNomRadLst = new List(); public List m_MainDataLst = new List(); public List m_SubDataLst = new List(); public Pipe mainPipe = null; public double subDia = 0; public Form_Assembly() { InitializeComponent(); } private void Form_Assembly_Load(object sender, EventArgs e) { this.KeyPreview = true; //유형 라디오 Rad_Assem_Type1.Checked = true; //메인 어셈블리 rad_Assem_Main.Checked = true; //밸브 콤보박스 라디오 Rad_Assem_parts.Checked = true; //밸브 콤보박스 값 넣기 foreach (KMBIM.AssemblyMain.Info_ValveSymbol infor in info_ValSymLst) Combo_Assem_parts.Items.Add(infor.m_SymFamilyName); //부품 콤보박스 값 넣기 foreach (KMBIM.AssemblyMain.Info_AttachSymbol infor in info_AttSymLst) Combo_Assem_Attach.Items.Add(infor.m_AttSymFamilyName); //배관 세그먼트 관경 가져오기 List segLst = Util.GetPipeSegmentSizes(m_doc, mainPipe.PipeType.Name); //코일 유형 변경시 관경도 리셋해야 함. combo_Assem_PipeDia.Items.Clear(); foreach (double seg in segLst) { double bb = Math.Round(seg, 2); combo_Assem_PipeDia.Items.Add(Math.Round(seg, 2)); } //관경이 없으면 기본값 지정 X if (combo_Assem_PipeDia.Items.Count != 0) { bool b_contain = combo_Assem_PipeDia.Items.Contains(Math.Round(Unit.FeetToMM(mainPipe.Diameter), 2)); int mainDiaIdx = combo_Assem_PipeDia.Items.IndexOf(Math.Round(Unit.FeetToMM(mainPipe.Diameter), 2)); combo_Assem_PipeDia.SelectedIndex = mainDiaIdx; } txt_Assem_Main2SubDist.Text = "500"; txt_Assem_MainTotal.Text = "0"; txt_Assem_SubTotal.Text = "0"; } //어셈블리 명칭 private void txt_Assem_Name_TextChanged(object sender, EventArgs e) { m_AssemStr = txt_Assem_Name.Text; } //라디오 유형 두줄 private void Rad_Assem_Type1_CheckedChanged(object sender, EventArgs e) { m_TypeIdx = 0; if (Rad_Assem_Type1.Checked == true) { rad_Assem_Sub.Enabled = true; list_Assem_Sub.Enabled = true; txt_Assem_Main2SubDist.Enabled = true; } } //픽쳐박스 유형 두줄 private void pic_Assem_Type1_Click(object sender, EventArgs e) { Rad_Assem_Type1.Checked = true; } //라디오 유형 한줄 private void Rad_Assem_Type2_CheckedChanged(object sender, EventArgs e) { m_TypeIdx = 1; if (Rad_Assem_Type2.Checked == true) { rad_Assem_Sub.Enabled = false; list_Assem_Sub.Enabled = false; txt_Assem_Main2SubDist.Enabled = false; if (rad_Assem_Sub.Checked == true) { rad_Assem_Main.Checked = true; rad_Assem_Sub.Checked = false; list_Assem_Main.Enabled = true; list_Assem_Sub.Enabled = false; list_Assem_Sub.ClearSelected(); } } } //픽쳐박스 유형 한줄 private void pic_Assem_Type2_Click(object sender, EventArgs e) { Rad_Assem_Type2.Checked = true; } //배관길이 private void txt_Assem_PipeDist_TextChanged(object sender, EventArgs e) { if (txt_Assem_PipeDist.Text == "") return; else { PipeDist = double.Parse(txt_Assem_PipeDist.Text); //Reg.setReg("Assem_PipeDist", PipeDist.ToString()); } } //밸브 라디오버튼 private void Rad_Assem_parts_CheckedChanged(object sender, EventArgs e) { m_ValpartsIdx = 0; if (Rad_Assem_parts.Checked == true) { Combo_Assem_parts.Enabled = true; Combo_Assem_Attach.Enabled = false; } } //밸브 콤보박스 private void Combo_Assem_parts_SelectedIndexChanged(object sender, EventArgs e) { m_PartsComboIdx = Combo_Assem_parts.SelectedIndex; if (Combo_Assem_parts.SelectedItem != null) m_partsName = Combo_Assem_parts.SelectedItem.ToString(); } //부속 라디오버튼 private void Rad_Assem_Attach_CheckedChanged(object sender, EventArgs e) { m_ValpartsIdx = 1; if (Rad_Assem_Attach.Checked == true) { Combo_Assem_Attach.Enabled = true; Combo_Assem_parts.Enabled = false; } } //부속 콤보박스 private void Combo_Assem_Attach_SelectedIndexChanged(object sender, EventArgs e) { m_AttachComboIdx = Combo_Assem_Attach.SelectedIndex; if (Combo_Assem_Attach.SelectedItem != null) m_AttachName = Combo_Assem_Attach.SelectedItem.ToString(); } //추가 버튼 private void btn_Assem_Add_Click(object sender, EventArgs e) { AssemblyData MainDistdata = new AssemblyData(); AssemblyData MainSymdata = new AssemblyData(); AssemblyData SubDistdata = new AssemblyData(); AssemblyData SubSymdata = new AssemblyData(); if (m_AssemblyIdx == 0)//메인 어셈블리 리스트 { if (Rad_Assem_parts.Checked == true) { //길이 파츠 값이 같이 있으면 둘다 추가 if (txt_Assem_PipeDist.Text != "" && Combo_Assem_parts.Text != "") { MainDistdata.AssemFamSymFamName = ""; MainDistdata.AssemPipeDist = txt_Assem_PipeDist.Text; MainDistdata.IsSymbol = false; m_MainDataLst.Add(MainDistdata); //리스트에 길이 추가 list_Assem_Main.Items.Add(txt_Assem_PipeDist.Text); if (Combo_Assem_parts.Items.Contains(Combo_Assem_parts.Text) == true) { MainSymdata.AssemPipeDist = ""; MainSymdata.AssemFamSymFamName = Combo_Assem_parts.Text; MainSymdata.IsSymbol = true; m_MainDataLst.Add(MainSymdata); //리스트에 심볼 추가 list_Assem_Main.Items.Add(Combo_Assem_parts.Text); //NomRad 매개변수가 없는 심볼이 추가되면 메시지 뿌려줌. foreach(string str in NonNomRadLst) { if(str == Combo_Assem_parts.Text) { MessageBox.Show("밸브 패밀리에 매개변수 'NomRad'가 존재하지 않습니다." + "\n어셈블리 목록에 보라색으로 표시됩니다." + "\n패밀리 편집기에서 반경 매개변수를 'NomRad'로 정의해 주시기 바랍니다.", "패밀리 오류"); break; } } } double totalDist = ListBoxTotalDist(list_Assem_Main); txt_Assem_MainTotal.Text = totalDist.ToString(); } else if (txt_Assem_PipeDist.Text != "") { MainDistdata.AssemFamSymFamName = ""; MainDistdata.AssemPipeDist = txt_Assem_PipeDist.Text; MainDistdata.IsSymbol = false; m_MainDataLst.Add(MainDistdata); //리스트에 길이 추가 list_Assem_Main.Items.Add(txt_Assem_PipeDist.Text); double totalDist = ListBoxTotalDist(list_Assem_Main); txt_Assem_MainTotal.Text = totalDist.ToString(); } else if (Combo_Assem_parts.Text != "") { MainSymdata.AssemPipeDist = ""; MainSymdata.AssemFamSymFamName = Combo_Assem_parts.Text; MainSymdata.IsSymbol = true; m_MainDataLst.Add(MainSymdata); //리스트에 심볼 추가 list_Assem_Main.Items.Add(Combo_Assem_parts.Text); //NomRad 매개변수가 없는 심볼이 추가되면 메시지 뿌려줌. foreach (string str in NonNomRadLst) { if (str == Combo_Assem_parts.Text) { MessageBox.Show("밸브 패밀리에 매개변수 'NomRad'가 존재하지 않습니다." + "\n어셈블리 목록에 보라색으로 표시됩니다.", "심볼오류"); break; } } } //값 초기화 txt_Assem_PipeDist.Text = ""; Combo_Assem_parts.Text = ""; } else if (Rad_Assem_Attach.Checked == true) { //길이 파츠 값이 같이 있으면 둘다 추가 if (txt_Assem_PipeDist.Text != "" && Combo_Assem_Attach.Text != "") { MainDistdata.AssemFamSymFamName = ""; MainDistdata.AssemPipeDist = txt_Assem_PipeDist.Text; MainDistdata.IsSymbol = false; m_MainDataLst.Add(MainDistdata); //리스트에 길이 추가 list_Assem_Main.Items.Add(txt_Assem_PipeDist.Text); if (Combo_Assem_Attach.Items.Contains(Combo_Assem_Attach.Text) == true) { MainSymdata.AssemPipeDist = ""; MainSymdata.AssemFamSymFamName = Combo_Assem_Attach.Text; MainSymdata.IsSymbol = true; m_MainDataLst.Add(MainSymdata); //리스트에 심볼 추가 list_Assem_Main.Items.Add(Combo_Assem_Attach.Text); } double totalDist = ListBoxTotalDist(list_Assem_Main); txt_Assem_MainTotal.Text = totalDist.ToString(); } else if (txt_Assem_PipeDist.Text != "") { MainDistdata.AssemFamSymFamName = ""; MainDistdata.AssemPipeDist = txt_Assem_PipeDist.Text; MainDistdata.IsSymbol = false; m_MainDataLst.Add(MainDistdata); //리스트에 길이 추가 list_Assem_Main.Items.Add(txt_Assem_PipeDist.Text); double totalDist = ListBoxTotalDist(list_Assem_Main); txt_Assem_MainTotal.Text = totalDist.ToString(); } else if (Combo_Assem_Attach.Text != "") { MainSymdata.AssemPipeDist = ""; MainSymdata.AssemFamSymFamName = Combo_Assem_Attach.Text; MainSymdata.IsSymbol = true; m_MainDataLst.Add(MainSymdata); //리스트에 심볼 추가 list_Assem_Main.Items.Add(Combo_Assem_Attach.Text); } //값 초기화 txt_Assem_PipeDist.Text = ""; Combo_Assem_Attach.Text = ""; } } else//서브 어셈블리 리스트 { if (Rad_Assem_parts.Checked == true) { //길이 파츠 값이 같이 있으면 둘다 추가 if (txt_Assem_PipeDist.Text != "" && Combo_Assem_parts.Text != "") { SubDistdata.AssemFamSymFamName = ""; SubDistdata.AssemPipeDist = txt_Assem_PipeDist.Text; SubDistdata.IsSymbol = false; m_SubDataLst.Add(SubDistdata); //리스트에 길이 추가 list_Assem_Sub.Items.Add(txt_Assem_PipeDist.Text); if (Combo_Assem_parts.Items.Contains(Combo_Assem_parts.Text) == true) { SubSymdata.AssemPipeDist = ""; SubSymdata.AssemFamSymFamName = Combo_Assem_parts.Text; SubSymdata.IsSymbol = true; m_SubDataLst.Add(SubSymdata); //리스트에 심볼 추가 list_Assem_Sub.Items.Add(Combo_Assem_parts.Text); //NomRad 매개변수가 없는 심볼이 추가되면 메시지 뿌려줌. foreach (string str in NonNomRadLst) { if (str == Combo_Assem_parts.Text) { MessageBox.Show("밸브 패밀리에 매개변수 'NomRad'가 존재하지 않습니다." + "\n어셈블리 목록에 보라색으로 표시됩니다.", "심볼오류"); break; } } } double totalDist = ListBoxTotalDist(list_Assem_Sub); txt_Assem_SubTotal.Text = totalDist.ToString(); } else if (txt_Assem_PipeDist.Text != "") { SubDistdata.AssemFamSymFamName = ""; SubDistdata.AssemPipeDist = txt_Assem_PipeDist.Text; SubDistdata.IsSymbol = false; m_SubDataLst.Add(SubDistdata); //리스트에 길이 추가 list_Assem_Sub.Items.Add(txt_Assem_PipeDist.Text); double totalDist = ListBoxTotalDist(list_Assem_Sub); txt_Assem_SubTotal.Text = totalDist.ToString(); } else if (Combo_Assem_parts.Text != "") { SubSymdata.AssemPipeDist = ""; SubSymdata.AssemFamSymFamName = Combo_Assem_parts.Text; SubSymdata.IsSymbol = true; m_SubDataLst.Add(SubSymdata); //리스트에 심볼 추가 list_Assem_Sub.Items.Add(Combo_Assem_parts.Text); //NomRad 매개변수가 없는 심볼이 추가되면 메시지 뿌려줌. foreach (string str in NonNomRadLst) { if (str == Combo_Assem_parts.Text) { MessageBox.Show("밸브 패밀리에 매개변수 'NomRad'가 존재하지 않습니다." + "\n어셈블리 목록에 보라색으로 표시됩니다.", "심볼오류"); break; } } } //값 초기화 txt_Assem_PipeDist.Text = ""; Combo_Assem_parts.Text = ""; } else if (Rad_Assem_Attach.Checked == true) { //길이 파츠 값이 같이 있으면 둘다 추가 if (txt_Assem_PipeDist.Text != "" && Combo_Assem_Attach.Text != "") { SubDistdata.AssemFamSymFamName = ""; SubDistdata.AssemPipeDist = txt_Assem_PipeDist.Text; SubDistdata.IsSymbol = false; m_SubDataLst.Add(SubDistdata); //리스트에 길이 추가 list_Assem_Sub.Items.Add(txt_Assem_PipeDist.Text); if (Combo_Assem_Attach.Items.Contains(Combo_Assem_Attach.Text) == true) { SubSymdata.AssemPipeDist = ""; SubSymdata.AssemFamSymFamName = Combo_Assem_Attach.Text; SubSymdata.IsSymbol = true; m_SubDataLst.Add(SubSymdata); //리스트에 심볼 추가 list_Assem_Sub.Items.Add(Combo_Assem_Attach.Text); } double totalDist = ListBoxTotalDist(list_Assem_Sub); txt_Assem_SubTotal.Text = totalDist.ToString(); } else if (txt_Assem_PipeDist.Text != "") { SubDistdata.AssemFamSymFamName = ""; SubDistdata.AssemPipeDist = txt_Assem_PipeDist.Text; SubDistdata.IsSymbol = false; m_SubDataLst.Add(SubDistdata); //리스트에 길이 추가 list_Assem_Sub.Items.Add(txt_Assem_PipeDist.Text); double totalDist = ListBoxTotalDist(list_Assem_Sub); txt_Assem_SubTotal.Text = totalDist.ToString(); } else if (Combo_Assem_Attach.Text != "") { SubSymdata.AssemPipeDist = ""; SubSymdata.AssemFamSymFamName = Combo_Assem_Attach.Text; SubSymdata.IsSymbol = true; m_SubDataLst.Add(SubSymdata); //리스트에 심볼 추가 list_Assem_Sub.Items.Add(Combo_Assem_Attach.Text); } //값 초기화 txt_Assem_PipeDist.Text = ""; Combo_Assem_Attach.Text = ""; } } } //라디오 메인 어셈블리 private void rad_Assem_Main_CheckedChanged(object sender, EventArgs e) { m_AssemblyIdx = 0; list_Assem_Main.Enabled = true; list_Assem_Sub.Enabled = false; list_Assem_Sub.ClearSelected(); } //라디오 서브 어셈블리 private void rad_Assem_Sub_CheckedChanged(object sender, EventArgs e) { m_AssemblyIdx = 1; list_Assem_Main.Enabled = false; list_Assem_Sub.Enabled = true; list_Assem_Main.ClearSelected(); } //메인과 서브 사이 간격 private void txt_Assem_Main2SubDist_TextChanged(object sender, EventArgs e) { if (txt_Assem_Main2SubDist.Text == "") return; else { Main2SubDist = double.Parse(txt_Assem_Main2SubDist.Text); Reg.setReg("Assem_Main2SubDist", Main2SubDist.ToString()); } } //편집 삭제 private void btm_Assem_Delete_Click(object sender, EventArgs e) { //메인 어셈블리 if (m_AssemblyIdx == 0) { int m_selidx = list_Assem_Main.SelectedIndex; list_Assem_Main.Items.RemoveAt(m_selidx); m_MainDataLst.RemoveAt(m_selidx); //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Main); txt_Assem_MainTotal.Text = totalDist.ToString(); } else//서브 어셈블리 { int m_selidx = list_Assem_Sub.SelectedIndex; list_Assem_Sub.Items.RemoveAt(m_selidx); m_SubDataLst.RemoveAt(m_selidx); //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Sub); txt_Assem_SubTotal.Text = totalDist.ToString(); } } //편집 삽입 private void btm_Assem_Insert_Click(object sender, EventArgs e) { //메인 어셈블리 if (m_AssemblyIdx == 0) { int m_selidx = list_Assem_Main.SelectedIndex; if (Rad_Assem_parts.Checked == true)//밸브 라디오 버튼일 때 { //콤보박스와 거리 값 두개다 존재하고 수정하면 작동 안되도록 if (Combo_Assem_parts.Text != "" && txt_Assem_PipeDist.Text != "") { } else { if (Combo_Assem_parts.Text != "") { list_Assem_Main.Items.Insert(m_selidx, Combo_Assem_parts.Text); AssemblyData Maindata = new AssemblyData(); Maindata.AssemPipeDist = ""; Maindata.AssemFamSymFamName = Combo_Assem_parts.Text; Maindata.IsSymbol = true; m_MainDataLst.Insert(m_selidx, Maindata); } else if (txt_Assem_PipeDist.Text != "") { list_Assem_Main.Items.Insert(m_selidx, txt_Assem_PipeDist.Text); AssemblyData Maindata = new AssemblyData(); Maindata.AssemFamSymFamName = ""; Maindata.AssemPipeDist = txt_Assem_PipeDist.Text; Maindata.IsSymbol = false; m_MainDataLst.Insert(m_selidx, Maindata); //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Main); txt_Assem_MainTotal.Text = totalDist.ToString(); } } } else if (Rad_Assem_Attach.Checked == true)//부속 라디오 버튼일 때 { //콤보박스와 거리 값 두개다 존재하고 수정하면 작동 안되도록 if (Combo_Assem_Attach.Text != "" && txt_Assem_PipeDist.Text != "") { } else { if (Combo_Assem_Attach.Text != "") { list_Assem_Main.Items.Insert(m_selidx, Combo_Assem_Attach.Text); AssemblyData Maindata = new AssemblyData(); Maindata.AssemPipeDist = ""; Maindata.AssemFamSymFamName = Combo_Assem_Attach.Text; Maindata.IsSymbol = true; m_MainDataLst.Insert(m_selidx, Maindata); } else if (txt_Assem_PipeDist.Text != "") { list_Assem_Main.Items.Insert(m_selidx, txt_Assem_PipeDist.Text); AssemblyData Maindata = new AssemblyData(); Maindata.AssemFamSymFamName = ""; Maindata.AssemPipeDist = txt_Assem_PipeDist.Text; Maindata.IsSymbol = false; m_MainDataLst.Insert(m_selidx, Maindata); //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Main); txt_Assem_MainTotal.Text = totalDist.ToString(); } } } } else//서브 어셈블리 { int m_selidx = list_Assem_Sub.SelectedIndex; if (Rad_Assem_parts.Checked == true)//밸브 라디오 버튼일 떄 { //콤보박스와 거리 값 두개다 존재하고 수정하면 작동 안되도록 if (Combo_Assem_parts.Text != "" && txt_Assem_PipeDist.Text != "") { } else { if (Combo_Assem_parts.Text != "") { list_Assem_Sub.Items.Insert(m_selidx, Combo_Assem_parts.Text); AssemblyData Subdata = new AssemblyData(); Subdata.AssemPipeDist = ""; Subdata.AssemFamSymFamName = Combo_Assem_parts.Text; Subdata.IsSymbol = true; m_SubDataLst.Insert(m_selidx, Subdata); } else if (txt_Assem_PipeDist.Text != "") { list_Assem_Sub.Items.Insert(m_selidx, txt_Assem_PipeDist.Text); AssemblyData Subdata = new AssemblyData(); Subdata.AssemFamSymFamName = ""; Subdata.AssemPipeDist = txt_Assem_PipeDist.Text; Subdata.IsSymbol = false; m_SubDataLst.Insert(m_selidx, Subdata); //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Sub); txt_Assem_SubTotal.Text = totalDist.ToString(); } } } else if (Rad_Assem_Attach.Checked == true)//부속 라디오버튼일 때 { //콤보박스와 거리 값 두개다 존재하고 수정하면 작동 안되도록 if (Combo_Assem_Attach.Text != "" && txt_Assem_PipeDist.Text != "") { } else { if (Combo_Assem_Attach.Text != "") { list_Assem_Sub.Items.Insert(m_selidx, Combo_Assem_Attach.Text); AssemblyData Subdata = new AssemblyData(); Subdata.AssemPipeDist = ""; Subdata.AssemFamSymFamName = Combo_Assem_Attach.Text; Subdata.IsSymbol = true; m_SubDataLst.Insert(m_selidx, Subdata); } else if (txt_Assem_PipeDist.Text != "") { list_Assem_Sub.Items.Insert(m_selidx, txt_Assem_PipeDist.Text); AssemblyData Subdata = new AssemblyData(); Subdata.AssemFamSymFamName = ""; Subdata.AssemPipeDist = txt_Assem_PipeDist.Text; Subdata.IsSymbol = false; m_SubDataLst.Insert(m_selidx, Subdata); //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Sub); txt_Assem_SubTotal.Text = totalDist.ToString(); } } } } } //편집 수정 private void btm_Assem_Edit_Click(object sender, EventArgs e) { //메인 어셈블리 if (m_AssemblyIdx == 0) { int m_selidx = list_Assem_Main.SelectedIndex; if (Rad_Assem_parts.Checked == true)//밸브 라디오 버튼일 때 { //콤보박스와 거리 값 두개다 존재하고 수정하면 작동 안되도록 if (Combo_Assem_parts.Text != "" && txt_Assem_PipeDist.Text != "") { } else { if (Combo_Assem_parts.Text != "") { list_Assem_Main.Items[m_selidx] = Combo_Assem_parts.Text; m_MainDataLst.ElementAt(m_selidx).AssemFamSymFamName = Combo_Assem_parts.Text; m_MainDataLst.ElementAt(m_selidx).AssemPipeDist = ""; m_MainDataLst.ElementAt(m_selidx).IsSymbol = true; } else if (txt_Assem_PipeDist.Text != "") { list_Assem_Main.Items[m_selidx] = txt_Assem_PipeDist.Text; m_MainDataLst.ElementAt(m_selidx).AssemPipeDist = txt_Assem_PipeDist.Text; m_MainDataLst.ElementAt(m_selidx).AssemFamSymFamName = ""; m_MainDataLst.ElementAt(m_selidx).IsSymbol = false; //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Main); txt_Assem_MainTotal.Text = totalDist.ToString(); } } } else if (Rad_Assem_Attach.Checked == true)//부속 라디오 버튼일 때 { //콤보박스와 거리 값 두개다 존재하고 수정하면 작동 안되도록 if (Combo_Assem_Attach.Text != "" && txt_Assem_PipeDist.Text != "") { } else { if (Combo_Assem_Attach.Text != "") { list_Assem_Main.Items[m_selidx] = Combo_Assem_Attach.Text; m_MainDataLst.ElementAt(m_selidx).AssemFamSymFamName = Combo_Assem_Attach.Text; m_MainDataLst.ElementAt(m_selidx).AssemPipeDist = ""; m_MainDataLst.ElementAt(m_selidx).IsSymbol = true; } else if (txt_Assem_PipeDist.Text != "") { list_Assem_Main.Items[m_selidx] = txt_Assem_PipeDist.Text; m_MainDataLst.ElementAt(m_selidx).AssemPipeDist = txt_Assem_PipeDist.Text; m_MainDataLst.ElementAt(m_selidx).AssemFamSymFamName = ""; m_MainDataLst.ElementAt(m_selidx).IsSymbol = false; //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Main); txt_Assem_MainTotal.Text = totalDist.ToString(); } } } } else//서브 어셈블리 { int m_selidx = list_Assem_Sub.SelectedIndex; if (Rad_Assem_parts.Checked == true)//밸브 라디오 버튼일 때 { //콤보박스와 거리 값 두개다 존재하고 수정하면 작동 안되도록 if (Combo_Assem_parts.Text != "" && txt_Assem_PipeDist.Text != "") { } else { if (Combo_Assem_parts.Text != "") { list_Assem_Sub.Items[m_selidx] = Combo_Assem_parts.Text; m_SubDataLst.ElementAt(m_selidx).AssemFamSymFamName = Combo_Assem_parts.Text; m_SubDataLst.ElementAt(m_selidx).AssemPipeDist = ""; m_SubDataLst.ElementAt(m_selidx).IsSymbol = true; } else if (txt_Assem_PipeDist.Text != "") { list_Assem_Sub.Items[m_selidx] = txt_Assem_PipeDist.Text; m_SubDataLst.ElementAt(m_selidx).AssemPipeDist = txt_Assem_PipeDist.Text; m_SubDataLst.ElementAt(m_selidx).AssemFamSymFamName = ""; m_SubDataLst.ElementAt(m_selidx).IsSymbol = false; //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Sub); txt_Assem_SubTotal.Text = totalDist.ToString(); } } } else if (Rad_Assem_Attach.Checked == true)// 부속 라디오 버튼일 때 { //콤보박스와 거리 값 두개다 존재하고 수정하면 작동 안되도록 if (Combo_Assem_Attach.Text != "" && txt_Assem_PipeDist.Text != "") { } else { if (Combo_Assem_Attach.Text != "") { list_Assem_Sub.Items[m_selidx] = Combo_Assem_Attach.Text; m_SubDataLst.ElementAt(m_selidx).AssemFamSymFamName = Combo_Assem_Attach.Text; m_SubDataLst.ElementAt(m_selidx).AssemPipeDist = ""; m_SubDataLst.ElementAt(m_selidx).IsSymbol = true; } else if (txt_Assem_PipeDist.Text != "") { list_Assem_Sub.Items[m_selidx] = txt_Assem_PipeDist.Text; m_SubDataLst.ElementAt(m_selidx).AssemPipeDist = txt_Assem_PipeDist.Text; m_SubDataLst.ElementAt(m_selidx).AssemFamSymFamName = ""; m_SubDataLst.ElementAt(m_selidx).IsSymbol = false; //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Sub); txt_Assem_SubTotal.Text = totalDist.ToString(); } } } } } //패밀리 로드 버튼 private void btm_Assem_FamLoad_Click(object sender, EventArgs e) { string versionNumber = m_doc.Application.VersionNumber.ToString(); string location = Util.GetKMBIMLibraryFolder("Libraries\\Assembly\\" + versionNumber); OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "rfa|*.rfa"; openFileDialog.Title = "Load Family File"; openFileDialog.InitialDirectory = location; if (openFileDialog.ShowDialog() == DialogResult.OK) { if (openFileDialog.FileName != "") { string FileName = Path.GetFileNameWithoutExtension(openFileDialog.FileName); //MessageBox.Show(FileName); FamilySymbol famSym = Util.getNameByFamily(m_doc, FileName); if (famSym == null) { //로드 되지 않은 패밀리 리스트 중 로드할 패밀리 삭제 m_NonSymbolLst.Remove(FileName); //해당 패밀리 로드 FamilySymbol sym = null; using (Transaction trans = new Transaction(m_doc)) { trans.Start("LoadFamily"); sym = Util.LoadFamilys(m_doc, openFileDialog.FileName); trans.Commit(); } if (sym.Category.Id.IntegerValue == (int)BuiltInCategory.OST_PipeAccessory) { //밸브 콤보박스에 로드한 패밀리 Combo_Assem_parts.Items.Add(FileName); } else if (sym.Category.Id.IntegerValue == (int)BuiltInCategory.OST_PipeFitting) { //부속 콤보박스에 로드한 패밀리 Combo_Assem_Attach.Items.Add(FileName); } //현재 활성화 된 메인/서브 리스트의 이름을 찾아 색상 idx를 변경하여 DrawItem 이벤트로 색상 변경 if (m_AssemblyIdx == 0) { int FamIdx =list_Assem_Main.Items.IndexOf(FileName); list_Assem_Main.SelectedIndex = FamIdx; //list_Assem_Main.SelectedIndexChanged += list_Assem_Main_SelectedIndexChanged; } else if (m_AssemblyIdx == 1) { int FamIdx = list_Assem_Sub.Items.IndexOf(FileName); list_Assem_Sub.SelectedIndex = FamIdx; } int FileIdx = list_Assem_Main.FindString(FileName); //if (tmp_nonSymLst.Contains(main.AssemFamSymFamName) == false) //{ // tmp_nonSymLst += ("- " + main.AssemFamSymFamName + "\n"); // m_NonSymbolLst.Add(main.AssemFamSymFamName); //} } else { MessageBox.Show("패밀리가 이미 로드되어 있습니다."); } } } } //메인 어셈블리 리스트박스 private void list_Assem_Main_SelectedIndexChanged(object sender, EventArgs e) { if (m_AssemblyIdx == 0 && list_Assem_Main.SelectedIndex != -1) { int selListIdx = list_Assem_Main.SelectedIndex; string SelName = list_Assem_Main.SelectedItem.ToString(); //선택한 리스트가 숫자인지 확인 double selDouble = 0; bool b_num = double.TryParse(SelName, out selDouble); //숫자면 배관길이에 선택한 값 넣기. if (b_num) { txt_Assem_PipeDist.Text = SelName; Combo_Assem_parts.Text = ""; Combo_Assem_Attach.Text = ""; } else//숫자가 아니면 부품 콤보박스에서 선택한 값 찾아 넣기. { int PartsSelComboIdx = Combo_Assem_parts.FindString(SelName); if (PartsSelComboIdx != -1) { Rad_Assem_parts.Checked = true; Combo_Assem_parts.Text = SelName; txt_Assem_PipeDist.Text = ""; Combo_Assem_Attach.Text = ""; } int AttSelComboIdx = Combo_Assem_Attach.FindString(SelName); if (AttSelComboIdx != -1) { Rad_Assem_Attach.Checked = true; Combo_Assem_Attach.Text = SelName; txt_Assem_PipeDist.Text = ""; Combo_Assem_parts.Text = ""; } } } } //서브 어셈블리 관경 private void combo_Assem_PipeDia_SelectedIndexChanged(object sender, EventArgs e) { subDia = double.Parse(combo_Assem_PipeDia.SelectedItem.ToString()); } //서브 어셈블리 리스트박스 private void list_Assem_Sub_SelectedIndexChanged(object sender, EventArgs e) { if (m_AssemblyIdx == 1 && list_Assem_Sub.SelectedIndex != -1) { int selListIdx = list_Assem_Sub.SelectedIndex; string SelName = list_Assem_Sub.SelectedItem.ToString(); //선택한 리스트가 숫자인지 확인 double selDouble = 0; bool b_num = double.TryParse(SelName, out selDouble); //숫자면 배관길이에 선택한 값 넣기. if (b_num) { txt_Assem_PipeDist.Text = SelName; Combo_Assem_parts.Text = ""; } else//숫자가 아니면 부품 콤보박스에서 선택한 값 찾아 넣기. { if (Rad_Assem_parts.Checked == true) { int SelComboIdx = Combo_Assem_parts.FindString(SelName); if (SelComboIdx != -1) { Combo_Assem_parts.Text = SelName; txt_Assem_PipeDist.Text = ""; } } else if (Rad_Assem_Attach.Checked == true) { int SelComboIdx = Combo_Assem_Attach.FindString(SelName); if (SelComboIdx != -1) { Combo_Assem_Attach.Text = SelName; txt_Assem_PipeDist.Text = ""; } } } } } //메인 어셈블리 리스트박스 item 그리기 private void list_Assem_Main_DrawItem(object sender, DrawItemEventArgs e) { if (list_Assem_Main.Items.Count <= 0) return; Brush drawBrush = Brushes.Black; e.DrawBackground(); StringFormat sf = new StringFormat(); sf.LineAlignment = StringAlignment.Center; sf.Alignment = StringAlignment.Near; var mainItems = list_Assem_Main.Items[e.Index]; //숫자면 색상 블루로 //bool isNum = mainItems.ToString().All(char.IsDigit); double d_Num = 0; bool isNum = double.TryParse(mainItems.ToString(), out d_Num); if (isNum == true) { drawBrush = Brushes.DeepSkyBlue; } //존재하지 않는 심볼일 경우 빨간색으로 표시 foreach (string str in m_NonSymbolLst) { if (str == mainItems.ToString()) { drawBrush = Brushes.Red; break; } } //NomRad 매개변수 없으면 보라색 변경 foreach(string str in NonNomRadLst) { if(str == mainItems.ToString()) { drawBrush = Brushes.Violet; break; } } //메인 어셈블리 라디오 버튼 체크X 시 그레이로 변경 if (rad_Assem_Main.Checked == false) drawBrush = Brushes.DarkGray; e.Graphics.DrawString(mainItems.ToString(), e.Font, drawBrush, e.Bounds, StringFormat.GenericDefault); e.DrawFocusRectangle(); } //서브 어셈블리 리스트박스 item 그리기 private void list_Assem_Sub_DrawItem(object sender, DrawItemEventArgs e) { if (list_Assem_Sub.Items.Count <= 0) return; Brush drawBrush = Brushes.Black; e.DrawBackground(); StringFormat sf = new StringFormat(); sf.LineAlignment = StringAlignment.Center; sf.Alignment = StringAlignment.Near; var SubItems = list_Assem_Sub.Items[e.Index]; //숫자면 색상 블루 double d_Num = 0; bool isNum = double.TryParse(SubItems.ToString(), out d_Num); //bool isNum = SubItems.ToString().All(char.IsDigit); if (isNum == true) { drawBrush = Brushes.DeepSkyBlue; } //존재하지 않는 심볼일 경우 빨간색으로 표시 foreach (string str in m_NonSymbolLst) { if (str == SubItems.ToString()) { drawBrush = Brushes.Red; break; } } //NomRad 매개변수 없으면 보라색 변경 foreach (string str in NonNomRadLst) { if (str == SubItems.ToString()) { drawBrush = Brushes.Violet; break; } } //서브 어셈블리 라디오 버튼 체크X 시 그레이로 변경 if (rad_Assem_Sub.Checked == false) drawBrush = Brushes.DarkGray; e.Graphics.DrawString(SubItems.ToString(), e.Font, drawBrush, e.Bounds, StringFormat.GenericDefault); e.DrawFocusRectangle(); } //내보내기(저장) private void btm_Assem_Export_Click(object sender, EventArgs e) { AssemData.m_table.Clear(); //AssemData.Add(txt_Assem_Name.Text, AssemMainDataLst, AssemSubDataLst, double.Parse(txt_Assem_Main2SubDist.Text)); AssemData.Add(txt_Assem_Name.Text, m_MainDataLst, m_SubDataLst, double.Parse(txt_Assem_Main2SubDist.Text), subDia); SaveFileDialog saveFileDialog = new SaveFileDialog(); if (txt_Assem_Name.Text == "") saveFileDialog.FileName = "Assembly" + "_settings" + ".asmb"; //초기 파일명을 지정할 때 사용한다. else saveFileDialog.FileName = txt_Assem_Name.Text + "_settings" + ".asmb"; //초기 파일명을 지정할 때 사용한다. saveFileDialog.Filter = "asmb|*.asmb"; saveFileDialog.Title = "Save an asmb File"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { if (saveFileDialog.FileName != "") { //string location = Util.GetKMBIMLibraryFolder("\\Libraries\\Assembly"); //string jsonPath = Path.Combine(location, "settings.kins"); // //System.IO.File.Copy(jsonPath, saveFileDialog.FileName, true); save(saveFileDialog.FileName); } } } //가져오기(열기) private void btm_Assem_Import_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); string location = Util.GetKMBIMLibraryFolder("Libraries\\Assembly"); openFileDialog.Filter = "asmb|*.asmb"; openFileDialog.Title = "Open an asmb File"; openFileDialog.InitialDirectory = location; if (openFileDialog.ShowDialog() == DialogResult.OK) { if (openFileDialog.FileName != "") { //string location = Util.GetKMBIMLibraryFolder("Libraries\\Assembly"); string jsonPath = Path.Combine(location, "settings.asmb"); //System.IO.File.Copy(jsonPath, openFileDialog.FileName, true); } } if (openFileDialog.FileName != "") { //string location = Util.GetKMBIMLibraryFolder("Libraries\\Assembly"); string jsonPath = Path.Combine(location, "settings.asmb"); //System.IO.File.Copy(openFileDialog.FileName, jsonPath, true); open(openFileDialog.FileName); m_MainDataLst.Clear(); m_SubDataLst.Clear(); list_Assem_Main.Items.Clear(); list_Assem_Sub.Items.Clear(); foreach (var data in AssemData.GetTable()) { m_MainDataLst = data.MainAssemLst; m_SubDataLst = data.SubAssemLst; //어셈블리 명칭 txt_Assem_Name.Text = data.AssemName; //메인 서브 간격 txt_Assem_Main2SubDist.Text = data.dblMain2SubDist.ToString(); //서브 관경 foreach (var item in combo_Assem_PipeDia.Items) { if (data.dblSubPipeDia.ToString().Equals(item.ToString())) { int idx = combo_Assem_PipeDia.Items.IndexOf(item); combo_Assem_PipeDia.SelectedIndex = idx; break; } } foreach (var main in data.MainAssemLst) { if (main.AssemFamSymFamName != "") list_Assem_Main.Items.Add(main.AssemFamSymFamName); else if (main.AssemPipeDist != "") list_Assem_Main.Items.Add(main.AssemPipeDist); } //총 길이 새로고침 double totalDist = ListBoxTotalDist(list_Assem_Main); txt_Assem_MainTotal.Text = totalDist.ToString(); foreach (var sub in data.SubAssemLst) { if (sub.AssemFamSymFamName != "") list_Assem_Sub.Items.Add(sub.AssemFamSymFamName); else if (sub.AssemPipeDist != "") list_Assem_Sub.Items.Add(sub.AssemPipeDist); } //총 길이 새로고침 totalDist = ListBoxTotalDist(list_Assem_Sub); txt_Assem_SubTotal.Text = totalDist.ToString(); m_NonSymbolLst.Clear(); //심볼 존재 유무 확인 후 없으면 메시지 뿌림 string tmp_nonSymLst = ""; foreach (AssemblyData main in m_MainDataLst) { if (main.AssemFamSymFamName != "") { FamilySymbol famSym = Util.getNameByFamily(m_doc, main.AssemFamSymFamName); if (famSym == null) { if (tmp_nonSymLst.Contains(main.AssemFamSymFamName) == false) { tmp_nonSymLst += ("- " + main.AssemFamSymFamName + "\n"); m_NonSymbolLst.Add(main.AssemFamSymFamName); } } } } foreach (AssemblyData sub in m_SubDataLst) { if (sub.AssemFamSymFamName != "") { FamilySymbol famSym = Util.getNameByFamily(m_doc, sub.AssemFamSymFamName); if (famSym == null) { if (tmp_nonSymLst.Contains(sub.AssemFamSymFamName) == false) { tmp_nonSymLst += ("- " + sub.AssemFamSymFamName + "\n"); m_NonSymbolLst.Add(sub.AssemFamSymFamName); } } } } //심볼 없으면 메시지 뿌림 if (tmp_nonSymLst != "") MessageBox.Show("해당 패밀리가 존재하지 않습니다.\n\n" + tmp_nonSymLst, "패밀리 로드 오류"); //list_Assem_Main.Items.Add(); } //category = PipeData.GetTable().First().Key; //cbCategory.SelectedIndex = cbCategory.FindString(category); //RefreshList(); } } private void button7_Click(object sender, EventArgs e) { //메인~서브 사이 거리 bool b_M2S = double.TryParse(txt_Assem_Main2SubDist.Text, out Main2SubDist); if (b_M2S == false) { MessageBox.Show("메인-서브 간격이 없습니다."); } } private double ListBoxTotalDist(System.Windows.Forms.ListBox listbox) { double totalDist = 0; foreach (var item in listbox.Items) { bool isNum = item.ToString().All(char.IsDigit); if (isNum) { double item_num = double.Parse(item.ToString()); totalDist += item_num; } } return totalDist; } public void save(string FilePath) { //string location = Util.GetKMBIMLibraryFolder("\\Libraries\\Assembly"); //string jsonPath = Path.Combine(location, "settings.kins"); // ////DirectoryInfo 생성 //DirectoryInfo di = new DirectoryInfo(location); ////DirectoryInfo.Exists로 폴더 존재유무 확인 //if (!di.Exists) { di.Create(); } using (StreamWriter file = File.CreateText(FilePath)) { string strJson = AssemData.toJson(); JsonSerializer serializer = new JsonSerializer(); //serialize object directly into file stream serializer.Serialize(file, strJson); } } public void open(string FilePath) { //string location = Util.GetKMBIMLibraryFolder("Libraries\\Assembly"); //string jsonPath = Path.Combine(location, "settings.kins"); ////DirectoryInfo 생성 //DirectoryInfo di = new DirectoryInfo(location); ////DirectoryInfo.Exists로 폴더 존재유무 확인 //if (!di.Exists) { di.Create(); } if (File.Exists(FilePath)) { using (StreamReader r = new StreamReader(FilePath)) { using (JsonTextReader reader1 = new JsonTextReader(r)) { JValue o2 = (JValue)JToken.ReadFrom(reader1); string strJson = o2.ToString(); AssemData.LoadJson(strJson); } } } } private void Form_Assembly_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_Assem_PipeDist_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_Assem_PipeDist.Text) || txt_Assem_PipeDist.Text.Contains('.') == true) e.Handled = true; } } private void txt_Assem_Main2SubDist_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_Assem_Main2SubDist.Text) || txt_Assem_Main2SubDist.Text.Contains('.') == true) e.Handled = true; } } } public class AssemblyData { public string AssemFamSymFamName; public string AssemPipeDist; public bool IsSymbol; } }