Client/Desktop/KMBIM3.0/KMBIM3.0_소스/Cmd/Assembly/Form_Assembly.cs

1328 lines
57 KiB
C#

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<string> m_NonSymbolLst = new List<string>();
public List<KMBIM.AssemblyMain.Info_ValveSymbol> info_ValSymLst = new List<KMBIM.AssemblyMain.Info_ValveSymbol>();
public List<KMBIM.AssemblyMain.Info_AttachSymbol> info_AttSymLst = new List<KMBIM.AssemblyMain.Info_AttachSymbol>();
public List<string> NonNomRadLst = new List<string>();
public List<AssemblyData> m_MainDataLst = new List<AssemblyData>();
public List<AssemblyData> m_SubDataLst = new List<AssemblyData>();
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<double> 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;
}
}