345 lines
12 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|