Rename Layer
Demonstrates how to rename a layer.
partial class Examples
{
public static Result RenameLayer(RhinoDoc doc)
{
string layer_name = "";
var rc = RhinoGet.GetString("Name of layer to rename", true, ref layer_name);
if (rc != Result.Success)
return rc;
if (String.IsNullOrWhiteSpace(layer_name))
return Result.Nothing;
// because of sublayers it's possible that more than one layer has the same name
// so simply calling doc.Layers.Find(layerName) isn't good enough. If "layerName" returns
// more than one layer then present them to the user and let him decide.
var matching_layers = (from layer in doc.Layers
where layer.Name == layer_name
select layer).ToList<Layer>();
Layer layer_to_rename = null;
if (matching_layers.Count == 0)
{
RhinoApp.WriteLine("Layer \"{0}\" does not exist.", layer_name);
return Result.Nothing;
}
else if (matching_layers.Count == 1)
{
layer_to_rename = matching_layers[0];
}
else if (matching_layers.Count > 1)
{
for (int i = 0; i < matching_layers.Count; i++)
{
RhinoApp.WriteLine("({0}) {1}", i+1, matching_layers[i].FullPath.Replace("::", "->"));
}
int selected_layer = -1;
rc = RhinoGet.GetInteger("which layer?", true, ref selected_layer);
if (rc != Result.Success)
return rc;
if (selected_layer > 0 && selected_layer <= matching_layers.Count)
layer_to_rename = matching_layers[selected_layer - 1];
else return Result.Nothing;
}
if (layer_to_rename == null)
return Result.Nothing;
layer_name = "";
rc = RhinoGet.GetString("New layer name", true, ref layer_name);
if (rc != Result.Success)
return rc;
if (String.IsNullOrWhiteSpace(layer_name))
return Result.Nothing;
layer_to_rename.Name = layer_name;
if (!layer_to_rename.CommitChanges())
return Result.Failure;
return Result.Success;
}
}
Partial Friend Class Examples
Public Shared Function RenameLayer(ByVal doc As RhinoDoc) As Result
Dim layer_name As String = ""
Dim rc = RhinoGet.GetString("Name of layer to rename", True, layer_name)
If rc IsNot Result.Success Then
Return rc
End If
If String.IsNullOrWhiteSpace(layer_name) Then
Return Result.Nothing
End If
' because of sublayers it's possible that more than one layer has the same name
' so simply calling doc.Layers.Find(layerName) isn't good enough. If "layerName" returns
' more than one layer then present them to the user and let him decide.
Dim matching_layers = (
From layer In doc.Layers
Where layer.Name = layer_name
Select layer).ToList()
Dim layer_to_rename As Layer = Nothing
If matching_layers.Count = 0 Then
RhinoApp.WriteLine("Layer ""{0}"" does not exist.", layer_name)
Return Result.Nothing
ElseIf matching_layers.Count = 1 Then
layer_to_rename = matching_layers(0)
ElseIf matching_layers.Count > 1 Then
For i As Integer = 0 To matching_layers.Count - 1
RhinoApp.WriteLine("({0}) {1}", i+1, matching_layers(i).FullPath.Replace("::", "->"))
Next i
Dim selected_layer As Integer = -1
rc = RhinoGet.GetInteger("which layer?", True, selected_layer)
If rc IsNot Result.Success Then
Return rc
End If
If selected_layer > 0 AndAlso selected_layer <= matching_layers.Count Then
layer_to_rename = matching_layers(selected_layer - 1)
Else
Return Result.Nothing
End If
End If
If layer_to_rename Is Nothing Then
Return Result.Nothing
End If
layer_name = ""
rc = RhinoGet.GetString("New layer name", True, layer_name)
If rc IsNot Result.Success Then
Return rc
End If
If String.IsNullOrWhiteSpace(layer_name) Then
Return Result.Nothing
End If
layer_to_rename.Name = layer_name
If Not layer_to_rename.CommitChanges() Then
Return Result.Failure
End If
Return Result.Success
End Function
End Class
import rhinoscriptsyntax as rs
from scriptcontext import doc
def rename():
layerName = rs.GetString("Name of layer to rename")
matchingLayers = [layer for layer in doc.Layers if layer.Name == layerName]
layerToRename = None
if len(matchingLayers) == 0:
print "Layer \"{0}\" does not exist.".format(layerName)
return
if len(matchingLayers) == 1:
layerToRename = matchingLayers[0]
elif len(matchingLayers) > 1:
i = 0;
for layer in matchingLayers:
print "({0}) {1}".format(
i+1, matchingLayers[i].FullPath.replace("::", "->"))
i += 1
selectedLayer = rs.GetInteger(
"which layer?", -1, 1, len(matchingLayers))
if selectedLayer == None:
return
layerToRename = matchingLayers[selectedLayer - 1]
layerName = rs.GetString("New layer name")
layerToRename.Name = layerName
layerToRename.CommitChanges()
return
if __name__ == "__main__":
rename()