Force rebuild corridor

Hi,

any ideas how to trigger Rebuild() for Corridors?
The script updates AppliedSubassembly parameters in all sections, then all BaselineRegions and Baselines are manually flagged as NeedsProcessing. Despite all of that neither Corridor.Rebuild() nor the Rebuild node does the corridor update. Only sending the FORCEUPDATECORRIDOR command triggers the rebuilding.

Thanks.

import clr
import System

# Load necessary Civil 3D and AutoCAD .NET Assemblies
clr.AddReference('AcMgd')
clr.AddReference('AcCoreMgd')
clr.AddReference('AcDbMgd')
clr.AddReference('AecBaseMgd')
clr.AddReference('AecPropDataMgd')
clr.AddReference('AeccDbMgd')

# Import core AutoCAD and Civil 3D namespaces
from Autodesk.AutoCAD.ApplicationServices import Application
from Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.Civil.DatabaseServices import *

# Get the active document
adoc = Application.DocumentManager.MdiActiveDocument
db = adoc.Database

# --- Dynamo Input ---
corridor_input = IN[0]

# --- Output List Initialization ---
all_applied_subassemblies_structured = []

# --- Step 1: Unwrap the Corridor Input ---
corridor_object_id = None
if corridor_input:
    try:
        corridor_object_id = corridor_input.InternalObjectId
    except AttributeError:
        pass

if corridor_object_id:
    with adoc.LockDocument():
        with db.TransactionManager.StartTransaction() as t:
            try:
                corridor_db_obj = t.GetObject(corridor_object_id, OpenMode.ForWrite)
                if isinstance(corridor_db_obj, Corridor):
                    for baseline_item in corridor_db_obj.Baselines:
                        baseline_obj = None
                        if isinstance(baseline_item, ObjectId):
                            baseline_obj = t.GetObject(baseline_item, OpenMode.ForWrite)
                        elif isinstance(baseline_item, Baseline):
                            baseline_obj = baseline_item
                        else:
                            continue

                        if isinstance(baseline_obj, Baseline):
                            for region_item in baseline_obj.BaselineRegions:
                                region_obj = None
                                if isinstance(region_item, ObjectId):
                                    region_obj = t.GetObject(region_item, OpenMode.ForWrite)
                                elif isinstance(region_item, BaselineRegion):
                                    region_obj = region_item
                                region_obj.NeedsProcessing = True
                                    
                        baseline_obj.NeedsProcessing = True
                        
                #adoc.SendStringToExecute("forceupdateallcorridors ",True,False,True)
                        
            except Exception as e:
                errormessage = (["Transaction Failed", str(e)])
            t.Commit()
            
with adoc.LockDocument():
        with db.TransactionManager.StartTransaction() as t:
            try:
                corridor_db_obj = t.GetObject(corridor_object_id, OpenMode.ForWrite)
                state = corridor_db_obj.IsOutOfDate
                corridor_db_obj.Rebuild()
                result = "done"
                        
            except Exception as e:
                errormessage = (["Transaction Failed", str(e)])
            t.Commit()
            

OUT = state, result

Hello @kovacsv

did you solve this? I have similar issue when programing custom subassemblies. You solution with the FORCEUPDATECORRIDOR works fine. However, after few hours of trying I circled back to corridor rebuild as it should work.

Here is directly written “Forces the corridor to rebuild.”
Civil3D API 2027 Documentation

So, it should rebuild corridor correctly. However, I use C# not python.

Best regards

Ondřej