--
-- smartExtruder by Black Sphinx
--
rollout smartExtruderRollout "smartExtruder" width:160 height:208
(
checkbox chkSelOnly "Selected only" pos:[8,8] width:144 height:16 checked:false
groupBox grp1 "Low Area Params" pos:[8,32] width:144 height:64
spinner spnLATresh "Treshold " pos:[24,48] width:120 height:16 range:[0,1000,0]
spinner spnLAExtr "Extrude " pos:[24,72] width:120 height:16 range:[0,1000,1] type: #worldunits
groupBox grp2 "Order Area Params" pos:[8,104] width:144 height:64
spinner spnExtrL "Extrude low " pos:[23,120] width:121 height:16 range:[0,1000,1] type: #worldunits
spinner spnExtrH "Extrude high " pos:[24,144] width:120 height:16 range:[0,10000,1] type: #worldunits
button btnOk "Banzai" pos:[8,176] width:144 height:16
/*
Calculation of shape area.
*/
fn shapeArea sh = (
-- copy shape and convert it to mesh
obj = copy sh
convertToMesh obj
local total_area = 0
-- calculate area as sum of all faces of mesh
for f = 1 to obj.numfaces do (
total_area = total_area + meshop.getFaceArea obj #{f}
)
delete obj -- delete temporary object
total_area
)
struct ShapeParam (o, ar)
-- o - refernce to object (shape)
-- ar - shape area
on btnOk pressed do (
local objSet
if chkSelOnly.checked then
objSet = selection
else
objSet = shapes
local shapesArr = #()
local max_area = -1
local min_area = 10.0^38
-- precomputation pass:
-- for all shapes calculate area and stored with object reference in array
-- find min and max shape areas
for obj in objSet where isShapeObject obj do (
sp = ShapeParam o:obj ar:(shapeArea obj)
append shapesArr sp
if max_area < sp.ar do
max_area = sp.ar
if min_area > sp.ar and sp.ar >= spnLATresh.value do
min_area = sp.ar
)
-- precomputation scale factor
local rate = (spnExtrH.value - spnExtrL.value) / (max_area - min_area)
format "h2 = %\th1 = %\tmin = %\tmax = %\trate = %\n" spnExtrH.value spnExtrL.value min_area max_area rate
-- create Extrude modifier for shapes that area is less then specified treshold
-- this modifier will apply to shapes as inctance
local modExtrLA = Extrude amount:spnLAExtr.value
local amount
undo "smartExtrude" on (
for sp in shapesArr do (
if sp.ar < spnLATresh.value then
-- for small areas
addModifier sp.o modExtrLA -- add Extrude modifier as instance
else (
-- for large areas
amount = (sp.ar - min_area) * rate + spnExtrL.value -- calculate amount for Extrude
format "ar = %\tamount = %\n" sp.ar amount
addModifier sp.o (Extrude amount:amount) -- add unique Extrude to shape
)
)
) -- undo
)
)
CreateDialog smartExtruderRollout