代码文件
【话不多说,上代码】
try
{
//句柄
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
//让用户选择需要算量的构件;
TaskDialog.Show("提示信息", "请先框选需要汇总工程量的构件,完成后单机左上角的完成按钮!");
IList<Reference> referList = uidoc.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element,
"请框选需要选中的构件");
List<Element> elementList = new List<Element>();
foreach (Reference refer in referList)
{
Element referElement = doc.GetElement(refer.ElementId);
elementList.Add(referElement);
}
//初始化数据
List<Element> wallList = new List<Element>();
double wallVolume = 0.000;
string wallInfo = "【构件名称】" + "----" + "【构件ID】" + "----" + "【构件体积】" + "\t\n";
List<Element> columnList = new List<Element>();
double columnVolume = 0.000;
string columnInfo = "【构件名称】" + "----" + "【构件ID】" + "----" + "【构件体积】" + "\t\n";
List<Element> beamList = new List<Element>();
double beamVolume = 0.000;
string beamInfo = "【构件名称】" + "----" + "【构件ID】" + "----" + "【构件体积】" + "\t\n";
List<Element> floorList = new List<Element>();
double floorVolume = 0.000;
string floorInfo = "【构件名称】" + "----" + "【构件ID】" + "----" + "【构件体积】" + "\t\n";
List<Element> stairList = new List<Element>();
double stairVolume = 0.000;
string stairInfo = "【构件名称】" + "----" + "【构件ID】" + "----" + "【构件体积】" + "\t\n";
List<Element> foundationList = new List<Element>();
double foundationVolume = 0.000;
string foundationInfo = "【构件名称】" + "----" + "【构件ID】" + "----" + "【构件体积】" + "\t\n";
List<Element> roofList = new List<Element>();
double roofVolume = 0.000;
string roofInfo = "【构件名称】" + "----" + "【构件ID】" + "----" + "【构件体积】" + "\t\n";
List<Element> genericList = new List<Element>();
double genericVolume = 0.000;
string genericInfo = "【构件名称】" + "----" + "【构件ID】" + "----" + "【构件体积】" + "\t\n";
List<Element> elseList = new List<Element>();
string elseInfo = "【构件名称】" + "----" + "【构件ID】" + "\t\n";
//判断构件类型,统计构件体积
foreach (Element elem in elementList)
{
string name = elem.Category.Name.ToString();
//计算墙体体积
if (name == "墙")
{
wallList.Add(elem);
wallInfo += (elem.Name.ToString() + "----" + elem.Id.ToString() + "----");
foreach (Parameter para in elem.Parameters)
{
if (para.Definition.Name == "体积")
{
wallVolume += double.Parse(para.AsValueString());
wallInfo += (para.AsValueString() + "\t\n");
}
}
}
//计算结构柱体积
if (name == "结构柱")
{
columnList.Add(elem);
columnInfo += (elem.Name + "----" + elem.Id.ToString() + "----");
foreach (Parameter para in elem.Parameters)
{
if (para.Definition.Name == "体积")
{
columnVolume += double.Parse(para.AsValueString());
columnInfo += para.AsValueString() + "\t\n";
}
}
}
//计算结构框架体积
if (name == "结构框架")
{
beamList.Add(elem);
beamInfo += (elem.Name + "----" + elem.Id.ToString() + "----");
foreach (Parameter para in elem.Parameters)
{
if (para.Definition.Name == "体积")
{
beamVolume += double.Parse(para.AsValueString());
beamInfo += (para.AsValueString() + "\t\n");
}
}
}
//计算楼板体积
if (name == "楼板")
{
floorList.Add(elem);
floorInfo += (elem.Name + "----" + elem.Id.ToString() + "----");
foreach (Parameter para in elem.Parameters)
{
if (para.Definition.Name == "体积")
{
floorVolume += double.Parse(para.AsValueString());
floorInfo += (para.AsValueString() + "\t\n");
}
}
}
//计算楼梯体积
if (name == "楼梯")
{
ICollection<ElementId> stairIds = elem.GetMaterialIds(false);
foreach (ElementId stairId in stairIds)
{
stairList.Add(elem);
foreach (Parameter para in elem.Parameters)
{
if (para.Definition.Name == "族与类型")
{
stairInfo += (para.AsValueString() + "----");
}
}
stairInfo += elem.Id.ToString() + "----";
stairVolume += (elem.GetMaterialVolume(stairId) * 0.3048 * 0.3048 * 0.3048);
stairInfo += ((elem.GetMaterialVolume(stairId) * 0.3048 * 0.3048 * 0.3048).ToString("0.000") + "\t\n");
}
}
//计算结构基础体积
if (name == "结构基础")
{
foundationList.Add(elem);
foundationInfo += (elem.Name + "----" + elem.Id.ToString() + "----");
foreach (Parameter para in elem.Parameters)
{
if (para.Definition.Name == "体积")
{
foundationVolume += double.Parse(para.AsValueString());
foundationInfo += (para.AsValueString() + "\t\n");
}
}
}
//计算屋顶体积
if (name == "屋顶")
{
roofList.Add(elem);
roofInfo += (elem.Name + "----" + elem.Id.ToString() + "----");
foreach (Parameter para in elem.Parameters)
{
if (para.Definition.Name == "体积")
{
roofVolume += double.Parse(para.AsValueString());
roofInfo += (para.AsValueString() + "\t\n");
}
}
}
//计算常规模型体积
if (name == "常规模型")
{
genericList.Add(elem);
foreach (Parameter para in elem.Parameters)
{
if (para.Definition.Name == "族与类型")
{
stairInfo += (para.AsValueString() + "----");
}
}
stairInfo += (elem.Id.ToString() + "----");
foreach (Parameter para in elem.Parameters)
{
if (para.Definition.Name == "体积")
{
genericVolume += double.Parse(para.AsValueString());
genericInfo += (para.AsValueString() + "\t\n");
}
}
}
//其他构件的显示
if (name != "墙" && name != "结构柱" && name != "结构框架" && name != "楼板"
&& name != "楼梯" && name != "结构基础" && name != "屋顶" && name != "常规模型")
{
elseList.Add(elem);
foreach (Parameter para in elem.Parameters)
{
if (para.Definition.Name == "族与类型")
{
elseInfo += (para.AsValueString() + "----");
}
}
elseInfo += elem.Id.ToString() + "\t\n";
}
}
//弹出对话框显示汇总结果
GetSolidVolume_WPF getSolidVolumeWPF = new GetSolidVolume_WPF(
wallList.Count(), wallVolume, wallInfo,
columnList.Count(), columnVolume, columnInfo,
beamList.Count(), beamVolume, beamInfo,
floorList.Count(), floorVolume, floorInfo,
stairList.Count(), stairVolume, stairInfo,
foundationList.Count(), foundationVolume, foundationInfo,
roofList.Count(), roofVolume, roofInfo,
genericList.Count(), genericVolume, genericInfo,
elseList.Count(), elseInfo
);
getSolidVolumeWPF.ShowDialog();
return Result.Succeeded;
}
catch (Exception ex)
{
TaskDialog.Show("错误!!!", ex.ToString());
return Result.Failed;
}
效果展示
这部分内容正在研究,稍后上线