В общем ситуация такая, есть огромное количество замкнутых сплайнов, некоторые из них могут содержать вложенные сплайны (сплайн (контур), а внутри него еще один приатаченный сплайн).
Задача следующая:
1. Все контуры которые имеют площадь меньше, чем заданное мной пороговое значение S1 - выдавливаются на высоту h1
2. Все остальные выдавливаются пропорционально. Т.е. есть два высотных значения h2 и h3. Чем больше площадь контура, тем наиболее она приближена к высоте h3. Ну и соответсвенно, чем меньше, тем наиболее она становится приближенной к h2. Но при этом контуры с площадью S1 уже игнорируются.
Огромное спасибо за любую предоставленную помощь!!! )))
--
-- 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
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
$[]uL aka2man
Задача следующая:
1. Все контуры которые имеют площадь меньше, чем заданное мной пороговое значение S1 - выдавливаются на высоту h1
2. Все остальные выдавливаются пропорционально. Т.е. есть два высотных значения h2 и h3. Чем больше площадь контура, тем наиболее она приближена к высоте h3. Ну и соответсвенно, чем меньше, тем наиболее она становится приближенной к h2. Но при этом контуры с площадью S1 уже игнорируются.
Огромное спасибо за любую предоставленную помощь!!! )))
Sphinx Black (Black Sphinx)
-- -- 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 smartExtruderRolloutSphinx Black (Black Sphinx)
Нормально отформатированная версия здесь. Будут храниться минимум до 4 июня 2013 года.