Я пишу плагин для Revit в C#
, и код долгое время точно читал ячейки Excel. Затем к тому же сценарию я указал путь к другому файлу Excel, теперь он не принимает файл excel
, даже первый файл Excel, который он читал в течение длительного времени. Я не знаю, почему тот же скрипт чтения ячеек из excel
больше не работает. я получаю исключение как; «смещение и длина вышли за пределы массива или счетчика больше, чем количество элементов от индекса до конца исходной коллекции», потому что в этой строке я пытаюсь извлечь некоторые элементы из списка, но на самом деле в этом списке ничего нет не принимает значения из Excel Вы можете увидеть изображение в ссылке. введите описание изображения здесь
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Microsoft.Office.Interop.Excel;
using Line = Autodesk.Revit.DB.Line;
using System.IO;
namespace RevitComm
{
[TransactionAttribute(TransactionMode.Manual)]
class Boundaries : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//-------------------------------------------------Reading from excel coordinates-------------------------------------------------------------|
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"D:\Example.xlsx");
Microsoft.Office.Interop.Excel.Worksheet xlWorksheet = xlWorkbook.Sheets[1];
Microsoft.Office.Interop.Excel.Range xlRange = xlWorksheet.UsedRange;
//---------------------------------------------------Rows and columns--------------------------------------------------------------------------|
int rowCount = xlRange.Rows.Count;
int colCount = xlRange.Columns.Count;
//--------------------------------------------------Conversion Factor--------------------------------------------------------------------------|
double cF = 1 / 0.3048;
//-------------------------------------- No of entered rows + 1 as rows starts from 2 -------------------------------------------------------|
int rows = Convert.ToInt32(xlRange.Cells[3, "B"].value2) + 3;
//---------------------------------------------------Getting Active Revit Document--------------------------------------------------------------|
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
double z = 0;
//------------------------------------------- Getting the level on which Wall starts------------------------------------------------------------|
Level level = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Levels)
.WhereElementIsNotElementType()
.Cast<Level>()
.First(x => x.Name == "Level 1");
//------------------------------------------------- Getting level on which Roof to be placed ----------------------------------------------------|
Level upperlevel = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Levels)
.WhereElementIsNotElementType()
.Cast<Level>()
.First(x => x.Name == "Level 2");
//------------------------------------------------- Roof type ---------------------------------------------------------------------------------|
var rooftype = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Roofs)
.WhereElementIsElementType().Cast<RoofType>().First(x => x.Name == "Generic - 9\"");
//------------- Floor type example __________//
var floorty = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors)
.WhereElementIsElementType().Cast<FloorType>().First(x => x.Name == "OurFloor");
//----- wall type example
var wallty = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls)
.WhereElementIsElementType().Cast<WallType>().First(x => x.Name == "JustGeneric");
//------------------------------------------ List for Points -----------------------------------------------------------------------------|
List<XYZ> pointStr = new List<XYZ>();
//----------Start Points------/
for (int i = 4; i < rows; i = i + 2)
{
XYZ pi = new XYZ(xlRange.Cells[i, "N"].value2 * cF, xlRange.Cells[i, "O"].value2 * cF, z);
pointStr.Add(pi);
}
//----------------End Points ------------/
List<XYZ> pointEnd = new List<XYZ>();
for (int i = 5; i <= rows; i = i + 2)
{
XYZ pi = new XYZ(xlRange.Cells[i, "N"].value2 * cF, xlRange.Cells[i, "O"].value2 * cF, z);
pointEnd.Add(pi);
}
//-----------------------------------------------------------List for Lines -------------------------------------------------------|
List<Line> lines = new List<Line>();
for (int i = 0; i < (rows - 3) / 2; i++)
{
XYZ pk = pointStr.ElementAt(i);
XYZ pj = pointEnd.ElementAt(i);
Line l = Line.CreateBound(pk, pj);
lines.Add(l);
}
//------------------------------------------------------- List for Curves for walls ------------------------------------------------------|
List<Curve> curWalls = new List<Curve>();
for (int i = 0; i < (rows - 3) / 2; i++)
{
Line li = lines.ElementAt(i);
curWalls.Add(li);
}
List<Curve> Curvet = curWalls.GetRange(0,4);
CurveLoop crvloopExE = CurveLoop.Create(Curvet);
CurveLoop offcrExE = CurveLoop.CreateViaOffset(crvloopExE, 0.5 * cF, new XYZ(0, 0, 1));
CurveArray curArrExE = new CurveArray();
foreach (Curve c in offcrExE)
{
/// To put the curves to Currve array
curArrExE.Append(c);
}
// ------------------------------------ Start transaction -------------------------------------------------------|
try
{
//return Result.Succeeded;
using (Transaction trans = new Transaction(doc, "Neus-Haus"))
{
trans.Start();
// Creating Walls
for (int i = 0; i <= 5; i++)
Wall W1 = Wall.Create(doc, curWalls.ElementAt(i), wallty.Id, level.Id, 3 * cF, 0, false, false);
}
trans.Commit();
}
return Result.Succeeded;
}
catch (Exception e)
{
message = e.Message;
return Result.Failed;
}
}
}
}