443 lines
19 KiB
C#
443 lines
19 KiB
C#
using Autodesk.Revit.Attributes;
|
|
using Autodesk.Revit.DB;
|
|
using Autodesk.Revit.DB.Architecture;
|
|
using Autodesk.Revit.DB.Electrical;
|
|
using Autodesk.Revit.DB.Plumbing;
|
|
using Autodesk.Revit.UI;
|
|
using OfficeOpenXml;
|
|
using RookieStation.Utils;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using static OfficeOpenXml.ExcelErrorValue;
|
|
|
|
namespace RookieStation.Statistics
|
|
{
|
|
[Transaction(TransactionMode.Manual)]
|
|
[Regeneration(RegenerationOption.Manual)]
|
|
internal class CmdExportWorkSchedule : IExternalCommand
|
|
{
|
|
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
|
|
{
|
|
UIApplication uiapp = commandData.Application;
|
|
UIDocument uidoc = uiapp.ActiveUIDocument;
|
|
Document doc = uidoc.Document;
|
|
|
|
string fileName = UserConstant.AddinDirectory + "\\RsLibrary\\Document\\样板工程量清单.xlsx";
|
|
SaveFileDialog sfd = new SaveFileDialog()
|
|
{
|
|
Filter = "Excel文件|*.xlsx"
|
|
};
|
|
//VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog()
|
|
//{
|
|
// Multiselect = false,
|
|
//};
|
|
string destinationFileName = string.Empty;
|
|
if (sfd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
destinationFileName = sfd.FileName;
|
|
|
|
File.Copy(fileName, destinationFileName, true);
|
|
}
|
|
if (destinationFileName == string.Empty)
|
|
{
|
|
return Result.Cancelled;
|
|
}
|
|
//白色乳胶漆
|
|
double blankEmulsionPaintArea = 0.0;
|
|
//灰色乳胶漆
|
|
double greyEmulsionPaintArea = 0.0;
|
|
//踢脚线
|
|
double skirtingWallLength = 0.0;
|
|
//铝塑板
|
|
double aluminumPlasticPanelArea = 0.0;
|
|
//轻钢龙骨
|
|
double steelWallArea = 0.0;
|
|
//水泥砂浆
|
|
double cementMortarArea = 0.0;
|
|
//桥架
|
|
double cableTrayLength = 0.0;
|
|
//消防管
|
|
double pipeLength = 0.0;
|
|
//寄件台
|
|
double receptionDeskLength = 0;
|
|
//绿动箱
|
|
int greenRecyclingBoxCount = 0;
|
|
//绿动垃圾箱
|
|
int trashCanCount = 0;
|
|
//货架数量
|
|
int shelfCount = 0;
|
|
//货架尺寸
|
|
string shelfSize = string.Empty;
|
|
//端牌
|
|
int shelfCardCount = 0;
|
|
//高拍仪
|
|
int highCameraCount = 0;
|
|
//菜鸟使命字
|
|
int cainiaoDutyCount = 0;
|
|
//防撞条长度
|
|
double containmentLength = 0.0;
|
|
//标识牌
|
|
int signageCount = 0;
|
|
//地贴
|
|
int groundSignageCount = 0;
|
|
//侧招灯箱
|
|
int lightBoxCount = 0;
|
|
//海报
|
|
int posterCount = 0;
|
|
//亚克力不发光字
|
|
int textCount = 0;
|
|
//闸机
|
|
int extranceGateCount = 0;
|
|
//收检台
|
|
int exitGateDeskCount = 0;
|
|
//配电箱
|
|
int switchingCabinetCount = 0;
|
|
//从开关
|
|
int switchCount = 0;
|
|
//插座
|
|
int socketCount = 0;
|
|
//射灯
|
|
int spotLightCount = 0;
|
|
//筒灯
|
|
int downlightCount = 0;
|
|
//筒灯应急模块
|
|
int downlightEmergencyModuleCount = 0;
|
|
//吊灯
|
|
int chandelierCount = 0;
|
|
//支架灯
|
|
int bracketLightCount = 0;
|
|
//镀锌方管骨架
|
|
double galvanizeFrame = 0.0;
|
|
//卷帘门
|
|
double curtainedDoorArea = 0.0;
|
|
//文化墙
|
|
double cultureWallArea = 0.0;
|
|
//半透明玻璃贴
|
|
double halfGlassPasteArea = 0.0;
|
|
//伸缩隔离栏
|
|
int railIsolateCount = 0;
|
|
//菜小鸟雕塑
|
|
int cainiaoSculptureCount = 0;
|
|
//面积
|
|
double floorArea = 0.0;
|
|
//门头石
|
|
double doorStoneArea = 0.0;
|
|
//台阶饰面
|
|
double stairStoneArea = 0.0;
|
|
var walls = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).OfClass(typeof(Wall));
|
|
foreach (Wall wall in walls)
|
|
{
|
|
if (wall.Name.Contains("灰色乳胶漆"))
|
|
{
|
|
greyEmulsionPaintArea += wall.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
|
|
}
|
|
else if (wall.Name.Contains("白色乳胶漆"))
|
|
{
|
|
blankEmulsionPaintArea += wall.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
|
|
}
|
|
else if (wall.Name.Contains("黑钛不锈钢"))
|
|
{
|
|
skirtingWallLength += wall.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH).AsDouble();
|
|
}
|
|
else if (wall.Name.Contains("铝塑板"))
|
|
{
|
|
aluminumPlasticPanelArea += wall.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
|
|
var re = HostObjectUtils.GetSideFaces(wall, ShellLayerType.Interior).FirstOrDefault();
|
|
PlanarFace p = wall.GetGeometryObjectFromReference(re) as PlanarFace;
|
|
var cs = p.GetEdgesAsCurveLoops().OrderByDescending(l => l.GetExactLength());
|
|
galvanizeFrame += cs.First().GetExactLength();
|
|
}
|
|
else if (wall.Name.Contains("轻钢龙骨"))
|
|
{
|
|
steelWallArea += wall.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
|
|
}
|
|
else if (wall.Name.Contains("水泥砂浆"))
|
|
{
|
|
cementMortarArea += wall.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
|
|
}
|
|
}
|
|
var floors = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors).OfClass(typeof(Floor));
|
|
foreach (Floor floor in floors)
|
|
{
|
|
floorArea += floor.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
|
|
}
|
|
var pipes = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeCurves).OfClass(typeof(Pipe));
|
|
foreach (Pipe p in pipes)
|
|
{
|
|
pipeLength += p.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH).AsDouble();
|
|
}
|
|
var cableTrays = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_CableTray).OfClass(typeof(CableTray));
|
|
foreach (CableTray ct in cableTrays)
|
|
{
|
|
cableTrayLength += ct.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH).AsDouble();
|
|
}
|
|
var lights = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_LightingFixtures).OfClass(typeof(FamilyInstance));
|
|
foreach (FamilyInstance light in lights)
|
|
{
|
|
if (light.Symbol.FamilyName.Contains("支架灯"))
|
|
{
|
|
bracketLightCount += 1;
|
|
}
|
|
else if (light.Symbol.FamilyName.Contains("筒灯"))
|
|
{
|
|
if (light.Symbol.get_Parameter(BuiltInParameter.WINDOW_TYPE_ID).AsString() == "E")
|
|
{
|
|
downlightEmergencyModuleCount += 1;
|
|
}
|
|
else
|
|
{
|
|
downlightCount += 1;
|
|
}
|
|
}
|
|
else if (light.Symbol.FamilyName.Contains("吊灯"))
|
|
{
|
|
chandelierCount += 1;
|
|
}
|
|
else if (light.Symbol.FamilyName.Contains("射灯"))
|
|
{
|
|
spotLightCount += 1;
|
|
}
|
|
}
|
|
var sockets = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_ElectricalFixtures).OfClass(typeof(FamilyInstance));
|
|
|
|
foreach (FamilyInstance socket in sockets)
|
|
{
|
|
if (socket.Symbol.FamilyName.Contains("二三孔"))
|
|
{
|
|
socketCount += 1;
|
|
}
|
|
else if (socket.Symbol.FamilyName.Contains("数据信息"))
|
|
{
|
|
socketCount += 1;
|
|
}
|
|
}
|
|
var switchs = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_LightingDevices).OfClass(typeof(FamilyInstance));
|
|
foreach (FamilyInstance swit in switchs)
|
|
{
|
|
if (swit.Symbol.FamilyName.Contains("单联") && swit.Name.Contains("单控"))
|
|
{
|
|
switchCount += 1;
|
|
}
|
|
}
|
|
var furnitures = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Furniture).OfClass(typeof(FamilyInstance));
|
|
foreach (FamilyInstance furn in furnitures)
|
|
{
|
|
bool isdetail = furn.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).AsString().Contains("大样");
|
|
if (furn.Symbol.FamilyName.Contains("收检台") && !isdetail)
|
|
{
|
|
exitGateDeskCount += 1;
|
|
}
|
|
else if (furn.Symbol.FamilyName.Contains("接待台") && !isdetail)
|
|
{
|
|
receptionDeskLength = furn.Symbol.GetParameters("台面长度").FirstOrDefault().AsDouble();
|
|
}
|
|
else if (furn.Symbol.FamilyName.Contains("绿动箱") && !isdetail)
|
|
{
|
|
greenRecyclingBoxCount += 1;
|
|
if (furn.Symbol.Name.Contains("1500"))
|
|
{
|
|
trashCanCount += 1;
|
|
}
|
|
else
|
|
{
|
|
trashCanCount += 2;
|
|
}
|
|
}
|
|
else if (furn.Symbol.FamilyName.Contains("货架"))
|
|
{
|
|
shelfCount += 1;
|
|
}
|
|
else if (furn.Symbol.FamilyName.Contains("菜小鸟雕塑"))
|
|
{
|
|
cainiaoSculptureCount += 1;
|
|
}
|
|
}
|
|
var furnituressystem = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_FurnitureSystems).OfClass(typeof(FamilyInstance));
|
|
foreach (FamilyInstance furnsys in furnituressystem)
|
|
{
|
|
if (furnsys.Symbol.FamilyName.Contains("端牌"))
|
|
{
|
|
shelfCardCount += 1;
|
|
}
|
|
else if (furnsys.Symbol.FamilyName.Contains("使命"))
|
|
{
|
|
cainiaoDutyCount += 1;
|
|
}
|
|
else if (furnsys.Symbol.FamilyName.Contains("防撞条"))
|
|
{
|
|
containmentLength += furnsys.get_Parameter(BuiltInParameter.FAMILY_LINE_LENGTH_PARAM).AsDouble();
|
|
}
|
|
else if (furnsys.Symbol.FamilyName.Contains("标识"))
|
|
{
|
|
signageCount += 1;
|
|
}
|
|
else if (furnsys.Symbol.FamilyName.Contains("亚克力"))
|
|
{
|
|
textCount += furnsys.GetParameters("文字").FirstOrDefault().AsString().Length;
|
|
}
|
|
else if (furnsys.Symbol.FamilyName.Contains("地贴"))
|
|
{
|
|
groundSignageCount += 1;
|
|
}
|
|
else if (furnsys.Symbol.FamilyName.Contains("灯箱"))
|
|
{
|
|
lightBoxCount += 1;
|
|
}
|
|
else if (furnsys.Symbol.FamilyName.Contains("海报"))
|
|
{
|
|
posterCount += 1;
|
|
}
|
|
else if (furnsys.Symbol.FamilyName.Contains("文化墙"))
|
|
{
|
|
var h = furnsys.GetParameters("高度").First().AsDouble();
|
|
var l = furnsys.GetParameters("长度").First().AsDouble();
|
|
cultureWallArea += h * l;
|
|
}
|
|
else if (furnsys.Symbol.FamilyName.Contains("半透"))
|
|
{
|
|
double h = furnsys.GetParameters("高度").First().AsDouble();
|
|
double w = furnsys.GetParameters("宽度").First().AsDouble();
|
|
halfGlassPasteArea += h * w;
|
|
}
|
|
}
|
|
var equipments = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_SpecialityEquipment).OfClass(typeof(FamilyInstance));
|
|
foreach (FamilyInstance equip in equipments)
|
|
{
|
|
if (equip.Symbol.FamilyName.Contains("闸机"))
|
|
{
|
|
extranceGateCount += 1;
|
|
}
|
|
else if (equip.Symbol.FamilyName.Contains("高拍仪"))
|
|
{
|
|
highCameraCount += 1;
|
|
}
|
|
}
|
|
var doors = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilyInstance));
|
|
foreach (FamilyInstance door in doors)
|
|
{
|
|
if (door.Symbol.FamilyName.Contains("卷帘"))
|
|
{
|
|
var width = door.Symbol.GetParameters("宽度").FirstOrDefault().AsDouble();
|
|
var height = door.Symbol.GetParameters("高度").FirstOrDefault().AsDouble();
|
|
curtainedDoorArea += height * width;
|
|
}
|
|
else if (door.Symbol.FamilyName.Contains("单扇"))
|
|
{
|
|
}
|
|
}
|
|
var rails = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StairsRailing).OfClass(typeof(Railing));
|
|
foreach (Railing rail in rails)
|
|
{
|
|
if (rail.Name.Contains("伸缩隔离栏"))
|
|
{
|
|
railIsolateCount += 1;
|
|
}
|
|
}
|
|
var sites = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Site).OfClass(typeof(FamilyInstance));
|
|
foreach (FamilyInstance site in sites)
|
|
{
|
|
if (site.Symbol.FamilyName.Contains("门头石"))
|
|
{
|
|
var length = site.Symbol.GetParameters("长度").FirstOrDefault().AsDouble();
|
|
var height = site.Symbol.GetParameters("高度").FirstOrDefault().AsDouble();
|
|
doorStoneArea += height * length;
|
|
}
|
|
else if (site.Symbol.FamilyName.Contains("台阶"))
|
|
{
|
|
var width = site.GetParameters("踏面宽度").FirstOrDefault().AsDouble();
|
|
var length = site.GetParameters("梯段宽度").FirstOrDefault().AsDouble();
|
|
int num = 0;
|
|
switch (site.Symbol.Name)
|
|
{
|
|
case "一阶":
|
|
num = 1;
|
|
break;
|
|
|
|
case "二阶":
|
|
num = 2;
|
|
break;
|
|
|
|
case "三阶":
|
|
num = 3;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
stairStoneArea += length * width * num;
|
|
}
|
|
}
|
|
FileInfo fi = new FileInfo(destinationFileName);
|
|
using (ExcelPackage package = new ExcelPackage(fi))
|
|
{
|
|
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
|
ExcelWorksheet sheet0 = package.Workbook.Worksheets["汇总表"];
|
|
ExcelWorksheet sheet1 = package.Workbook.Worksheets["基装"];
|
|
//消防管
|
|
sheet1.Cells[8, 7].Value = RsRevitUtils.FtConvertToM(pipeLength);
|
|
//桥架
|
|
sheet1.Cells[9, 7].Value = RsRevitUtils.FtConvertToM(cableTrayLength);
|
|
//乳胶漆
|
|
sheet1.Cells[10, 7].Value = RsRevitUtils.SFConvertToSM(blankEmulsionPaintArea + greyEmulsionPaintArea);
|
|
//铝塑板
|
|
sheet1.Cells[11, 7].Value = RsRevitUtils.SFConvertToSM(aluminumPlasticPanelArea);
|
|
sheet1.Cells[12, 7].Value = RsRevitUtils.FtConvertToM(galvanizeFrame);
|
|
sheet1.Cells[13, 7].Value = RsRevitUtils.SFConvertToSM(cementMortarArea);
|
|
//轻钢龙骨
|
|
sheet1.Cells[14, 7].Value = RsRevitUtils.SFConvertToSM(steelWallArea);
|
|
sheet1.Cells[16, 7].Value = RsRevitUtils.SFConvertToSM(floorArea);
|
|
sheet1.Cells[17, 7].Value = RsRevitUtils.SFConvertToSM(floorArea);
|
|
sheet1.Cells[18, 7].Value = RsRevitUtils.SFConvertToSM(floorArea);
|
|
//踢脚线
|
|
sheet1.Cells[19, 7].Value = RsRevitUtils.FtConvertToM(skirtingWallLength);
|
|
sheet1.Cells[21, 7].Value = RsRevitUtils.SFConvertToSM(stairStoneArea);
|
|
sheet1.Cells[22, 7].Value = RsRevitUtils.SFConvertToSM(doorStoneArea);
|
|
sheet1.Cells[24, 7].Value = RsRevitUtils.FtConvertToM(receptionDeskLength);
|
|
sheet1.Cells[25, 7].Value = greenRecyclingBoxCount;
|
|
sheet1.Cells[26, 7].Value = exitGateDeskCount;
|
|
sheet1.Cells[27, 7].Value = RsRevitUtils.SFConvertToSM(curtainedDoorArea);
|
|
sheet1.Cells[32, 7].Value = switchingCabinetCount;
|
|
//为什么和桥架乳胶漆长度不一样
|
|
sheet1.Cells[33, 7].Value = RsRevitUtils.FtConvertToM(cableTrayLength);
|
|
sheet1.Cells[39, 7].Value = socketCount;
|
|
sheet1.Cells[40, 7].Value = switchCount;
|
|
sheet1.Cells[41, 7].Value = chandelierCount;
|
|
sheet1.Cells[42, 7].Value = spotLightCount;
|
|
sheet1.Cells[46, 7].Value = downlightCount;
|
|
sheet1.Cells[47, 7].Value = bracketLightCount;
|
|
sheet1.Cells[48, 7].Value = downlightEmergencyModuleCount;
|
|
|
|
ExcelWorksheet sheet2 = package.Workbook.Worksheets["道具"];
|
|
sheet2.Cells[4, 7].Value = trashCanCount;
|
|
sheet2.Cells[5, 7].Value = extranceGateCount;
|
|
sheet2.Cells[6, 7].Value = railIsolateCount;
|
|
sheet2.Cells[7, 7].Value = cainiaoSculptureCount;
|
|
|
|
ExcelWorksheet sheet3 = package.Workbook.Worksheets["品牌模块"];
|
|
|
|
sheet3.Cells[7, 6].Value = lightBoxCount;
|
|
sheet3.Cells[9, 6].Value = textCount;
|
|
sheet3.Cells[10, 6].Value = textCount;
|
|
sheet3.Cells[11, 6].Value = signageCount;
|
|
sheet3.Cells[12, 6].Value = RsRevitUtils.SFConvertToSM(cultureWallArea);
|
|
sheet3.Cells[14, 6].Value = cainiaoDutyCount;
|
|
sheet3.Cells[15, 6].Value = RsRevitUtils.SFConvertToSM(halfGlassPasteArea);
|
|
sheet3.Cells[16, 6].Value = RsRevitUtils.FtConvertToM(containmentLength);
|
|
sheet3.Cells[17, 6].Value = groundSignageCount;
|
|
sheet3.Cells[18, 6].Value = shelfCardCount;
|
|
sheet3.Cells[19, 4].Value = shelfSize;
|
|
sheet3.Cells[19, 6].Value = shelfCount;
|
|
|
|
package.Save();
|
|
}
|
|
System.Diagnostics.Process.Start(destinationFileName);
|
|
return Result.Succeeded;
|
|
}
|
|
}
|
|
} |