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<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);
|
}
|
}
|
}
|