import clr
clr.AddReference(“AcMgd”)
clr.AddReference(“AcDbMgd”)
clr.AddReference(“AeccDbMgd”)
clr.AddReference(“AutoCADNodes”)
clr.AddReference(“Civil3DNodes”)
from Autodesk.AutoCAD.ApplicationServices import Application
from Autodesk.AutoCAD.DatabaseServices import OpenMode
from Autodesk.AutoCAD.DynamoNodes import Document
from Autodesk.Civil.DynamoNodes import CogoPoint as DynamoCogoPoint
from Autodesk.Civil.DynamoNodes import CogoPointGroup
from Autodesk.Civil.DatabaseServices import StandardPointGroupQuery
from System.Collections.Generic import List
---------------------------------------------------------
Inputs
IN[0] = Point Group name
IN[1] = CogoPoint or nested lists of CogoPoints
IN[2] = Raw Description
---------------------------------------------------------
groupName = str(IN[0]).strip()
inputPoints = IN[1]
rawDescription = str(IN[2]).strip()
---------------------------------------------------------
Validation
---------------------------------------------------------
if not groupName:
raise Exception(“IN[0]: Group name cannot be empty.”)
if inputPoints is None:
raise Exception(“IN[1]: COGO points input is null.”)
if not rawDescription:
raise Exception(“IN[2]: Raw Description cannot be empty.”)
---------------------------------------------------------
Flatten nested lists
---------------------------------------------------------
def flatten(data):
if isinstance(data, (list, tuple)):
for item in data:
for nestedItem in flatten(item):
yield nestedItem
else:
yield data
---------------------------------------------------------
Convert to typed .NET list
---------------------------------------------------------
cogoPoints = ListDynamoCogoPoint
for point in flatten(inputPoints):
if point is None:
continue
if not isinstance(point, DynamoCogoPoint):
objectType = (
point.GetType().FullName
if hasattr(point, "GetType")
else type(point).__name__
)
raise Exception(
"IN[1] contains an invalid object: {0}".format(objectType)
)
cogoPoints.Add(point)
if cogoPoints.Count == 0:
raise Exception(“IN[1]: No valid COGO points were supplied.”)
---------------------------------------------------------
First create/update the Dynamo CogoPointGroup wrapper
---------------------------------------------------------
pointGroup = CogoPointGroup.ByCogoPoints(
cogoPoints,
groupName,
Document.Current,
rawDescription
)
if pointGroup is None:
raise Exception(“Civil 3D failed to create the COGO Point Group.”)
---------------------------------------------------------
Assign Raw Description and replace number-based query
---------------------------------------------------------
acadDocument = Application.DocumentManager.MdiActiveDocument
database = acadDocument.Database
with acadDocument.LockDocument():
with database.TransactionManager.StartTransaction() as transaction:
# Assign Raw Description to selected COGO points
for dynamoPoint in cogoPoints:
nativePoint = transaction.GetObject(
dynamoPoint.InternalObjectId,
OpenMode.ForWrite
)
nativePoint.RawDescription = rawDescription
# Open native Civil 3D Point Group
nativePointGroup = transaction.GetObject(
pointGroup.InternalObjectId,
OpenMode.ForWrite
)
# Create a Raw Description query
query = StandardPointGroupQuery()
query.IncludeRawDescriptions = rawDescription
query.UseCaseSensitiveMatch = False
# Replace the previous number-based query
nativePointGroup.SetQuery(query)
nativePointGroup.Update()
transaction.Commit()
---------------------------------------------------------
Output
---------------------------------------------------------
OUT = pointGroup