
3dsMax Dynamesh script
Slices object in 3d dimension giving it na evenly distributed definition similar to the dynamesh tool in ZBrush.
colStart = white as point3; print colA
colEnd = green as point3; print colB
remeshprogress = 0.0
totalremeshsteps = 0.0
objectpos
objectrot
offset =0.01
run = true
errorstringvariable
progresssteps = 0.0
try
(
cui.UnRegisterDialogBar remeshdialog
destroyDialog remeshdialog
)
catch()
rollout remeshdialog "Remesh"
(
editText devisionsbox "" text:"10" width:35
checkbutton btnSX "X" pos:(devisionsbox.pos+[50,0]) tooltip: "Slice on X plane" checked:true align:#left
checkbutton btnSY "Y" pos:(btnSX.pos+[30,0]) tooltip: "Slice on Y plane" checked:true
checkbutton btnSZ "Z" pos:(btnSX.pos+[60,0]) tooltip: "Slice on Z plane" checked:true
checkbutton btnKO "Old" align:#left tooltip: "Keep old edges" checked:true
checkbutton btnKB "Border" pos:(btnKO.pos+[40,0]) tooltip: "Keep borders" checked:true
checkbutton btnWP "Weld" pos:(btnKB.pos+[55,0]) tooltip: "Weld Close points after remesh" checked:false
button btndynamsh "Remesh" width:140
progressBar pbProgress "" value:0 color:colStart
--button btnweld "WeldPoints" width:140
on spnSelectAmount changed val do
(
pbProgress.value += 1/totalremeshsteps
pbProgress.color = colStart + (colEnd - colStart) * val / 100
)
fn Remesh =
(
DisableSceneRedraw()
progressStart
progress = 0.0
if(run) then
(
run = false
devisions = devisionsbox.text as integer
)
else
(
devisions = (devisionsbox.text as integer) + 1
run = true
)
print (devisions)
s = $
if(classof s == Editable_Poly ) then
(
undo on
(
polyop.setEdgeSelection s #all
old = polyOp.getEdgeSelection s
colW=s.max.x-s.min.x
colL=s.max.y-s.min.y
colH=s.max.z-s.min.z
if(colH>=colL and colH>=colW) do cutsize = colH/(devisions as float)
if(colL>=colH and colL>=colW) do cutsize = colL/(devisions as float)
if(colW>=colH and colW>=colL) do cutsize = colL/(devisions as float)
totalremeshsteps = 3* (devisions as integer)
progresssteps = 100.0/totalremeshsteps
objectpos = s.pos
objectrot = s.rotation
-- s.pos = [0,0,0]
-- s.rotation = eulerangles 0 0 0
cutpoint = s.min
Dummy pos:$.max
--z
if(btnSZ.checked) do
(
cutpoint.z += cutsize + offset
while(cutpoint.z<s.max.z)do
(
progress += progresssteps
if keyboard.escPressed do exit()
pbProgress.value = progress
$.slice [0,0,1] (cutpoint-s.pos)
cutpoint.z += cutsize
progressUpdate (progress)
)
cutpoint.z += cutsize + offset
)
--y
if(btnSY.checked) do
(
cutpoint.y += cutsize + offset
while(cutpoint.y<s.max.y)do
(
progress += progresssteps
print progress
if keyboard.escPressed do exit()
pbProgress.value = progress
$.slice [0,1,0] (cutpoint-s.pos)
cutpoint.y += cutsize
progressUpdate (progress)
)
)
--x
if(btnSX.checked) do
(
cutpoint.x += cutsize + offset
while(cutpoint.x<s.max.x)do
(
progress += progresssteps
if keyboard.escPressed do exit()
pbProgress.value = progress
$.slice [1,0,0] (cutpoint-s.pos)
cutpoint.x += cutsize
progressUpdate (progress)
)
)
pbProgress.value = 0
if(btnKB.checked) do
(
/* $.EditablePoly.ConvertSelection #Object #Border
* temp = polyOp.getEdgeSelection $
* old = old - temp
*/
)
EnableSceneRedraw()
polyOp.SetEdgeSelection s old
subobjectLevel = 2
macros.run "PolyTools" "Loop"
--s.rotation = objectrot
-- s.pos = objectpos
d = $
subobjectLevel = 2
if(not btnKO.checked) do
(
macros.run "PolyTools" "Loop"
d.EditablePoly.ConvertSelection #Edge #Vertex
d.EditablePoly.Remove()
subobjectLevel = 1
d.EditablePoly.Remove()
)
if(btnWP.checked) do
(
d.EditablePoly.ConvertSelection #Object #Vertex
verts = polyOp.GetVertSelection d
weldtresh = cutsize - cutsize/2.0
d.weldThreshold = weldtresh
polyop.weldVertsByThreshold d verts
)
)
)
else
(
messagebox "Object has to be an editpoly"
EnableSceneRedraw()
)
)
on btndynamsh pressed do
(
try
(
Remesh()
)
catch
(
EnableSceneRedraw()
errorstringvariable = getCurrentException()
MessageBox errorstringvariable
)
)
)
createDialog remeshdialog
cui.RegisterDialogBar remeshdialog style:#(#cui_dock_left, #cui_floatable)