C3D-SIDEDB · Read CONTRACT.dwg via side database (read-only) done
Open the unopened DWG as a side database and dump units/extents/layers/text without the user opening it
C# payload
// Read a DWG that is NOT open in Civil 3D by loading it as a side database (read-only).
// Dumps units, extents, layer count, all text, and block-attribute values so we can inspect
// CONTRACT.dwg without the user opening it.
string path = @"C:\Users\sanja\OneDrive\_SurveyDisco\_DRAFTS\CONTRACT.dwg";
if (!System.IO.File.Exists(path)) { Log("file not found: " + path); return; }
using (var sdb = new Database(false, true)) {
sdb.ReadDwgFile(path, System.IO.FileShare.Read, true, null);
Log($"opened side db: {path}");
Log($"INSUNITS={sdb.Insunits}");
using (var t = sdb.TransactionManager.StartTransaction()) {
var bt = (BlockTable)t.GetObject(sdb.BlockTableId, OpenMode.ForRead);
var lt = (LayerTable)t.GetObject(sdb.LayerTableId, OpenMode.ForRead);
int layers = 0; foreach (ObjectId id in lt) layers++;
Log($"layers: {layers}");
// extents from model space
double minx=double.MaxValue,miny=double.MaxValue,maxx=double.MinValue,maxy=double.MinValue;
int ents=0;
var ms = (BlockTableRecord)t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
foreach (ObjectId id in ms) {
var e = t.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
if (e == null) continue; ents++;
try { var ex = e.GeometricExtents;
if (ex.MinPoint.X>1000 && ex.MinPoint.X<minx) minx=ex.MinPoint.X;
if (ex.MinPoint.Y>1000 && ex.MinPoint.Y<miny) miny=ex.MinPoint.Y;
if (ex.MaxPoint.X>maxx) maxx=ex.MaxPoint.X; if (ex.MaxPoint.Y>maxy) maxy=ex.MaxPoint.Y;
} catch { }
}
Log($"model entities: {ents}, extents ({minx:F1},{miny:F1})-({maxx:F1},{maxy:F1})");
// all text + attributes across model, layouts, block defs
Log("--- text ---");
int shown = 0;
foreach (ObjectId btrId in bt) {
var btr = (BlockTableRecord)t.GetObject(btrId, OpenMode.ForRead);
string where = btr.Name;
if (btr.IsLayout) { var lay = (Layout)t.GetObject(btr.LayoutId, OpenMode.ForRead); where = "LAYOUT:" + lay.LayoutName; }
foreach (ObjectId id in btr) {
var o = t.GetObject(id, OpenMode.ForRead);
string s = null;
if (o is MText mt) s = (mt.Contents ?? "").Replace("\\P"," / ");
else if (o is DBText tx) s = tx.TextString;
else if (o is BlockReference br && br.AttributeCollection != null) {
foreach (ObjectId aid in br.AttributeCollection) {
var ar = (AttributeReference)t.GetObject(aid, OpenMode.ForRead);
var v = (ar.TextString ?? "").Trim();
if (v.Length > 1 && shown++ < 250) Log($" [{where}] ATTR {ar.Tag}=\"{v}\"");
}
continue;
}
if (string.IsNullOrWhiteSpace(s) || s.Trim().Length < 3) continue;
if (shown++ < 250) Log($" [{where}] \"{s.Trim()}\"");
}
}
Log($"text items: {shown}");
t.Commit();
}
}
Log("side-db read complete (nothing in the live drawing was touched).");
Result
Log
opened side db: C:\Users\sanja\OneDrive\_SurveyDisco\_DRAFTS\CONTRACT.dwg INSUNITS=Feet layers: 229 model entities: 1856, extents (2297515.7,1490746.7)-(2299949.0,1492660.3) --- text --- [LAYOUT:Model] "LOT-1" [LAYOUT:Model] "LOT-2" [LAYOUT:Model] "LOT-3" [LAYOUT:Model] "EX. R/W" [LAYOUT:Model] "28,861 S.F." [LAYOUT:Model] "30,758 S.F." [LAYOUT:Model] "28,954 S.F." [LAYOUT:Model] "30' B/L" [LAYOUT:Model] "25' B/L" [LAYOUT:Model] "15' B/L" [LAYOUT:Model] "15' B/L" [LAYOUT:Model] "15' B/L" [LAYOUT:Model] "FFE=1124.5" [LAYOUT:Model] "FBE=1112.5" [LAYOUT:Model] "FFE=1124.5" [LAYOUT:Model] "GE=1123.0" [LAYOUT:Model] "FFE=1129.0" [LAYOUT:Model] "FBE=1118.5" [LAYOUT:Model] "GE=1127.5" [LAYOUT:Model] "TW=1128.5 / BW=1128" [LAYOUT:Model] "TW=1128.5 / BW=1118.0" [LAYOUT:Model] "1126" [LAYOUT:Model] "1128" [LAYOUT:Model] "1142" [LAYOUT:Model] "1140" [LAYOUT:Model] "1140" [LAYOUT:Model] "1130" [LAYOUT:Model] "1128" [LAYOUT:Model] "1128" [LAYOUT:Model] "1122" [LAYOUT:Model] "1120" [LAYOUT:Model] "1120" [LAYOUT:Model] "1110" [LAYOUT:Model] "1100" [LAYOUT:Model] "1092" [LAYOUT:Model] "1120" [LAYOUT:Model] "1116" [LAYOUT:Model] "1106" [LAYOUT:Model] "1100" [LAYOUT:Model] "1090" [LAYOUT:Model] "1128" [LAYOUT:Model] "1132" [LAYOUT:Model] "1132" [LAYOUT:Model] "1128" [LAYOUT:Model] "1130" [LAYOUT:Model] "1120" [LAYOUT:Model] "1110" [LAYOUT:Model] "1138" [LAYOUT:Model] "1134" [LAYOUT:Model] "1130" [LAYOUT:Model] "1116" [LAYOUT:Model] "1118" [LAYOUT:Model] "SOIL DELINEATION LINE" [LAYOUT:Model] "SOIL DELINEATION LINE" [LAYOUT:Model] "EX. CONCRETE SIDEWALK" [LAYOUT:Model] "EX. 24" Curb & Gutter (high-back)" [LAYOUT:Model] "EX. 24" Curb & Gutter (mountable)" [LAYOUT:Model] "GRASSED ISLAND" [LAYOUT:Model] "MATHIS AIRPORT PARKWAY - R/W VARIES" [LAYOUT:Model] "LAKE LAUREL DRIVE" [LAYOUT:Model] "EX. 6' WOOD FENCE" [LAYOUT:Model] "GW(5)" [LAYOUT:Model] "SIGN" [LAYOUT:Model] "INTX" [LAYOUT:Model] "SWCB" [LAYOUT:Model] "SWCB" [LAYOUT:Model] "SWCB" [LAYOUT:Model] "SWCB" [LAYOUT:Model] "1/4"OPEN TOP" [LAYOUT:Model] "PIPE FOUND" [LAYOUT:Model] "RBF" [LAYOUT:Model] "RBF" [LAYOUT:Model] "RBF ON P.L." [LAYOUT:Model] "RBF" [LAYOUT:Model] "RBF" [LAYOUT:Model] "18"" [LAYOUT:Model] "CMP" [LAYOUT:Model] "EX. CONCRETE SW" [LAYOUT:Model] "24" C & G" [LAYOUT:Model] "(highback)" [LAYOUT:Model] "50' R/W" [LAYOUT:Model] "SIGN" [LAYOUT:Model] "25 MPH" [LAYOUT:Model] "ETB" [LAYOUT:Model] "SSMH" [LAYOUT:Model] "CMF-R/W" [LAYOUT:Model] "CMF-R/W" [LAYOUT:Model] "CMF-R/W" [LAYOUT:Model] "3/4"CRIMPED TOP" [LAYOUT:Model] "PIPE FOUND" [LAYOUT:Model] "AXLE" [LAYOUT:Model] "FOUND" [LAYOUT:Model] "1/2" REBAR FOUND" [LAYOUT:Model] "FROM CORNER" [LAYOUT:Model] "DISTURBED = 0.5' SE" [LAYOUT:Model] "RBS" [LAYOUT:Model] "S58°14'40"E" [LAYOUT:Model] "262.06'" [LAYOUT:Model] "S16°43'02"W" [LAYOUT:Model] "43.76'" [LAYOUT:Model] "S71°31'21"E" [LAYOUT:Model] "123.24'" [LAYOUT:Model] "S34°05'26"W" [LAYOUT:Model] "97.77'" [LAYOUT:Model] "N56°07'14"W" [LAYOUT:Model] "19.85'" [LAYOUT:Model] "S34°07'15"W" [LAYOUT:Model] "45.02'" [LAYOUT:Model] "S56°58'22"E" [LAYOUT:Model] "19.88'" [LAYOUT:Model] "S34°05'26"W" [LAYOUT:Model] "71.10'" [LAYOUT:Model] "N61°03'33"W" [LAYOUT:Model] "298.74'" [LAYOUT:Model] "RBS" [LAYOUT:Model] "N31°38'04"E" [LAYOUT:Model] "74.30'" [LAYOUT:Model] "N21°07'32"E / 72.81'" [LAYOUT:Model] "N16°06'53"E" [LAYOUT:Model] "79.30'" [LAYOUT:Model] "EX. 6' WOOD FENCE" [LAYOUT:Model] "N31°27'50"E" [LAYOUT:Model] "13.10'" [LAYOUT:Model] "R/W" [LAYOUT:Model] "N19°46'11"E" [LAYOUT:Model] "4.25'" [LAYOUT:Model] "RBS" [LAYOUT:Model] "50' R/W P.B. 187, PGS. 1-12" [LAYOUT:Model] "ARC=76.65'" [LAYOUT:Model] "RAD=152.98" [LAYOUT:Model] "BRG=N05%%D29'19"E" [LAYOUT:Model] "CHD=75.85'" [LAYOUT:Model] "TAX PARCEL 137 483" [LAYOUT:Model] "BEING 2.37 ACRES" [LAYOUT:Model] "103,378 S.F." [LAYOUT:Model] "R/W" [LAYOUT:Model] "R/W" [LAYOUT:Model] "R/W" [LAYOUT:Model] "N61°02'17"W" [LAYOUT:Model] "16.14'" [LAYOUT:Model] "EX." [LAYOUT:Model] "EX." [LAYOUT:Model] "EX." [LAYOUT:Model] "R=1067.02 / L=64.68 / /" [LAYOUT:Model] "C=64.67 / CB=N 32°21'15" E" [LAYOUT:Model] "EX." [LAYOUT:Model] "EX." [LAYOUT:Model] "SSMH" [LAYOUT:Model] "EX." [LAYOUT:Model] "EX." [LAYOUT:Model] "EX." [LAYOUT:Model] "EX." [LAYOUT:Model] "EX." [LAYOUT:Model] "EX." [LAYOUT:Model] "EX. R/W" [LAYOUT:Model] "EX. CONCRETE SIDEWALK" [LAYOUT:Model] "EX. R/W" [LAYOUT:Model] "15' B/L" [LAYOUT:Model] "25' B/L" [LAYOUT:Model] "RBF- / DISTURBED" [LAYOUT:Model] "EX. 6' WOOD FENCE" [LAYOUT:Model] "MAIL KIOSK" [LAYOUT:Model] "COMMON AREA" [LAYOUT:Model] "264.62'" [LAYOUT:Model] "27'" [LAYOUT:Model] "235'" [LAYOUT:Model] "101.25'" [LAYOUT:Model] "30' B/L" [LAYOUT:Model] "30' B/L" [LAYOUT:Model] "NIKKI COURT / 50' R/W" [LAYOUT:Model] "PUBLIC RD." [LAYOUT:Model] "PROP. GATE" [LAYOUT:Model] "BC/BC" [LAYOUT:Model] "R/W" [LAYOUT:Model] "EX." [LAYOUT:Model] "1+00" [LAYOUT:Model] "2+00" [LAYOUT:Model] "2+66.14" [LAYOUT:Model] "PC = 1+59.40" [LAYOUT:Model] "PT = 2+08.60" [LAYOUT:Model] "15'" [LAYOUT:Model] "1110" [LAYOUT:Model] "1120" [LAYOUT:Model] "1130" [LAYOUT:Model] ATTR DATUM="1105.00" [LAYOUT:Model] "1+00" [LAYOUT:Model] "1+50" [LAYOUT:Model] "2+00" [LAYOUT:Model] "2+50" [LAYOUT:Model] "1120.6" [LAYOUT:Model] "1120.7" [LAYOUT:Model] "1120.4" [LAYOUT:Model] "1123.7" [LAYOUT:Model] "1129.2" [LAYOUT:Model] "1133.6" [LAYOUT:Model] "1133.9" [LAYOUT:Model] "1131.5" [LAYOUT:Model] "59.40'" [LAYOUT:Model] "S 88°11' 31" E" [LAYOUT:Model] "R=150.00 / L=49.21 / /" [LAYOUT:Model] "C=48.98 / CB=N 78°47'40" W" [LAYOUT:Model] "57.54'" [LAYOUT:Model] "S 69°23'49" E" [LAYOUT:Model] "EX." [LAYOUT:Model] "1130" [LAYOUT:Model] "1120" [LAYOUT:Model] "1124" [LAYOUT:Model] "1124" [LAYOUT:Model] "1126" [LAYOUT:Model] "1130" [LAYOUT:Model] "GE=1123.0" [LAYOUT:Model] "FBE=1112.5" [LAYOUT:Model] "EX. SSMH / TOP=1121.46 / IE. IN=1113.26 / IE. OUT=1113.21" [LAYOUT:Model] "EX. SSMH / TOP=1128.99 / IE. IN=1120.49 / IE. OUT=1120.37" [LAYOUT:Model] "EX. SSMH / TOP=??? / IE. IN=-9.05 / IE. OUT=-9.10" [LAYOUT:Model] "EX. SWCB / TOP=1125.30 / IE. OUT=1112.76" [LAYOUT:Model] "EX. SWCB / TOP=1124.24 / IE. IN=1118.94 / IE. IN=1111.64 / IE. OUT=1111.59" [LAYOUT:Model] "EX. DI / TOP=1113.09 / IE. IN=1102.59 / IE. OUT=1102.59" [LAYOUT:Model] "EX. YI / TOP=1076.60 / IE. OUT=1073.35" [LAYOUT:Model] "EX. JB / TOP=1079.10 / IE. IN=1072.90 / IE. OUT=1072.80" [LAYOUT:Model] "EX. 18" RCP" [LAYOUT:Model] "EX. 18" RCP" [LAYOUT:Model] "EX. SWCB / TOP=??? / IE. OUT=-4.58" [LAYOUT:Model] "EX. SWCB / TOP=1078.99 / IE. IN=1072.64 / IE. OUT=1072.37" [LAYOUT:Model] "EX. JB / TOP=1082.73 / IE. IN=1074.38 / IE. OUT=1073.91" [LAYOUT:Model] "EX. SWCB / TOP=1077.76 / IE. IN=1073.76 / IE. OUT=1073.76" [LAYOUT:Model] "15' B/L" [LAYOUT:Model] "1090" [LAYOUT:Model] "1094" [LAYOUT:Model] "1088" [LAYOUT:Model] "1080" [LAYOUT:Model] "1094" [LAYOUT:Model] "1096" [LAYOUT:Model] "1082" [LAYOUT:Model] "1116" [LAYOUT:Model] "1092" [LAYOUT:Model] "1080" [LAYOUT:Model] "1078" [LAYOUT:Model] "SSMH" [LAYOUT:Model] "A-2" [LAYOUT:Model] "A-1" [LAYOUT:Model] "20' D.E." [LAYOUT:Model] "1110" [LAYOUT:Model] "1120" [LAYOUT:Model] "1130" [LAYOUT:Model] ATTR DATUM="1105.00" [LAYOUT:Model] "0+00" [LAYOUT:Model] "0+50" [LAYOUT:Model] "1+00" [LAYOUT:Model] "1121.5" text items: 888 side-db read complete (nothing in the live drawing was touched).
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.