XSIforum.com

formatear el output de un comando

0 Usuarios y 1 Visitante están viendo este tema.

Adam Sullastres

  • *****
  • 2713
  • Mercenario del 3D
formatear el output de un comando
« 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.

Re: formatear el output de un comando
« Respuesta #1 en: 12 Noviembre 2008, 22:16:07 »
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:
Código: [Seleccionar]
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
« Última modificación: 13 Noviembre 2008, 00:49:41 por César Sáez »

Adam Sullastres

  • *****
  • 2713
  • Mercenario del 3D
Re: formatear el output de un comando
« Respuesta #2 en: 13 Noviembre 2008, 11:20:08 »
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?

Adam Sullastres

  • *****
  • 2713
  • Mercenario del 3D
Re: formatear el output de un comando
« Respuesta #3 en: 13 Noviembre 2008, 11:33:14 »
d momento tengo esto
Código: [Seleccionar]
' 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

Adam Sullastres

  • *****
  • 2713
  • Mercenario del 3D
Re: formatear el output de un comando
« Respuesta #4 en: 13 Noviembre 2008, 11:35:28 »
Se m ocurre q podría hacer otra lista con los objetos y comparar las 2, creando grupos según coincidencias :\
Algo rollo esto
Código: [Seleccionar]

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 @(

Adam Sullastres

  • *****
  • 2713
  • Mercenario del 3D
Re: formatear el output de un comando
« Respuesta #5 en: 13 Noviembre 2008, 11:39:08 »
Ah! lo del parent name es pa otra cosa

Re: formatear el output de un comando
« Respuesta #6 en: 13 Noviembre 2008, 15:39:20 »
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 :)

Adam Sullastres

  • *****
  • 2713
  • Mercenario del 3D
Re: formatear el output de un comando
« Respuesta #7 en: 13 Noviembre 2008, 19:10:33 »
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.

Adam Sullastres

  • *****
  • 2713
  • Mercenario del 3D
Re: formatear el output de un comando
« Respuesta #8 en: 13 Noviembre 2008, 19:12:53 »
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:

Código: [Seleccionar]
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

Re: formatear el output de un comando
« Respuesta #9 en: 13 Noviembre 2008, 22:09:02 »
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

Código: (JScript) [Seleccionar]
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("---------------------");
}