C3D-0166 · Flood note into the block + FIRM_PANEL / FIRM_DATE / FLOOD_ZONE attributes [FEMA-ATTRS] done
Adds the flood note sentence to the SS_BLOCK_11X17 definition as static MText and creates three attribute definitions for the variable parts - FIRM_PANEL, FIRM_DATE, FLOOD_ZONE - matching the SurveyDisco card fields. Wording is unchanged, only split. Height 0.055 and style L120 carried from the existing note; positioned from the loose note paper coords mapped into block space. Idempotent, and the loose MText is left in place until the result is confirmed.
C# payload
// Move the flood note INTO the SS_BLOCK_11X17 definition and make the three variable parts
// attributes, so they travel with the block instead of being loose MText on the sheet.
//
// The sentence is UNCHANGED - it is split, not rewritten:
// "FLOOD NOTE:\PTHIS PROPERTY IS NOT LOCATED WITHIN A SPECIAL FLOOD HAZARD AREA (SFHA) AS
// SHOWN ON F.I.R.M. COMMUNITY PANEL NO. <FIRM_PANEL>, EFFECTIVE <FIRM_DATE>, AND LIES IN
// ZONE <FLOOD_ZONE>."
// The static wording stays as MText inside the definition; only the panel number, effective date
// and zone letter become attributes (they are exactly the three fields the SurveyDisco job card
// supplies: firmPanel / firmPanelDate / floodZone).
//
// COORDINATES: the loose note sits at paper 7.7231,3.3919 and the block reference is inserted at
// paper 10.8150,0.2874 with scale 1 and no rotation, so block-space position is
// (7.7231-10.8150, 3.3919-0.2874) = (-3.0919, 3.1045). Text height 0.0550 and style L120 are
// carried over from the existing note so it looks identical.
//
// The loose MText 158D1 is NOT erased here - it stays until the change is confirmed on screen.
// Nothing outside the SS_BLOCK_11X17 definition is touched.
const string BLOCK = "SS_BLOCK_11X17";
const double X = -3.0919, Y = 3.1045; // block-space, from the loose note's paper position
const double H = 0.0550;
const string STYLE = "L120";
const string LAYER = "BLOCK_NOTES_FLOOD";
var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForWrite);
Log("drawing: " + Db.Filename);
if (!bt.Has(BLOCK)) { Log("ABORT: block " + BLOCK + " not found"); return; }
var btr = (BlockTableRecord)Tx.GetObject(bt[BLOCK], OpenMode.ForWrite);
// idempotency: if the attributes already exist, do nothing
foreach (ObjectId id in btr) {
var ex = Tx.GetObject(id, OpenMode.ForRead) as AttributeDefinition;
if (ex != null && (ex.Tag == "FIRM_PANEL" || ex.Tag == "FIRM_DATE" || ex.Tag == "FLOOD_ZONE")) {
Log("flood attributes already present in " + BLOCK + " - nothing to do");
return;
}
}
EnsureLayer(LAYER, 7);
// the static sentence, with the three variable slots left out
var body = new MText {
Location = new Point3d(X, Y, 0),
Contents = @"FLOOD NOTE:\PTHIS PROPERTY IS NOT LOCATED WITHIN A SPECIAL FLOOD HAZARD AREA (SFHA) AS SHOWN ON F.I.R.M. COMMUNITY PANEL NO.",
TextHeight = H,
Width = 2.9020,
Attachment = AttachmentPoint.TopLeft,
};
body.Layer = LAYER;
try { body.TextStyleId = ((TextStyleTable)Tx.GetObject(Db.TextStyleTableId, OpenMode.ForRead))[STYLE]; } catch { }
btr.AppendEntity(body);
Tx.AddNewlyCreatedDBObject(body, true);
Log("static sentence added to the block definition");
// the three variable parts, as attribute definitions
Action<string,string,string,double,double> mk = (tag, prompt, def, ax, ay) => {
var ad = new AttributeDefinition();
ad.Position = new Point3d(ax, ay, 0);
ad.Tag = tag;
ad.Prompt = prompt;
ad.TextString = def;
ad.Height = H;
ad.Layer = LAYER;
try { ad.TextStyleId = ((TextStyleTable)Tx.GetObject(Db.TextStyleTableId, OpenMode.ForRead))[STYLE]; } catch { }
btr.AppendEntity(ad);
Tx.AddNewlyCreatedDBObject(ad, true);
Log(String.Format(" attribute {0,-12} at {1:F4},{2:F4} default \"{3}\"", tag, ax, ay, def));
};
// stacked under the sentence; the user will nudge them onto the line where they belong
mk("FIRM_PANEL", "F.I.R.M. community panel number", "13135C0016G", X, Y - 0.30);
mk("FIRM_DATE", "F.I.R.M. effective date", "FEBRUARY 4, 2013", X, Y - 0.40);
mk("FLOOD_ZONE", "Flood zone", "X", X, Y - 0.50);
// verify from the definition
Log("");
int nAtt = 0;
foreach (ObjectId id in btr) {
var ad = Tx.GetObject(id, OpenMode.ForRead) as AttributeDefinition;
if (ad == null) continue;
nAtt++;
Log(String.Format(" {0,-22} = \"{1}\"", ad.Tag, ad.TextString));
}
Log("attribute definitions now in " + BLOCK + ": " + nAtt + " (verified)");
Log("");
Log("NOTE: existing inserts still show the OLD attribute set until ATTSYNC is run on the block.");
Ed.Regen();
Result
Log
drawing: C:\Users\sanja\OneDrive\_SurveyDisco\SS_BLOCK_11X17.dwg static sentence added to the block definition attribute FIRM_PANEL at -3.0919,2.8045 default "13135C0016G" attribute FIRM_DATE at -3.0919,2.7045 default "FEBRUARY 4, 2013" attribute FLOOD_ZONE at -3.0919,2.6045 default "X" JOB_NO = "JOB NO.: 251002" SITE_ADDRESS = "SITE_ADDRESS" REF_DB_PG = "REF DB xxx Page xxx" LAND_LOT = "LAND LOT: ###" DISTRICT = "DISTRICT: #TH" COUNTY = "COUNTY: CLAYCO" DATE = "DATE: 10/16/25" SUBDIVISION_NAME_LOT = "SUBDIVISION_NAME LOT ##" PREP_FOR = "PREP_FOR" SURVEY_TYPE = "BOUNDARY SURVEY" FIRM_PANEL = "13135C0016G" FIRM_DATE = "FEBRUARY 4, 2013" FLOOD_ZONE = "X" attribute definitions now in SS_BLOCK_11X17: 13 (verified) NOTE: existing inserts still show the OLD attribute set until ATTSYNC is run on the block.
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.