Skip to content

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} expressions
  • ROTATION_DEGREES — base rotation in degrees CCW; use 0 for 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 placeholders
  • HEIGHT_MM — text height in mm on the plotted sheet (auto-scaled to model units)
  • DX_MM, DY_MM — offset from point in mm
  • ROT_DEG — rotation in degrees
  • JUSTIFICATIONTL, 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.5001.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