I hope that you have tested the script and with give settings it works for you.
Here is the same script that works with no UI.
/*
Detach by Material ID
Version: 2
by Jefferson Lim
Terabye Inc./ Shirogumi Inc.
[features]
Detach Polygons based on its Material ID
- works on a selection of objects
- Options to name detached objects
- material propagation
- this will assign a corresponding material by id to the detached object
[usage]
1. select any number of objects
2. set the desired paramteters
3. optional: if you know the maximun number of ids the object has
set the Max IDs to help speed up detachment.
4. press detach
[Internal Operations]
Procedure:
- object[s] is/are copied
- then collapsed to an editable poly
- faces are finally detached by material ID
Naming:
- "Numbered"
- will creae numbered names
- e.g. 0,1,2,3
- preferable to use with the Prefix option checked
- "Bitmap Name"
- if not diffuse bitmap found, it will use the material name
- if no material applied, it will use the object's name
- "Material Name"
- if no material applied, it will use the object's name
- "Object Name"
- will create a unique name based on the object's name
*/
-- try(destroyDialog detachByID)catch()
-- rollout detachByID "Detach by ID" width:140 height:250
(
local name_type = 2
local the_polyobj
local ran_color = true
local the_name
local the_mat_arr = #()
local id_list = #()
-- label lbl_maxids "Max IDs:" pos:[10,190] width:55 height:15
-- GroupBox grp_naming "Naming: " pos:[5,0] width:130 height:125
-- GroupBox grp_prefix "" pos:[5,75] width:130 height:50
-- GroupBox grp_ops "Options:" pos:[5,125] width:130 height:90
-- radiobuttons rb_naming "" pos:[10,15] width:107 height:64 enabled:true labels:#("Object Name", "Material Name", "Bitmap Name", "Numbered") default:2 columns:1
-- checkbox chk_prefix "Use Prefix" pos:[10,85] width:70 height:15 checked:false
-- edittext edt_prefix "" pos:[5,100] width:125
-- checkbox chk_prop "Propagate Materials" pos:[10,140] width:120 height:15 checked:true
-- checkbox btn_del "Delete Original" pos:[10,155] width:120 height:15 checked:true
-- checkbox chk_rancolor "Random Wire Colors" pos:[10,170] width:120 height:15 checked:true
-- spinner spn_maxids "" pos:[70,190] width:60 height:16 range:[0,99,99] type:#integer scale:0.05
local maxIds = 99
-- button detach_bot "DETACH" pos:[5,220] width:130 height:25
fn getMaterialIDs obj =
(
id_arr = #()
-- for i in 1 to spn_maxids.value do
for i in 1 to maxIds do
(
obj.selectByMaterial i
the_faces = getFaceSelection obj
if (the_faces as array).count != 0 do
(
append id_arr i
)
)
id_arr
)
fn getMatTextureName mat =
(
local the_map_name = the_polyobj.name
try
(
bmp = mat.diffusemap
if classof bmp == Bitmaptexture then
(
the_mapfile = mat.diffuseMap.bitmap.filename
the_map_name = getFileNameFile the_mapfile
)
else
(
the_map_name = mat.name
)
)
catch()
the_map_name
)
-- on rb_naming changed val do
-- (
-- name_type = val
-- the_name = edt_prefix.text
-- )
-- on edt_prefix entered txt do
-- (
-- the_name = txt
-- )
-- on chk_rancolor changed val do
-- (
-- ran_color = val
-- )
-- on detach_bot pressed do
-- (
undo "Detach by ID" on
(
the_sel = selection as array
if the_sel.count != 0 do
(
for obj in the_sel where \
superclassof obj == GeometryClass and \
obj.material != undefined do
(
try(convertToPoly obj)catch(exit; print "DetacByID: Error Occured on Object Conversion")
the_orig = obj
the_polyobj = copy the_orig
the_mat = obj.material
id_count = the_mat.numSubs
id_list = getMaterialIDs the_polyobj
-- start detaching
for i in id_list do
(
the_polyobj.selectByMaterial i
the_faces = getFaceSelection the_polyobj
case name_type of
(
1: the_name = uniquename (the_polyobj.name)
2: the_name = uniquename (the_mat[i].name)
3: the_name = uniquename (getMatTextureName the_mat[i])
4: the_name = uniquename the_name
)
-- if chk_prefix.checked do the_name = edt_prefix.text + the_name
polyOp.detachFaces the_polyobj the_faces asnode:true name:the_name
theDetachedObj = (getnodebyname the_name)
if isValidNode theDetachedObj do
(
/* if chk_prop.checked do */theDetachedObj.material = the_mat[i]
if ran_color do theDetachedObj.wirecolor = random black white
)
)-- end detach loop
/* if btn_del.checked do */delete the_orig
)-- end object check loop
)-- end selection loop
)-- end Undo
-- )-- end button press
)
-- createDialog detachByID style:#(#style_sysmenu,#style_toolwindow)
/*
[2.0]
2008-12-09
- added material propagation
- faster detachment procedure
- old script was looping through every face to look for IDs
- the new procedure will only search thru the <Max IDs> set by the user
- cleaned up code
- reworked UI
[1.0]
2005-05-24
- initial public release
[to do]
- make a more intuitive naming option
- save settings to ini file
- add progress bar
[notes]
- script request by Eye of Hawk (CGTalk)
- "Propagate Materials" feature request by titane357 (scriptspot)
*/