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.Utils; 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(); 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 }; 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 }; 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> PostProcessing(Dictionary> groupElems, List> properties) { var result = new List>(); 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(prop.Item1, /*group.Key + ":" +*/ prop.Item2)); findGroupName = true; break; } } if (!findGroupName) { result.Add(new Tuple(prop.Item1, prop.Item2)); } } return result; } private void FillRow(DataGridView dgv, List> properties, ref int elemIndex) { properties.Insert(0, new Tuple("序号", (++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> 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> 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(); var items = this.checkedListBox_systemType.CheckedIndices; for (int i = 0; i < items.Count; i++) { int index = items[i]; indexes.Add(index); } Dictionary> 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> 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 indexes = GetCheckedIndexes(this._itemCheck); Dictionary> 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 GetCheckedIndexes(ItemCheckEventArgs e) { var indexes = new List(); 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> GetGroupElements(List indexes) { Dictionary> dict = new Dictionary>(); 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()); } 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 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); } } }