← Inbox

C3D-0107 · READ-ONLY: pre-delivery sanity check [SANITY-CHECK] done

Lists every layer still holding entities split by model, paper and block definition, and flags zero-length geometry, text under 0.5 height, and anything sitting more than 5000 feet outside the sewer extent. No changes.

Script file
C3D-0107.cs
Target
active document · model space
Author
claude
Approved
yes · reviewer
Timeout
300s

C# payload

// READ-ONLY. Pre-delivery sanity check. Nothing is modified.
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForRead);
Log("drawing: " + Db.Filename);

var model = new Dictionary<string,int>();
var paper = new Dictionary<string,int>();
var blockd = new Dictionary<string,int>();
var types = new Dictionary<string,int>();
int zeroLen = 0, tinyText = 0, offSite = 0;
double minX = 1e18, maxX = -1e18, minY = 1e18, maxY = -1e18;

// site extent from the sewer lines, to spot strays
foreach (ObjectId id in (BlockTableRecord)Tx.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(Db), OpenMode.ForRead)) {
    var ln = Tx.GetObject(id, OpenMode.ForRead) as Line;
    if (ln == null) continue;
    try { if (ln.Layer != "SEWER_LINE") continue; } catch { continue; }
    foreach (var p in new Point3d[] { ln.StartPoint, ln.EndPoint }) {
        if (p.X < minX) minX = p.X; if (p.X > maxX) maxX = p.X;
        if (p.Y < minY) minY = p.Y; if (p.Y > maxY) maxY = p.Y;
    }
}
Log(String.Format("sewer extent: X {0:F0}..{1:F0}  Y {2:F0}..{3:F0}", minX, maxX, minY, maxY));

foreach (ObjectId btrId in bt) {
    var btr = (BlockTableRecord)Tx.GetObject(btrId, OpenMode.ForRead);
    bool isModel = btr.Name.ToUpper() == "*MODEL_SPACE";
    foreach (ObjectId id in btr) {
        Autodesk.AutoCAD.DatabaseServices.DBObject o;
        try { o = Tx.GetObject(id, OpenMode.ForRead); } catch { continue; }
        var ent = o as Autodesk.AutoCAD.DatabaseServices.Entity;
        if (ent == null) continue;
        string lay; try { lay = ent.Layer; } catch { continue; }

        var tgt = isModel ? model : (btr.IsLayout ? paper : blockd);
        if (!tgt.ContainsKey(lay)) tgt[lay] = 0;
        tgt[lay]++;

        string tn = o.GetType().Name;
        if (!types.ContainsKey(tn)) types[tn] = 0;
        types[tn]++;

        if (!isModel) continue;

        var pl = o as Polyline;
        if (pl != null && pl.Length < 0.01) zeroLen++;
        var ln2 = o as Line;
        if (ln2 != null && ln2.Length < 0.01) zeroLen++;
        var mt = o as MText;
        if (mt != null && mt.TextHeight < 0.5) tinyText++;

        // anything wildly outside the site
        try {
            var e = ent.GeometricExtents;
            if (e.MinPoint.X < minX - 5000 || e.MaxPoint.X > maxX + 5000 ||
                e.MinPoint.Y < minY - 5000 || e.MaxPoint.Y > maxY + 5000) {
                offSite++;
                if (offSite <= 10)
                    Log(String.Format("  OFF-SITE [{0}] {1} on {2} at {3:F0},{4:F0}",
                        o.Handle, tn, lay, e.MinPoint.X, e.MinPoint.Y));
            }
        } catch { }
    }
}

Log("");
Log("=== layers holding anything ===");
var all = new List<string>();
foreach (ObjectId lid in lt) {
    var l = (LayerTableRecord)Tx.GetObject(lid, OpenMode.ForRead);
    all.Add(l.Name);
}
all.Sort();
int empty = 0;
foreach (var nm in all) {
    int m = model.ContainsKey(nm) ? model[nm] : 0;
    int p = paper.ContainsKey(nm) ? paper[nm] : 0;
    int b = blockd.ContainsKey(nm) ? blockd[nm] : 0;
    if (m + p + b == 0) { empty++; continue; }
    var l = (LayerTableRecord)Tx.GetObject(lt[nm], OpenMode.ForRead);
    Log(String.Format("  {0,-38} model={1,-5} paper={2,-4} blockdef={3,-4} {4}{5}",
        nm, m, p, b, l.IsOff ? "OFF " : "", l.IsFrozen ? "FROZEN " : ""));
}
Log("  (empty layers: " + empty + ")");

Log("");
Log("=== flags ===");
Log("  zero-length lines/polylines in model: " + zeroLen);
Log("  MText under 0.5 height in model:      " + tinyText);
Log("  entities >5000ft outside the site:    " + offSite);
Log("  total layers: " + all.Count);

Result

Status
success
Drawing file
C:\Users\sanja\OneDrive\_SurveyDisco\260613 - 5030 E Lake Pkwy, Stockbridge, GA 30281, USA\ACAD-260612 - CSTORE WATER ABS 30.dwg
Message
Executed C3D-0107 (0 entities touched).
Entities
Duration
412 ms
Civil 3D
25.0.0.0

Log

drawing: C:\Users\sanja\OneDrive\_SurveyDisco\260613 - 5030 E Lake Pkwy, Stockbridge, GA 30281, USA\ACAD-260612 - CSTORE WATER ABS 30.dwg
sewer extent: X 2296380..2297425  Y 1279598..1280096

=== layers holding anything ===
  0                                      model=64    paper=3    blockdef=195  
  BLOCK_CERT                             model=0     paper=3    blockdef=0    
  BLOCK_CLOSURE                          model=0     paper=35   blockdef=0    
  BLOCK_LEGEND                           model=0     paper=1    blockdef=23   
  BLOCK_NORTH_ARROW                      model=0     paper=101  blockdef=0    
  BLOCK_SCALE                            model=0     paper=0    blockdef=37   
  BLOCK_TB2                              model=0     paper=0    blockdef=46   
  C-ANNO                                 model=5     paper=0    blockdef=0    
  C-ANNO-TABL                            model=35    paper=0    blockdef=0    
  C-ANNO-TABL-TEXT                       model=87    paper=0    blockdef=0    
  C-ANNO-TABL-TITL                       model=8     paper=0    blockdef=0    
  C-ANNO-TABL-TTBL                       model=8     paper=0    blockdef=0    
  C-PROP-BRNG                            model=16    paper=0    blockdef=0    
  C-PROP-TEXT                            model=1     paper=0    blockdef=0    
  FIRE_HYDRANT                           model=4     paper=0    blockdef=0    
  FIRE_HYDRANT_VALVE                     model=3     paper=0    blockdef=0    
  HORIZONTAL_AND_VERTICAL_CONTROL_POINT  model=1     paper=0    blockdef=0    
  HORIZONTAL_AND_VERTICAL_CONTROL_TEXT   model=4     paper=0    blockdef=0    
  PROPERTY_LINE                          model=1     paper=0    blockdef=0    
  ROAD_CL                                model=4     paper=0    blockdef=0    
  ROAD_CURB                              model=75    paper=0    blockdef=0    
  ROAD_EDGE_OF_PAVEMENT                  model=22    paper=0    blockdef=0    
  ROAD_RIGHT-OF-WAY                      model=4     paper=1    blockdef=0    
  SEWER_EASEMENT                         model=3     paper=0    blockdef=0    
  SEWER_EASEMENT_TEXT                    model=38    paper=0    blockdef=0    
  SEWER_LINE                             model=14    paper=0    blockdef=0    
  SEWER_LINE_TEXT                        model=28    paper=0    blockdef=0    
  SEWER_MANHOLE                          model=13    paper=0    blockdef=0    
  SEWER_MANHOLE_EXISTING                 model=1     paper=0    blockdef=0    
  SEWER_MANHOLE_TEXT                     model=26    paper=0    blockdef=0    
  V-NODE-BNDY                            model=0     paper=0    blockdef=8    
  V-NODE-BORE                            model=0     paper=0    blockdef=1    
  V-NODE-POLE                            model=0     paper=0    blockdef=2    
  V-NODE-STRM                            model=0     paper=0    blockdef=14   
  V-NODE-TEXT                            model=0     paper=0    blockdef=94   
  V-NODE-TREE                            model=0     paper=0    blockdef=2    
  V-NODE-WATR                            model=0     paper=0    blockdef=26   
  WATER_LINE                             model=2     paper=0    blockdef=0    
  WATER_LINE_TEXT                        model=6     paper=0    blockdef=0    
  WATER_VALVE                            model=4     paper=0    blockdef=0    
  WATER_VAULT                            model=4     paper=0    blockdef=0    
  (empty layers: 1)

=== flags ===
  zero-length lines/polylines in model: 0
  MText under 0.5 height in model:      0
  entities >5000ft outside the site:    0
  total layers: 42

Notes

What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.

No notes yet.