//get the total length of the multisegment grid providing one of the grids of the multiseg grid private double getMultiGridTotalLength(Document doc, Grid targetGrid) { MultiSegmentGrid currentMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(targetGrid)) as MultiSegmentGrid; double totalLength = 0; foreach (ElementId eID in currentMultiSegGrid.GetGridIds()) { Grid currentGrid = doc.GetElement(eID) as Grid; totalLength += getTheoricalLengthOfTheGrid(currentGrid); } return(totalLength); }
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; } } }
private void doTheRenumberingOrLettering(Document doc, IList <Grid> targetListOfGrids, IList <Grid> targetListOfGridsFromMultiSegGrids, IList <ElementId> allMultiGridsIDs, bool isNumber) { Grid prevGrid = null; bool prevGridIsSub = false; int counter = 0; int subCounter = 1; char letter = 'A'; char subLetter = 'a'; double currentGridLength = 0; double prevGridLength = 0; foreach (Grid currentGrid in targetListOfGrids) { if (targetListOfGridsFromMultiSegGrids.Contains(currentGrid)) { MultiSegmentGrid currentMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(currentGrid)) as MultiSegmentGrid; currentGridLength = getMultiGridLengthSameOrientationMainGrid(doc, currentMultiSegGrid, currentGrid); if (prevGrid != null) { if (allMultiGridsIDs.Contains(MultiSegmentGrid.GetMultiSegementGridId(prevGrid))) { MultiSegmentGrid PrevMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(prevGrid)) as MultiSegmentGrid; prevGridLength = getMultiGridLengthSameOrientationMainGrid(doc, PrevMultiSegGrid, prevGrid); } else { prevGridLength = getTheoricalLengthOfTheGrid(prevGrid); } if (canUseSubNumering) { if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isEqual") { if (prevGridIsSub == false) { if (isNumber) { increaseWholeNumber(doc, ref currentMultiSegGrid, ref counter, ref subCounter, ref prevGridIsSub); } else { increaseWholeLetter(doc, ref currentMultiSegGrid, ref letter, ref subLetter, ref prevGridIsSub); } } if (prevGridIsSub == true) { if (isNumber) { increaseSubNumber(doc, ref currentMultiSegGrid, ref prevGrid, ref subCounter, ref prevGridIsSub); } else { increaseSubLetter(doc, ref currentMultiSegGrid, ref prevGrid, ref subLetter, ref prevGridIsSub); } } } if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isBigger") { if (isNumber) { increaseSubNumber(doc, ref currentMultiSegGrid, ref prevGrid, ref subCounter, ref prevGridIsSub); } else { increaseSubLetter(doc, ref currentMultiSegGrid, ref prevGrid, ref subLetter, ref prevGridIsSub); } } if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isSmaller") { if (isNumber) { increaseWholeNumber(doc, ref currentMultiSegGrid, ref counter, ref subCounter, ref prevGridIsSub); } else { increaseWholeLetter(doc, ref currentMultiSegGrid, ref letter, ref subLetter, ref prevGridIsSub); } } } else { if (isNumber) { increaseWholeNumber(doc, ref currentMultiSegGrid, ref counter, ref subCounter, ref prevGridIsSub); } else { increaseWholeLetter(doc, ref currentMultiSegGrid, ref letter, ref subLetter, ref prevGridIsSub); } } } else { if (isNumber) { increaseWholeNumber(doc, ref currentMultiSegGrid, ref counter, ref subCounter, ref prevGridIsSub); } else { increaseWholeLetter(doc, ref currentMultiSegGrid, ref letter, ref subLetter, ref prevGridIsSub); } } } else { currentGridLength = getTheoricalLengthOfTheGrid(currentGrid); if (prevGrid != null) { if (allMultiGridsIDs.Contains(MultiSegmentGrid.GetMultiSegementGridId(prevGrid))) { MultiSegmentGrid PrevMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(prevGrid)) as MultiSegmentGrid; prevGridLength = getMultiGridLengthSameOrientationMainGrid(doc, PrevMultiSegGrid, prevGrid); } else { prevGridLength = getTheoricalLengthOfTheGrid(prevGrid); } if (canUseSubNumering) { if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isEqual") { if (prevGridIsSub == false) { if (isNumber) { currentGrid.Name = increaseWholeNumber(doc, currentGrid, ref counter, ref subCounter, ref prevGridIsSub); } else { currentGrid.Name = increaseWholeLetter(doc, currentGrid, ref letter, ref subLetter, ref prevGridIsSub); } } if (prevGridIsSub == true) { if (isNumber) { currentGrid.Name = increaseSubNumber(doc, currentGrid, ref prevGrid, ref subCounter, ref prevGridIsSub); } else { currentGrid.Name = increaseSubLetter(doc, currentGrid, ref prevGrid, ref subLetter, ref prevGridIsSub); } } } if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isBigger") { if (isNumber) { currentGrid.Name = increaseSubNumber(doc, currentGrid, ref prevGrid, ref subCounter, ref prevGridIsSub); } else { currentGrid.Name = increaseSubLetter(doc, currentGrid, ref prevGrid, ref subLetter, ref prevGridIsSub); } } if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isSmaller") { if (isNumber) { currentGrid.Name = increaseWholeNumber(doc, currentGrid, ref counter, ref subCounter, ref prevGridIsSub); } else { currentGrid.Name = increaseWholeLetter(doc, currentGrid, ref letter, ref subLetter, ref prevGridIsSub); } } } else { if (isNumber) { currentGrid.Name = increaseWholeNumber(doc, currentGrid, ref counter, ref subCounter, ref prevGridIsSub); } else { currentGrid.Name = increaseWholeLetter(doc, currentGrid, ref letter, ref subLetter, ref prevGridIsSub); } } } else { if (isNumber) { currentGrid.Name = increaseWholeNumber(doc, currentGrid, ref counter, ref subCounter, ref prevGridIsSub); } else { currentGrid.Name = increaseWholeLetter(doc, currentGrid, ref letter, ref subLetter, ref prevGridIsSub); } } } prevGrid = currentGrid; } }
private void doTheRenumberingOrLettering(Document doc, IList <GridInfo> targetListOfGrids, IList <ElementId> allMultiGridsIDs, bool isNumber) { Grid prevGrid = null; bool prevGridIsSub = false; int counter = 0; int subCounter = 1; char letter = 'A'; char subLetter = 'a'; WholeName = "A"; double currentGridLength = 0; double prevGridLength = 0; IList <ElementId> allMultiGridSubGridsIDs = new List <ElementId>(); foreach (ElementId currentMultiGridId in allMultiGridsIDs) { allMultiGridSubGridsIDs = allMultiGridSubGridsIDs.Union((uidoc.Document.GetElement(currentMultiGridId) as MultiSegmentGrid).GetGridIds()).ToList(); } foreach (GridInfo currentGridInfo in targetListOfGrids) { Grid currentGrid = null; currentGrid = uidoc.Document.GetElement(new ElementId(currentGridInfo.Id)) as Grid; if (allMultiGridSubGridsIDs.Contains(new ElementId(currentGridInfo.Id))) { MultiSegmentGrid currentMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(currentGrid)) as MultiSegmentGrid; currentGridLength = getMultiGridLengthSameOrientationMainGrid(doc, currentMultiSegGrid, currentGrid); } else { currentGridLength = getTheoricalLengthOfTheGrid(currentGrid); } if (prevGrid != null) { if (allMultiGridsIDs.Contains(MultiSegmentGrid.GetMultiSegementGridId(prevGrid))) { MultiSegmentGrid PrevMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(prevGrid)) as MultiSegmentGrid; prevGridLength = getMultiGridLengthSameOrientationMainGrid(doc, PrevMultiSegGrid, prevGrid); } else { prevGridLength = getTheoricalLengthOfTheGrid(prevGrid); } GridInfo prevGridInfo = targetListOfGrids.Where(g => g.Id == prevGrid.Id.IntegerValue).FirstOrDefault(); if (canUseSubNumering) { if (CompareGridLength(prevGridLength, currentGridLength) == GridLength.Equal) { if (prevGridIsSub == false) { if (isNumber) { currentGridInfo.newName = increaseWholeNumber(doc, currentGridInfo, ref counter, ref subCounter, ref prevGridIsSub); } else { currentGridInfo.newName = increaseWholeLetter(doc, currentGridInfo, ref letter, ref subLetter, ref prevGridIsSub); } } if (prevGridIsSub == true) { if (isNumber) { currentGridInfo.newName = increaseSubNumber(doc, currentGridInfo, ref prevGridInfo, ref subCounter, ref prevGridIsSub); } else { currentGridInfo.newName = increaseSubLetter(doc, currentGridInfo, ref prevGridInfo, ref subLetter, ref prevGridIsSub); } } } if (CompareGridLength(prevGridLength, currentGridLength) == GridLength.Bigger) { if (isNumber) { currentGridInfo.newName = increaseSubNumber(doc, currentGridInfo, ref prevGridInfo, ref subCounter, ref prevGridIsSub); } else { currentGridInfo.newName = increaseSubLetter(doc, currentGridInfo, ref prevGridInfo, ref subLetter, ref prevGridIsSub); } } if (CompareGridLength(prevGridLength, currentGridLength) == GridLength.Smaller) { if (isNumber) { currentGridInfo.newName = increaseWholeNumber(doc, currentGridInfo, ref counter, ref subCounter, ref prevGridIsSub); } else { currentGridInfo.newName = increaseWholeLetter(doc, currentGridInfo, ref letter, ref subLetter, ref prevGridIsSub); } } } else { if (isNumber) { currentGridInfo.newName = increaseWholeNumber(doc, currentGridInfo, ref counter, ref subCounter, ref prevGridIsSub); } else { currentGridInfo.newName = increaseWholeLetter(doc, currentGridInfo, ref letter, ref subLetter, ref prevGridIsSub); } } } else { if (isNumber) { currentGridInfo.newName = increaseWholeNumber(doc, currentGridInfo, ref counter, ref subCounter, ref prevGridIsSub); } else { currentGridInfo.newName = increaseWholeLetter(doc, currentGridInfo, ref letter, ref subLetter, ref prevGridIsSub); } } prevGrid = currentGrid; } }