Skip to content

Hosts Civil3D

Truong Giang Vu edited this page May 31, 2026 · 1 revision

Civil 3D Features

Civil 3D is an AutoCAD vertical product with additional APIs for civil engineering design. RevitDevTool loads via the shared AcadDevTool add-in — all AutoCAD features are available plus access to Civil 3D-specific APIs.

Civil 3D API Access

Civil 3D extends AutoCAD with domain-specific objects:

Object Namespace Library
Alignments Autodesk.Civil.DatabaseServices AeccDbMgd.dll
Surfaces Autodesk.Civil.DatabaseServices AeccDbMgd.dll
Corridors Autodesk.Civil.DatabaseServices AeccDbMgd.dll
Pipe Networks Autodesk.Civil.DatabaseServices AeccDbMgd.dll
Point Groups Autodesk.Civil.DatabaseServices AeccDbMgd.dll
Sites Autodesk.Civil.DatabaseServices AeccDbMgd.dll
Parcels Autodesk.Civil.DatabaseServices AeccDbMgd.dll
Profiles Autodesk.Civil.DatabaseServices AeccDbMgd.dll
Assemblies Autodesk.Civil.DatabaseServices AeccDbMgd.dll
Grading Autodesk.Civil.DatabaseServices AeccDbMgd.dll

Loading Civil 3D API

import clr
clr.AddReference("AeccDbMgd")
from Autodesk.Civil.DatabaseServices import CivilDocument

The AeccDbMgd.dll is pre-loaded in Civil 3D's runtime — clr.AddReference registers it with Python.NET.

Python Scripting Example

# /// script
# dependencies = ["tabulate>=0.9"]
# ///

import clr
clr.AddReference("AeccDbMgd")

from Autodesk.AutoCAD.ApplicationServices.Core import Application
from Autodesk.AutoCAD.DatabaseServices import OpenMode
from Autodesk.Civil.DatabaseServices import CivilDocument, Alignment
from tabulate import tabulate

doc = Application.DocumentManager.MdiActiveDocument
db = doc.Database
civil_doc = CivilDocument.GetCivilDocument(db)

tr = db.TransactionManager.StartTransaction()
try:
    align_ids = civil_doc.GetAlignmentIds()
    rows = []
    for oid in align_ids:
        alignment = tr.GetObject(oid, OpenMode.ForRead)
        rows.append([alignment.Name, f"{alignment.Length:.2f}"])
    tr.Commit()
finally:
    tr.Dispose()

print(tabulate(rows, headers=["Alignment", "Length"]))

Testing with PyTest

Configure pyproject.toml for Civil 3D:

[tool.pytest.ini_options]
host_name = "civil3d"
host_version = "2026"

Run tests:

pytest tests/Civil3d/ -v

Test Fixtures

# conftest.py
import pytest

@pytest.fixture(scope="session")
def acad_app():
    from Autodesk.AutoCAD.ApplicationServices.Core import Application
    return Application

@pytest.fixture(scope="session")
def acad_doc(acad_app):
    doc = acad_app.DocumentManager.MdiActiveDocument
    if doc is None:
        pytest.skip("No active document in Civil 3D")
    return doc

@pytest.fixture(scope="session")
def acad_db(acad_doc):
    return acad_doc.Database

@pytest.fixture
def acad_auto_rollback(acad_db):
    """Start a transaction and always abort — undo all changes after test."""
    tr = acad_db.TransactionManager.StartTransaction()
    try:
        yield tr
    finally:
        tr.Abort()
        tr.Dispose()

Civil 3D Test Example

def test_list_alignments(acad_db, acad_transaction):
    import clr
    clr.AddReference("AeccDbMgd")
    from Autodesk.Civil.DatabaseServices import CivilDocument
    from Autodesk.AutoCAD.DatabaseServices import OpenMode

    civil_doc = CivilDocument.GetCivilDocument(acad_db)
    align_ids = civil_doc.GetAlignmentIds()
    print(f"Found {align_ids.Count} alignments")

    for oid in align_ids:
        alignment = acad_transaction.GetObject(oid, OpenMode.ForRead)
        print(f"  {alignment.Name}: length={alignment.Length:.2f}")

Available Features

All standard RevitDevTool features work in Civil 3D:

  • Python 3.13 with PEP 723 + Pixi dependencies
  • VSCode debugger integration
  • C# / F# scripting
  • .NET assembly execution
  • Logging panel with color keywords
  • MCP integration (standalone + in-host)
  • PyTest bridge

Visualization (DirectContext3D) is not available — this is a Revit-only feature.

See Also

Clone this wiki locally