/*************************** example setup ************
delete objects
gc()
n = plane name:#relax_poly_test width:100 length:100 widthsegs:32 lengthsegs:32
addmodifier n (Noisemodifier strength:[2,2,10] fractal:off roughness:1 scale:10)
converttopoly n
********************************************/
try(destroydialog PolyRelaxByAxis) catch()
rollout PolyRelaxByAxis "Relax by Axis" width:191
(
fn relaxPolyVertsUsingAxis node verts: amount:0.5 iterations:10 keepBorder:off keepOuter:off axis:#z =
(
old_sel = node.selectedverts as bitarray
if verts == unsupplied or verts == #all do verts = #{1..node.numverts}
if verts == #selected do verts = node.selectedverts as bitarray
node.setSelection #vertex verts
getvert = polyop.getvert
pp = for v in verts collect (getvert node v)
node.relaxAmount = amount
node.relaxIterations = iterations
node.relaxHoldOuterPoints = keepOuter
node.relaxHoldBoundaryPoints = keepBorder
node.relax selLevel:#vertex
_axis = case axis of
(
#x: #{1}
#y: #{2}
#z: #{3}
#xy: #{1,2}
#yz: #{2,3}
#xz: #{1,3}
default: #{1..3}
)
k = 0
for v in verts do
(
k += 1
p = getvert node v
for i in _axis do pp[k][i] = p[i]
)
polyop.setvert node verts pp
node.setSelection #vertex old_sel
update node
)
group "Relax: "
(
spinner amount_sp "Relax Value: " range:[0,1,0.5] type:#float scale:0.01 \
fieldwidth:56 align:#right offset:[4,0] tooltip:"Relax Amount"
spinner iterations_sp "Iterations: " range:[1,1000,10] type:#integer \
fieldwidth:56 align:#right offset:[4,0] tooltip:"Relax Iterations"
checkbox keep_boundary_ch "Keep Boundary" checked:on offset:[0,4]
tooltip:"Keep Boundary"
checkbox keep_outer_corners_ch "Keep Outer Corners" checked:off offset:[0,0]
tooltip:"Keep Outer Corners"
)
group "Axis: "
(
radiobuttons axis_rb labels:#("X", "YZ", "Y", "XZ", "Z", "XY", "XYZ") default:7 columns:2 align:#left offset:[40,0] \
offsets:#([0,0],[-41,0],[0,5],[-41,5],[0,10],[-41,10],[54,15])
)
group "Vertex: "
(
radiobuttons target_rb labels:#("All", "Selected") columns:2 align:#left offset:[40,0] offsets:#([0,0],[-5,0])
)
group ""
(
button relax_bt "Relax" width:173 align:#left offset:[-4,-7]
)
on relax_bt pressed do undo "Relax" on if iskindof (node = selection[1]) Editable_Poly do
(
axis = uiaccessor.getwindowtext axis_rb.hwnd[axis_rb.state] as name
verts = uiaccessor.getwindowtext target_rb.hwnd[target_rb.state] as name
relaxPolyVertsUsingAxis node verts:verts \
amount:amount_sp.value \
iterations:iterations_sp.value \
keepBorder:keep_boundary_ch.state \
keepOuter:keep_outer_corners_ch.state \
axis:axis
)
on PolyRelaxByAxis close do
(
)
on PolyRelaxByAxis open do
(
)
)
createdialog PolyRelaxByAxis
this is the UI of the tool might look like. I already showed in other my posts how to make it the real tool -
# save dialog position (and state)
# save/load settings on dialog open/close
# save/load settings between MAX sessions
# make it a macrobutton
# organize as one struct (one script, one file)
technically it should be a modifier.
If I have time I will show how to make it a Modifier