コード例 #1
0
ファイル: ConvertWall.cs プロジェクト: xc0derx/speckle-sharp
        private object GetWallDisplayMesh(DB.Wall wall)
        {
            var grid = wall.CurtainGrid;
            var mesh = new Mesh();

            // meshing for walls in case they are curtain grids
            if (grid != null)
            {
                var meshPanels   = new Mesh();
                var meshMullions = new Mesh();

                var panels   = new List <Solid>();
                var mullions = new List <Solid>();
                foreach (ElementId panelId in grid.GetPanelIds())
                {
                    panels.AddRange(GetElementSolids(Doc.GetElement(panelId)));
                }
                foreach (ElementId mullionId in grid.GetMullionIds())
                {
                    mullions.AddRange(GetElementSolids(Doc.GetElement(mullionId)));
                }
                (meshPanels.faces, meshPanels.vertices)     = GetFaceVertexArrFromSolids(panels);
                (meshMullions.faces, meshMullions.vertices) = GetFaceVertexArrFromSolids(mullions);

                meshPanels["renderMaterial"] = new Other.RenderMaterial()
                {
                    opacity = 0.2, diffuse = System.Drawing.Color.AliceBlue.ToArgb()
                };

                meshMullions["renderMaterial"] = new Other.RenderMaterial()
                {
                    diffuse = System.Drawing.Color.DarkGray.ToArgb()
                };

                meshPanels.units   = ModelUnits;
                meshMullions.units = ModelUnits;
                return(new List <Base>()
                {
                    meshPanels, meshMullions
                });
            }
            else
            {
                (mesh.faces, mesh.vertices) = GetFaceVertexArrayFromElement(wall, new Options()
                {
                    DetailLevel = ViewDetailLevel.Fine, ComputeReferences = false
                });
                mesh.units = ModelUnits;
                return(mesh);
            }
        }
コード例 #2
0
        public Base WallToSpeckle(DB.Wall revitWall)
        {
            var baseGeometry = LocationToSpeckle(revitWall);

            if (baseGeometry is Geometry.Point)
            {
                return(RevitElementToSpeckle(revitWall));
            }

            RevitWall speckleWall = new RevitWall();

            speckleWall.family     = revitWall.WallType.FamilyName.ToString();
            speckleWall.type       = revitWall.WallType.Name;
            speckleWall.baseLine   = (ICurve)baseGeometry;
            speckleWall.level      = ConvertAndCacheLevel(revitWall, BuiltInParameter.WALL_BASE_CONSTRAINT);
            speckleWall.topLevel   = ConvertAndCacheLevel(revitWall, BuiltInParameter.WALL_HEIGHT_TYPE);
            speckleWall.height     = GetParamValue <double>(revitWall, BuiltInParameter.WALL_USER_HEIGHT_PARAM);
            speckleWall.baseOffset = GetParamValue <double>(revitWall, BuiltInParameter.WALL_BASE_OFFSET);
            speckleWall.topOffset  = GetParamValue <double>(revitWall, BuiltInParameter.WALL_TOP_OFFSET);
            speckleWall.structural = GetParamValue <bool>(revitWall, BuiltInParameter.WALL_STRUCTURAL_SIGNIFICANT);
            speckleWall.flipped    = revitWall.Flipped;


            if (revitWall.CurtainGrid == null)
            {
                if (revitWall.IsStackedWall)
                {
                    var wallMembers = revitWall.GetStackedWallMemberIds().Select(id => (Wall)Doc.GetElement(id));
                    speckleWall.elements = new List <Base>();
                    foreach (var wall in wallMembers)
                    {
                        speckleWall.elements.Add(WallToSpeckle(wall));
                    }
                }

                speckleWall.displayMesh = GetElementDisplayMesh(revitWall,
                                                                new Options()
                {
                    DetailLevel = ViewDetailLevel.Fine, ComputeReferences = false
                });
            }
            else
            {
                // curtain walls have two meshes, one for panels and one for mullions
                // adding mullions as sub-elements so they can be correctly displayed in viewers etc
                (var panelsMesh, var mullionsMesh) = GetCurtainWallDisplayMesh(revitWall);
                speckleWall["renderMaterial"]      = new Other.RenderMaterial()
                {
                    opacity = 0.2, diffuse = System.Drawing.Color.AliceBlue.ToArgb()
                };
                speckleWall.displayMesh = panelsMesh;

                var mullions = new Base
                {
                    ["@displayMesh"]   = mullionsMesh,
                    ["renderMaterial"] = new Other.RenderMaterial()
                    {
                        diffuse = System.Drawing.Color.DarkGray.ToArgb()
                    }
                };
                speckleWall.elements = new List <Base> {
                    mullions
                };
            }

            GetAllRevitParamsAndIds(speckleWall, revitWall, new List <string>
            {
                "WALL_USER_HEIGHT_PARAM",
                "WALL_BASE_OFFSET",
                "WALL_TOP_OFFSET",
                "WALL_BASE_CONSTRAINT",
                "WALL_HEIGHT_TYPE",
                "WALL_STRUCTURAL_SIGNIFICANT"
            });

            GetHostedElements(speckleWall, revitWall);
            //Report.Log($"Converted Wall {revitWall.Id}");
            return(speckleWall);
        }