C3D-0004 · Read title block attributes [TB-READ] done
Read-only: every layout with its paper size, every block reference carrying attributes and their current values, plus any flood/FIRM/panel text in paper space.
C# payload
// READ-ONLY: layouts, and every block reference with attributes in each paper space, so the
// title block's current attribute values can be diffed against the SurveyDisco job record.
var layDict = (DBDictionary)Tx.GetObject(Db.LayoutDictionaryId, OpenMode.ForRead);
foreach (DBDictionaryEntry de in layDict)
{
var lay = (Layout)Tx.GetObject(de.Value, OpenMode.ForRead);
var ps = (BlockTableRecord)Tx.GetObject(lay.BlockTableRecordId, OpenMode.ForRead);
int n = 0; foreach (ObjectId x in ps) n++;
Log("=== layout '" + lay.LayoutName + "' tab=" + lay.TabOrder + " entities=" + n +
" paper=" + (lay.PlotPaperSize.X/25.4).ToString("F1") + "x" + (lay.PlotPaperSize.Y/25.4).ToString("F1") + "in");
foreach (ObjectId id in ps)
{
var br = Tx.GetObject(id, OpenMode.ForRead) as BlockReference;
if (br == null) continue;
var def = (BlockTableRecord)Tx.GetObject(br.BlockTableRecord, OpenMode.ForRead);
int na = br.AttributeCollection.Count;
if (na == 0) continue;
Log(" block '" + def.Name + "' h=" + br.Handle + " " + na + " attribute(s)");
foreach (ObjectId aid in br.AttributeCollection)
{
var ar = Tx.GetObject(aid, OpenMode.ForRead) as AttributeReference;
if (ar != null) Log(" " + ar.Tag.PadRight(24) + " = '" + ar.TextString + "'");
}
}
}
Log("=== flood / FIRM text anywhere in paper space ===");
foreach (DBDictionaryEntry de in layDict)
{
var lay = (Layout)Tx.GetObject(de.Value, OpenMode.ForRead);
var ps = (BlockTableRecord)Tx.GetObject(lay.BlockTableRecordId, OpenMode.ForRead);
foreach (ObjectId id in ps)
{
var e = Tx.GetObject(id, OpenMode.ForRead);
string t = null;
var mt = e as MText; if (mt != null) t = mt.Contents;
var dt = e as DBText; if (dt != null) t = dt.TextString;
if (t == null) continue;
var u = t.ToUpper();
if (u.Contains("FIRM") || u.Contains("PANEL") || u.Contains("FLOOD") || u.Contains("ZONE"))
Log(" [" + lay.LayoutName + "] " + t.Replace("\u005CP", " | "));
}
}
Result
Log
=== layout '11X17' tab=1 entities=215 paper=11.0x17.0in
block 'SS_BLOCK_11X17' h=20355 10 attribute(s)
JOB_NO = 'JOB NO.: 260104'
SITE_ADDRESS = '6333 GA-42, Rex, GA 30273, USA'
REF_DB_PG = 'REF DB 13594 Page 389'
LAND_LOT = 'LAND LOT: 119'
DISTRICT = 'DISTRICT: 12th'
COUNTY = 'COUNTY: CLAYTON'
DATE = 'DATE: 12/22/25'
SUBDIVISION_NAME_LOT = ''
PREP_FOR = 'Curry Leaves 6333 LLC & SERVISFIRST BANK'
SURVEY_TYPE = 'ALTA retracement Survey'
=== layout '13709-779' tab=3 entities=215 paper=11.0x17.0in
block 'SS_BLOCK_11X17' h=22F36 10 attribute(s)
JOB_NO = 'JOB NO.: 260104'
SITE_ADDRESS = '6333 GA-42, Rex, GA 30273, USA'
REF_DB_PG = 'REF DB 13594 Page 389'
LAND_LOT = 'LAND LOT: 119'
DISTRICT = 'DISTRICT: 12th'
COUNTY = 'COUNTY: CLAYTON'
DATE = 'DATE: 12/22/25'
SUBDIVISION_NAME_LOT = ''
PREP_FOR = 'Curry Leaves 6333 LLC & SERVISFIRST BANK'
SURVEY_TYPE = 'ALTA retracement Survey'
=== layout '22X17' tab=2 entities=7 paper=22.0x17.0in
block 'SS_BLOCK_11X17' h=23273 10 attribute(s)
JOB_NO = 'JOB NO.: 260104'
SITE_ADDRESS = '6333 GA-42, Rex, GA 30273, USA'
REF_DB_PG = 'REF DB 13594 Page 389'
LAND_LOT = 'LAND LOT: 119'
DISTRICT = 'DISTRICT: 12th'
COUNTY = 'COUNTY: CLAYTON'
DATE = 'DATE: 10/16/25'
SUBDIVISION_NAME_LOT = 'SUBDIVISION_NAME LOT ##'
PREP_FOR = 'Curry Leaves 6333 LLC & SERVISFIRST BANK'
SURVEY_TYPE = 'ALTA retracement Survey'
=== layout 'Model' tab=0 entities=12763 paper=17.0x11.0in
=== flood / FIRM text anywhere in paper space ===
[11X17] FLOOD NOTE: | THIS PROPERTY IS NOT IN AN AREA HAVING SPECIAL FLOOD HAZARD AS PER COMMUNITY PANEL NO. 13063C0083F, DATED JUNE 7TH 2017.
[13709-779] FLOOD NOTE: | THIS PROPERTY IS NOT IN AN AREA HAVING SPECIAL FLOOD HAZARD AS PER COMMUNITY PANEL NO. 13063C0083F, DATED JUNE 7TH 2017.Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.