วันอังคารที่ 2 เมษายน พ.ศ. 2562

สร้าง face จาก Floor

ในหลายกรณีต้องการสร้าง face เพื่อบางงาน ชั่วคราว หรือ ปะ กับ Model


  public static void ExecuteSolid2(ExternalCommandData commandData)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            var app = uiapp.Application;
            Document doc = uidoc.Document;

            IList<Reference> references = uidoc.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Face);

            IList<IList<IList<XYZ>>> all = new List<IList<IList<XYZ>>>();

            foreach (Reference reference in references)
            {
                Face face = doc.GetElement(reference).GetGeometryObjectFromReference(reference) as Face;

                IList<IList<XYZ>> loopVertices = new List<IList<XYZ>>();

                PlanarFace planarFace = face as PlanarFace;

                if (!planarFace.FaceNormal.IsAlmostEqualTo(XYZ.BasisZ))
                {
                    EdgeArrayArray edgeArrayArray = planarFace.EdgeLoops;

                    foreach (EdgeArray ea in edgeArrayArray)
                    {
                        IList<XYZ> loops = new List<XYZ>();

                        foreach (Edge e in ea)
                        {
                            Curve c = e.AsCurve();
                            loops.Add(c.GetEndPoint(0));
                        }

                        loopVertices.Add(loops);
                    }
                }
                all.Add(loopVertices);
            }

            CreateTessellatedShape(doc, all, ElementId.InvalidElementId);

        //    return Result.Succeeded;
        }
        public static void CreateTessellatedShape(Document doc, IList<IList<IList<XYZ>>> all, ElementId materialId)
        {
            TessellatedShapeBuilder builder = new TessellatedShapeBuilder();

            builder.OpenConnectedFaceSet(true);

            foreach (IList<IList<XYZ>> loopVertices in all)
            {
                TessellatedFace tessellatedFace = new TessellatedFace(loopVertices, materialId);

                if (builder.DoesFaceHaveEnoughLoopsAndVertices(tessellatedFace))
                {
                    builder.AddFace(tessellatedFace);
                }
            }

            builder.CloseConnectedFaceSet();
            builder.Target = TessellatedShapeBuilderTarget.AnyGeometry;
            builder.Fallback = TessellatedShapeBuilderFallback.Mesh;
            builder.Build();

            TessellatedShapeBuilderResult result = builder.GetBuildResult();

            using (Transaction t = new Transaction(doc, "Create tessellated direct shape"))
            {
                t.Start();
                DirectShape ds = DirectShape.CreateElement(doc, new ElementId(BuiltInCategory.OST_Floors));
                ds.ApplicationId = "Application id";
                ds.ApplicationDataId = "Geometry object id";
                ds.SetShape(result.GetGeometricalObjects());
                t.Commit();
            }
        }