/
test_uralcp
/
columns_test
Обзор
Документация
Войти
/
test_uralcp
/
columns_test
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
master
ColumnDraft/CreateSpecification.cs
326 строк
13 KB
Буравов Андрей Александрович
First BASH commit
28 ноя 2024, 12:50
28 ноя 2024, 12:50
0d2b500
Код
Авторство
О чём код?
using Autodesk.Revit.DB; using Autodesk.Revit.DB.Structure; using STP.ColumnDraft; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ColumnDraft { internal class CreateSpecification { public TextNoteType textNoteType; double assemblyUnitsSchHeight { get; set; } XYZ assemblyUnitsSchLocation { get; set; } XYZ rebarSchLocation { get; set; } double rebarSchYSize { get; set; } XYZ materialSchLocation { get; set; } double marginWithOutStructs; public void CreateSpecificationSchedule(Document doc, ViewSheet sheet, ColumnData column, ViewSchedule scheduleAssenblyUbits, ViewSchedule scheduleRebar, ViewSchedule scheduleMaterial, List<string> names, TextNoteType textNoteT) { textNoteType = textNoteT; CreateAssemblyUnits(doc, sheet, column, scheduleAssenblyUbits, names); CreateRebar(doc, sheet, column, scheduleRebar, names); CreateMaterialSchedule(doc, sheet, column, scheduleMaterial, names); } public void CreateAssemblyUnits(Document doc, ViewSheet sheet, ColumnData column, ViewSchedule schedule, List<string> names) { //Собираем все закладные ElementCategoryFilter structCatFilter = new ElementCategoryFilter(BuiltInCategory.OST_StructuralFraming); FilteredElementCollector structCollector = new FilteredElementCollector(doc); //Console.WriteLine(projectStructs); // дублируем существующую спецификацию ElementId scheduleId = schedule.Duplicate(ViewDuplicateOption.Duplicate); ViewSchedule assemblyUnitsSchedule = doc.GetElement(scheduleId) as ViewSchedule; TableData td = assemblyUnitsSchedule.GetTableData(); TableSectionData tsd = td.GetSectionData(SectionType.Header); //Console.WriteLine(tsd.LastRowNumber); //if (tsd.LastRowNumber == 2) //{ // tsd.RemoveRow(2); //} //set Title string titleString = "Спецификация колонны монолитной " + column.mark; tsd.SetCellText(0, 0, titleString); int n = 0; string basisName = String.Format("{0} - Закладные", column.mark); while (names.Contains(basisName)) { if (n == 0) { basisName = String.Format("{0} - Закладные(дубл.)", column.mark); } else { basisName = String.Format("{0} - Закладные(дубл.{1})", column.mark, n); } n++; if (n > 10) break; } assemblyUnitsSchedule.Name = basisName; ScheduleFieldId filterField = null; for (int i = 0; i < assemblyUnitsSchedule.Definition.GetFieldCount(); i++) { if (assemblyUnitsSchedule.Definition.GetField(i).GetName() == "СТП_Метка основы") { filterField = assemblyUnitsSchedule.Definition.GetFieldId(i); } } ScheduleFilter filter = new ScheduleFilter(filterField, Autodesk.Revit.DB.ScheduleFilterType.Equal, column.mark); //Поиск фильтра int filterIndex = -1; for (int i = 0; i < assemblyUnitsSchedule.Definition.GetFilterCount(); i++) { if (assemblyUnitsSchedule.Definition.GetFilter(i).FieldId.IntegerValue == filterField.IntegerValue) { filterIndex = i; } } if (filterIndex >= 0) { assemblyUnitsSchedule.Definition.SetFilter(filterIndex, filter); } else assemblyUnitsSchedule.Definition.AddFilter(filter); ScheduleSheetInstance assemblyUnitsScheduleInstance = ScheduleSheetInstance.Create(doc, sheet.Id, assemblyUnitsSchedule.Id, XYZ.Zero); //Проверяем, есть ли в таблице закладные, если нет, удаляем заголовок TableData table = assemblyUnitsSchedule.GetTableData(); TableSectionData tsdBody = table.GetSectionData(SectionType.Body); Console.WriteLine(tsdBody); if (tsdBody.LastRowNumber == -1) { TableSectionData tsdHeader = table.GetSectionData(SectionType.Header); tsdHeader.RemoveRow(2); marginWithOutStructs = 4.8; } else { marginWithOutStructs = 0; } BoundingBoxXYZ schBB = assemblyUnitsScheduleInstance.get_BoundingBox(sheet); double width = schBB.Max.X - schBB.Min.X; double height = schBB.Max.Y - schBB.Min.Y; XYZ point = new XYZ( -width -SizeData.Margins.RightMarginSpecific, SizeData.SheetA1.Height - SizeData.Stamp.StampBorderWidth, 0 ); this.assemblyUnitsSchHeight = height; this.assemblyUnitsSchLocation = point; assemblyUnitsScheduleInstance.Point = point; } public void CreateRebar(Document doc, ViewSheet sheet, ColumnData column, ViewSchedule schedule, List<string> names) { // дублируем существующую спецификацию ElementId scheduleId = schedule.Duplicate(ViewDuplicateOption.Duplicate); ViewSchedule rebarSchedule = doc.GetElement(scheduleId) as ViewSchedule; TableData td = rebarSchedule.GetTableData(); TableSectionData tsd = td.GetSectionData(SectionType.Header); //Удаляем заголовок tsd.RemoveRow(0); tsd.RemoveRow(0); int n = 0; string basisName = String.Format("{0} - Арматура", column.mark); while (names.Contains(basisName)) { if (n == 0) { basisName = String.Format("{0} - Арматура(дубл.)", column.mark); } else { basisName = String.Format("{0} - Арматура(дубл.{1})", column.mark, n); } n++; if (n > 10) break; } rebarSchedule.Name = basisName; ScheduleFieldId filterField = null; for (int i = 0; i < rebarSchedule.Definition.GetFieldCount(); i++) { if (rebarSchedule.Definition.GetField(i).GetName() == "РЗ_Метка основы") { filterField = rebarSchedule.Definition.GetFieldId(i); } } rebarSchedule.Definition.ShowTitle = true; ScheduleFilter filter = new ScheduleFilter(filterField, Autodesk.Revit.DB.ScheduleFilterType.Equal, column.mark); //Поиск фильтра int filterIndex = -1; for (int i = 0; i < rebarSchedule.Definition.GetFilterCount(); i++) { if (rebarSchedule.Definition.GetFilter(i).FieldId.IntegerValue == filterField.IntegerValue) { filterIndex = i; } } if (filterIndex >= 0) { rebarSchedule.Definition.SetFilter(filterIndex, filter); } else rebarSchedule.Definition.AddFilter(filter); ScheduleSheetInstance rebarScheduleInstance = ScheduleSheetInstance.Create(doc, sheet.Id, rebarSchedule.Id, XYZ.Zero); XYZ newLocPoint = assemblyUnitsSchLocation.Subtract(XYZ.BasisY.Multiply(assemblyUnitsSchHeight - SizeData.Margins.ScheduleMargin + (marginWithOutStructs == 0 ? 0 : UnitUtils.ConvertToInternalUnits(marginWithOutStructs, UnitTypeId.Millimeters)))); BoundingBoxXYZ schBB = rebarScheduleInstance.get_BoundingBox(sheet); // передаем опорные координаты для других спецификаций double xSize = schBB.Max.X - schBB.Min.X; double ySize = schBB.Max.Y - schBB.Min.Y; //XYZ newLocPoint = new XYZ( // -xSize - SizeData.Margins.RightMarginSpecific, // SizeData.SheetA1.Height - SizeData.Stamp.StampBorderWidth - assemblyUnitsSchHeight, // 0 //); this.rebarSchLocation = newLocPoint; this.rebarSchYSize = ySize; rebarScheduleInstance.Point = newLocPoint; } public void CreateMaterialSchedule(Document doc, ViewSheet sheet, ColumnData column, ViewSchedule schedule, List<string> names) { ElementId scheduleId = schedule.Duplicate(ViewDuplicateOption.Duplicate); ViewSchedule materialSchedule = doc.GetElement(scheduleId) as ViewSchedule; int n = 0; string basisName = String.Format("{0} - Материалы", column.mark); while (names.Contains(basisName)) { if (n == 0) { basisName = String.Format("{0} - Материалы(дубл.)", column.mark); } else { basisName = String.Format("{0} - Материалы(дубл.{1})", column.mark, n); } n++; if (n > 10) break; } materialSchedule.Name = basisName; ScheduleFieldId filterField = null; ScheduleFieldId stpFilterField = null; for (int i = 0; i < materialSchedule.Definition.GetFieldCount(); i++) { if (materialSchedule.Definition.GetField(i).GetName() == "Марка") { filterField = materialSchedule.Definition.GetFieldId(i); } if (materialSchedule.Definition.GetField(i).GetName() == "СТП_Занести в спецификацию") { stpFilterField = materialSchedule.Definition.GetFieldId(i); } } ScheduleFilter filter = new ScheduleFilter(filterField, ScheduleFilterType.Equal, column.mark); //Поиск фильтра int filterIndex = -1; int stpFilterIndex = -1; for (int i = 0; i < materialSchedule.Definition.GetFilterCount(); i++) { if (materialSchedule.Definition.GetFilter(i).FieldId.IntegerValue == filterField.IntegerValue) { filterIndex = i; } if (materialSchedule.Definition.GetFilter(i).FieldId.IntegerValue == stpFilterField.IntegerValue) { stpFilterIndex = i; } } if (filterIndex >= 0) { materialSchedule.Definition.SetFilter(filterIndex, filter); } else materialSchedule.Definition.AddFilter(filter); ScheduleSheetInstance materialScheduleInstance = ScheduleSheetInstance.Create(doc, sheet.Id, materialSchedule.Id, XYZ.Zero); BoundingBoxXYZ schBB = materialScheduleInstance.get_BoundingBox(sheet); double xSize = schBB.Max.X - schBB.Min.X; double ySize = schBB.Max.Y - schBB.Min.Y; //XYZ newLocPoint = new XYZ( // -xSize - SizeData.Margins.RightMarginSpecific, // SizeData.SheetA1.Height - SizeData.Stamp.StampBorderWidth - assemblyUnitsSchHeight - rebarSchYSize, // 0 //); XYZ newLocPoint = rebarSchLocation.Subtract(XYZ.BasisY.Multiply(rebarSchYSize - SizeData.Margins.ScheduleMargin)); materialScheduleInstance.Point = newLocPoint; this.materialSchLocation = newLocPoint; // примечание под спецификацией BoundingBoxXYZ scheduleBB = materialScheduleInstance.get_BoundingBox(sheet); double scheduleHeight = scheduleBB.Max.Y - scheduleBB.Min.Y; string text = "*Позиции смотреть Ведомость деталей"; XYZ textNotePoint = newLocPoint .Subtract(XYZ.BasisY.Multiply(scheduleHeight)) .Add(XYZ.BasisX.Multiply(SizeData.Margins.ScheduleNoteMargin)); TextNoteOptions textNoteOptions = new TextNoteOptions(textNoteType.Id); TextNote textNote = TextNote.Create( doc, sheet.Id, textNotePoint, SizeData.Stamp.StampWidth, text, textNoteOptions); } } }