Beispiel #1
0
        private static ElementId[] GetLineStyles(this Document doc)
        {
            ElementId[] eids      = new ElementId[5];
            var         collector = new FilteredElementCollector(doc)
                                    .OfClass(typeof(LinePatternElement))
                                    .ToElementIds().ToList();

            bool[] check = new bool[5] {
                false, false, false, false, false
            };
            foreach (var id in collector)
            {
                LinePatternElement lpe  = doc.GetElement(id) as LinePatternElement;
                string             name = lpe.Name;
                if (Names.Contains(name))
                {
                    check[Names.ToList().IndexOf(name)] = true;
                    eids[Names.ToList().IndexOf(name)]  = lpe.Id;
                }
            }
            if (!check[0])
            {
                eids[0] = LinePatternElement.GetSolidPatternId();
            }
            if (!check[1])
            {
                TaskDialog.Show("Test", "Dash Trying to be Created");
                LinePattern lp = new LinePattern("Dash");
                lp.SetSegments(CreateDash());
                LinePatternElement lpe = LinePatternElement.Create(doc, lp);
                eids[1] = lpe.Id;
            }
            if (!check[2])
            {
                LinePattern lp = new LinePattern("Dot");
                lp.SetSegments(CreateDot());
                LinePatternElement lpe = LinePatternElement.Create(doc, lp);
                eids[2] = lpe.Id;
            }
            if (!check[3])
            {
                LinePattern lp = new LinePattern("Center");
                lp.SetSegments(CreateCenter());
                LinePatternElement lpe = LinePatternElement.Create(doc, lp);
                eids[3] = lpe.Id;
            }
            if (!check[4])
            {
                LinePattern lp = new LinePattern("Hidden");
                lp.SetSegments(CreateHidden());
                LinePatternElement lpe = LinePatternElement.Create(doc, lp);
                eids[4] = lpe.Id;
            }
            return(eids);
        }
Beispiel #2
0
        public ViewsOICBRequest(UIApplication uiApp, String text)
        {
            UIDocument uidoc = uiApp.ActiveUIDocument;
            //Collect all viewers and viewports
            var viewerCollector   = new FilteredElementCollector(uidoc.Document).OfCategory(BuiltInCategory.OST_Viewers);
            var viewportCollector = new FilteredElementCollector(uidoc.Document).OfClass(typeof(Viewport)).ToElements();
            //Generate an OverrideGraphicsSetting
            OverrideGraphicSettings orgs = new OverrideGraphicSettings();

            //Use the solid line pattern
            orgs.SetProjectionLinePatternId(LinePatternElement.GetSolidPatternId());
            //Set the line weight to the property value
            orgs.SetProjectionLineWeight(Properties.Settings.Default.RevitOverrideInteriorCropWeight);

            //Start a new transaction and cycle through the viewports
            Transaction t1 = new Transaction(uidoc.Document, "OverrideInteriorElevationCrops");

            t1.Start();
            foreach (Viewport viewport in viewportCollector)
            {
                //Get the view associated with the viewport, then get its ViewType
                ElementId viewId   = viewport.ViewId;
                Element   viewElem = uidoc.Document.GetElement(viewId);
                Autodesk.Revit.DB.View viewElemView = viewElem as Autodesk.Revit.DB.View;
                ElementId typeId          = viewElem.GetTypeId();
                Element   typeElement     = uidoc.Document.GetElement(typeId);
                string    typeElementName = typeElement.Name.ToString();
                //If the view is a derivative of a section, its type is an Elevation, and its type name contains Interior, continue
                if (viewElem.GetType().ToString() == "Autodesk.Revit.DB.ViewSection" && viewElemView.ViewType == ViewType.Elevation && typeElementName.Contains("Interior"))
                {
                    //Get the viewers and cycle through them
                    var viewers = new FilteredElementCollector(uidoc.Document).OfCategory(BuiltInCategory.OST_Viewers);
                    foreach (Element viewer in viewerCollector)
                    {
                        //If the viewer's name is equal to the view's name, continue
                        if (viewer.Name.ToString() == viewElem.Name.ToString())
                        {
                            //Override the view element's viewer with the settings
                            Autodesk.Revit.DB.View viewToOverride = viewElem as Autodesk.Revit.DB.View;
                            viewToOverride.SetElementOverrides(viewer.Id, orgs);
                        }
                        else
                        {
                            continue;
                        }
                    }
                }
                else
                {
                    continue;
                }
            }
            t1.Commit();
        }
Beispiel #3
0
        public MaterialsAMLPaletteRequest(UIApplication uiApp, String text)
        {
            RVTDocument         doc = uiApp.ActiveUIDocument.Document;
            MaterialsAMLPalette materialsPalette = BARevitTools.Application.thisApp.newMainUi.materialsAMLPalette;

            //Get the versioned symbol family
            FamilySymbol familySymbol    = null;
            string       versionedFamily = RVTOperations.GetVersionedFamilyFilePath(uiApp, Properties.Settings.Default.RevitIDAccentMatTag);

            //Try loading the family symbol
            Transaction loadSymbolTransaction = new Transaction(doc, "LoadFamilySymbol");

            loadSymbolTransaction.Start();
            try
            {
                try
                {
                    IFamilyLoadOptions loadOptions = new RVTFamilyLoadOptions();
                    doc.LoadFamilySymbol(versionedFamily, "Legend Tag (Fake)", loadOptions, out FamilySymbol symb);
                    familySymbol = symb;
                }
                catch
                {
                    MessageBox.Show(String.Format("Could not get the 'Legend Tag (Fake)' type from {0}", versionedFamily), "Family Symbol Load Error");
                }
                loadSymbolTransaction.Commit();
            }
            catch (Exception transactionException)
            { loadSymbolTransaction.RollBack(); MessageBox.Show(transactionException.ToString()); }

            //Get the line style to use, or create the default
            Element lineStyle = null;

            if (materialsPalette.paletteMaterialComboBox.Text == "Default")
            {
                try
                {
                    lineStyle = doc.Settings.Categories.get_Item(BuiltInCategory.OST_Lines).SubCategories.get_Item("6 BA ID ACCENT").GetGraphicsStyle(GraphicsStyleType.Projection);
                }
                catch
                {
                    try
                    {
                        Category linesCategory        = doc.Settings.Categories.get_Item(BuiltInCategory.OST_Lines);
                        Category newLineStyleCategory = doc.Settings.Categories.NewSubcategory(linesCategory, "6 BA ID ACCENT");
                        newLineStyleCategory.LineColor = new Color(0, 0, 0);
                        newLineStyleCategory.SetLineWeight(6, GraphicsStyleType.Projection);
                        newLineStyleCategory.SetLinePatternId(LinePatternElement.GetSolidPatternId(), GraphicsStyleType.Projection);
                        doc.Regenerate();
                        lineStyle = newLineStyleCategory.GetGraphicsStyle(GraphicsStyleType.Projection);
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.ToString());
                    }
                }
            }
            else
            {
                lineStyle = doc.Settings.Categories.get_Item(BuiltInCategory.OST_Lines).SubCategories.get_Item("ID " + materialsPalette.paletteMaterialComboBox.Text).GetGraphicsStyle(GraphicsStyleType.Projection);
            }

            //Assure the view being used is a floor plan
            if (doc.ActiveView.ViewType != ViewType.FloorPlan)
            {
                MessageBox.Show("This tool should be used ina a Floor Plan or Area Plan view");
            }
            else
            {
                //Create a loop for picking points. Change the palette background color based on the number of points picked
                List <XYZ> pickedPoints = new List <XYZ>();
                bool       breakLoop    = false;
                int        pickCount    = 0;
                while (breakLoop == false)
                {
                    try
                    {
                        //Have the user begin picking points. The number of clicks to start the UI color change is 1 because the first click is usually to activate the window.
                        XYZ point = uiApp.ActiveUIDocument.Selection.PickPoint(Autodesk.Revit.UI.Selection.ObjectSnapTypes.Endpoints, "Click points for the line to follow. Then click once to the side where the lines should be drawn. Hit ESC to finish");
                        pickedPoints.Add(point);

                        if (pickCount == 1)
                        {
                            materialsPalette.BackColor = System.Drawing.Color.Firebrick;
                        }
                        else if (pickCount == 2)
                        {
                            materialsPalette.BackColor = System.Drawing.Color.Orange;
                        }
                        else if (pickCount > 2)
                        {
                            //After three clicks in the window, the user has made the minimum point selection to generate the lines from the start, end, and positive side points.
                            materialsPalette.BackColor = System.Drawing.Color.GreenYellow;
                        }
                        else
                        {
                            ;
                        }

                        pickCount++;
                    }
                    catch
                    {
                        materialsPalette.BackColor = MaterialsAMLPalette.DefaultBackColor;
                        breakLoop = true;
                    }
                }

                //Get rid of the first point from clicking into the Revit view. This point is not needed.
                pickedPoints.RemoveAt(0);

                if (pickedPoints.Count > 2)
                {
                    Transaction createLinesTransaction = new Transaction(doc, "CreateAccentLines");
                    createLinesTransaction.Start();

                    try
                    {
                        //These points will be used in determining the start, end, and room points
                        XYZ firstPoint = pickedPoints[0];
                        XYZ roomPoint  = pickedPoints[pickedPoints.Count - 1];
                        XYZ lastPoint  = pickedPoints[pickedPoints.Count - 2];

                        //Create  a list of points for the polyline that excludes the room point
                        List <XYZ> polyLinePoints = new List <XYZ>();
                        for (int i = 0; i < pickedPoints.Count - 1; i++)
                        {
                            polyLinePoints.Add(pickedPoints[i]);
                        }

                        //Create a polyline from the list of picked points and then get make lines from the points on the poly line
                        PolyLine    guidePolyLine = PolyLine.Create(polyLinePoints);
                        IList <XYZ> polyPoints    = guidePolyLine.GetCoordinates();

                        List <Line> guideLines = new List <Line>();
                        for (int i = 0; i < polyLinePoints.Count - 1; i++)
                        {
                            guideLines.Add(Line.CreateBound(polyLinePoints[i], polyLinePoints[i + 1]));
                        }

                        //Get the direction of the line offset by measuring the first offset for positive and negative values and comparing their distances with the room point
                        bool positiveZ = false;

                        List <Line> offsetLines            = new List <Line>();
                        Line        positiveOffsetLine     = guideLines.Last().CreateOffset(0.6666666667d, XYZ.BasisZ) as Line;
                        Line        negativeOffsetLine     = guideLines.Last().CreateOffset(-0.6666666667d, XYZ.BasisZ) as Line;
                        XYZ         positiveOffsetMidPoint = positiveOffsetLine.Evaluate(0.5d, true);
                        XYZ         negativeOffsetMidPoint = negativeOffsetLine.Evaluate(0.5d, true);

                        Double positiveOffsetDistance = positiveOffsetMidPoint.DistanceTo(roomPoint);
                        Double negativeOffsetDistance = negativeOffsetMidPoint.DistanceTo(roomPoint);

                        //If the positive offset side resulted in a shorter distance to the point inside the room, then the offset should have a positive Z normal.
                        if (positiveOffsetDistance < negativeOffsetDistance)
                        {
                            positiveZ = true;
                        }

                        //Knowing whether or not to use a positive or negative offset, begin creating offset lines for each guide line
                        foreach (Line guideLine in guideLines)
                        {
                            if (positiveZ)
                            {
                                offsetLines.Add(guideLine.CreateOffset(0.6666666667d, XYZ.BasisZ) as Line);
                            }
                            else
                            {
                                offsetLines.Add(guideLine.CreateOffset(-0.6666666667d, XYZ.BasisZ) as Line);
                            }
                        }

                        //Determine if the number of line segments is 1 or more
                        Line firstLine = offsetLines.First();
                        Line lastLine  = null;
                        if (offsetLines.Count > 1)
                        {
                            lastLine = offsetLines.Last();
                        }

                        //If there is only one line segment, both end operations must be performed on it
                        if (lastLine == null)
                        {
                            double lineLength       = firstLine.Length;
                            double fractionOfLength = 0.6666666667d / lineLength;

                            //Checking fractions to ensure they are not greater than 1 for the normalization
                            if (fractionOfLength > 1)
                            {
                                fractionOfLength = 0.25d;
                            }

                            //Re-evaluating where to place the start and end point of the line
                            XYZ shiftedStartPoint = firstLine.Evaluate(fractionOfLength, true);
                            XYZ shiftedEndPoint   = firstLine.Evaluate(1 - fractionOfLength, true);
                            firstLine = Line.CreateBound(shiftedStartPoint, shiftedEndPoint);

                            //Creating the angled corner lines
                            Line firstCornerLine = Line.CreateBound(firstPoint, firstLine.GetEndPoint(0));
                            Line lastCornerLine  = Line.CreateBound(lastPoint, firstLine.GetEndPoint(1));

                            //Create the detail lines from the lines
                            DetailCurve newAccentLine1 = doc.Create.NewDetailCurve(doc.ActiveView, firstCornerLine);
                            DetailCurve newAccentLine2 = doc.Create.NewDetailCurve(doc.ActiveView, firstLine);
                            DetailCurve newAccentLine3 = doc.Create.NewDetailCurve(doc.ActiveView, lastCornerLine);

                            //Assign a line style to the newly created detail lines
                            newAccentLine1.LineStyle = lineStyle;
                            newAccentLine2.LineStyle = lineStyle;
                            newAccentLine3.LineStyle = lineStyle;


                            XYZ    tagPlacementPoint = firstLine.Evaluate(0.5d, true);
                            XYZ    direction         = firstLine.Direction;
                            Line   axisLine          = Line.CreateUnbound(tagPlacementPoint, XYZ.BasisZ);
                            double rotationAngle     = direction.AngleTo(XYZ.BasisX);

                            //Get the midpoint of the line, its direction, and create the rotation and axis
                            if (familySymbol != null)
                            {
                                //Create the tag instance
                                FamilyInstance newTag = doc.Create.NewFamilyInstance(tagPlacementPoint, familySymbol, doc.ActiveView);
                                //Rotate the new tag instance
                                ElementTransformUtils.RotateElement(doc, newTag.Id, axisLine, rotationAngle);
                            }

                            createLinesTransaction.Commit();
                        }
                        //If there is more than one line segment, an operation must be performed on the start and end of the start and end lines, respectively
                        else
                        {
                            List <Line> linesToDraw = new List <Line>();
                            // Get the normalized value for 8" relative to the lengths of the start and end lines
                            double firstLineLength     = firstLine.Length;
                            double fractionOfFirstLine = 0.6666666667 / firstLineLength;
                            double lastLineLength      = lastLine.Length;
                            double fractionOfLastLine  = 0.666666667 / lastLineLength;

                            //Checking fractions to ensure they are not greater than 1 for the normalization
                            if (fractionOfFirstLine > 1)
                            {
                                fractionOfFirstLine = 0.25d;
                            }
                            if (fractionOfLastLine > 1)
                            {
                                fractionOfLastLine = 0.25d;
                            }

                            //Shift the ends of the start and end lines by finding the point along the line relative to the normalized 8" value
                            XYZ shiftedStartPoint = firstLine.Evaluate(fractionOfFirstLine, true);
                            XYZ shiftedEndPoint   = lastLine.Evaluate(1 - fractionOfLastLine, true);

                            //Reset the start and end lines with the new shifted points
                            firstLine = Line.CreateBound(shiftedStartPoint, firstLine.GetEndPoint(1));
                            lastLine  = Line.CreateBound(lastLine.GetEndPoint(0), shiftedEndPoint);
                            linesToDraw.Add(firstLine);

                            //If there are only 3 offset lines, there will be just one middle segment
                            if (offsetLines.Count == 3)
                            {
                                linesToDraw.Add(offsetLines[1]);
                            }
                            //If there are more than three offset lines, there will be more than one middle line segment
                            else
                            {
                                List <Line> middleLines = offsetLines.GetRange(1, offsetLines.Count - 2);
                                foreach (Line middleLine in middleLines)
                                {
                                    linesToDraw.Add(middleLine);
                                }
                            }
                            linesToDraw.Add(lastLine);

                            //For the lines to draw, intersect them with the next line in the list and reset their start and end points to be the intersection
                            for (int i = 0; i < linesToDraw.Count - 1; i++)
                            {
                                Line line1       = linesToDraw[i];
                                Line scaledLine1 = Line.CreateUnbound(line1.GetEndPoint(1), line1.Direction);
                                Line line2       = linesToDraw[i + 1];
                                Line scaledLine2 = Line.CreateUnbound(line2.GetEndPoint(0), line2.Direction.Negate());
                                SetComparisonResult intersectionResult = scaledLine1.Intersect(scaledLine2, out IntersectionResultArray results);
                                if (intersectionResult == SetComparisonResult.Overlap)
                                {
                                    IntersectionResult result = results.get_Item(0);
                                    Line newLine1             = Line.CreateBound(line1.GetEndPoint(0), result.XYZPoint);
                                    Line newLine2             = Line.CreateBound(result.XYZPoint, line2.GetEndPoint(1));

                                    linesToDraw[i]     = newLine1;
                                    linesToDraw[i + 1] = newLine2;
                                }
                            }

                            //Create the angled corner lines at the start and end of the line chain
                            Line firstCornerLine = Line.CreateBound(firstPoint, firstLine.GetEndPoint(0));
                            Line lastCornerLine  = Line.CreateBound(lastPoint, lastLine.GetEndPoint(1));
                            linesToDraw.Add(firstCornerLine);
                            linesToDraw.Add(lastCornerLine);

                            //Create each line as a detail line
                            foreach (Line apiLine in linesToDraw)
                            {
                                DetailCurve newAccentLine = doc.Create.NewDetailCurve(doc.ActiveView, apiLine);
                                newAccentLine.LineStyle = lineStyle;
                            }

                            //Declare some stuff for use in the symbol placement
                            Line   firstMiddleLine = linesToDraw[0];
                            Line   lastMiddleLine  = linesToDraw[linesToDraw.Count - 3];
                            XYZ    firstTagPoint   = firstMiddleLine.Evaluate(0.5d, true);
                            XYZ    lastTagPoint    = lastMiddleLine.Evaluate(0.5d, true);
                            XYZ    firstDirection  = firstMiddleLine.Direction;
                            XYZ    lastDirection   = lastMiddleLine.Direction;
                            Line   firstAxisLine   = Line.CreateUnbound(firstTagPoint, XYZ.BasisZ);
                            Line   lastAxisLine    = Line.CreateUnbound(lastTagPoint, XYZ.BasisZ);
                            double firstRotation   = firstDirection.AngleTo(XYZ.BasisX);
                            double lastRotation    = lastDirection.AngleTo(XYZ.BasisX);

                            if (familySymbol != null)
                            {
                                //Create tag at the beginning of the middle lines
                                FamilyInstance firstTag = doc.Create.NewFamilyInstance(firstTagPoint, familySymbol, doc.ActiveView);
                                ElementTransformUtils.RotateElement(doc, firstTag.Id, firstAxisLine, firstRotation);

                                //Create a tag at the end of the middle lines if there are more than 2 middle lines
                                if (linesToDraw.Count > 4)
                                {
                                    FamilyInstance lastTag = doc.Create.NewFamilyInstance(lastTagPoint, familySymbol, doc.ActiveView);
                                    ElementTransformUtils.RotateElement(doc, lastTag.Id, lastAxisLine, lastRotation);
                                }
                            }

                            createLinesTransaction.Commit();
                        }
                    }
                    catch (Exception e)
                    {
                        //Suppose the user closed the palette too soon. This will remind them to keep it open.
                        if (BARevitTools.Application.thisApp.newMainUi.materialsAMLPalette == null)
                        {
                            MessageBox.Show("AML Picker was closed prematurely. Please keep the picker open until the lines are drawn.");
                        }
                        else
                        {
                            //Otherwise, if some other error occurred, show the exception
                            MessageBox.Show(e.ToString());
                        }
                        createLinesTransaction.RollBack();
                    }
                }
                else
                {
                    ;
                }
            }
        }
Beispiel #4
0
        public ViewsCEPRRequest(UIApplication uiApp, String text)
        {
            MainUI     uiForm = BARevitTools.Application.thisApp.newMainUi;
            UIDocument uidoc  = uiApp.ActiveUIDocument;

            //Collect the ViewTypes in the project
            FilteredElementCollector viewTypesCollector = new FilteredElementCollector(uidoc.Document);
            ICollection <Element>    viewTypes          = viewTypesCollector.OfClass(typeof(ViewFamilyType)).ToElements();
            ElementId viewTypeId = null;

            //Cycle through the ViewType elements to find the one with a type name equal to the one selected in the MainUI's combobox
            foreach (ViewFamilyType viewType in viewTypes)
            {
                if (viewType.get_Parameter(BuiltInParameter.ALL_MODEL_TYPE_NAME).AsString() == uiForm.viewsCEPRElevationComboBox.Text)
                {
                    viewTypeId = viewType.Id;
                }
            }

            //If the ViewType was found, and the active view is a plan view, continue
            if (viewTypeId != null && uidoc.ActiveView.GetType().ToString() == "Autodesk.Revit.DB.ViewPlan")
            {
                //Invoke a room selection
                List <Room> selectedRoomElements = RVTOperations.SelectRoomElements(uiApp);

                //If the user selected rooms, continue
                if (selectedRoomElements != null)
                {
                    try
                    {
                        //Cycle through each selected room
                        foreach (Room room in selectedRoomElements)
                        {
                            //First, get the room number for use in generating the elevation view names
                            string roomNumber = room.Number;
                            string roomName   = room.get_Parameter(BuiltInParameter.ROOM_NAME).AsString().ToUpper();
                            //Get the geometry of the room
                            Options geomOptions = new Options();
                            geomOptions.IncludeNonVisibleObjects = true;
                            GeometryElement geomElements = room.get_Geometry(geomOptions);
                            //Get the location point of the room as a point for where to place the elevation marker
                            LocationPoint roomLocation = room.Location as LocationPoint;
                            XYZ           point        = roomLocation.Point;

                            //Start a transaction
                            Transaction t1 = new Transaction(uidoc.Document, "Create Elevations Per Room");
                            t1.Start();
                            try
                            {
                                //Make a new ElevationMarker that uses the ViewType earlier, the location point of the room, and has a view scale of 1/8"
                                ElevationMarker newMarker = ElevationMarker.CreateElevationMarker(uidoc.Document, viewTypeId, point, 96);
                                //Start making views going around the elevation marker where the indexes start on the west side and go clockwise
                                ViewSection view0 = newMarker.CreateElevation(uidoc.Document, uidoc.ActiveView.Id, 0);
                                //Set the view name equal to the room number + room name + plus orientation
                                view0.Name          = roomNumber + " " + roomName + " WEST";
                                view0.CropBoxActive = true;
                                //Repeat for the other view directions at their appropriate index
                                ViewSection view1 = newMarker.CreateElevation(uidoc.Document, uidoc.ActiveView.Id, 1);
                                view1.Name          = roomNumber + " " + roomName + " NORTH";
                                view1.CropBoxActive = true;
                                ViewSection view2 = newMarker.CreateElevation(uidoc.Document, uidoc.ActiveView.Id, 2);
                                view2.Name          = roomNumber + " " + roomName + " EAST";
                                view2.CropBoxActive = true;
                                ViewSection view3 = newMarker.CreateElevation(uidoc.Document, uidoc.ActiveView.Id, 3);
                                view3.Name          = roomNumber + " " + roomName + " SOUTH";
                                view3.CropBoxActive = true;

                                //Make a Solid object for assignment
                                Solid roomSolid = null;
                                //The following section is dedicated to cropping the elevation views to the cross-section of the room geometry
                                if (uiForm.viewsCEPRCropCheckBox.Checked == true)
                                {
                                    //Cycle through the geometry elements associated with the room geometry until the solid is found
                                    foreach (GeometryObject geom in geomElements)
                                    {
                                        if (geom.GetType().ToString() == "Autodesk.Revit.DB.Solid")
                                        {
                                            roomSolid = geom as Solid;
                                            break;
                                        }
                                    }

                                    //Generate 4 planes at the room point that will correspond to each elevation view's cross section of the room geometry
                                    // Each plane's normal vector is in the direction their view is facing
                                    Plane westPlane  = Plane.CreateByNormalAndOrigin(new XYZ(-1, 0, 0), point); //-X vector for West
                                    Plane northPlane = Plane.CreateByNormalAndOrigin(new XYZ(0, 1, 0), point);  //+Y vector for North
                                    Plane eastPlane  = Plane.CreateByNormalAndOrigin(new XYZ(1, 0, 0), point);  //+X vector for East
                                    Plane southPlane = Plane.CreateByNormalAndOrigin(new XYZ(0, -1, 0), point); //-Y vector for South

                                    //Use the room section's perimeter as the crop boundary if the first index of the MainUI combobox is selected
                                    if (uiForm.viewsCEPRCropMethodComboBox.SelectedIndex == 0)
                                    {
                                        try
                                        {
                                            //Generate some CurveLoop lists for use later
                                            IList <CurveLoop> westCurveLoopsFitted  = null;
                                            IList <CurveLoop> northCurveLoopsFitted = null;
                                            IList <CurveLoop> southCurveLoopsFitted = null;
                                            IList <CurveLoop> eastCurveLoopsFitted  = null;

                                            //Slice the room solid with the westPlane object made earlier. This will result in a solid boolean result to the west of the plane because the positive side of the plane faces west
                                            Solid westBooleanSolid = BooleanOperationsUtils.CutWithHalfSpace(roomSolid, westPlane);
                                            //Grab the faces of the solid that resulted from the boolean
                                            FaceArray westBoolSolidFaces = westBooleanSolid.Faces;
                                            //Cycle through each face and get the normal vector
                                            foreach (PlanarFace westFace in westBoolSolidFaces)
                                            {
                                                //For the west elevation face to use as the crop boundary, we need the face that has a vector going east, or the +X vector
                                                XYZ westFaceNormal = westFace.FaceNormal;
                                                if (westFaceNormal.X == 1)
                                                {
                                                    //Get the edges as a CurveLoops once the face is found, then jump out of the loop thorugh the faces
                                                    westCurveLoopsFitted = westFace.GetEdgesAsCurveLoops();
                                                    break;
                                                }
                                            }

                                            //Repeat for the north elevation
                                            Solid     northBooleanSolid   = BooleanOperationsUtils.CutWithHalfSpace(roomSolid, northPlane);
                                            FaceArray northBoolSolidFaces = northBooleanSolid.Faces;
                                            foreach (PlanarFace northFace in northBoolSolidFaces)
                                            {
                                                XYZ northFaceNormal = northFace.FaceNormal;
                                                if (northFaceNormal.Y == -1)
                                                {
                                                    northCurveLoopsFitted = northFace.GetEdgesAsCurveLoops();
                                                    break;
                                                }
                                            }

                                            //Repeat for the east elevation
                                            Solid     eastBooleanSolid   = BooleanOperationsUtils.CutWithHalfSpace(roomSolid, eastPlane);
                                            FaceArray eastBoolSolidFaces = eastBooleanSolid.Faces;
                                            foreach (PlanarFace eastFace in eastBoolSolidFaces)
                                            {
                                                XYZ eastFaceNormal = eastFace.FaceNormal;
                                                if (eastFaceNormal.X == -1)
                                                {
                                                    eastCurveLoopsFitted = eastFace.GetEdgesAsCurveLoops();
                                                    break;
                                                }
                                            }

                                            //Repeat for the south elevation
                                            Solid     southBooleanSolid   = BooleanOperationsUtils.CutWithHalfSpace(roomSolid, southPlane);
                                            FaceArray southBoolSolidFaces = southBooleanSolid.Faces;
                                            foreach (PlanarFace southFace in southBoolSolidFaces)
                                            {
                                                XYZ southFaceNormal = southFace.FaceNormal;
                                                if (southFaceNormal.Y == 1)
                                                {
                                                    southCurveLoopsFitted = southFace.GetEdgesAsCurveLoops();
                                                    break;
                                                }
                                            }

                                            //To get the CurveLoop fitted 0.5" offset to the boundary of the face retrieved, create a CurveLoop via an offset
                                            //Now, the original curve loop was drawn on a plane with a +X axis vector normal, so the offset must be made in the positive X axis plane as well
                                            CurveLoop offsetWestCurveLoopFitted = CurveLoop.CreateViaOffset(westCurveLoopsFitted[0], (0.5d / 12), XYZ.BasisX);
                                            ViewCropRegionShapeManager westCropRegionShapeManager = view0.GetCropRegionShapeManager();
                                            westCropRegionShapeManager.SetCropShape(offsetWestCurveLoopFitted);

                                            //Repeat for the north CurveLoop
                                            //Note that because the plane has a -Y vector, the offset needs to be negative too
                                            CurveLoop offsetNorthCurveLoopFitted = CurveLoop.CreateViaOffset(northCurveLoopsFitted[0], -(0.5d / 12), XYZ.BasisY);;
                                            ViewCropRegionShapeManager northCropRegionShapeManager = view1.GetCropRegionShapeManager();
                                            northCropRegionShapeManager.SetCropShape(offsetNorthCurveLoopFitted);

                                            //Repeat for the east CurveLoop
                                            CurveLoop offsetEastCurveLoopFitted = CurveLoop.CreateViaOffset(eastCurveLoopsFitted[0], -(0.5d / 12), XYZ.BasisX);;
                                            ViewCropRegionShapeManager eastCropRegionShapeManager = view2.GetCropRegionShapeManager();
                                            eastCropRegionShapeManager.SetCropShape(offsetEastCurveLoopFitted);

                                            //Repeat for the south CurveLoop
                                            CurveLoop offsetSouthCurveLoopFitted = CurveLoop.CreateViaOffset(southCurveLoopsFitted[0], (0.5d / 12), XYZ.BasisY);;
                                            ViewCropRegionShapeManager southCropRegionShapeManager = view3.GetCropRegionShapeManager();
                                            southCropRegionShapeManager.SetCropShape(offsetSouthCurveLoopFitted);
                                        }
                                        catch (Exception e)
                                        {
                                            MessageBox.Show(e.ToString());
                                        }
                                    }

                                    //Use the room section's rectangular extents as the crop boundary if the second index was selected for the MainUI combobox
                                    if (uiForm.viewsCEPRCropMethodComboBox.SelectedIndex == 1)
                                    {
                                        try
                                        {
                                            //Create some CurveLoop lists to use later
                                            IList <CurveLoop> westCurveLoopsRectangular  = null;
                                            IList <CurveLoop> northCurveLoopsRectangular = null;
                                            IList <CurveLoop> southCurveLoopsRectangular = null;
                                            IList <CurveLoop> eastCurveLoopsRectangular  = null;

                                            //To get a rectangular cross section of a non-rectangular room cross section, we need to generate a bounding box for the room, then make a solid from the bounding box
                                            //Get the bounding box of the room
                                            BoundingBoxXYZ roomBBox = roomSolid.GetBoundingBox();
                                            //Use the minimum and maximum points of the bounding box to get the 4 points along the bottom of the bounding box
                                            XYZ pt0 = new XYZ(roomBBox.Min.X, roomBBox.Min.Y, roomBBox.Min.Z);
                                            XYZ pt1 = new XYZ(roomBBox.Max.X, roomBBox.Min.Y, roomBBox.Min.Z);
                                            XYZ pt2 = new XYZ(roomBBox.Max.X, roomBBox.Max.Y, roomBBox.Min.Z);
                                            XYZ pt3 = new XYZ(roomBBox.Min.X, roomBBox.Max.Y, roomBBox.Min.Z);
                                            //Generate perimeter lines for the bottom of the bounding box points
                                            Line edge0 = Line.CreateBound(pt0, pt1);
                                            Line edge1 = Line.CreateBound(pt1, pt2);
                                            Line edge2 = Line.CreateBound(pt2, pt3);
                                            Line edge3 = Line.CreateBound(pt3, pt0);
                                            //Make a list of curves out of the edges
                                            List <Curve> edges = new List <Curve>();
                                            edges.Add(edge0);
                                            edges.Add(edge1);
                                            edges.Add(edge2);
                                            edges.Add(edge3);
                                            //Use the curves to make a CurveLoop list
                                            List <CurveLoop> loops = new List <CurveLoop>();
                                            loops.Add(CurveLoop.Create(edges));
                                            //Generate a solid from an extrusion that uses the CurveLoops extruded upward a height equal to the the height of the bounding box
                                            Solid initialSolidBBox = GeometryCreationUtilities.CreateExtrusionGeometry(loops, XYZ.BasisZ, (roomBBox.Max.Z - roomBBox.Min.Z));
                                            //Create a transformed solid box from the previously created box moved to where the room bounding box is located
                                            Solid roomSolidBBox = SolidUtils.CreateTransformed(initialSolidBBox, roomBBox.Transform);

                                            //Cut the solid box with the west plane created earlier and get the faces
                                            Solid     westBooleanSolidBBox   = BooleanOperationsUtils.CutWithHalfSpace(roomSolidBBox, westPlane);
                                            FaceArray westBoolSolidFacesBBox = westBooleanSolidBBox.Faces;
                                            foreach (PlanarFace westFace in westBoolSolidFacesBBox)
                                            {
                                                //As with the earlier code for a fitted crop, get the face with a positive X normal
                                                XYZ westFaceNormal = westFace.FaceNormal;
                                                if (westFaceNormal.X == 1)
                                                {
                                                    //Obtain the edges of the face
                                                    westCurveLoopsRectangular = westFace.GetEdgesAsCurveLoops();
                                                    break;
                                                }
                                            }

                                            //Repeat for the north face
                                            Solid     northBooleanSolidBBox   = BooleanOperationsUtils.CutWithHalfSpace(roomSolidBBox, northPlane);
                                            FaceArray northBoolSolidFacesBBox = northBooleanSolidBBox.Faces;
                                            foreach (PlanarFace northFace in northBoolSolidFacesBBox)
                                            {
                                                XYZ northFaceNormal = northFace.FaceNormal;
                                                if (northFaceNormal.Y == -1)
                                                {
                                                    northCurveLoopsRectangular = northFace.GetEdgesAsCurveLoops();
                                                    break;
                                                }
                                            }

                                            //Repeat for the east face
                                            Solid     eastBooleanSolidBBox   = BooleanOperationsUtils.CutWithHalfSpace(roomSolidBBox, eastPlane);
                                            FaceArray eastBoolSolidFacesBBox = eastBooleanSolidBBox.Faces;
                                            foreach (PlanarFace eastFace in eastBoolSolidFacesBBox)
                                            {
                                                XYZ eastFaceNormal = eastFace.FaceNormal;
                                                if (eastFaceNormal.X == -1)
                                                {
                                                    eastCurveLoopsRectangular = eastFace.GetEdgesAsCurveLoops();
                                                    break;
                                                }
                                            }

                                            //Repeat for the south face
                                            Solid     southBooleanSolidBBox   = BooleanOperationsUtils.CutWithHalfSpace(roomSolidBBox, southPlane);
                                            FaceArray southBoolSolidFacesBBox = southBooleanSolidBBox.Faces;
                                            foreach (PlanarFace southFace in southBoolSolidFacesBBox)
                                            {
                                                XYZ southFaceNormal = southFace.FaceNormal;
                                                if (southFaceNormal.Y == 1)
                                                {
                                                    southCurveLoopsRectangular = southFace.GetEdgesAsCurveLoops();
                                                    break;
                                                }
                                            }

                                            //As before, get the offset curve from the original curve, but offset by 1'
                                            CurveLoop offsetWestCurveLoopRectangular = CurveLoop.CreateViaOffset(westCurveLoopsRectangular[0], 1, XYZ.BasisX);
                                            ViewCropRegionShapeManager westCropRegionShapeManager = view0.GetCropRegionShapeManager();
                                            westCropRegionShapeManager.SetCropShape(offsetWestCurveLoopRectangular);

                                            //As with the fitted offset curve, the offset for a curve in a plane with a negative vector must also be negative
                                            CurveLoop offsetNorthCurveLoopRectangular = CurveLoop.CreateViaOffset(northCurveLoopsRectangular[0], -1, XYZ.BasisY);
                                            ViewCropRegionShapeManager northCropRegionShapeManager = view1.GetCropRegionShapeManager();
                                            northCropRegionShapeManager.SetCropShape(offsetNorthCurveLoopRectangular);

                                            CurveLoop offsetEastCurveLoopRectangular = CurveLoop.CreateViaOffset(eastCurveLoopsRectangular[0], -1, XYZ.BasisX);
                                            ViewCropRegionShapeManager eastCropRegionShapeManager = view2.GetCropRegionShapeManager();
                                            eastCropRegionShapeManager.SetCropShape(offsetEastCurveLoopRectangular);

                                            CurveLoop offsetSouthCurveLoopRectangular = CurveLoop.CreateViaOffset(southCurveLoopsRectangular[0], 1, XYZ.BasisY);
                                            ViewCropRegionShapeManager southCropRegionShapeManager = view3.GetCropRegionShapeManager();
                                            southCropRegionShapeManager.SetCropShape(offsetSouthCurveLoopRectangular);
                                        }
                                        catch (Exception e)
                                        {
                                            MessageBox.Show(e.ToString());
                                        }
                                    }

                                    //If the user opted to override the crop boundary of the elevations, continue as follows
                                    if (uiForm.viewsCEPROverrideCheckBox.Checked == true)
                                    {
                                        //Make a new OverrideGraphicsSetting to use in the boundary override
                                        OverrideGraphicSettings orgs = new OverrideGraphicSettings();
                                        //Use the solid line pattern
                                        orgs.SetProjectionLinePatternId(LinePatternElement.GetSolidPatternId());
                                        //Set the line weight to the properties value
                                        orgs.SetProjectionLineWeight(Properties.Settings.Default.RevitOverrideInteriorCropWeight);

                                        //Grab all of the viewers, which are the viewport windows, and cycle through them
                                        var viewers = new FilteredElementCollector(uidoc.Document).OfCategory(BuiltInCategory.OST_Viewers);
                                        foreach (Element viewer in viewers)
                                        {
                                            //Get the parameters for the viewer
                                            ParameterSet parameters = viewer.Parameters;
                                            foreach (Parameter parameter in parameters)
                                            {
                                                //Get the View Name parameter
                                                if (parameter.Definition.Name.ToString() == "View Name")
                                                {
                                                    string viewName = parameter.AsString();
                                                    //If the view's view name is the same as the west elvation, continue
                                                    if (viewName == view0.Name)
                                                    {
                                                        //Set the view's override setting using the viewer and the OverrideGraphicsSettings
                                                        Autodesk.Revit.DB.View viewtouse = view0 as Autodesk.Revit.DB.View;
                                                        viewtouse.SetElementOverrides(viewer.Id, orgs);
                                                    }
                                                    //Continue to evaluate for the other view names
                                                    else if (viewName == view1.Name)
                                                    {
                                                        Autodesk.Revit.DB.View viewtouse = view1 as Autodesk.Revit.DB.View;
                                                        viewtouse.SetElementOverrides(viewer.Id, orgs);
                                                    }
                                                    else if (viewName == view2.Name)
                                                    {
                                                        Autodesk.Revit.DB.View viewtouse = view2 as Autodesk.Revit.DB.View;
                                                        viewtouse.SetElementOverrides(viewer.Id, orgs);
                                                    }
                                                    else if (viewName == view3.Name)
                                                    {
                                                        Autodesk.Revit.DB.View viewtouse = view3 as Autodesk.Revit.DB.View;
                                                        viewtouse.SetElementOverrides(viewer.Id, orgs);
                                                    }
                                                    else
                                                    {
                                                        //If the view's name is not one of the create elevation views, skip it
                                                        continue;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                t1.Commit();
                            }
                            catch (Exception e)
                            {
                                MessageBox.Show(e.ToString());
                                t1.RollBack();
                            }
                            t1.Dispose();
                        }
                    }
                    catch
                    {
                        //If the user did not select any room tags or room elements, then report that
                        MessageBox.Show("No rooms were selected");
                    }
                }
            }
            else if (uidoc.ActiveView.GetType().ToString() != "Autodesk.Revit.DB.ViewPlan")
            {
                //If the user tried to run this outside a plan view, report it
                MessageBox.Show("Please run from a plan view");
            }
            else
            {
                //If the user did not select an elevation type, report it
                MessageBox.Show("No elevation type selected");
            }
        }
Beispiel #5
0
        public MaterialsAMLRequest(UIApplication uiApp, String text)
        {
            DataGridView dgv = BARevitTools.Application.thisApp.newMainUi.materialsAMLDataGridView;
            RVTDocument  doc = uiApp.ActiveUIDocument.Document;

            //Get all of the line styles in the project and assign them to a dictionary indexed by line style name
            Dictionary <string, Category> lineStyleDict = new Dictionary <string, Category>();

            foreach (Category lineStyle in RVTGetElementsByCollection.DocumentLineStyles(uiApp))
            {
                lineStyleDict.Add(lineStyle.Name.Replace("ID ", ""), lineStyle);
            }

            //All new line styles will use the solid line pattern, so get that from the project
            ElementId solidPatternId = LinePatternElement.GetSolidPatternId();

            //Start the transaction to create the line styles
            Transaction t1 = new Transaction(doc, "CreateLineStyles");

            t1.Start();
            //Cycle through the rows of line styles in the MainUI form
            foreach (DataGridViewRow row in dgv.Rows)
            {
                //Get the color of the button in the row and convert it to a Revit color
                System.Drawing.Color buttonColor = row.Cells["Color"].Style.BackColor;
                Color revitColor = new Color(buttonColor.R, buttonColor.G, buttonColor.B);

                //If the Updated column cell is not null, continue
                if (row.Cells["Updated"].Value != null)
                {
                    //Assuming the user made a modification to the color for an existing line style and the Mark is part of the dictionary keys...
                    if (row.Cells["Updated"].Value.ToString() == "True" && lineStyleDict.Keys.Contains(row.Cells["Mark"].Value.ToString()))
                    {
                        try
                        {
                            //Get the line style by key name in the dictionary and update its line color to the one from the button
                            Category lineStyleToUpdate = lineStyleDict[row.Cells["Mark"].Value.ToString()];
                            lineStyleToUpdate.LineColor = revitColor;
                        }
                        catch (Exception e)
                        {
                            MessageBox.Show(e.ToString());
                        }
                    }
                }

                //If the Select column cell is not null, continue
                if (row.Cells["Select"].Value != null)
                {
                    //Assuming the user checked the box in the Select column, Mark is not emtpy, and the dictionary of line styles does not already contain a line style with the same mark name...
                    if (row.Cells["Select"].Value.ToString() == "True" && row.Cells["Mark"].Value.ToString() != "" && !lineStyleDict.Keys.Contains(row.Cells["Mark"].Value.ToString()))
                    {
                        try
                        {
                            //Get the category for Lines
                            Category linesCategory = doc.Settings.Categories.get_Item(BuiltInCategory.OST_Lines);
                            //Make a new line style subcategory with the name of the mark value from the Mark column cell, prefixed with ID so it is easier to find during the sort
                            Category newLineStyleCategory = doc.Settings.Categories.NewSubcategory(linesCategory, "ID " + row.Cells["Mark"].Value.ToString());
                            //Set the line style's color, projection weight, and solid line pattern
                            newLineStyleCategory.LineColor = revitColor;
                            newLineStyleCategory.SetLineWeight(6, GraphicsStyleType.Projection);
                            newLineStyleCategory.SetLinePatternId(solidPatternId, GraphicsStyleType.Projection);
                            //Regenerate the document
                            doc.Regenerate();
                        }
                        catch (Exception e)
                        {
                            MessageBox.Show(e.ToString());
                        }
                    }
                }
            }
            t1.Commit();

            //Update the DataGridView of the MainUI with the changes and new line styles
            BARevitTools.Application.thisApp.newMainUi.MaterialsAMLUpdateDGV(dgv);

            //Make another line style dictionary with the line styles indexed by name (mark)
            Dictionary <string, Category> newlineStyleDict = new Dictionary <string, Category>();

            foreach (Category lineStyle in RVTGetElementsByCollection.DocumentLineStyles(uiApp))
            {
                newlineStyleDict.Add(lineStyle.Name.Replace("ID ", ""), lineStyle);
            }

            //Add a default line style to the palette's combo box, then add the checked line styles to a list in alphabetical order
            SortedList <string, string> materialsToUseList = new SortedList <string, string>();

            BARevitTools.Application.thisApp.newMainUi.materialsAMLPalette.paletteMaterialComboBox.Items.Add("Default");
            foreach (DataGridViewRow row in dgv.Rows)
            {
                if (newlineStyleDict.Keys.Contains(row.Cells["Mark"].Value.ToString()) && row.Cells["Select"].Value.ToString() == "True")
                {
                    materialsToUseList.Add(row.Cells["Mark"].Value.ToString(), row.Cells["Mark"].Value.ToString());
                }
            }

            //Assuming there were checked linestyles to add to the palette's combo box, add them to the combo box
            if (materialsToUseList.Count != 0)
            {
                foreach (string item in materialsToUseList.Keys)
                {
                    BARevitTools.Application.thisApp.newMainUi.materialsAMLPalette.paletteMaterialComboBox.Items.Add(item);
                }
            }
            else
            {
                //If there were no additional line styles to add to the combo box, disable it and set it to Default
                BARevitTools.Application.thisApp.newMainUi.materialsAMLPalette.paletteMaterialComboBox.Text    = "Default";
                BARevitTools.Application.thisApp.newMainUi.materialsAMLPalette.paletteMaterialComboBox.Enabled = false;
            }

            //Show the palette and continue doing requests for the Accent Material Lines tool from there.
            BARevitTools.Application.thisApp.newMainUi.materialsAMLPalette.Show();
        }