Point Styles¶
The PointStyleConfig file controls how individual survey points are drawn — their layer, symbol style, labels, and any additional geometry (circles, blocks, rectangles, text).
The file is located at:
%APPDATA%\SpatialViz\PointStyles\<ConfigName>_PointStyleConfig.txt
Open it from R3MANAGECONFIGS → Edit Point Styles.
File format¶
The file contains one block per code. Each block starts with the code name and is followed by indented rules:
CODENAME
Layer = LAYERNAME
Style = STYLENAME
Label = LABELSTYLE
LayerIf ATTR = VALUE => LAYERNAME
StyleIf ATTR = VALUE => STYLENAME
LabelIf ATTR = VALUE => LABELSTYLE
ActionIf ATTR = VALUE => Action(...)
ActionElse = Action(...)
AttrAction = Transform(Ax)
Base assignments¶
Set a default layer, style, or label for all points with this code, regardless of attributes:
TR
Layer = VEGETATION
Style = VEGETATION-CROSS
If no base assignment is given, the point inherits the layer and style from AutoCAD's current layer or Description Key settings.
Conditional overrides¶
Use LayerIf, StyleIf, and LabelIf to change layer, style, or label based on an attribute value:
BLD
LayerIf A5 = Lower Ground => BUILDINGS_LG-PNTS
LayerIf A5 = Ground => BUILDINGS_G-PNTS
LayerIf A5 = L1 => BUILDINGS_L1-PNTS
StyleIf A5 = Lower Ground => BUILDINGS_LG-CROSS
StyleIf A5 = Ground => BUILDINGS_G-CROSS
Multiple conditions (AND)¶
Join conditions with &&:
BLD
StyleIf A5 = Lower Ground && A3 = Line only => BUILDINGS_LG-LO
StyleIf A5 = Lower Ground => BUILDINGS_LG-CROSS
Put the most specific rule (with &&) before the simpler fallback. First match wins.
Wildcard: attribute is present¶
Use * to mean "this attribute has any non-empty value":
MH
ActionIf A2 = * => Circle({A2}/2)
ActionElse = Circle(0.35)
Inequality¶
Use != to match when an attribute does not equal a value:
PYLON
LabelIf A2 != Bottom => A1_POLE
Label control¶
LabelIf and LabelElse control the label style applied to the point. The label style name maps to a definition in your point label rules.
| Keyword | Meaning |
|---|---|
HIDE |
Suppress the label entirely |
H |
Show elevation |
H_TF |
Show top-of-feature elevation |
| Any name | Use that named label style |
FCE
LabelIf A4 = Middle => HIDE
LabelIf A4 = Top => H_TF
FURN
Label = [H]
LabelIf A3 = Mid => A4
LabelIf A3 = Top => A4{H}
Actions¶
Actions draw additional geometry at the point location. Use ActionIf (conditional) or ActionElse (fallback):
Block insertion¶
POLE
ActionIf A1 = Power => Block(PP, 0.35)
ActionIf A1 = Light => Block(LP, 0.25)
Block(NAME, SCALE) inserts block NAME at scale SCALE (drawing units). The scale can use attribute expressions.
Trees use attribute-driven scale — canopy radius from A1, trunk diameter from A2:
TR
ActionIf A1 = * => Circle({A1}/2)
ActionIf A2 = * => Block(TREE, {A2}, {A2}, {A2})
Circle¶
Draws a circle centred at the point. Radius in drawing units. Expressions using {A1}–{A8} are supported.
MH
ActionIf A2 = * => Circle({A2}/2) # lid diameter recorded in field
ActionElse = Circle(0.35) # default 0.35 m if no diameter
Donut¶
Draws concentric circles. Donut(OUTER, INNER) — inner defaults to 0 if omitted:
ActionIf A1 = * => Donut({A1}, {A2})
ActionIf A1 = * => Donut(0.4)
Both radii can use {A1}–{A8} expressions.
Rectangle¶
Draws a rectangle centred at the point.
Rectangle(WIDTH, HEIGHT, ROTATION_DEGREES)
Rectangle(WIDTH, HEIGHT, ROTATION_DEGREES, AlignCode="CODE1|CODE2", AlignWithin=RADIUS)
WIDTH,HEIGHT— in drawing units; can use{A1}–{A8}expressionsROTATION_DEGREES— base rotation in degrees CCW; use0for no fixed rotation
Basic example — pit with dimensions from attributes:
PIT1
ActionIf A4 = * => Rectangle({A5}, {A4}, 0)
A5 stores the pit width and A4 stores the pit length, both recorded in the field. The rectangle is drawn with no fixed rotation.
Aligning a rectangle to a nearby string¶
The optional AlignCode and AlignWithin parameters automatically rotate the rectangle to align with the bearing of the nearest matching string within the drawing.
TELSTRA
Layer = COMMS
ActionIf A2 = Single Pit => Rectangle(0.6, 0.4, 0, AlignCode="KERB|*", AlignWithin=8.0)
| Parameter | Description |
|---|---|
AlignCode="CODE1\|CODE2" |
Search for a nearby string with one of these codes. Use \| to separate alternatives. Use * to match any code. |
AlignWithin=N |
Search radius in drawing units. Only strings within this distance are considered. |
How it works:
Before any points are drawn, R3Survey builds an index of all string segments in the current run. When drawing a point with AlignCode, it finds the nearest segment from a matching string within the search radius and computes its bearing. The rectangle is then rotated to that bearing (plus the base ROTATION_DEGREES).
In the TELSTRA example: each comms pit is drawn as a 0.6 × 0.4 m rectangle, automatically rotated to align with the nearest kerb line (KERB string) within 8 m. If no KERB string is found within 8 m, the * allows alignment to any other nearby string instead. If nothing is found within the radius, the rectangle falls back to the base rotation (0° — no rotation).
This is useful for any rectangular feature that should be drawn parallel to an adjacent feature — pits, Telstra pillars, valves, etc.
Text¶
AddText("BM {A3}", 2.5, 1.5, -1.0, 0, "ML")
AddText(TEXT, HEIGHT_MM, DX_MM, DY_MM, ROT_DEG, JUSTIFICATION)
TEXT— the string to draw; use{A1}–{A8}as placeholdersHEIGHT_MM— text height in mm on the plotted sheet (auto-scaled to model units)DX_MM,DY_MM— offset from point in mmROT_DEG— rotation in degreesJUSTIFICATION—TL,TC,TR,ML,MC,MR,BL,BC,BR
Multi-line text (MText)¶
AddMText("{A2} / {A3}", 2.5, 12.0, 0, 3.0, 0, "TL")
AddMText(TEXT, HEIGHT_MM, WIDTH_MM, DX_MM, DY_MM, ROT_DEG, JUSTIFICATION)
Use WIDTH_MM = 0 to disable wrapping.
Delete elevation¶
Removes the Z coordinate from the point — it is treated as having no elevation. Subsequent geometry uses Z = 0. Use this for points that should not participate in surface generation (contours, DTM).
TAP
ActionIf A1 = Non Contourable => DeleteElevation()
TR
ActionIf A4 = Mid => DeleteElevation() # mid-canopy shots: no elevation needed
Attribute pre-processing (AttrAction)¶
AttrAction transforms attribute values before they are used in conditions, actions, or labels. Multiple AttrAction lines are applied in order.
| AttrAction | Effect |
|---|---|
TrimTrailingZeros(Ax) |
1.500 → 1.5 |
Round(Ax, N) |
Round to N decimal places |
AddPrefix(Ax, "X") |
Prepend text to the attribute value |
AddSuffix(Ax, "X") |
Append text |
Replace(Ax, "old", "new") |
Replace a substring |
FormatAsString(Ax, "0.00") |
Apply a numeric format string |
MapValue(Ax, "k1:v1;k2:v2") |
Map specific values to other values |
PadLeft(Ax, N, "C") |
Pad with character C to length N |
PadRight(Ax, N, "C") |
Pad right |
UCase(Ax) |
Uppercase |
Lower(Ax) |
Lowercase |
Camel(Ax) |
Title case (each word capitalised) |
Concat(Ax, Ay, "sep") => Az |
Join attributes with separator, write to Az |
Examples¶
TR
AttrAction = TrimTrailingZeros(A1) # canopy radius: "14.0" → "14"
AttrAction = TrimTrailingZeros(A2) # trunk diameter: "0.50" → "0.5"
BM
AttrAction = UCase(A1) # benchmark ID always uppercase
AttrAction = UCase(A2)
TRACE
AttrAction = TrimTrailingZeros(A3)
AttrAction = AddPrefix(A3, ↓) # prefix depth with down-arrow
Full example¶
TR
Layer = VEGETATION
Style = VEGETATION-CROSS
LabelIf A4 = Bottom => TREE_H
LabelElse => TREE
ActionIf A4 = Mid => DeleteElevation()
ActionIf A1 = * => Circle({A1}/2) # draw canopy circle using A1 radius
ActionIf A2 = * => Block(TREE,{A2},{A2},{A2}) # insert TREE block at trunk diameter
AttrAction = TrimTrailingZeros(A1)
AttrAction = TrimTrailingZeros(A2)
AttrAction = TrimTrailingZeros(A3)
MH
Layer = SEWER-PNTS
ActionIf A2 = * => Circle({A2}/2) # draw manhole circle using lid diameter
ActionElse = Circle(0.35) # default 0.35 m radius if no diameter recorded
POLE
Layer = ELECTRICAL
Style = ELECTRICAL-CROSS
LabelIf A2 = Mid => A1_POLE
ActionIf A1 = Power => Block(PP, 0.35)
ActionIf A1 = Power & Light => Block(PP, 0.35)
ActionIf A1 = Light => Block(LP, 0.25)
ActionIf A1 = Light & Outreach => Block(LP, 0.25)
ActionElse = Circle(0.35)
# Pits: draw a rectangle using field-recorded dimensions (A5 = width, A4 = length)
# Service type (A6) drives the layer and point style
PIT1
StyleIf A6 = Sewer => SEWER-CROSS
StyleIf A6 = Stormwater => DRAINAGE-CROSS
StyleIf A6 = Water => WATER-CROSS
StyleIf A6 = Gas => GAS-CROSS
StyleIf A6 = Electrical => ELECTRICAL-CROSS
LayerIf A6 = Sewer => SEWER
LayerIf A6 = Stormwater => DRAINAGE
LayerIf A6 = Water => WATER
LayerIf A6 = Gas => GAS
LayerIf A6 = Electrical => ELECTRICAL
LabelIf A3 = Mid => HIDE
ActionIf A4 = * => Rectangle({A5}, {A4}, 0)
# Comms pits: fixed 0.6 x 0.4 m rectangle, aligned to nearest kerb line within 8 m
TELSTRA
Layer = COMMS
ActionIf A2 = Single Pit => Rectangle(0.6, 0.4, 0, AlignCode="KERB|*", AlignWithin=8.0)
Notes¶
- Rules are evaluated top-to-bottom; first match wins per rule kind (Layer/Style/Label/Action)
- Attribute value comparisons are case-insensitive
- Multi-word attribute values do not need quotes (e.g.,
A5 = Lower Ground) {A1}–{A8}placeholders in action arguments are expanded after AttrAction transforms have been applied