Use Dynamo to create and manipulate Autocad / Civil 3D layers

Would anybody know how to create a layer in Autocad / Civil 3D, and set name and color, using Python in Dynamo?


In Dynamo for Civil 3D 2020 you can feed any string value into the “Layer” input of most nodes and it will make a new layer with that name. I have not seen anyone set layer colors though. Object color is doable via OOTB nodes though.

I know that. But setting layer color is essential in my case. I did not find any OOTB nodes to do that, so i am eager to try some AutoCAD dotNET API stuff through Dynamo and Python. But cant find a good reference for this :slight_smile:

Hi try this Link to get an idea of what is the code to create a Layer.
Attached an implementation with Python in Dynamo for Civil 3D.CreateLayerByNameColor.dyn (8.7 KB)


Thanks for helping out, @Paolo_Emilio_Serra1. Will check this out.


Hi @Paolo_Emilio_Serra1 thanks for posting the CreateLayerByNameColor script - this is super helpful! I am trying to do the same thing but instead set the color by ACI. I was reading that “ColorMethod.ByAci” can be used for this task but am getting an error in my python code when I write it this way. Do you have any suggestions?

Copyright 2019 Autodesk, Inc. All rights reserved.

This file is part of the Civil 3D Python Module.

__author__ = 'Paolo Emilio Serra -'
__modifiedby__ = 'Deivid Steffens -'
__copyright__ = '2020'
__version__ = '1.0.0'

import clr

# Add Assemblies for AutoCAD and Civil 3D APIs

# Add standard Python references
import sys
sys.path.append('C:\Program Files (x86)\IronPython 2.7\Lib')
import os
import math

# Add references to manage arrays, collections and interact with the user
from System import *
from System.IO import *
from System.Collections.Specialized import *
from System.Windows.Forms import MessageBox

# Create an alias to the Autodesk.AutoCAD.ApplicationServices.Application class
import Autodesk.AutoCAD.ApplicationServices.Application as acapp

# Import references from AutoCAD
from Autodesk.AutoCAD.Runtime import *
from Autodesk.AutoCAD.ApplicationServices import *
from Autodesk.AutoCAD.EditorInput import *
from Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.Geometry import *
from Autodesk.AutoCAD.Colors import Color
from Autodesk.AutoCAD.Colors import ColorMethod
# Import references for PropertySets
from Autodesk.Aec.PropertyData import *
from Autodesk.Aec.PropertyData.DatabaseServices import *

# Import references for Civil 3D
from Autodesk.Civil.ApplicationServices import *
from Autodesk.Civil.DatabaseServices import *

adoc = acapp.DocumentManager.MdiActiveDocument
ed = adoc.Editor

# Example function
def create_layer(name, index):

	indx = int(index)
	# Fail gracefully
	if not isinstance(name, str) or len(name) == 0:
		raise Exception('The name is not a valid string')
	if not isinstance(indx, int) or indx < 0 or indx > 255:
		raise Exception('The index component is not a valid integer')
	# replace invalid characters in the name
	name = name.replace(':', '_').replace(';', '_').replace(',', '_')
	global adoc
	result = False

	with adoc.LockDocument():
		with adoc.Database as db:
			with db.TransactionManager.StartTransaction() as t:
				# Get the Layer Table Object
				lt = t.GetObject(db.LayerTableId, OpenMode.ForRead)
				# Check if the layer already exists
				if not lt.Has(name):
					with LayerTableRecord() as ltr:
						ltr = LayerTableRecord()
						ltr.Name = name
						ltr.Color = Color.FromColorIndex(ColorMethod.ByAci,indx)
						t.AddNewlyCreatedDBObject(ltr, True)
					ltr = t.GetObject(lt[name], OpenMode.ForWrite)
				# Set the color
				if ltr is not None:
					ltr.Color = Color.FromColorIndex(ColorMethod.ByAci,indx)
				result = True
	return result

if IN[0] == None or IN[1] == None:
	OUT = create_layer.__doc__
	OUT = create_layer(IN[0], IN[1])