qin
2024-09-28 e358beb08f5be49703009b64f058ecfbcfeefbd9
HStation.RevitDev/RevitDataExport/Forms/Form_SystemSelect.cs
@@ -1,471 +1,478 @@
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.UI;
using Glodon.Revit.Utility;
using Hydro.Core.Model;
using Hydro.Revit;
using Hydro.Revit.Model;
using HStation.RevitDev.RevitDataExport.Common;
using HStation.RevitDev.RevitDataExport.Service;
using HStation.RevitDev.RevitDataExport.Utility;
using HStation.RevitDev.RevitDataExport.Common;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Forms;
using static Hydro.Core.ObjectEnum;
namespace HStation.RevitDev.RevitDataExport.Forms
{
    public partial class Form_SystemSelect : System.Windows.Forms.Form
    {
        private UIDocument _uiDocument;
        private Document _doc;
        private ExternalCommandData _data;
        private ItemCheckEventArgs _itemCheck;
        public RevitNetWork _revitNetWork;
        public Form_SystemSelect(ExternalCommandData data)
        {
            _data = data;
            _uiDocument = data.Application.ActiveUIDocument;
            _doc = _uiDocument.Document;
            InitializeComponent();
        }
        private void SystemSelect_Load(object sender, System.EventArgs e)
        {
            InitControlsData();
        }
        private void InitControlsData()
        {
            InitMepSystemComboBox();
            InitMepSystemCheckListBox();
            InitDataGridViewStyle();
            InitDataGridViewEvent();
        }
        private void InitMepSystemCheckListBox()
        {
            this.checkedListBox_systemType.Items.Clear();
            var systemTypes = RevitMepSystemService.GetSystemTypeList(_doc).ToList();
            systemTypes = systemTypes.FindAll(x => x.GetDependentElements(new ElementClassFilter(typeof(PipingSystem), false)).Count != 0);
            if (systemTypes != null && systemTypes.Count > 0)
            {
                this.checkedListBox_systemType.DataSource = systemTypes;
                this.checkedListBox_systemType.DisplayMember = "Name";
                this.checkedListBox_systemType.SelectedIndex = 0;
            }
            this.checkedListBox_systemType.SelectedIndex = -1;
        }
        private void InitDataGridViewStyle()
        {
            var pages = this.pageContainer.TabPages;
            foreach (TabPage page in pages)
            {
                foreach (var subControl in page.Controls)
                {
                    if (subControl is DataGridView dgv)
                    {
                        dgv.AllowUserToResizeRows = false;
                    }
                }
            }
        }
        private void InitDataGridViewEvent()
        {
            var dgvs = new List<DataGridView>();
            var pages = this.pageContainer.TabPages;
            foreach (TabPage page in pages)
            {
                foreach (var subControl in page.Controls)
                {
                    if (subControl is DataGridView dgv)
                    {
                        dgvs.Add(dgv);
                        dgv.CellClick += Dgv_CellClick;
                        //dgv.CellContentDoubleClick += Dgv_DoubleCellClick;
                    }
                }
            }
        }
        private void Dgv_DoubleCellClick(object sender, DataGridViewCellEventArgs e)
        {
            var dgv = sender as DataGridView;
            var rowIndex = e.RowIndex;
            var columnIndex = e.ColumnIndex;
            var cell = dgv[columnIndex, rowIndex];
            if (cell.Value == null) { return; }
            var view = Set3DView();
            var cellText = cell.Value.ToString();
            if (dgv.Columns[columnIndex].HeaderText == "ID" ||
                dgv.Columns[columnIndex].HeaderText.Contains("连接点"))
            {
                var idContent = cellText.Split(':')?.Last();
                if (string.IsNullOrEmpty(idContent)) { return; }
                if (int.TryParse(idContent, out int id))
                {
                    var elementId = new ElementId(id);
                    var ids = new List<ElementId> { elementId };
                    view.Select(_uiDocument, ids);
                    view.OnlyShow(ids);
                    view.Zoom(_uiDocument, ids);
                }
            }
        }
        private void Dgv_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            var dgv = sender as DataGridView;
            var rowIndex = e.RowIndex;
            var columnIndex = e.ColumnIndex;
            var cell = dgv[columnIndex, rowIndex];
            if (cell.Value == null) { return; }
            var view = Set3DView();
            var cellText = cell.Value.ToString();
            if (dgv.Columns[columnIndex].HeaderText == "ID" ||
                dgv.Columns[columnIndex].HeaderText.Contains("连接点"))
            {
                var idContent = cellText.Split(':')?.Last();
                if (string.IsNullOrEmpty(idContent)) { return; }
                if (int.TryParse(idContent, out int id))
                {
                    var elementId = new ElementId(id);
                    var ids = new List<ElementId> { elementId };
                    view.Select(_uiDocument, ids);
                }
            }
        }
        private void InitMepSystemComboBox()
        {
            //this.comboBox1.Items.Clear();
            //var systems = RevitMepSystemService.GetSystemList(_doc).ToList();
            //systems = systems.FindAll(x => x is PipingSystem);
            //if (systems != null && systems.Count > 0)
            //{
            //    this.comboBox1.DataSource = systems;
            //    this.comboBox1.DisplayMember = "Name";
            //    this.comboBox1.SelectedIndex = 0;
            //}
            //this.comboBox1.SelectedIndex = -1;
        }
        private View3D Set3DView()
        {
            var view3d = ViewHelper.Get3dView(_doc);
            _uiDocument.ActiveView = view3d;
            return view3d;
        }
        private List<Tuple<string, string>> PostProcessing(Dictionary<string, List<Element>> groupElems, List<Tuple<string, string>> properties)
        {
            var result = new List<Tuple<string, string>>();
            foreach (var prop in properties)
            {
                if (!prop.Item1.Contains("连接点"))
                {
                    result.Add(prop);
                    continue;
                }
                bool findGroupName = false;
                foreach (var group in groupElems)
                {
                    if (group.Value.Any(x => x.Id.IntegerValue.ToString() == prop.Item2))
                    {
                        result.Add(new Tuple<string, string>(prop.Item1, /*group.Key + ":" +*/ prop.Item2));
                        findGroupName = true;
                        break;
                    }
                }
                if (!findGroupName)
                {
                    result.Add(new Tuple<string, string>(prop.Item1, prop.Item2));
                }
            }
            return result;
        }
        private void FillRow(DataGridView dgv, List<Tuple<string, string>> properties, ref int elemIndex)
        {
            properties.Insert(0, new Tuple<string, string>("序号", (++elemIndex).ToString()));
            var newRowIndex = dgv.Rows.Add();
            for (var i = 0; i < dgv.ColumnCount; i++)
            {
                var cell = dgv.Rows[newRowIndex].Cells[i];
                var hd = dgv.Columns[cell.ColumnIndex].HeaderText;
                var p = properties.Where(c => c.Item1.Equals(hd)).FirstOrDefault();
                if (p != null)
                {
                    cell.Value = p.Item2?.ToString();
                }
            }
        }
        private void FillDataGridView(Dictionary<string, List<Element>> groupElems)
        {
            foreach (TabPage page in this.pageContainer.TabPages)
            //for (var i = 0; i < this.pageContainer.TabPages.Count - 1; i++)
            {
                var t = new Task(() =>
                 {
                     //var page = this.pageContainer.TabPages[i];
                     string str = "";
                     Stopwatch sw = Stopwatch.StartNew();
                     sw.Restart();
                     var pageTitle = page.Text;
                     var dgv = page.Controls[0] as DataGridView;
                     dgv.Rows.Clear();
                     if (groupElems.ContainsKey(pageTitle))
                     {
                         //continue;
                         var elems = groupElems[pageTitle];
                         var parser = ParserManager.Instance.GetParser(pageTitle);
                         var elemIndex = 0;
                         foreach (var element in elems)
                         {
                             List<Tuple<string, string>> properties = parser.PropertyParse(element);
                             var newProps = PostProcessing(groupElems, properties);
                             FillRow(dgv, newProps, ref elemIndex);
                         }
                         sw.Stop();
                         str += pageTitle + " 数据加载耗时:" + sw.Elapsed.TotalSeconds + " 秒,数量:" + elems.Count + ",时间:" + DateTime.Now.ToString();
                         textBox1.Text += str;
                     }
                 });
                t.Start();
            }
        }
        private void button1_Click2(object sender, EventArgs e)
        {
            var excelFolder = DialogHelper.UserSelectFolderPath();
            if (string.IsNullOrEmpty(excelFolder)) { return; }
            var excelPath = Path.Combine(excelFolder, $@"管道系统数据.xlsx");
            ExcelHelper excelHelper = new ExcelHelper();
            var indexes = new List<int>();
            var items = this.checkedListBox_systemType.CheckedIndices;
            for (int i = 0; i < items.Count; i++)
            {
                int index = items[i];
                indexes.Add(index);
            }
            Dictionary<string, List<Element>> dict = GetGroupElements(indexes);
            foreach (TabPage page in this.pageContainer.TabPages)
            {
                var pageTitle = page.Text;
                if (!dict.ContainsKey(pageTitle))
                {
                    continue;
                }
                var elems = dict[pageTitle];
                var parser = ParserManager.Instance.GetParser(pageTitle);
                excelHelper.SetCurrentSheet(pageTitle);
                for (int i = 1; i <= elems.Count; i++)
                {
                    var element = elems[i - 1];
                    List<Tuple<string, string>> properties = parser.PropertyParse(element);
                    var newProps = PostProcessing(dict, properties);
                    if (i == 1)//先写表头
                    {
                        var headers = newProps.Select(x => x.Item1).ToList();
                        for (int j = 1; j <= headers.Count; j++)
                        {
                            excelHelper.Write(i, j, headers[j - 1]);
                        }
                    }
                    var contents = newProps.Select(x => x.Item2).ToList();
                    for (int j = 1; j <= contents.Count; j++)
                    {
                        excelHelper.Write(i + 1, j, contents[j - 1]);
                    }
                }
            }
            excelHelper.SaveAs(excelPath);
            MessageBox.Show("导出完成!");
        }
        private void checkedListBox_systemType_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            this._itemCheck = e;
            //SetCheckIndexs();
        }
        public void SetCheckIndexs()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            textBox1.Text += "开始时间:" + DateTime.Now.ToString();
            List<int> indexes = GetCheckedIndexes(this._itemCheck);
            Dictionary<string, List<Element>> dict = GetGroupElements(indexes);
            var elemIds = dict.Values.SelectMany(x => x).Select(y => y.Id).ToList();
            var view = Set3DView();
            if (elemIds.Count != 0)
            {
                view.OnlyShow(elemIds);
                view.Zoom(_uiDocument, elemIds);
            }
            stopwatch.Stop();
            textBox1.Text += ",获取所有构件耗时:" + stopwatch.Elapsed.TotalSeconds + "秒,时间:" + DateTime.Now.ToString();
            //stopwatch.Restart();
            FillDataGridView(dict);
        }
        private List<int> GetCheckedIndexes(ItemCheckEventArgs e)
        {
            var indexes = new List<int>();
            var items = this.checkedListBox_systemType.CheckedIndices;
            for (int i = 0; i < items.Count; i++)
            {
                int index = items[i];
                indexes.Add(index);
            }
            //if (e.NewValue == CheckState.Checked)
            //{
            //    indexes.Add(e.Index);
            //}
            //else
            //{
            //    if (indexes.Contains(e.Index))
            //    {
            //        indexes.Remove(e.Index);
            //    }
            //}
            return indexes;
        }
        private void SetProp(int eleId, string propName, string propValue)
        {
            var eid = new ElementId(eleId);
            var ele = _doc.GetElement(eid);
            if (ele == null) { return; }
            var prop = ele.LookupParameter(propName);
            if (propName.Equals("流量"))
                propValue = Math.Abs(decimal.Parse(propValue)).ToString();
            if (prop != null && !prop.IsReadOnly && prop.StorageType == StorageType.String)
            {
                prop.Set(propValue);
            }
        }
        private Dictionary<string, List<Element>> GetGroupElements(List<int> indexes)
        {
            Dictionary<string, List<Element>> dict = new Dictionary<string, List<Element>>();
            foreach (var index in indexes)
            {
                var systemType = checkedListBox_systemType.Items[index] as PipingSystemType;
                var typeName = systemType.Name;
                var elems = RevitMepElementService.GetElements(_doc, typeName);
                var subDict = RevitMepCategoryService.GroupElements(elems);
                foreach (var pairs in subDict)
                {
                    if (!dict.ContainsKey(pairs.Key))
                    {
                        dict.Add(pairs.Key, new List<Element>());
                    }
                    dict[pairs.Key].AddRange(pairs.Value);
                }
            }
            return dict;
        }
        public CheckModel GetNetWrok()
        {
            this._revitNetWork = NetWorkHelper.GetModelList(this.pageContainer);
            this._revitNetWork.BuildToInp(inpPath);
            return NetWorkHelper.Check(this._revitNetWork);
        }
        private string inpPath = "d:\\revitinp.inp";
        private void button2_Click(object sender, EventArgs e)
        {
            //SetProp(577273, "标记", "注释测试");
            ////var json = JsonHelper.ToJson(list);
            var result = GetNetWrok();
            //nw.BuildToInp(inpPath);
            if (result.Result)
            {
                if (MessageBox.Show("校验通过,是否执行计算?", "校验结果", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                {
                    var r = this._revitNetWork.Calc(inpPath);
                    SetEleProp(r);
                    var json = JsonHelper.ToJson(r);
                    JsonHelper.WriteJson("d:\\revittest.json", json);
                    MessageBox.Show("计算成功!");
                }
            }
            else
            {
                var form = new Form_CheckResult(result, this.pageContainer, _data, this);
                var revitHandle = Process.GetCurrentProcess().MainWindowHandle;
                form.Show(new WindowHandle(revitHandle));
            }
        }
        private void SetEleProp(List<TimePoint> eleProp)
        {
            //Transaction trans = new Transaction(_doc, "修改参数");
            //trans.Start();
            eleProp.ForEach(d =>
            {
                var id = int.Parse(d.Key.Split('_')[0]);
                var prop = d.Key.Split('_')[1];
                var vu = d.Value.ToString();
                SetProp(id, prop, vu);
            });
            //trans.Commit();
        }
        public void Test()
        {
            MessageBox.Show("OK");
        }
        private void button5_Click(object sender, EventArgs e)
        {
            SetCheckIndexs();
        }
        private void button6_Click(object sender, EventArgs e)
        {
            //var refernce = _uiDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
            var pipe1 = _doc.GetElement(new ElementId(714683)) as MEPCurve;
            //var refernce2 = _uiDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
            var pipe2 = _doc.GetElement(new ElementId(732605)) as MEPCurve;
            JoinGeometryUtils.JoinGeometry(_doc, pipe1, pipe2);
        }
    }
}
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.UI;
using Glodon.Revit.Utility;
using Hydro.Core.Model;
using Hydro.Revit;
using Hydro.Revit.Model;
using HStation.RevitDev.RevitDataExport.Common;
using HStation.RevitDev.RevitDataExport.Service;
using HStation.RevitDev.RevitDataExport.Utility;
using HStation.RevitDev.RevitDataExport.Common;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Forms;
using static Hydro.Core.ObjectEnum;
using Hydro.CommonBase;
namespace HStation.RevitDev.RevitDataExport.Forms
{
    public partial class Form_SystemSelect : System.Windows.Forms.Form
    {
        private UIDocument _uiDocument;
        private Document _doc;
        private ExternalCommandData _data;
        private ItemCheckEventArgs _itemCheck;
        public RevitNetWork _revitNetWork;
        public Form_SystemSelect(ExternalCommandData data)
        {
            _data = data;
            _uiDocument = data.Application.ActiveUIDocument;
            _doc = _uiDocument.Document;
            InitializeComponent();
        }
        private void SystemSelect_Load(object sender, System.EventArgs e)
        {
            InitControlsData();
        }
        private void InitControlsData()
        {
            InitMepSystemComboBox();
            InitMepSystemCheckListBox();
            InitDataGridViewStyle();
            InitDataGridViewEvent();
        }
        private void InitMepSystemCheckListBox()
        {
            this.checkedListBox_systemType.Items.Clear();
            var systemTypes = RevitMepSystemService.GetSystemTypeList(_doc).ToList();
            systemTypes = systemTypes.FindAll(x => x.GetDependentElements(new ElementClassFilter(typeof(PipingSystem), false)).Count != 0);
            if (systemTypes != null && systemTypes.Count > 0)
            {
                this.checkedListBox_systemType.DataSource = systemTypes;
                this.checkedListBox_systemType.DisplayMember = "Name";
                this.checkedListBox_systemType.SelectedIndex = 0;
            }
            this.checkedListBox_systemType.SelectedIndex = -1;
        }
        private void InitDataGridViewStyle()
        {
            var pages = this.pageContainer.TabPages;
            foreach (TabPage page in pages)
            {
                foreach (var subControl in page.Controls)
                {
                    if (subControl is DataGridView dgv)
                    {
                        dgv.AllowUserToResizeRows = false;
                    }
                }
            }
        }
        private void InitDataGridViewEvent()
        {
            var dgvs = new List<DataGridView>();
            var pages = this.pageContainer.TabPages;
            foreach (TabPage page in pages)
            {
                foreach (var subControl in page.Controls)
                {
                    if (subControl is DataGridView dgv)
                    {
                        dgvs.Add(dgv);
                        dgv.CellClick += Dgv_CellClick;
                        //dgv.CellContentDoubleClick += Dgv_DoubleCellClick;
                    }
                }
            }
        }
        private void Dgv_DoubleCellClick(object sender, DataGridViewCellEventArgs e)
        {
            var dgv = sender as DataGridView;
            var rowIndex = e.RowIndex;
            var columnIndex = e.ColumnIndex;
            var cell = dgv[columnIndex, rowIndex];
            if (cell.Value == null) { return; }
            var view = Set3DView();
            if (view == null) { return; }
            var cellText = cell.Value.ToString();
            if (dgv.Columns[columnIndex].HeaderText == "ID" ||
                dgv.Columns[columnIndex].HeaderText.Contains("连接点"))
            {
                var idContent = cellText.Split(':')?.Last();
                if (string.IsNullOrEmpty(idContent)) { return; }
                if (int.TryParse(idContent, out int id))
                {
                    var elementId = new ElementId(id);
                    var ids = new List<ElementId> { elementId };
                    view.Select(_uiDocument, ids);
                    view.OnlyShow(ids);
                    view.Zoom(_uiDocument, ids);
                }
            }
        }
        private void Dgv_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            var dgv = sender as DataGridView;
            var rowIndex = e.RowIndex;
            var columnIndex = e.ColumnIndex;
            var cell = dgv[columnIndex, rowIndex];
            if (cell.Value == null) { return; }
            var view = Set3DView();
            if (view == null) { return; }
            var cellText = cell.Value.ToString();
            if (dgv.Columns[columnIndex].HeaderText == "ID" ||
                dgv.Columns[columnIndex].HeaderText.Contains("连接点"))
            {
                var idContent = cellText.Split(':')?.Last();
                if (string.IsNullOrEmpty(idContent)) { return; }
                if (int.TryParse(idContent, out int id))
                {
                    var elementId = new ElementId(id);
                    var ids = new List<ElementId> { elementId };
                    view.Select(_uiDocument, ids);
                }
            }
        }
        private void InitMepSystemComboBox()
        {
            //this.comboBox1.Items.Clear();
            //var systems = RevitMepSystemService.GetSystemList(_doc).ToList();
            //systems = systems.FindAll(x => x is PipingSystem);
            //if (systems != null && systems.Count > 0)
            //{
            //    this.comboBox1.DataSource = systems;
            //    this.comboBox1.DisplayMember = "Name";
            //    this.comboBox1.SelectedIndex = 0;
            //}
            //this.comboBox1.SelectedIndex = -1;
        }
        private View3D Set3DView()
        {
            var view3d = ViewHelper.Get3dView(_doc);
            if (view3d == null) { return null; }
            _uiDocument.ActiveView = view3d;
            return view3d;
        }
        private List<Tuple<string, string>> PostProcessing(Dictionary<string, List<Element>> groupElems, List<Tuple<string, string>> properties)
        {
            var result = new List<Tuple<string, string>>();
            foreach (var prop in properties)
            {
                if (!prop.Item1.Contains("连接点"))
                {
                    result.Add(prop);
                    continue;
                }
                bool findGroupName = false;
                foreach (var group in groupElems)
                {
                    if (group.Value.Any(x => x.Id.IntegerValue.ToString() == prop.Item2))
                    {
                        result.Add(new Tuple<string, string>(prop.Item1, /*group.Key + ":" +*/ prop.Item2));
                        findGroupName = true;
                        break;
                    }
                }
                if (!findGroupName)
                {
                    result.Add(new Tuple<string, string>(prop.Item1, prop.Item2));
                }
            }
            return result;
        }
        private void FillRow(DataGridView dgv, List<Tuple<string, string>> properties, ref int elemIndex)
        {
            properties.Insert(0, new Tuple<string, string>("序号", (++elemIndex).ToString()));
            var newRowIndex = dgv.Rows.Add();
            for (var i = 0; i < dgv.ColumnCount; i++)
            {
                var cell = dgv.Rows[newRowIndex].Cells[i];
                var hd = dgv.Columns[cell.ColumnIndex].HeaderText;
                var p = properties.Where(c => c.Item1.Equals(hd)).FirstOrDefault();
                if (p != null)
                {
                    cell.Value = p.Item2?.ToString();
                }
            }
        }
        private void FillDataGridView(Dictionary<string, List<Element>> groupElems)
        {
            foreach (TabPage page in this.pageContainer.TabPages)
            //for (var i = 0; i < this.pageContainer.TabPages.Count - 1; i++)
            {
                //var t = new Task(() =>
                // {
                     //var page = this.pageContainer.TabPages[i];
                     string str = "";
                     Stopwatch sw = Stopwatch.StartNew();
                     sw.Restart();
                     var pageTitle = page.Text;
                     var dgv = page.Controls[0] as DataGridView;
                     dgv.Rows.Clear();
                     if (groupElems.ContainsKey(pageTitle))
                     {
                         //continue;
                         var elems = groupElems[pageTitle];
                         var parser = ParserManager.Instance.GetParser(pageTitle);
                         var elemIndex = 0;
                         foreach (var element in elems)
                         {
                             List<Tuple<string, string>> properties = parser.PropertyParse(element);
                             var newProps = PostProcessing(groupElems, properties);
                             FillRow(dgv, newProps, ref elemIndex);
                         }
                         sw.Stop();
                         str += pageTitle + " 数据加载耗时:" + sw.Elapsed.TotalSeconds + " 秒,数量:" + elems.Count + ",时间:" + DateTime.Now.ToString();
                         textBox1.Text += str;
                     }
                // });
                //t.Start();
            }
        }
        private void button1_Click2(object sender, EventArgs e)
        {
            var excelFolder = DialogHelper.UserSelectFolderPath();
            if (string.IsNullOrEmpty(excelFolder)) { return; }
            var excelPath = Path.Combine(excelFolder, $@"管道系统数据.xlsx");
            ExcelHelper excelHelper = new ExcelHelper();
            var indexes = new List<int>();
            var items = this.checkedListBox_systemType.CheckedIndices;
            for (int i = 0; i < items.Count; i++)
            {
                int index = items[i];
                indexes.Add(index);
            }
            Dictionary<string, List<Element>> dict = GetGroupElements(indexes);
            foreach (TabPage page in this.pageContainer.TabPages)
            {
                var pageTitle = page.Text;
                if (!dict.ContainsKey(pageTitle))
                {
                    continue;
                }
                var elems = dict[pageTitle];
                var parser = ParserManager.Instance.GetParser(pageTitle);
                excelHelper.SetCurrentSheet(pageTitle);
                for (int i = 1; i <= elems.Count; i++)
                {
                    var element = elems[i - 1];
                    List<Tuple<string, string>> properties = parser.PropertyParse(element);
                    var newProps = PostProcessing(dict, properties);
                    if (i == 1)//先写表头
                    {
                        var headers = newProps.Select(x => x.Item1).ToList();
                        for (int j = 1; j <= headers.Count; j++)
                        {
                            excelHelper.Write(i, j, headers[j - 1]);
                        }
                    }
                    var contents = newProps.Select(x => x.Item2).ToList();
                    for (int j = 1; j <= contents.Count; j++)
                    {
                        excelHelper.Write(i + 1, j, contents[j - 1]);
                    }
                }
            }
            excelHelper.SaveAs(excelPath);
            MessageBox.Show("导出完成!");
        }
        private void checkedListBox_systemType_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            this._itemCheck = e;
            //SetCheckIndexs();
        }
        public void SetCheckIndexs()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            textBox1.Text += "开始时间:" + DateTime.Now.ToString();
            List<int> indexes = GetCheckedIndexes(this._itemCheck);
            Dictionary<string, List<Element>> dict = GetGroupElements(indexes);
            var elemIds = dict.Values.SelectMany(x => x).Select(y => y.Id).ToList();
            var view = Set3DView();
            if (view == null) { return; }
            if (elemIds.Count != 0)
            {
                view.OnlyShow(elemIds);
                view.Zoom(_uiDocument, elemIds);
            }
            stopwatch.Stop();
            textBox1.Text += ",获取所有构件耗时:" + stopwatch.Elapsed.TotalSeconds + "秒,时间:" + DateTime.Now.ToString();
            //stopwatch.Restart();
            FillDataGridView(dict);
        }
        private List<int> GetCheckedIndexes(ItemCheckEventArgs e)
        {
            var indexes = new List<int>();
            var items = this.checkedListBox_systemType.CheckedIndices;
            for (int i = 0; i < items.Count; i++)
            {
                int index = items[i];
                indexes.Add(index);
            }
            //if (e.NewValue == CheckState.Checked)
            //{
            //    indexes.Add(e.Index);
            //}
            //else
            //{
            //    if (indexes.Contains(e.Index))
            //    {
            //        indexes.Remove(e.Index);
            //    }
            //}
            return indexes;
        }
        private void SetProp(int eleId, string propName, string propValue)
        {
            var eid = new ElementId(eleId);
            var ele = _doc.GetElement(eid);
            if (ele == null) { return; }
            var prop = ele.LookupParameter(propName);
            if (propName.Equals("流量"))
                propValue = Math.Abs(decimal.Parse(propValue)).ToString();
            if (prop != null && !prop.IsReadOnly && prop.StorageType == StorageType.String)
            {
                prop.Set(propValue);
            }
        }
        private Dictionary<string, List<Element>> GetGroupElements(List<int> indexes)
        {
            Dictionary<string, List<Element>> dict = new Dictionary<string, List<Element>>();
            foreach (var index in indexes)
            {
                var systemType = checkedListBox_systemType.Items[index] as PipingSystemType;
                var typeName = systemType.Name;
                var elems = RevitMepElementService.GetElements(_doc, typeName);
                var subDict = RevitMepCategoryService.GroupElements(elems);
                foreach (var pairs in subDict)
                {
                    if (!dict.ContainsKey(pairs.Key))
                    {
                        dict.Add(pairs.Key, new List<Element>());
                    }
                    dict[pairs.Key].AddRange(pairs.Value);
                }
            }
            return dict;
        }
        public CheckModel GetNetWrok()
        {
            this._revitNetWork = NetWorkHelper.GetModelList(this.pageContainer);
            this._revitNetWork.BuildToInp(inpPath);
            return NetWorkHelper.Check(this._revitNetWork);
        }
        private string inpPath = "d:\\revitinp.inp";
        private void button2_Click(object sender, EventArgs e)
        {
            //SetProp(577273, "标记", "注释测试");
            ////var json = JsonHelper.ToJson(list);
            var result = GetNetWrok();
            //nw.BuildToInp(inpPath);
            if (result.Result)
            {
                if (MessageBox.Show("校验通过,是否执行计算?", "校验结果", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                {
                    var r = this._revitNetWork.Calc(inpPath);
                    SetEleProp(r);
                    var json = JsonHelper.ToJson(r);
                    JsonHelper.WriteJson("d:\\revittest.json", json);
                    MessageBox.Show("计算成功!");
                }
            }
            else
            {
                var form = new Form_CheckResult(result, this.pageContainer, _data, this);
                var revitHandle = Process.GetCurrentProcess().MainWindowHandle;
                form.Show(new WindowHandle(revitHandle));
            }
        }
        private void SetEleProp(List<TimePoint> eleProp)
        {
            //Transaction trans = new Transaction(_doc, "修改参数");
            //trans.Start();
            eleProp.ForEach(d =>
            {
                var id = int.Parse(d.Key.Split('_')[0]);
                var prop = d.Key.Split('_')[1];
                var vu = d.Value.ToString();
                SetProp(id, prop, vu);
            });
            //trans.Commit();
        }
        public void Test()
        {
            MessageBox.Show("OK");
        }
        private void button5_Click(object sender, EventArgs e)
        {
            SetCheckIndexs();
        }
        private void button6_Click(object sender, EventArgs e)
        {
            //var refernce = _uiDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
            var pipe1 = _doc.GetElement(new ElementId(714683)) as MEPCurve;
            //var refernce2 = _uiDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
            var pipe2 = _doc.GetElement(new ElementId(732605)) as MEPCurve;
            JoinGeometryUtils.JoinGeometry(_doc, pipe1, pipe2);
        }
    }
}