Allows you to display viewport text for:
- object name and type
- edge length
- face area and texels
Text is displayed on the object or at the corner of the viewport, according to preference.
A UI is provided to configure the viewport settings, and may be closed once the viewport text is activated.
global ViewportText_EdgeEnabled
global ViewportText_EdgeEnabled
global ViewportText_EdgeCount
global ViewportText_EdgeTotal
global ViewportText_EdgeAverage
global ViewportText_ObjectEachEnabled
global ViewportText_ObjectName
global ViewportText_ObjectType
global ViewportText_ObjectColorBy
global ViewportText_ObjectSummaryEnabled
global ViewportText_ObjectSummaryName
global ViewportText_ObjectSummaryType
global ViewportText_FaceCount
global ViewportText_FaceArea
global ViewportText_FaceTexels
global ViewportText_TexelsPerMeter
global ViewportText_Position
global ViewportText_Enabled
global ViewportText_VerticalOffset
global GW_displayViewportText
global ViewportText_ObjectColorByColors = #("Always Yellow", "WireColor", "SuperClass", "Geometry SubClass")
if ViewportText_Enabled == undefined then
(
ViewportText_ObjectEachEnabled = True
ViewportText_ObjectName = True
ViewportText_ObjectType = True
ViewportText_ObjectColorBy = "Geometry SubClass"
ViewportText_ObjectSummaryEnabled = True
ViewportText_ObjectSummaryName = True
ViewportText_ObjectSummaryType = True
ViewportText_EdgeCount = true
ViewportText_EdgeTotal = true
ViewportText_EdgeAverage = true
ViewportText_FaceCount = True
ViewportText_FaceArea = True
ViewportText_FaceTexels = True
ViewportText_VerticalOffset = 0
ViewportText_TexelsPerMeter = 1024
ViewportText_Position = "Bottom-left"
ViewportText_Enabled = True
)
unregisterRedrawViewsCallback GW_displayViewportText
----------------------
-- Helper Funcitons
----------------------
fn round_to val n =
(
local mult = 10.0 ^ n
(floor ((val * mult) + 0.5)) / mult
)
fn systemAreaToMetersSquared systemUnitsArea =
(
systemUnitsAreaInMeterSquare = case units.SystemType of
(
#Inches: 1550.0
#Feet: 10.7639
#Miles: 0.000000386102
#Millimeters: 1000000.0
#Centimeters: 10000.0
#Meters: 1.0
#Kilometers: 0.000001
)
meterssquared = systemUnitsArea / systemUnitsAreaInMeterSquare
meterssquared *= (units.SystemScale ^ 2)
return round_to meterssquared 2
)
fn systemAreaToTexelArea systemUnitsArea =
(
meterssquared = systemAreaToMetersSquared systemUnitsArea
onesidetexels = (((meterssquared ^ 0.5) * ViewportText_TexelsPerMeter) as integer) as string
return (onesidetexels + "x" + onesidetexels + "px")
)
fn colorFromSuperClass obj =
(
cyan = color 0 255 255
return case (superclassof obj) of
(
GeometryClass: white
Helper: green
Shape: cyan
Camera: orange
Light: yellow
System: red
SpaceWarpObject: red
UndefinedClass: red
default: red
)
)
fn colorFromGeometryClass obj =
(
cyan = color 0 255 255
if superclassof obj != GeometryClass then return white
return case (classof obj) of
(
Editable_Poly: green
PolyMeshObject: green
Editable_Mesh: yellow
Box: cyan
Plane: cyan
cone: cyan
geosphere: cyan
sphere: cyan
cylinder:cyan
torus: cyan
pyramid: cyan
teapot: cyan
default: if canConvertTo o Editable_Poly then orange else red
)
)
----------------------
-- Viewport Draw
----------------------
fn drawText str textcolor worldpos textposition =
(
extents = gw.getTextExtent str
if textposition == "Selection" then
(
screenpos = gw.wTransPoint worldpos
screenpos = [screenpos.x, gw.getWinSizeY()-screenpos.y,0]
if ViewportText_VerticalOffset > 15 or ViewportText_VerticalOffset < -15 then
(
gw.setColor #line textcolor
endoffset = if ViewportText_VerticalOffset > 0 then -10 else 5
gw.hPolyline #(screenpos, screenpos + [0,ViewportText_VerticalOffset + endoffset,0]) false
)
screenpos = [screenpos.x - (extents.x / 2.0), screenpos.y - (extents.y / 2.0) + ViewportText_VerticalOffset, 0]
gw.htext screenpos str color:textcolor
)
else
(
case textposition of
(
"Bottom-left": pos = [50, 20, 0]
"Bottom-Right": pos = [gw.getWinSizeX()-extents.x, 20, 0]
"Top-Right": pos = [gw.getWinSizeX()-extents.x, gw.getWinSizeY()-extents.y, 0]
)
gw.htext pos str color:textcolor
)
gw.enlargeUpdateRect #whole
)
fn DisplayEdgeMeasure =
(
str = ""
worldpos = [0,0,0]
obj = selection[1]
op = if classof obj == editable_poly or classof obj == polymeshobject then polyop else meshop
edges = getedgeselection obj as array
if edges.count == 0 then return false
edgelengths = #()
midpoints = #()
for i = 1 to edges.count do
(
verts = op.getvertsusingedge obj edges[i] as array
v1 = op.getvert obj verts[1]
v2 = op.getvert obj verts[2]
edgelengths[i] = distance v1 v2
midpoints[i] = (v1 + v2) / 2.0
)
totallength = 0
for edlen in edgelengths do totallength += edlen
midpoint = 0
for m in midpoints do midpoint += m
midpoint = midpoint / (midpoints.count as float)
worldpos = midpoint
--format "edges: %, total: %, average: %\n" edges.count totallength (totallength / edges.count)
if ViewportText_EdgeCount then
(
str += "edges: " + edges.count as string + " "
)
if ViewportText_EdgeTotal then
(
str += "total: " + units.formatValue totallength + " "
)
if ViewportText_EdgeAverage then
(
str += "average: " + units.formatValue (totallength / (edges.count as float)) + " "
)
drawText str white worldpos ViewportText_Position
)
fn DisplayFaceMeasure =
(
str = ""
worldpos = [0,0,0]
obj = selection[1]
op = if classof obj == editable_poly or classof obj == polymeshobject then polyop else meshop
faces = (getfaceselection obj) as array
if faces.count == 0 then return false
faceareas = #()
midpoints = #()
for i = 1 to faces.count do
(
faceareas[i] = op.getfacearea obj faces[i]
midpoints[i] = op.getfacecenter obj faces[i]
)
totalarea = 0
for a in faceareas do totalarea += a
midpoint = [0,0,0]
for m in midpoints do midpoint += m
midpoint = midpoint / (midpoints.count as float)
worldpos = midpoint
-- print "--"
-- print (midpoints as array)
-- print worldpos
if ViewportText_FaceCount then
(
str += "faces: " + faces.count as string + " "
)
if ViewportText_FaceArea then
(
str += "area: " + ((systemAreaToMetersSquared totalarea) as string) + "msq "
)
if ViewportText_FaceTexels then
(
str += "texels: " + systemAreaToTexelArea totalarea + " "
)
drawText str white worldpos ViewportText_Position
)
fn DisplayObjects =
(
worldpos = [0,0,0]
sel = getcurrentselection()
matchingclasses = true
(
for o in sel do
(
if classof o != classof sel[1] then matchingclasses = false
)
)
matchingsuperclasses = true
for o in sel do (if superclassof o != superclassof sel[1] then matchingsuperclasses = false; exit)
if ViewportText_ObjectEachEnabled then
(
if sel.count < 1000 then -- too many objects would be very cluttered on screen and hurt perf
(
for obj in sel do
(
str = ""
if ViewportText_ObjectName then str += obj.name + " "
if ViewportText_ObjectType then str += ((classof obj) as string) + " "
case ViewportText_ObjectColorBy of
(
"Always Yellow": textcolor = yellow
"WireColor": try (textcolor = obj.wirecolor) catch (textcolor = yellow)
"SuperClass": textcolor = colorFromSuperClass obj
"Geometry SubClass": textcolor = colorFromGeometryClass obj
)
if textcolor == undefined then (print obj.name; print obj.wirecolor)
worldpos = obj.pos
drawText str textcolor worldpos "Selection"
)
)
)
if ViewportText_ObjectSummaryEnabled then
(
str = ""
if ViewportText_ObjectSummaryName then
(
if sel.count == 1 then str += sel[1].name + " "
else str += sel.count as string + " objects "
)
if ViewportText_ObjectSummaryType then
(
if matchingclasses then str += (classof sel[1]) as string + " (" + sel.count as string + ") "
else str += "various types (" + sel.count as string + ") "
)
pos = ViewportText_Position
-- prevent summary and each from overlapping
if ViewportText_ObjectEachEnabled and ViewportText_Position == "Selection" then
(
pos = "Bottom-left"
)
worldpos = [0,0,0]
for o in sel do worldpos += o.pos
worldpos = worldpos / (sel.count as float)
drawText str yellow worldpos pos
)
)
fn GW_displayViewportText =
(
gw.setTransform (matrix3 1)
-- OBJECTS
if subobjectlevel == 0 or subobjectlevel == undefined and selection.count > 0 then
(
DisplayObjects()
)
-- EDGES
if (subobjectlevel == 2 or subobjectlevel == 3) and selection.count == 1 then
(
DisplayEdgeMeasure()
)
-- FACES
if (subobjectlevel == 4 or subobjectlevel == 5) and selection.count == 1 then
(
DisplayFaceMeasure()
)
)
----------------------
-- UI
----------------------
try (destroydialog rol_ViewportText) catch()
rollout rol_ViewportText "Viewport Text"
(
group "Per Object"
(
checkbox chk_objectname "Object Name"
checkbox chk_objecttype "Object Type"
radiobuttons rdo_colorby "Color By" labels:ViewportText_ObjectColorByColors
checkbox chk_objecteach "Enabled"
)
group "Object Summary"
(
checkbox chk_objectsummaryname "Object Name / Count"
checkbox chk_objectsummarytype "Object Type + Count"
checkbox chk_objectsummaryenabled "Enabled"
)
group "Edge"
(
checkbox chk_edgecount "Edge Count"
checkbox chk_edgetotal "Edge Total"
checkbox chk_edgeaverage "Edge Average"
)
group "Face"
(
checkbox chk_facecount "Face Count"
checkbox chk_facearea "Surface Area"
checkbox chk_facetexels "Texel Area"
)
spinner spn_texelsPerMeter "Texels per Meter " range:[128, 4096, 1024] scale:128 type:#integer offset:[46,4] width:110
label lbl_pos "Position" across:2 width:80 offset:[8,2]
dropdownlist ddl_position "" items:#("Selection", "Bottom-left", "Bottom-Right", "Top-Right") width:90 offset:[-20,0]
spinner spn_verticalOffset "Vertical Offset " range:[-50,50,0] scale:5 type:#integer offset:[46,-3] width:110
checkbutton btn_enable "Enable" width:100 offset:[0,-2]
fn updatePrefs =
(
ViewportText_EdgeCount = chk_edgecount.checked
ViewportText_EdgeTotal = chk_edgetotal.checked
ViewportText_EdgeAverage = chk_edgeaverage.checked
ViewportText_ObjectEachEnabled = chk_objecteach.checked
ViewportText_ObjectName = chk_objectname.checked
ViewportText_ObjectType = chk_objecttype.checked
ViewportText_ObjectColorBy = ViewportText_ObjectColorByColors[rdo_colorby.state]
ViewportText_ObjectSummaryEnabled = chk_objectsummaryenabled.checked
ViewportText_ObjectSummaryName = chk_objectsummaryname.checked
ViewportText_ObjectSummaryType = chk_objectsummarytype.checked
ViewportText_FaceCount = chk_facecount.checked
ViewportText_FaceArea = chk_facearea.checked
ViewportText_FaceTexels = chk_facetexels.checked
ViewportText_TexelsPerMeter = spn_texelsPerMeter.value
ViewportText_Position = ddl_position.selected
ViewportText_VerticalOffset = spn_verticalOffset.value
ViewportText_Enabled = btn_enable.checked
btn_enable.text = if ViewportText_Enabled then "Active" else "Click to Activate"
unregisterRedrawViewsCallback GW_displayViewportText
if ViewportText_Enabled then registerRedrawViewsCallback GW_displayViewportText
redrawViews()
)
on rol_ViewportText open do
(
chk_edgecount.checked = ViewportText_EdgeCount
chk_edgetotal.checked = ViewportText_EdgeTotal
chk_edgeaverage.checked = ViewportText_EdgeAverage
chk_objecteach.checked = ViewportText_ObjectEachEnabled
chk_objectname.checked = ViewportText_ObjectSummaryName
chk_objecttype.checked = ViewportText_ObjectType
rdo_colorby.state = finditem ViewportText_ObjectColorByColors ViewportText_ObjectColorBy
chk_objectsummaryname.checked = ViewportText_ObjectSummaryEnabled
chk_objectsummarytype.checked = ViewportText_ObjectSummaryType
chk_objectsummaryenabled.checked = ViewportText_ObjectSummaryEnabled
chk_facecount.checked = ViewportText_FaceCount
chk_facearea.checked = ViewportText_FaceArea
chk_facetexels.checked = ViewportText_FaceTexels
spn_texelsPerMeter.value = ViewportText_TexelsPerMeter
ddl_position.selection = finditem ddl_position.items ViewportText_Position
spn_verticalOffset.value = ViewportText_VerticalOffset
btn_enable.checked = ViewportText_Enabled
updatePrefs()
)
on chk_edgecount changed val do updatePrefs()
on chk_edgetotal changed val do updatePrefs()
on chk_edgeaverage changed val do updatePrefs()
on chk_objectname changed val do updatePrefs()
on chk_objecttype changed val do updatePrefs()
on rdo_colorby changed val do updatePrefs()
on chk_objecteach changed val do updatePrefs()
on chk_objectsummaryname changed val do updatePrefs()
on chk_objectsummarytype changed val do updatePrefs()
on chk_objectsummaryenabled changed val do updatePrefs()
on chk_facecount changed val do updatePrefs()
on chk_facearea changed val do updatePrefs()
on chk_facetexels changed val do updatePrefs()
on spn_texelsPerMeter changed val do updatePrefs()
on btn_enable changed val do updatePrefs()
on ddl_position selected val do updatePrefs()
on spn_verticalOffset changed val do updatePrefs()
)
createdialog rol_ViewportText






