Beispiel #1
0
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            UIApplication           uiapp = commandData.Application;
            UIDocument              uidoc = uiapp.ActiveUIDocument;
            Application             app = uiapp.Application;
            Document                doc = uidoc.Document;
            Selection               SelectedObjs = uidoc.Selection;
            ICollection <ElementId> ids = uidoc.Selection.GetElementIds();
            ElementId               defTextType = doc.GetDefaultElementTypeId(ElementTypeGroup.TextNoteType);
            List <double>           cDiams = new List <double>();
            Line          LineDir = null; bool updateRack = false;
            List <string> Conduits = new List <string>();
            TextNote      toUpdate = null;

            RackDim.GetMenuValues(uiapp);
            Store.mod_split = 30;
            foreach (ElementId eid in ids)
            {
                Element elem = doc.GetElement(eid);
                if (elem.GetType() == typeof(TextNote))
                {
                    updateRack = true; toUpdate = elem as TextNote;
                }
                else
                {
                    GeometryElement geom = elem.get_Geometry(Store.Dimop(doc.ActiveView));
                    cDiams.Add(elem.get_Parameter(BuiltInParameter.RBS_CONDUIT_DIAMETER_PARAM).AsDouble());
                    LineDir = RackDim.GetLineOfGeom(geom);
                }
            }
            if (toUpdate != null)
            {
                ids.Remove(toUpdate.Id);
            }
            double dMax = cDiams.Max();

            foreach (string s in Conduits)
            {
                TaskDialog.Show("asd", s);
            }
            using (Transaction tx = new Transaction(doc))
            {
                tx.Start("Create Text");
                List <ElementId>         Rows = new List <ElementId>();
                List <List <ElementId> > allRows = SeparateRows(ids, doc, dMax);
                string        diameters = ""; Double Distance = 0;
                List <double> leftXs = new List <double>(); List <ElementId> lefts = new List <ElementId>();
                List <double> rightXs = new List <double>(); List <ElementId> rights = new List <ElementId>();
                foreach (int i in SortRows(allRows, doc))
                {
                    string prev = ""; int typcount = 1; string diam;
                    if (i == 0 && allRows.Count > 1)
                    {
                        diameters += "ABOVE: ";
                    }
                    else if (i == allRows.Count - 1 && allRows.Count != 1)
                    {
                        diameters += '\n' + "BELOW: ";
                    }
                    else if (allRows.Count > 1)
                    {
                        diameters += '\n' + "MIDDLE: ";
                    }
                    List <ElementId> SortedRows = SortX(allRows[i], doc);
                    leftXs.Add(RackDim.GetRotatedToVert(SortedRows[0], doc).GetEndPoint(0).X); lefts.Add(SortedRows[0]);
                    rightXs.Add(RackDim.GetRotatedToVert(SortedRows[SortedRows.Count - 1], doc).GetEndPoint(0).X); rights.Add(SortedRows[SortedRows.Count - 1]);
                    foreach (ElementId eid in SortedRows)
                    {
                        diam = doc.GetElement(eid).get_Parameter(BuiltInParameter.RBS_CONDUIT_DIAMETER_PARAM).AsValueString();

                        if (diam == prev)
                        {
                            typcount += 1;
                        }
                        else
                        {
                            if (typcount != 1)
                            {
                                diameters = diameters + typcount + "-" + prev + "C, ";
                                diameters = BreakLine(diameters, Store.mod_split);
                                typcount  = 1;
                            }
                            else if (prev != "")
                            {
                                diameters = diameters + prev + "C, ";
                                diameters = BreakLine(diameters, Store.mod_split);
                            }
                            prev = diam;
                        }
                    }
                    if (typcount != 1)
                    {
                        diameters = diameters + typcount + "-" + prev + "C";
                    }
                    else
                    {
                        diameters = diameters + prev + "C";
                    }
                }
                ElementId     firstEid = lefts[leftXs.IndexOf(leftXs.Max())];
                ElementId     lastEid  = rights[rightXs.IndexOf(rightXs.Min())];
                LocationCurve firstP   = doc.GetElement(firstEid).Location as LocationCurve;
                LocationCurve lastP = doc.GetElement(lastEid).Location as LocationCurve;
                XYZ           rotP  = firstP.Curve.GetEndPoint(0);
                Distance = Math.Abs(RackDim.GetRotatedToVert(firstEid, doc, rotP).GetEndPoint(0).X - RackDim.GetRotatedToVert(lastEid, doc, rotP).GetEndPoint(0).X);
                Line firstL = firstP.Curve as Line;
                if (updateRack)
                {
                    toUpdate.Text = diameters;
                }
                else
                {
                    Line   texRot    = Line.CreateBound(firstP.Curve.GetEndPoint(0), firstP.Curve.GetEndPoint(1));
                    Double textAngle = texRot.Direction.AngleTo(new XYZ(0, -1, 0));
                    bool   fix       = false;
                    if (textAngle >= Math.PI / 2)
                    {
                        textAngle = Math.PI - textAngle;
                        fix       = true;
                    }
                    TextNoteOptions textRotate = new TextNoteOptions
                    {
                        TypeId   = defTextType,
                        Rotation = textAngle
                    };
                    TextNote text = TextNote.Create(doc, doc.ActiveView.Id, LineDir.Evaluate(Store.mod_place, true), diameters, textRotate);
                    text.get_Parameter(BuiltInParameter.TEXT_ALIGN_HORZ).Set((Int32)TextAlignFlags.TEF_ALIGN_BOTTOM);
                    if (fix)
                    {
                        text.Coord = firstP.Curve.Evaluate(Store.mod_place, true)
                                     .Add(RackDim.GetPerpendicular(firstL, Store.mod_place)
                                          .Direction.Multiply(Distance + (4 * Store.mod_firsty)));
                    }
                    else
                    {
                        text.Coord = firstP.Curve.Evaluate(Store.mod_place, true)
                                     .Subtract(RackDim.GetPerpendicular(firstL, Store.mod_place)
                                               .Direction.Multiply(Distance + (4 * Store.mod_firsty)));
                    }
                    text.Coord = new XYZ(text.Coord.X, text.Coord.Y + (1.4 * Store.mod_stepy), text.Coord.Z);
                    text.AddLeader(TextNoteLeaderTypes.TNLT_STRAIGHT_R); text.AddLeader(TextNoteLeaderTypes.TNLT_STRAIGHT_R);
                    IList <Leader> leaders = text.GetLeaders();
                    leaders[0].End = firstP.Curve.Evaluate(Store.mod_place, true);
                    if (firstL.Direction.AngleTo(new XYZ(0, 1, 0)) >= Math.PI / 2)
                    {
                        leaders[1].End = leaders[0].End.Subtract(RackDim.GetPerpendicular(firstL, Store.mod_place)
                                                                 .Direction.Multiply(Distance));
                    }
                    else
                    {
                        leaders[1].End = leaders[0].End.Add(RackDim.GetPerpendicular(firstL, Store.mod_place)
                                                            .Direction.Multiply(Distance));
                    }
                    if (fix)
                    {
                        leaders[0].Elbow = leaders[0].End.Subtract(RackDim.GetPerpendicular(firstL, Store.mod_place)
                                                                   .Direction.Multiply(1.4 * Store.mod_left));
                        leaders[1].Elbow = leaders[1].End.Add(RackDim.GetPerpendicular(firstL, Store.mod_place)
                                                              .Direction.Multiply(1.4 * Store.mod_left));
                    }
                    else
                    {
                        leaders[0].Elbow = leaders[0].End.Add(RackDim.GetPerpendicular(firstL, Store.mod_place)
                                                              .Direction.Multiply(1.4 * Store.mod_left));
                        leaders[1].Elbow = leaders[1].End.Subtract(RackDim.GetPerpendicular(firstL, Store.mod_place)
                                                                   .Direction.Multiply(1.4 * Store.mod_left));
                    }
                }
                tx.Commit();
            }
            return(Result.Succeeded);
        }
Beispiel #2
0
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            UIApplication           uiapp = commandData.Application;
            UIDocument              uidoc = uiapp.ActiveUIDocument;
            Application             app = uiapp.Application;
            Document                doc = uidoc.Document;
            Selection               SelectedObjs = uidoc.Selection;
            ICollection <ElementId> ids = uidoc.Selection.GetElementIds();
            Line           dimDirCross = null; Line dimDir = null;
            int            selectdim  = 0;
            bool           updateMode = false;
            ElementArray   dimensions = new ElementArray();
            ReferenceArray dimto = new ReferenceArray();

            GetMenuValues(uiapp);
            foreach (ElementId eid in ids)
            {
                if (doc.GetElement(eid).GetType() == typeof(Grid))
                {
                    Grid grid = doc.GetElement(eid) as Grid;
                    dimto.Append(new Reference(grid));
                }
                else if (doc.GetElement(eid).GetType() == typeof(Dimension))
                {
                    updateMode = true;
                    dimensions.Append(doc.GetElement(eid));
                }
                else
                {
                    GeometryElement geom    = doc.GetElement(eid).get_Geometry(Store.Dimop(doc.ActiveView));
                    Line            refLine = GetLineOfGeom(geom);
                    if (selectdim == 0)
                    {
                        dimDir      = Line.CreateBound(refLine.GetEndPoint(0), refLine.GetEndPoint(1));
                        dimDirCross = RackDim.GetPerpendicular(dimDir, Store.mod_place);
                        selectdim   = 1;
                    }
                    dimto.Append(refLine.Reference);
                }
            }
            if (updateMode)
            {
                foreach (Element elem in dimensions)
                {
                    selectdim = 0;
                    Dimension      dim        = elem as Dimension;
                    ReferenceArray updatedref = new ReferenceArray();
                    foreach (Reference refe in dim.References)
                    {
                        if (doc.GetElement(refe.ElementId).GetType() == typeof(Grid))
                        {
                            Grid grid = doc.GetElement(refe.ElementId) as Grid;
                            updatedref.Append(new Reference(grid));
                        }
                        else
                        {
                            GeometryElement geom    = doc.GetElement(refe.ElementId).get_Geometry(Store.Dimop(doc.ActiveView));
                            Line            refLine = GetLineOfGeom(geom);
                            if (selectdim == 0)
                            {
                                dimDir      = Line.CreateBound(refLine.GetEndPoint(0), refLine.GetEndPoint(1));
                                dimDirCross = RackDim.GetPerpendicular(dimDir, Store.mod_place);
                                selectdim   = 1;
                            }
                            updatedref.Append(refLine.Reference);
                        }
                    }
                    RackDim.CreateRackDim(doc, uiapp, dimDir, dimDirCross, updatedref);
                    using (Transaction deltrans = new Transaction(doc))
                    {
                        deltrans.Start("Update Dimension");
                        doc.Delete(elem.Id);
                        deltrans.Commit();
                    }
                }
            }
            else
            {
                RackDim.CreateRackDim(doc, uiapp, dimDir, dimDirCross, dimto);
            }
            return(Result.Succeeded);
        }