如何使用C#在Revit中获取计划元素数据

时间:2018-07-14 06:42:19

标签: revit-api

我是Revit API的新手,正在使用C#。我想使用C#获取计划元素参数值。我使用下面的代码来获取视图时间表。

var viewSchedule = new FilteredElementCollector(document)
                                    .OfClass(typeof(ViewSchedule))
                                    .FirstOrDefault(e => e.Name == "MyScheduleName") as ViewSchedule;

Schedule Element Data

根据上面的时间表,我使用下面的代码来获取元素数据(请参考上面的屏幕快照链接),但是它需要很长时间才能反映出输出(10到15秒)。

var rowCount = viewSchedule.GetTableData().GetSectionData(SectionType.Body).NumberOfRows;
            var colCount = viewSchedule.GetTableData().GetSectionData(SectionType.Body).NumberOfColumns;

            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < colCount; j++)
                {
                    data += viewSchedule.GetCellText(SectionType.Body, i, j);
                }
            }

请让我知道,有没有其他方法可以使用C#获取计划数据。 预先感谢。

2 个答案:

答案 0 :(得分:0)

也许您也可以使用ViewSchedule.Export,正如建筑编码人员讨论The Schedule API and Access to Schedule Data所演示的那样。

答案 1 :(得分:0)

是的,您可以轻松访问计划数据而无需导出。 首先,获取所有时间表并逐个单元读取数据。其次,创建字典并以键,值对的形式存储数据。现在,您可以根据需要使用计划数据。我已经在Revit 2019中尝试过此操作。
这是实现。

public void getScheduleData(Document doc)
    {
        FilteredElementCollector collector = new FilteredElementCollector(doc);
        IList<Element> collection = collector.OfClass(typeof(ViewSchedule)).ToElements();

        String prompt = "ScheduleData :";
        prompt += Environment.NewLine;

        foreach (Element e in collection)
        {
            ViewSchedule viewSchedule = e as ViewSchedule;
            TableData table = viewSchedule.GetTableData();
            TableSectionData section = table.GetSectionData(SectionType.Body);
            int nRows = section.NumberOfRows;
            int nColumns = section.NumberOfColumns;

            if (nRows > 1)
            {
                //valueData.Add(viewSchedule.Name);

                List<List<string>> scheduleData = new List<List<string>>();
                for (int i = 0; i < nRows; i++)
                {
                    List<string> rowData = new List<string>();

                    for (int j = 0; j < nColumns; j++)
                    {
                        rowData.Add(viewSchedule.GetCellText(SectionType.Body, i, j));
                    }
                    scheduleData.Add(rowData);
                }

                List<string> columnData = scheduleData[0];
                scheduleData.RemoveAt(0);

                DataMapping(columnData, scheduleData);
            }
        }
    }

    public static void DataMapping(List<string> keyData, List<List<string>>valueData)
    {
        List<Dictionary<string, string>> items= new List<Dictionary<string, string>>();

        string prompt = "Key/Value";
        prompt += Environment.NewLine;

        foreach (List<string> list in valueData)
        {
            for (int key=0, value =0 ; key< keyData.Count && value< list.Count; key++,value++)
            {
                Dictionary<string, string> newItem = new Dictionary<string, string>();

                string k = keyData[key];
                string v = list[value];
                newItem.Add(k, v);
                items.Add(newItem);
            }
        }

        foreach (Dictionary<string, string> item in items)
        {
            foreach (KeyValuePair<string, string> kvp in item)
            {
                prompt += "Key: " + kvp.Key + ",Value: " + kvp.Value;
                prompt += Environment.NewLine;
            }
        }

        Autodesk.Revit.UI.TaskDialog.Show("Revit", prompt);
    }