Changing color of shift-selected faces overwrites the Brep names as one

Hi,
Problem found in Rhino Version 8 SR23 (8.23.25251.13001, 2025-09-08):
When changing the color via Properties on a sub-selection of multiple BrepFaces, the Brep names are overwritten and replaced with the name of one of the affected Breps.

This is a temporary fix for me for now:


public class CmdSetBrepFaceColors : Command
{
    public override string EnglishName => "SetBrepFaceColors";

    protected override Result RunCommand(RhinoDoc doc, RunMode mode)
    {
        // 1) Select faces (subobject select)
        GetObject go = new GetObject();
        go.SetCommandPrompt("Select Brep faces to change color");
        go.GeometryFilter = ObjectType.Surface;
        go.SubObjectSelect = true;
        go.GetMultiple(1, 0);
        if (go.CommandResult() != Result.Success)
            return go.CommandResult();

        // 2) Choose color
        Color color = Color.Red;
        if (!Dialogs.ShowColorDialog(ref color))
            return Result.Cancel;

        // 3) Collect face indices per object
        var facesPerObject = new Dictionary<Guid, List<int>>();
        for (int i = 0; i < go.ObjectCount; i++)
        {
            ObjRef objRef = go.Object(i);
            BrepFace face = objRef.Face();
            RhinoObject rhObj = objRef.Object();
            if (face == null || rhObj == null) continue;

            Guid id = rhObj.Id;
            if (!facesPerObject.ContainsKey(id))
                facesPerObject[id] = new List<int>();

            facesPerObject[id].Add(face.FaceIndex);
        }

        // 4) Per object: duplicate geometry, set face colors, replace in doc
        foreach (var kvp in facesPerObject)
        {
            Guid objId = kvp.Key;
            List<int> faceIndices = kvp.Value.Distinct().ToList();

            RhinoObject rhObj = doc.Objects.FindId(objId);
            if (rhObj == null) continue;

            GeometryBase geom = rhObj.Geometry;
            Brep newBrep = null;

            if (geom is Brep brep)
                newBrep = brep.DuplicateBrep();
            else if (geom is Extrusion ext)
                newBrep = ext.ToBrep();

            if (newBrep == null) continue;

            // Set PerFaceColor
            foreach (int fi in faceIndices)
            {
                if (fi >= 0 && fi < newBrep.Faces.Count)
                    newBrep.Faces[fi].PerFaceColor = color;
            }

            // Replace object in doc, keep attributes (including name)
            bool ok = doc.Objects.Replace(objId, newBrep, rhObj.Attributes);
            if (!ok)
                RhinoApp.WriteLine($"Failed to replace object {objId}");
        }

        doc.Views.Redraw();
        return Result.Success;
    }
}

Same in Rhino 9 WIP

object-name-issue.3dm (158.9 KB)

System Info

Rhino 9 SR0 2025-9-23 (Rhino WIP, 9.0.25266.10145, Git hash:master @ 20b4067c1882a571b5304975d8b2385b4678fada)
License type: Commercial, build 2025-09-23
License details: Cloud Zoo
Expires on: 2025-11-07

Windows 11 (10.0.26100 SR0.0) or greater (Physical RAM: 128GB)
.NET 9.0.9

Computer platform: DESKTOP

Standard graphics configuration using DirectX
Primary display: NVIDIA RTX A5000 (NVidia) Memory: 24GB, Driver date: 8-21-2025 (M-D-Y). DirectX(11)
> Accelerated graphics device with 4 adapter port(s)
- Windows Main Display attached to adapter port #0
- Secondary monitor attached to adapter port #1

Secondary graphics devices.
NVIDIA Quadro K2200 (NVidia) Memory: 4GB, Driver date: 8-21-2025 (M-D-Y).
> Accelerated graphics device with 4 adapter port(s)
- There are no monitors attached to this device!

DirectX Settings
Safe mode: Off

OpenBLAS: OpenBLAS 0.3.29 DYNAMIC_ARCH NO_AFFINITY Zen MAX_THREADS=64.

Rhino plugins that do not ship with Rhino

Rhino plugins that ship with Rhino
C:\Program Files\Rhino 9 WIP\Plug-ins\Commands.rhp “Commands” 9.0.25266.10145
C:\Program Files\Rhino 9 WIP\Plug-ins\WebBrowser.rhp “WebBrowser”
C:\Program Files\Rhino 9 WIP\Plug-ins\rdk.rhp “Renderer Development Kit”
C:\Program Files\Rhino 9 WIP\Plug-ins\RhinoScript.rhp “RhinoScript”
C:\Program Files\Rhino 9 WIP\Plug-ins\RhinoBonusTools.rhp “Rhino Bonus Tools”
C:\Program Files\Rhino 9 WIP\Plug-ins\AnimationTools.rhp “AnimationTools”
C:\Program Files\Rhino 9 WIP\Plug-ins\IdleProcessor.rhp “IdleProcessor”
C:\Program Files\Rhino 9 WIP\Plug-ins\UpdatesAndStatistics\UpdatesAndStatistics.rhp “UpdatesAndStatistics” 9.0.25266.10145
C:\Program Files\Rhino 9 WIP\Plug-ins\RhinoRenderCycles.rhp “Rhino Render” 9.0.25266.10145
C:\Program Files\Rhino 9 WIP\Plug-ins\RhinoRender.rhp “Legacy Rhino Render”
C:\Program Files\Rhino 9 WIP\Plug-ins\rdk_etoui.rhp “RDK_EtoUI” 9.0.25266.10145
C:\Program Files\Rhino 9 WIP\Plug-ins\import_PLY.rhp “PLY - Polygon File Format Import”
C:\Program Files\Rhino 9 WIP\Plug-ins\NamedSnapshots.rhp “Snapshots”
C:\Program Files\Rhino 9 WIP\Plug-ins\ShrinkWrap.rhp “ShrinkWrap” 9.0.25266.10145
C:\Program Files\Rhino 9 WIP\Plug-ins\MeshCommands.rhp “MeshCommands” 9.0.25266.10145
C:\Program Files\Rhino 9 WIP\Plug-ins\IronPython\RhinoDLR_Python.rhp “IronPython” 9.0.25266.10145
C:\Program Files\Rhino 9 WIP\Plug-ins\RhinoCycles.rhp “RhinoCycles” 9.0.25266.10145
C:\Program Files\Rhino 9 WIP\Plug-ins\Grasshopper\GrasshopperPlugin.rhp “Grasshopper” 9.0.25266.10145
C:\Program Files\Rhino 9 WIP\Plug-ins\import_STL.rhp “STL Import”
C:\Program Files\Rhino 9 WIP\Plug-ins\Toolbars\Toolbars.rhp “Toolbars” 9.0.25266.10145
C:\Program Files\Rhino 9 WIP\Plug-ins\3dxrhino.rhp “3Dconnexion 3D Mouse”
C:\Program Files\Rhino 9 WIP\Plug-ins\Displacement.rhp “Displacement”
C:\Program Files\Rhino 9 WIP\Plug-ins\SectionTools.rhp “SectionTools”

Hi @PeterKompier - I’ve logged the issue.

Thanks for reporting.

– Dale

RH-89667 is fixed in Rhino 8 Service Release 25