Files
RookieStation/RookieStation/cmdExportWorkSchedule.cs
2021-06-11 15:42:50 +08:00

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