hello @ChadForeman74, I looked into the issue and found that one possible workaround is to add a custom grid system on top of the default grid. However, please note that this suggestion is based on my research, and the script may contain bugs or require adjustments before it works properly in your environment.
Also, please be aware that we cannot take responsibility for any issues the script may cause. I recommend backing up your projects or testing the script in a safe environment before using it in production.
Here is the example:
If we run this in the script editor in 3ds Max:
global CustomGridOverlay
try(unRegisterRedrawViewsCallback CustomGridOverlay.drawCallback)catch()
struct CustomGridStruct
(
enabled = true,
gridSize = 1000.0, -- visual half-size of grid
spacing = 10.0, -- synced from Max
majorEvery = 10, -- synced from Max
minorColor = (color 90 90 90),
majorColor = (color 140 140 140),
xAxisColor = (color 220 80 80),
yAxisColor = (color 80 220 80),
fn syncFromMaxGrid =
(
spacing = getGridSpacing()
majorEvery = getGridMajorLines()
if majorEvery < 1 do majorEvery = 1
),
fn drawLine p1 p2 c =
(
gw.setColor #line c
gw.polyline #(p1, p2) false
),
fn drawGrid =
(
if not enabled do return false
syncFromMaxGrid()
gw.setTransform (matrix3 1)
local maxLines = gridSize / spacing
if maxLines < 1 then return false
for i = -maxLines to maxLines do
(
local pos = i * spacing
local isMajor = (mod (abs i) majorEvery) == 0
local lineColorX = if isMajor then majorColor else minorColor
local lineColorY = if isMajor then majorColor else minorColor
-- X axis horizontal line (Y=0)
if i == 0 then
lineColorX = yAxisColor
-- Y axis vertical line (X=0)
if i == 0 then
lineColorY = xAxisColor
-- horizontal line
drawLine [-gridSize, pos, 0] [gridSize, pos, 0] lineColorX
-- vertical line
drawLine [pos, -gridSize, 0] [pos, gridSize, 0] lineColorY
)
gw.enlargeUpdateRect #whole
gw.updateScreen()
true
),
fn drawCallback =
(
try
(
CustomGridOverlay.drawGrid()
)
catch()
),
fn start =
(
unRegisterRedrawViewsCallback drawCallback
registerRedrawViewsCallback drawCallback
completeRedraw()
),
fn stop =
(
unRegisterRedrawViewsCallback drawCallback
completeRedraw()
)
)
CustomGridOverlay = CustomGridStruct()
CustomGridOverlay.start()
rollout CustomGridUI "Custom Grid Overlay"
(
checkbox chkEnabled "Enable custom grid" checked:true
spinner spnSize "Grid half-size: " range:[100,100000,1000] type:#float
colorpicker cpMinor "Minor"
colorpicker cpMajor "Major"
colorpicker cpX "X Axis"
colorpicker cpY "Y Axis"
button btnSync "Sync from Max Grid"
button btnRedraw "Redraw"
on CustomGridUI open do
(
spnSize.value = CustomGridOverlay.gridSize
cpMinor.color = CustomGridOverlay.minorColor
cpMajor.color = CustomGridOverlay.majorColor
cpX.color = CustomGridOverlay.xAxisColor
cpY.color = CustomGridOverlay.yAxisColor
)
on chkEnabled changed val do
(
CustomGridOverlay.enabled = val
completeRedraw()
)
on spnSize changed val do
(
CustomGridOverlay.gridSize = val
completeRedraw()
)
on cpMinor changed val do
(
CustomGridOverlay.minorColor = val
completeRedraw()
)
on cpMajor changed val do
(
CustomGridOverlay.majorColor = val
completeRedraw()
)
on cpX changed val do
(
CustomGridOverlay.xAxisColor = val
completeRedraw()
)
on cpY changed val do
(
CustomGridOverlay.yAxisColor = val
completeRedraw()
)
on btnSync pressed do
(
CustomGridOverlay.syncFromMaxGrid()
format "Spacing: %, Major Every: %\n" CustomGridOverlay.spacing CustomGridOverlay.majorEvery
completeRedraw()
)
on btnRedraw pressed do
(
completeRedraw()
)
)
createDialog CustomGridUI width:220
This will give you a customizable grid system, screenshot you can find here:

Please make sure the default grid system is set correctly before applying the script. The script will capture the data from the default grid system and create a new grid system on top of it.
If it's too complicated, we could also try using Measure Distance tool instead. It's located in Tools > Measure Distance..
Thank you!
Haifeng Yu
Technical Support Specialist