From a52ddf00e986959f162f374fe85d5768523ee237 Mon Sep 17 00:00:00 2001 From: kike-garbo Date: Tue, 27 Aug 2024 16:14:18 +0200 Subject: [PATCH] Update `ModelContent` conversion. To be consistent with Bake. --- .../Types/GeometricElement.cs | 41 +++++++++++-------- .../Types/Materials/Material.cs | 20 +++++++++ .../Types/ObjectStyles/Category.cs | 26 ++++++++---- 3 files changed, 63 insertions(+), 24 deletions(-) diff --git a/src/RhinoInside.Revit.GH/Types/GeometricElement.cs b/src/RhinoInside.Revit.GH/Types/GeometricElement.cs index 17bb6aa4e..6d341f451 100644 --- a/src/RhinoInside.Revit.GH/Types/GeometricElement.cs +++ b/src/RhinoInside.Revit.GH/Types/GeometricElement.cs @@ -11,6 +11,7 @@ #if RHINO_8 using Grasshopper.Rhinoceros; using Grasshopper.Rhinoceros.Model; +using Grasshopper.Rhinoceros.Display; using Grasshopper.Rhinoceros.Render; #endif @@ -781,6 +782,7 @@ geometryElementContent[0] is ARDB.GeometryInstance geometryInstance && { GeometryDecoder.UpdateGraphicAttributes(g); + var shaded = false; var geo = default(IGH_GeometricGoo); switch (g) { @@ -795,6 +797,7 @@ geometryElementContent[0] is ARDB.GeometryInstance geometryInstance && var meshGeometry = mesh.ToMesh(); if (!identity) meshGeometry.Transform(transform); geo = new GH_Mesh(meshGeometry); + shaded = true; break; case ARDB.Solid solid: @@ -804,6 +807,7 @@ geometryElementContent[0] is ARDB.GeometryInstance geometryInstance && if (solidGeometry.TryGetExtrusion(out var extrusion)) geo = new GH_Extrusion(extrusion); else if (solidGeometry.Faces.Count == 1) geo = new GH_Surface(solidGeometry); else geo = new GH_Brep(solidGeometry); + shaded = true; break; case ARDB.Curve curve: @@ -833,24 +837,29 @@ geometryElementContent[0] is ARDB.GeometryInstance geometryInstance && var objectAttributes = ModelObject.Cast(geo).ToAttributes(); PeekModelAttributes(idMap, objectAttributes, element.Document); - var context = GeometryDecoder.Context.Peek; - if (context.FaceMaterialId?.Length > 0) + if (shaded) { - if (context.FaceMaterialId[0].IsValid()) + objectAttributes.Display = new ObjectDisplay.Attributes() { Color = ObjectDisplayColor.Value.ByMaterial }; + + var context = GeometryDecoder.Context.Peek; + if (context.FaceMaterialId?.Length > 0) { - var faceMaterial = new Material(element.Document, context.FaceMaterialId[0]); - var faceModelMaterial = faceMaterial.ToModelContent(idMap) as ModelRenderMaterial; - objectAttributes.Render = new ObjectRender.Attributes() { Material = faceModelMaterial }; - - // if (geo is Brep b) - // { - // foreach (var face in b.Faces) - // face.PerFaceColor = faceMaterial.ObjectColor; - // } - // else if (geo is Mesh m) - // { - // m.VertexColors.SetColors(Enumerable.Repeat(faceMaterial.ObjectColor, m.Vertices.Count).ToArray()); - // } + if (context.FaceMaterialId[0].IsValid()) + { + var faceMaterial = new Material(element.Document, context.FaceMaterialId[0]); + var faceModelMaterial = faceMaterial.ToModelContent(idMap) as ModelRenderMaterial; + objectAttributes.Render = new ObjectRender.Attributes() { Material = faceModelMaterial }; + + // if (geo is Brep b) + // { + // foreach (var face in b.Faces) + // face.PerFaceColor = faceMaterial.ObjectColor; + // } + // else if (geo is Mesh m) + // { + // m.VertexColors.SetColors(Enumerable.Repeat(faceMaterial.ObjectColor, m.Vertices.Count).ToArray()); + // } + } } } diff --git a/src/RhinoInside.Revit.GH/Types/Materials/Material.cs b/src/RhinoInside.Revit.GH/Types/Materials/Material.cs index 8c240bd11..11089184a 100644 --- a/src/RhinoInside.Revit.GH/Types/Materials/Material.cs +++ b/src/RhinoInside.Revit.GH/Types/Materials/Material.cs @@ -200,6 +200,26 @@ internal ModelContent ToModelContent(IDictionary i RenderMaterial = material.ToRenderMaterial(Grasshopper.Instances.ActiveRhinoDoc) }; +#if RHINO_8 + attributes.RenderMaterial.BeginChange(RenderContent.ChangeContexts.Program); + + if (!material.UseRenderAppearanceForShading) + { + var slot = attributes.RenderMaterial.TextureChildSlotName(RenderMaterial.StandardChildSlots.Diffuse); + if (!attributes.RenderMaterial.ChildSlotOn(slot)) + { + var diffuse = RenderContentType.NewContentFromTypeId(ContentUuids.SingleColorTextureType) as RenderTexture; + diffuse.Name = material.Name; + diffuse.Fields.Set("color-one", attributes.RenderMaterial.Fields.GetField(RenderMaterial.BasicMaterialParameterNames.Diffuse).GetValue()); + attributes.RenderMaterial.SetChild(diffuse, slot); + attributes.RenderMaterial.SetChildSlotAmount(slot, 100.0, RenderContent.ChangeContexts.Program); + attributes.RenderMaterial.SetChildSlotOn(slot, true, RenderContent.ChangeContexts.Program); + } + } + + attributes.RenderMaterial.Fields.Set(RenderMaterial.BasicMaterialParameterNames.Diffuse, material.Color.ToColor()); +#endif + idMap.Add(Id, modelContent = attributes.ToModelData() as ModelContent); return modelContent; } diff --git a/src/RhinoInside.Revit.GH/Types/ObjectStyles/Category.cs b/src/RhinoInside.Revit.GH/Types/ObjectStyles/Category.cs index bde8c2f59..032c0e7ec 100644 --- a/src/RhinoInside.Revit.GH/Types/ObjectStyles/Category.cs +++ b/src/RhinoInside.Revit.GH/Types/ObjectStyles/Category.cs @@ -465,8 +465,8 @@ out Guid guid #region ModelContent protected override string ElementPath => Parent is Category parent ? - $"{CategoryType}::{parent.ElementPath}::{base.ElementPath}" : - $"{CategoryType}::{base.ElementPath}"; + $"{CategoryType}::{parent.Nomen}::{Nomen}" : + $"{CategoryType}::{Nomen}"; #if RHINO_8 internal ModelContent ToModelContent(IDictionary idMap) @@ -480,7 +480,7 @@ internal ModelContent ToModelContent(IDictionary i // Path { - attributes.Path = ModelPath; + attributes.Path = $"Revit::{ElementPath}"; }; // Tags @@ -493,15 +493,15 @@ internal ModelContent ToModelContent(IDictionary i } } - // Color + // Linetype { - var lineColor = category.LineColor.ToColor(); - attributes.DisplayColor = lineColor.IsEmpty ? System.Drawing.Color.Black : lineColor; + attributes.Linetype = ProjectionLinePattern?.ToModelContent(idMap) as ModelLinetype ?? ModelLinetype.Unset; } - // Linetype + // LineColor { - attributes.Linetype = ProjectionLinePattern?.ToModelContent(idMap) as ModelLinetype ?? ModelLinetype.Unset; + var lineColor = category.LineColor.ToColor(); + attributes.DraftingColor = lineColor.IsEmpty ? System.Drawing.Color.Black : lineColor; } // LineWeight @@ -511,6 +511,16 @@ internal ModelContent ToModelContent(IDictionary i ToLineWeight(ProjectionLineWeight); } + // Color + { + var displayColor = category.CategoryType != ARDB.CategoryType.Model || + category.Root().ToBuiltInCategory() == ARDB.BuiltInCategory.OST_Lines ? + (System.Drawing.Color) attributes.DraftingColor : + new Material(category.Material).ObjectColor; + + attributes.DisplayColor = displayColor.IsEmpty ? System.Drawing.Color.FromArgb(0x7F, 0x7F, 0x7F) : displayColor; + } + // Material { attributes.Material = Material?.ToModelContent(idMap) as ModelRenderMaterial;