Render.ru

Нужен скрипт или содействие в его создании

$[]uL aka2man

Пользователь сайта
Рейтинг
2
#1
В общем ситуация такая, есть огромное количество замкнутых сплайнов, некоторые из них могут содержать вложенные сплайны (сплайн (контур), а внутри него еще один приатаченный сплайн).
Задача следующая:
1. Все контуры которые имеют площадь меньше, чем заданное мной пороговое значение S1 - выдавливаются на высоту h1
2. Все остальные выдавливаются пропорционально. Т.е. есть два высотных значения h2 и h3. Чем больше площадь контура, тем наиболее она приближена к высоте h3. Ну и соответсвенно, чем меньше, тем наиболее она становится приближенной к h2. Но при этом контуры с площадью S1 уже игнорируются.

Огромное спасибо за любую предоставленную помощь!!! )))
 
Рейтинг
31
#2
Примерно так, если в арифметике не ошибся:
Код:
--
-- 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
 
Сверху