XSIforum.com
Foros 3D => Autodesk Softimage => Rigging y Scripting => Mensaje iniciado por: Adam Sullastres en 12 Noviembre 2008, 19:52:23
-
Hola otra vez,
A ver si algún alma caritativa m explica como podría formatear el output de un "selectobj"
Veréis, el temas es q necesito el nombre de los objetos q tienen un determinado material y con el XSI 5 no hay un selectbymaterial ni nah por el estilo, el output de un pickobject o selectobj es NombreOBJ.Material
Alguien sabría decirme como guardo en una variable el NombreOBJ sin el .Material?
Seguro q es fácil pero como no tengo ni pijotera idea solo hago q ir dando tumbos por el SDK como un mono en un circo.
-
No sé si entiendo bien, quieres los nombres de los objetos que usan un determinado material? Quieres obtener el nombre del material que tiene aplicado un objeto?
Para lo primero prueba con algo como esto (jscript), la forma de uso sería seleccionar el material y ejecutar el script:
function findByMaterial(currentMaterial)
{
var oObj = new ActiveXObject( "XSI.Collection" );
var oRoot = Application.ActiveProject.ActiveScene.Root;
var allObjects = oRoot.FindChildren("*");
for ( var i=0 ; i<allObjects.count ; i++)
{
if (ClassName(allObjects(i)) == "X3DObject")
{
if (allObjects(i).material.name == currentMaterial) oObj.Add(allObjects(i));
}
}
return(oObj);
}
LogMessage(findByMaterial(selection(0)));
Si sólo quieres el nombre del material de un objeto sería objeto.material.name.
Salu2 O0
-
mmmmm si quiero justo eso, seleccionar los objetos q tienen un determinado material, pero seleccionando un material "n" de mi escena y corriendo tu script no m devuelve nada, y parece q esta todo bien, sera cosa de la 5?
-
d momento tengo esto
' Seteando VBScript como Lenguaje de Scripting y y un par de cosillas mas
SetValue "preferences.scripting.language", "VB Script Language"
Application.LogMessage "Version de XSI "&Application.Version & "y esto esta pensado para la 5.1"
DeselectAll
' Declarando Contador
dim gCounter
gCounter = 0
' Llamada a rutina
rSickAllMat
' Rutina de busqueda de materiales no destructiva
sub rSickAllMat
' Crear Coleccion de materiales de la escena
dim oMats, m
set oMats = CreateObject ( "XSI.Collection" )
SIGetAllNodeMaterial ActiveSceneRoot, oMats
' Imprimir Lista de mayteriales + total
LogMessage "-----> Hay (" & gCounter & ") materiales"
for each m in oMats
LogMessage "Material " & m
next
end sub
' Inspeccionar cada nodo y anyadir su material, si lo tiene, a la coleccion
sub SIGetAllNodeMaterial( in_Obj, byref io_materials )
' Obtener propiedades y repetir
dim oProp, p
set oProp = in_Obj.Properties
for each p in oProp
if TypeName(p) = "Material" Then
' Descartando lo q no sean materiales
if Not p.Branch then
' Anyade a la coleccion y suma 1 al counter
gCounter = gCounter + 1
io_materials.Add p
end if
end if
next
' Llama a SIGetAllNodeMaterial una y otra vez hasta q no haya mas Child
dim oChild, c
set oChild = in_Obj.FindChildren
for each c in oChild
SIGetAllNodeMaterial c, io_materials
next
end sub
' Crear grupos de seleccion a partir de el output
' p.e. todos los objetos q tengan .qwer en un grupo q se llame OBJCon_qwer
' el tema es q "*.qwer" es el material no el objeto3D
-
Se m ocurre q podría hacer otra lista con los objetos y comparar las 2, creando grupos según coincidencias :\
Algo rollo esto
SetValue "preferences.scripting.language", "VB Script Language"
Application.LogMessage "Version de XSI "&Application.Version
DeselectAll
set oChismesCollection = ActiveSceneRoot.FindChildren ( ,siPolyMeshType,, true )
logmessage "La escena cotiene " & oChismesCollection.count & " Chismes"
for i = 0 to oChismesCollection.count - 1
oChismeNum = oChismeNum + 1
set oChisme = oChismesCollection.Item( i )
PrintChismesInfo oChisme
next
sub PrintChismesInfo( in_obj )
dim oChisme
set oChisme = in_obj
logmessage "Chisme Numero: " & oChismeNum & " Nombre del Chisme: " & oChisme
Application.LogMessage oChisme.Parent.Name
end sub
y despues comparar las listas :S M va a etallar la olla @(
-
Ah! lo del parent name es pa otra cosa
-
Ejecutaste el script usando jscript? quizás lo tienes en vbscript y por ende no lo sabe interpretar, no creo que sea cosa de la 5 porque todo lo que hace es muy estándar.
Por cierto, el setValue que usas al principio de tus scripts para cambiar el lenguaje de scripting a vbscript está escrito en vbscript, es decir, si usas otro lenguaje no sabrá interpretar esa primera linea y dará error :)
-
Con JS, si.
po es verdad, a ver como lo hago pa hacer el set de VB o JS en VS y JS al mismo tiempo.
-
he visto q hay una historia para saber q objeto tiene q material a ver si con eso lo hago, pero ya pa mañana o pasado, el tema es leer los materiales de la librería de materiales en lugar de sacarla de los objetos, fijaos:
set oScena = Application.ActiveProject.ActiveScene
set oLibMaterial = oScena.ActiveMaterialLibrary
set oMateriales= oLibMaterial.Items
'set oO
for i = 0 to oMateriales.count - 1
set oMat = oMateriales( i )
Application.LogMessage "La libreria de materiales " & oLibMaterial.name & "tiene el material " & oMat.name
' Application.LogMessage
next
-
Por eso hice el primer script como función, de esta manera agregando un par de lineas lo puedes usar en distintos contextos, por ejemplo para listar los objetos que usan cada material de la librería de materiales activa podría ser algo asi O0
function findByMaterial(currentMaterial)
{
var oObj = new ActiveXObject( "XSI.Collection" );
var oRoot = Application.ActiveProject.ActiveScene.Root;
var allObjects = oRoot.FindChildren("*");
for ( var i=0 ; i<allObjects.count ; i++)
{
if (ClassName(allObjects(i)) == "X3DObject")
{
if (allObjects(i).material.name == currentMaterial.name) oObj.Add(allObjects(i));
}
}
return(oObj);
}
var oLibMaterial = ActiveProject.ActiveScene.ActiveMaterialLibrary;
var oMaterials= oLibMaterial.Items;
for (var i=0 ; i<oMaterials.count ; i++)
{
logMessage("Material: " + oMaterials(i).name);
logMessage("Objects using it: " + findByMaterial(oMaterials(i)));
logMessage("---------------------");
}
-
César, q grande eres !!!
-
Ara m dicen q nos pasamos a la 6 o la 6.5 q ya lo trae de serie ¬¬'