//increase the whole letter of a multi segmented grid private void increaseWholeLetter(Document doc, ref MultiSegmentGrid currentMultiSegGrid, ref char letter, ref char subLetter, ref bool prevGridIsSub) { currentMultiSegGrid.Name = WholeName; subLetter = 'a'; foreach (ElementId eID in currentMultiSegGrid.GetGridIds()) { Grid currentGridInMultiSegGrid = doc.GetElement(eID) as Grid; currentGridInMultiSegGrid.Name = WholeName; } if (letter != 90) { letter++; WholeName = WholeName.Remove(WholeName.Length - 1) + letter.ToString(); } else { letter = 'A'; char first = WholeName.First(); if (first == 90) { WholeName = "A" + letter.ToString(); } else { first++; WholeName = WholeName.Remove(0); WholeName = first.ToString() + WholeName + letter.ToString(); } } prevGridIsSub = false; }
// 获取链接模型中多段轴网信息 private void GetAllMultiSegmentGridInfoInLinkDoc() { foreach (RevitLinkInstance revitLinkInstance in m_lstLinkInst) { Document linkDocument = revitLinkInstance.GetLinkDocument(); if (linkDocument != null && m_doc.ActiveView.ViewType != ViewType.Section) { try { FilteredElementCollector filteredElementCollector = new FilteredElementCollector(linkDocument, m_uiDoc.ActiveView.Id); filteredElementCollector.OfClass(typeof(MultiSegmentGrid)); foreach (Element element in filteredElementCollector) { MultiSegmentGrid multiSegmentGrid = element as MultiSegmentGrid; if (multiSegmentGrid != null) { ICollection <ElementId> gridIds = multiSegmentGrid.GetGridIds(); foreach (ElementId elementId in gridIds) { Grid grid = m_doc.GetElement(elementId) as Grid; if (grid != null) { DrawElement item = new DrawElement(grid, ElemType._MultiSegGrid); m_DrawElems.Add(item); } } } } } catch (Exception) { } } } }
private void increaseSubLetter(Document doc, ref MultiSegmentGrid currentMultiSegGrid, ref Grid prevGrid, ref char subLetter, ref bool prevGridIsSub) { currentMultiSegGrid.Name = prevGrid.Name.ElementAt(0).ToString() + "." + subLetter; foreach (ElementId eID in currentMultiSegGrid.GetGridIds()) { Grid currentGridInMultiSegGrid = doc.GetElement(eID) as Grid; currentGridInMultiSegGrid.Name = prevGrid.Name.ElementAt(0).ToString() + "." + subLetter; } prevGridIsSub = true; subLetter++; }
//get the total length of the multisegment grid providing the multisegment grid private double getMultiGridTotalLength(Document doc, MultiSegmentGrid targetMultiSegGrid) { double totalLength = 0; foreach (ElementId eID in targetMultiSegGrid.GetGridIds()) { Grid currentGrid = doc.GetElement(eID) as Grid; totalLength += getTheoricalLengthOfTheGrid(currentGrid); } return(totalLength); }
//increase the whole number of a multi segmented grid private void increaseWholeNumber(Document doc, ref MultiSegmentGrid currentMultiSegGrid, ref int counter, ref int subCounter, ref bool prevGridIsSub) { currentMultiSegGrid.Name = (counter + 1).ToString(); subCounter = 1; foreach (ElementId eID in currentMultiSegGrid.GetGridIds()) { Grid currentGridInMultiSegGrid = doc.GetElement(eID) as Grid; currentGridInMultiSegGrid.Name = (counter + 1).ToString(); } counter++; prevGridIsSub = false; }
//get the length of only the Grids that have the same orientation that the main grid private double getMultiGridLengthSameOrientationMainGrid(Document doc, MultiSegmentGrid targetMultiSegGrid, Grid targetMainGrid) { double totalLength = 0; foreach (ElementId eID in targetMultiSegGrid.GetGridIds()) { Grid currentMultiSegGrid = doc.GetElement(eID) as Grid; if (verifyGridOrientation(currentMultiSegGrid) == verifyGridOrientation(targetMainGrid)) { Grid currentGrid = doc.GetElement(eID) as Grid; totalLength += getTheoricalLengthOfTheGrid(currentGrid); } } return(totalLength); }
/***************************************************/ public static BH.oM.Geometry.SettingOut.Grid GridFromRevit(this MultiSegmentGrid revitGrid, RevitSettings settings = null, Dictionary <string, List <IBHoMObject> > refObjects = null) { settings = settings.DefaultIfNull(); oM.Geometry.SettingOut.Grid grid = refObjects.GetValue <oM.Geometry.SettingOut.Grid>(revitGrid.Id); if (grid != null) { return(grid); } List <Grid> gridSegments = revitGrid.GetGridIds().Select(x => revitGrid.Document.GetElement(x) as Grid).ToList(); if (gridSegments.Count == 0) { return(null); } else if (gridSegments.Count == 1) { return(gridSegments[0].GridFromRevit(settings, refObjects)); } else { List <BH.oM.Geometry.PolyCurve> joinedGridCurves = BH.Engine.Geometry.Compute.IJoin(gridSegments.Select(x => x.Curve.IFromRevit()).ToList()); if (joinedGridCurves.Count != 1) { BH.Engine.Reflection.Compute.RecordError(String.Format("Revit grid consists of disjoint segments. Element id: {0}", revitGrid.Id)); return(null); } grid = BH.Engine.Geometry.SettingOut.Create.Grid(joinedGridCurves[0]); grid.Name = revitGrid.Name; } //Set identifiers, parameters & custom data grid.SetIdentifiers(revitGrid); grid.CopyParameters(revitGrid, settings.ParameterSettings); grid.SetProperties(revitGrid, settings.ParameterSettings); refObjects.AddOrReplace(revitGrid.Id, grid); return(grid); }
//获取多段轴网信息 private void GetAllMultiSegmentGridInfo() { FilteredElementCollector filteredElementCollector = new FilteredElementCollector(m_doc, m_uiDoc.ActiveView.Id); filteredElementCollector.OfClass(typeof(MultiSegmentGrid)); foreach (Element element in filteredElementCollector) { MultiSegmentGrid multiSegmentGrid = element as MultiSegmentGrid; if (multiSegmentGrid != null) { ICollection <ElementId> gridIds = multiSegmentGrid.GetGridIds(); foreach (ElementId elementId in gridIds) { Grid grid = m_doc.GetElement(elementId) as Grid; if (grid != null) { DrawElement item = new DrawElement(grid, ElemType._MultiSegGrid); m_DrawElems.Add(item); } } } } }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uidoc = commandData.Application.ActiveUIDocument; Document doc = uidoc.Document; Selection sel = uidoc.Selection; IList <Element> allGrids = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Grids).WhereElementIsNotElementType().ToElements(); IList <Element> allMultiGrids = new FilteredElementCollector(doc).OfClass(typeof(MultiSegmentGrid)).ToElements(); IList <ElementId> allMultiGridsIDs = new List <ElementId>(); IList <Grid> allSingleGrids = new List <Grid>(); IList <string> allGridNames = new List <string>(); try { if (allGrids.Count == 0) { message = "Não foi possível encontrar eixos no projeto, por favor crie-os e rode o comando novamente"; return(Result.Failed); } RenumberGridsUI currentGridUI = new RenumberGridsUI(); currentGridUI.ShowDialog(); if (currentGridUI.DialogResult == false) { return(Result.Cancelled); } foreach (Element e in allMultiGrids) { MultiSegmentGrid currentMultiSegGrid = e as MultiSegmentGrid; allMultiGridsIDs.Add(currentMultiSegGrid.Id); } foreach (Element e in allGrids) { Grid currentGrid = e as Grid; if (allGridNames.Contains(currentGrid.Name)) { continue; } allGridNames.Add(currentGrid.Name); allSingleGrids.Add(currentGrid); } IList <Grid> allOrganizedSingleGrids = new List <Grid>(); foreach (Grid currentGrid in allSingleGrids) { if (allMultiGridsIDs.Contains(MultiSegmentGrid.GetMultiSegementGridId(currentGrid))) { continue; } allOrganizedSingleGrids.Add(currentGrid); } IList <Grid> allOrganizedHorizontalGrids = new List <Grid>(); IList <Grid> allOrganizedVerticalGrids = new List <Grid>(); IList <Grid> allOrganizedHorizontalMainGridsFromMultiGrids = new List <Grid>(); IList <Grid> allOrganizedVerticalMainGridsFromMultiGrids = new List <Grid>(); foreach (Grid currentGrid in allOrganizedSingleGrids) { if (verifyGridOrientation(currentGrid) == "isVertical") { allOrganizedVerticalGrids.Add(currentGrid); } else { allOrganizedHorizontalGrids.Add(currentGrid); } } foreach (Element e in allMultiGrids) { MultiSegmentGrid curentMultiGrid = e as MultiSegmentGrid; IList <ElementId> GridsIds = curentMultiGrid.GetGridIds().ToList(); IList <Curve> gridCurves = new List <Curve>(); Grid MainGrid = null; foreach (ElementId eID in GridsIds) { gridCurves.Add((doc.GetElement(eID) as Grid).Curve); } XYZ farAwayPoint = new XYZ(9999999, -9999999, 9999999); gridCurves = gridCurves.Where(c => c is Curve).OrderBy(p => p.Distance(farAwayPoint)).ToList(); Curve lastCurve = gridCurves.Last(); //Organize the lists to the order of positioning //I dont know why, but I had to put a "where" query that always pass just to make "OrderBy" and "OrderByDescending" work ElementId MainGridID = allGrids.Where(g => g is Grid).OrderBy(d => lastCurve.Distance((d as Grid).Curve.GetEndPoint(1))).First().Id; MainGrid = doc.GetElement(MainGridID) as Grid; if (verifyGridOrientation(MainGrid) == "isVertical") { allOrganizedVerticalMainGridsFromMultiGrids.Add(MainGrid); } else { allOrganizedHorizontalMainGridsFromMultiGrids.Add(MainGrid); } } //Organize the lists to the order of positioning //I dont know why, but I had to put a "where" query that always pass just to make "OrderBy" and "OrderByDescending" work allOrganizedHorizontalGrids = allOrganizedHorizontalGrids.Union(allOrganizedHorizontalMainGridsFromMultiGrids).Where(g => g is Grid).OrderByDescending(f => f.Curve.GetEndPoint(0).Y).ToList(); allOrganizedVerticalGrids = allOrganizedVerticalGrids.Union(allOrganizedVerticalMainGridsFromMultiGrids).Where(g => g is Grid).OrderBy(f => f.Curve.GetEndPoint(0).X).ToList(); using (TransactionGroup tG = new TransactionGroup(doc, "Renumerar Eixos")) { tG.Start(); using (Transaction RenameAllGrids = new Transaction(doc, "Ajustar Nomes")) { RenameAllGrids.Start(); for (int i = 0; i < allGrids.Count; i++) { Grid currentGrid = allGrids.ElementAt(i) as Grid; currentGrid.Name = string.Format("ONBOX {0}", i.ToString()); } RenameAllGrids.Commit(); } using (Transaction RenumberVerticalGrids = new Transaction(doc, "Renumerar Eixos Verticais")) { RenumberVerticalGrids.Start(); bool isNumber = true; if (isVerticalGridsNumbered == false) { isNumber = false; } doTheRenumberingOrLettering(doc, allOrganizedVerticalGrids, allOrganizedVerticalMainGridsFromMultiGrids, allMultiGridsIDs, isNumber); RenumberVerticalGrids.Commit(); } using (Transaction RenumberHorizontalGrids = new Transaction(doc, "Renumerar Eixos Verticais")) { RenumberHorizontalGrids.Start(); bool isNumber = false; if (isVerticalGridsNumbered == false) { isNumber = true; } doTheRenumberingOrLettering(doc, allOrganizedHorizontalGrids, allOrganizedHorizontalMainGridsFromMultiGrids, allMultiGridsIDs, isNumber); RenumberHorizontalGrids.Commit(); } using (Transaction regenerate = new Transaction(doc, "Regen")) { regenerate.Start(); doc.Regenerate(); uidoc.RefreshActiveView(); regenerate.Commit(); } tG.Assimilate(); } Debug.Print("end"); } catch (Exception excep) { ExceptionManager eManager = new ExceptionManager(excep); return(Result.Cancelled); } return(Result.Succeeded); }
internal void ApplyTheRenumberingOnTheActualGrids(IList <GridInfo> targetGridInfoList) { IList <Element> allMultiGrids = new FilteredElementCollector(uidoc.Document).OfClass(typeof(MultiSegmentGrid)).ToElements(); IList <ElementId> allMultiGridsIDs = new List <ElementId>(); foreach (Element currentMultiGridElement in allMultiGrids) { MultiSegmentGrid currentMultiGrid = currentMultiGridElement as MultiSegmentGrid; if (currentMultiGrid == null) { continue; } allMultiGridsIDs = allMultiGridsIDs.Union(currentMultiGrid.GetGridIds()).ToList(); } foreach (GridInfo currentGridInfo in targetGridInfoList) { bool isCurrentGridPartOfMultiGridItem = false; Grid currentGrid = uidoc.Document.GetElement(new ElementId(currentGridInfo.Id)) as Grid; if (currentGrid == null) { isCurrentGridPartOfMultiGridItem = false; continue; } if (allMultiGridsIDs.Contains(currentGrid.Id)) { isCurrentGridPartOfMultiGridItem = true; } if (isCurrentGridPartOfMultiGridItem) { ElementId multisegGridID = MultiSegmentGrid.GetMultiSegementGridId(currentGrid); MultiSegmentGrid multiSegGrid = uidoc.Document.GetElement(multisegGridID) as MultiSegmentGrid; if (multiSegGrid == null) { continue; } foreach (ElementId currentMultiSegGridMemberID in multiSegGrid.GetGridIds()) { Grid currentMultiSegGrid = uidoc.Document.GetElement(currentMultiSegGridMemberID) as Grid; if (currentMultiSegGrid == null) { continue; } currentMultiSegGrid.Name = currentGridInfo.newName; } multiSegGrid.Name = currentGridInfo.newName; } else { if (currentGrid == null) { continue; } currentGrid.Name = currentGridInfo.newName; } } }