Ejemplo n.º 1
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument    uidoc = uiapp.ActiveUIDocument;
            Document      doc   = uidoc.Document;

            Autodesk.Revit.DB.View view;
            view = doc.ActiveView;
            Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;


            // Deleting existing DirectShape
            // get ready to filter across just the elements visible in a view
            FilteredElementCollector coll = new FilteredElementCollector(doc, view.Id);

            coll.OfClass(typeof(DirectShape));
            IEnumerable <DirectShape> DSdelete = coll.Cast <DirectShape>();

            using (Transaction tx = new Transaction(doc))
            {
                tx.Start("Delete elements");

                try
                {
                    foreach (DirectShape ds in DSdelete)
                    {
                        ICollection <ElementId> ids = doc.Delete(ds.Id);
                    }

                    tx.Commit();
                }
                catch (ArgumentException)
                {
                    tx.RollBack();
                }
            }


            // Delete Shema
            try
            {
                using (Transaction trans = new Transaction(doc))
                {
                    IList <Schema> schemasIn = Schema.ListSchemas();
                    foreach (Schema s in schemasIn)
                    {
                        Console.WriteLine("In > " + s.SchemaName + " : " + s.GUID);
                    }

                    trans.Start("Delete Schema");
                    Schema schemaOld = Schema.Lookup(_schemaGuid);
                    Schema.EraseSchemaAndAllEntities(schemaOld, false);
                    trans.Commit();

                    IList <Schema> schemasOut = Schema.ListSchemas();
                    foreach (Schema s in schemasOut)
                    {
                        Console.WriteLine("Out > " + s.SchemaName + " : " + s.GUID);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }


            // Def Site + Building
            double roomNbre = 0;
            string filename = doc.Title;


            FilteredElementCollector m_Collector = new FilteredElementCollector(doc);

            m_Collector.OfCategory(BuiltInCategory.OST_Rooms);
            IList <Element> m_Rooms = m_Collector.ToElements();

            // Create Shema Data
            SchemaBuilder schemaBuilder = new SchemaBuilder(_schemaGuid);

            // allow anyone to read the object
            schemaBuilder.SetReadAccessLevel(
                AccessLevel.Public);

            // restrict writing to this vendor only
            schemaBuilder.SetWriteAccessLevel(
                AccessLevel.Vendor);

            // required because of restricted write-access
            schemaBuilder.SetVendorId("P5RD");

            // create a field to store string
            Dictionary <string, string> listFiled = new Dictionary <string, string>();

            listFiled.Add("accessories", "");
            listFiled.Add("area", "");
            listFiled.Add("booking", "");
            listFiled.Add("building", "");
            listFiled.Add("categorie", "");
            listFiled.Add("center", "");
            listFiled.Add("department", "");
            listFiled.Add("division", "");
            listFiled.Add("label", "");
            listFiled.Add("labelPosition", "");
            listFiled.Add("level", "");
            listFiled.Add("name", "");
            listFiled.Add("occupationType", "");
            listFiled.Add("revit_id", "");
            listFiled.Add("room", "");
            listFiled.Add("sap", "");
            listFiled.Add("service", "");
            listFiled.Add("site", "");
            listFiled.Add("styleCategory", "");
            listFiled.Add("team", "");
            listFiled.Add("type", "");
            listFiled.Add("videoConferencing", "");
            listFiled.Add("workset", "");
            listFiled.Add("update", "");

            foreach (KeyValuePair <string, string> p in listFiled)
            {
                FieldBuilder fieldBuilder = schemaBuilder.AddSimpleField(p.Key, typeof(String));
                fieldBuilder.SetDocumentation("Rooms infos");
            }


            schemaBuilder.SetSchemaName("testRoom");
            Schema schema = schemaBuilder.Finish(); // register the Schema object

            //  Iterate the list and gather a list of boundaries
            foreach (Room room in m_Rooms)
            {
                //  Avoid unplaced rooms
                if (room.Area > 1)
                {
                    String _family_name = "testRoom-" + room.UniqueId.ToString();

                    using (Transaction tr = new Transaction(doc))
                    {
                        tr.Start("Create Mass");

                        // Found BBOX

                        BoundingBoxXYZ bb = room.get_BoundingBox(null);
                        XYZ            pt = new XYZ((bb.Min.X + bb.Max.X) / 2, (bb.Min.Y + bb.Max.Y) / 2, bb.Min.Z);


                        //  Get the room boundary
                        IList <IList <BoundarySegment> > boundaries = room.GetBoundarySegments(new SpatialElementBoundaryOptions()); // 2012


                        // a room may have a null boundary property:
                        int n = 0;

                        if (null != boundaries)
                        {
                            n = boundaries.Count;
                        }


                        //  The array of boundary curves
                        CurveArray m_CurveArray = new CurveArray();
                        //  Iterate to gather the curve objects


                        TessellatedShapeBuilder builder = new TessellatedShapeBuilder();
                        builder.OpenConnectedFaceSet(true);

                        // Add Direct Shape
                        List <CurveLoop> curveLoopList = new List <CurveLoop>();

                        if (0 < n)
                        {
                            int iBoundary = 0, iSegment;

                            foreach (IList <BoundarySegment> b in boundaries) // 2012
                            {
                                List <Curve> profile = new List <Curve>();
                                ++iBoundary;
                                iSegment = 0;

                                foreach (BoundarySegment s in b)
                                {
                                    ++iSegment;
                                    Curve curve = s.GetCurve(); // 2016

                                    profile.Add(curve);         //add shape for instant object
                                }


                                try
                                {
                                    CurveLoop curveLoop = CurveLoop.Create(profile);
                                    curveLoopList.Add(curveLoop);
                                }
                                catch (Exception ex)
                                {
                                    Debug.WriteLine(ex.Message);
                                }
                            }
                        }



                        try
                        {
                            SolidOptions options = new SolidOptions(ElementId.InvalidElementId, ElementId.InvalidElementId);

                            Frame frame = new Frame(pt, XYZ.BasisX, -XYZ.BasisZ, XYZ.BasisY);

                            //  Simple insertion point
                            XYZ pt1 = new XYZ(0, 0, 0);
                            //  Our normal point that points the extrusion directly up
                            XYZ ptNormal = new XYZ(0, 0, 100);
                            //  The plane to extrude the mass from
                            Plane m_Plane = app.Create.NewPlane(ptNormal, pt1);
                            // SketchPlane m_SketchPlane = m_FamDoc.FamilyCreate.NewSketchPlane(m_Plane);
                            SketchPlane m_SketchPlane = SketchPlane.Create(doc, m_Plane); // 2014

                            Solid roomSolid;

                            // Solid roomSolid = GeometryCreationUtilities.CreateRevolvedGeometry(frame, new CurveLoop[] { curveLoop }, 0, 2 * Math.PI, options);
                            roomSolid = GeometryCreationUtilities.CreateExtrusionGeometry(curveLoopList, ptNormal, 1);

                            DirectShape ds = DirectShape.CreateElement(doc, new ElementId(BuiltInCategory.OST_GenericModel), "3drooms", _family_name);

                            ds.SetShape(new GeometryObject[] { roomSolid });


                            // Add data
                            Dictionary <string, string> udroom    = Revit3Drooms.Util.GetElementProperties(room, true);
                            Dictionary <string, string> udroomNew = new Dictionary <string, string>();

                            foreach (KeyValuePair <string, string> p in udroom)
                            {
                                if (p.Key.ToLower() == "name")
                                {
                                    udroomNew.Add(p.Key, p.Value);
                                }
                                else if (p.Key.ToLower() == "niveau")
                                {
                                    udroomNew.Add("level", p.Value);
                                }
                            }

                            udroomNew.Add("area", room.Area.ToString());
                            udroomNew.Add("room", room.Number);
                            udroomNew.Add("revit_id", room.UniqueId.ToString());


                            // Create Parameter
                            try
                            {
                                // create an entity (object) for this schema (class)
                                Entity entity = new Entity(schema);

                                foreach (KeyValuePair <string, string> p in udroomNew)
                                {
                                    // get the field from the schema
                                    Field fieldSpliceLocation = schema.GetField(p.Key);
                                    entity.Set <String>(fieldSpliceLocation, p.Value.ToString()); // set the value for this entity
                                    ds.SetEntity(entity);                                         // store the entity in the element
                                }
                            }
                            catch (Exception s)
                            {
                                Console.WriteLine(s.Message);
                            }

                            tr.Commit();


                            // get the data back from the wall
                            Entity retrievedEntity = ds.GetEntity(schema);

                            String retrievedData = retrievedEntity.Get <String>(
                                schema.GetField("building"));

                            roomNbre += 1;
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.Message);
                        }
                    }
                }
            }

            Debug.Print("Rooms total : {0}", roomNbre + "/" + m_Rooms.Count.ToString());
            Console.WriteLine("Total Rooms : " + roomNbre + "/" + m_Rooms.Count.ToString());
            return(Result.Succeeded);
        }