Client/Desktop/KMBIM3.0/KMBIM3.0_소스/Cmd/Hanger/FormHangerPlacement.cs

345 lines
12 KiB
C#

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<string> ListFamily { get; set; }
public EnumAnchorInstallBase AnchorInstallBase { get; set; }
List<Autodesk.Revit.DB.Level> 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<string>();
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<Autodesk.Revit.DB.Level>();
foreach (Autodesk.Revit.DB.Level item in new Autodesk.Revit.DB.FilteredElementCollector(Document).OfCategory(BuiltInCategory.OST_Levels).OfType<Autodesk.Revit.DB.Level>())
{
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;
}
}
}
}