← Inbox

C3D-DIFF2403B · Diff LOT 10 vs R3 (read-only) error

Compare the two open 2403 drawings: layers, entity type counts, block inserts, Civil objects (cogo/alignments/surfaces/parcels). Report deltas.

Script file
C3D-DIFF2403B.cs
Target
active document · model space
Author
claude
Approved
yes · claude (read-only inspection)
Timeout
60s

C# payload

// READ-ONLY: compare the two open drawings (LOT 10 vs R3) across layers, entities by type,
// COGO points, blocks, and Civil objects. No writes.
using System;
using System.Linq;
using System.Collections.Generic;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.Civil.ApplicationServices;
using Autodesk.Civil.DatabaseServices;

var dm = Application.DocumentManager;

// summary of one drawing's contents
Dictionary<string,object> Summarize(Document doc)
{
    var db = doc.Database;
    var layers = new SortedSet<string>(StringComparer.OrdinalIgnoreCase);
    var byType = new SortedDictionary<string,int>(StringComparer.OrdinalIgnoreCase);
    var blocks = new SortedDictionary<string,int>(StringComparer.OrdinalIgnoreCase);
    int cogo = 0, align = 0, surf = 0, parcels = 0, pipes = 0, msEntities = 0;

    using (doc.LockDocument())
    using (var tr = db.TransactionManager.StartTransaction())
    {
        var lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
        foreach (ObjectId id in lt)
            layers.Add(((LayerTableRecord)tr.GetObject(id, OpenMode.ForRead)).Name);

        var ms = (BlockTableRecord)tr.GetObject(
            SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
        foreach (ObjectId id in ms)
        {
            msEntities++;
            var ent = tr.GetObject(id, OpenMode.ForRead);
            var tn = ent.GetType().Name;
            byType[tn] = byType.TryGetValue(tn, out var c) ? c + 1 : 1;
            if (ent is BlockReference br)
            {
                var btr = (BlockTableRecord)tr.GetObject(br.BlockTableRecord, OpenMode.ForRead);
                var bn = btr.Name;
                blocks[bn] = blocks.TryGetValue(bn, out var bc) ? bc + 1 : 1;
            }
        }

        try {
            var cdoc = CivilDocument.GetCivilDocument(db);
            cogo    = cdoc.CogoPoints.Count;
            align   = cdoc.GetAlignmentIds().Count;
            surf    = cdoc.GetSurfaceIds().Count;
            parcels = cdoc.GetSiteIds().Cast<ObjectId>()
                          .Sum(sid => ((Site)tr.GetObject(sid, OpenMode.ForRead)).GetParcelIds().Count);
        } catch (System.Exception ex) { Log($"  (civil read note: {ex.Message})"); }

        tr.Commit();
    }

    return new Dictionary<string,object> {
        {"file", doc.Name},
        {"layerCount", layers.Count},
        {"layers", layers},
        {"msEntities", msEntities},
        {"byType", byType},
        {"blocks", blocks},
        {"cogoPoints", cogo},
        {"alignments", align},
        {"surfaces", surf},
        {"parcels", parcels},
    };
}

var results = new List<Dictionary<string,object>>();
foreach (Document doc in dm)
{
    if (doc.Name.IndexOf("2403", StringComparison.OrdinalIgnoreCase) >= 0)
    {
        Log($"== {System.IO.Path.GetFileName(doc.Name)} ==");
        var s = Summarize(doc);
        results.Add(s);
        Log($"   layers={s["layerCount"]}  msEntities={s["msEntities"]}  cogo={s["cogoPoints"]}  align={s["alignments"]}  surfaces={s["surfaces"]}  parcels={s["parcels"]}");
    }
}

if (results.Count == 2)
{
    var a = results[0]; var b = results[1];
    string an = System.IO.Path.GetFileName((string)a["file"]);
    string bn = System.IO.Path.GetFileName((string)b["file"]);
    Log("");
    Log($"===== DIFF: {an}  vs  {bn} =====");

    // layers
    var la = (SortedSet<string>)a["layers"]; var lb = (SortedSet<string>)b["layers"];
    var onlyA = la.Except(lb, StringComparer.OrdinalIgnoreCase).ToList();
    var onlyB = lb.Except(la, StringComparer.OrdinalIgnoreCase).ToList();
    Log($"LAYERS: {an}={la.Count}, {bn}={lb.Count}");
    if (onlyA.Any()) Log($"  only in {an}: {string.Join(", ", onlyA)}");
    if (onlyB.Any()) Log($"  only in {bn}: {string.Join(", ", onlyB)}");
    if (!onlyA.Any() && !onlyB.Any()) Log("  layer sets identical");

    // entity type counts
    var ta = (SortedDictionary<string,int>)a["byType"]; var tb = (SortedDictionary<string,int>)b["byType"];
    var allTypes = ta.Keys.Union(tb.Keys, StringComparer.OrdinalIgnoreCase).OrderBy(x=>x);
    Log("ENTITY COUNTS BY TYPE (only where they differ):");
    foreach (var t in allTypes) {
        int ca = ta.TryGetValue(t, out var xa) ? xa : 0;
        int cb = tb.TryGetValue(t, out var xb) ? xb : 0;
        if (ca != cb) Log($"  {t}: {an}={ca}  {bn}={cb}  (Δ {cb-ca})");
    }

    // blocks
    var ba = (SortedDictionary<string,int>)a["blocks"]; var bb = (SortedDictionary<string,int>)b["blocks"];
    var allBlocks = ba.Keys.Union(bb.Keys, StringComparer.OrdinalIgnoreCase).OrderBy(x=>x);
    Log("BLOCK INSERT COUNTS (only where they differ):");
    bool anyBlk = false;
    foreach (var bl in allBlocks) {
        int ca = ba.TryGetValue(bl, out var xa) ? xa : 0;
        int cb = bb.TryGetValue(bl, out var xb) ? xb : 0;
        if (ca != cb) { Log($"  {bl}: {an}={ca}  {bn}={cb}"); anyBlk = true; }
    }
    if (!anyBlk) Log("  block insert counts identical");

    // civil tallies
    Log("CIVIL OBJECTS:");
    Log($"  cogoPoints: {an}={a["cogoPoints"]}  {bn}={b["cogoPoints"]}");
    Log($"  alignments: {an}={a["alignments"]}  {bn}={b["alignments"]}");
    Log($"  surfaces:   {an}={a["surfaces"]}  {bn}={b["surfaces"]}");
    Log($"  parcels:    {an}={a["parcels"]}  {bn}={b["parcels"]}");
}
else
{
    Log($"Expected 2 matching open drawings, found {results.Count}. Open both LOT 10 and R3.");
}

Result

Status
error
Drawing file
C:\Users\sanja\OneDrive\_SurveyDisco\251009 - 281 Maranatha Trail, Lawrenceville, GA 30045, USA\281 MARANATHA 2403\281 MARANTHA LOT 10.dwg
Message
Compile error: (48,23): error CS0266: Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?)
Entities
Duration
320 ms
Civil 3D
25.0.0.0

Notes

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

No notes yet.