XSIforum.com
Foros 3D => Autodesk Softimage => Rigging y Scripting => Mensaje iniciado por: surfaze en 06 Agosto 2008, 01:27:02
-
Hola,
En relación a la pregunta que os hice el otro día sobre un render a alta resolución y la posibilidad de renderizar en slices, he seguido investigando y creo que he llegado a buen puerto. Pero antes de mojarme, me gustaría probarlo en condiciones y presentaroslo como un script, pero de los buenos.
Para ello, necesitaría que el usuario pulsase sobre un botón y apareciese una pantalla donde introdujese los slices horizontales y verticales en los que quiere dividir el render. Otros dos slices, indicarían el slice (fila y columna) a renderizar. Por último, el usuario pulsaría un botón y se lanzaría el render de ese slice seleccionado. Ejemplo:
Número de columnas: 2 (Slide de 1 a 10)
Número de filas: 3 (Slide de 1 a 10)
Columna a renderizar: 1 (Slide de 1 a 2)
Fila a renderizar: 2 (Slide de 1 a 3)
Al cambiar el slide del Número de columnas de p.ej. de 2 a 4, el slide de Columna a renderizar pasará de permitir como mucho 2 columnas a permitir hasta 4.
La pregunta es ¿cómo se hace esta pantalla de selección? ¿Cómo la incorporo a un menú determinado de XSI?
Sé que es una pregunta muy abierta, sin embargo y aunque no he programado en XSI, soy programador de C#, JavaScript y Java entre otros, así que no tengo problema en aprender. Simplemente guiarme un poco para empezar... algún buen tutorial que conozcáis estaría de lujo.
Gracias. :D
-
En la ayuda de XSI (la del SDK) sale todo muy bien documentado y con ejemplos, es de las mejores referencias que te podría recomendar. Yo no tengo ni idea de programación y lo pude seguir asi que me imagino que no tendrás mayores problemas, busca por PPGLayout y vas a encontrar todo lo referente a interfaces dentro de un PPG O0
La forma de hacerlo a groso modo es crear un custom property (un PPG vacío) en alguna parte (en este caso el scene_root sería un buen lugar), luego agregarle los parámetros que necesites y luego redefinir una interface personalizada (PPGLayout). Prueba bajarte algún script con una interface simple para estudiar como está estructurado, a mi en su momento me sirvió mucho :)
Suerte!
-
Muchas gracias! :D Le echo un vistazo a lo que me comentas.
Recuerdas algún ejemplo concreto de script que pudiese estudiar?
-
Vale Cesar, no hace falta que me pases el ejemplo... acabo de descubrir los PPGdemos que vienen con el SDK. ;) Gracias de nuevo
-
Joder!!!!! si haces el scritp no te olvides de nosotros los mortales, pq al menos a mi me vendría de perlas.
;D
-
:D:D:D Por supuesto que no. Yo sin vosotros sabría la mitad de lo que sé de XSI. Si todo va bien espero tenerlo preparado para mañana.
-
Pues poco a poco lo voy sacando, pero me está costando un poco ya que la documentación de XSI no está tan bien como decía César. Si alguna vez habéis usado la MSDN de Microsoft o la ayuda contectual del Visual Studio sabréis a lo que me refiero.
-
Si te atascas con algo pregunta por acá y te trato de ayudar en lo que pueda :)
En que lenguaje estás scripteando? sólo por curiosidad.
-
Pues me he liado con el JScript...
Por ahora he montado el PPG como una Custom Property dentro de la raíz de la escena. Esta Custom Property (y su layout) la creo al pinchar sobre un menú que también me he creado dentro del menú de Render
Todo ello lo he creado como Plugin que al copiarse al directorio Plugin de XSI se crea sólito. Hasta aquí no ha habido demasiados problemas, salvo hasta ahora que me he atascado con una chorrada.
El problema es que cada vez que pulso en el menú que he creado en el Menú de Render, me vuelve a crear otra Custom Property con el mismo nombre, pero acabado en 1, 2, 3, etc. Esto no debería ser así, ya que no deja de ser una ventana donde seleccionamos los valores que queremos para luego tirar el render.
(http://www.fumpr.com/thumbs/bwy1218061090e.png) (http://www.fumpr.com/viewer.php?id=bwy1218061090e.png)
El código es:
var oCustomProperty = ActiveSceneRoot.AddProperty("CustomProperty", false, "RenderCrop" ) ;
Y para evitar lo que comento, he probado de todo sin éxito, como por ejemplo:
var oCustomProperty = ActiveSceneRoot.FindChild("RenderCrop");
if (oCustomProperty == null)
oCustomProperty = ActiveSceneRoot.AddProperty("CustomProperty", false, "RenderCrop" ) ;
Pero esto no funciona. Tampoco funciona:
var oCustomPropertyOld = ActiveSceneRoot.FindChild("RenderCrop");
if (oCustomPropertyOld != null)
DeleteObj("RenderCrop");
var oCustomProperty = ActiveSceneRoot.AddProperty("CustomProperty", false, "RenderCrop" ) ;
Ando un poco perdido ya que en los ejemplos que vienen con XSI de PPG (PPGDemos) los muy listos crean una escena nueva, antes de llamar al AddProperty.
Gracias de antemano... ;)
-
Igual estoy diciendo una tontería, pero si en el condicional pruebas a que busque por el nombre del la "property" ?
Primero de todo evaluas si existe una propiedad de nombre "RenderCrop". Si se cumple, sales del condicional. Si no existe, entonces creas la propiead con ese nombre.
var oCustomProperty = ActiveSceneRoot.FindChild("RenderCrop");
if("RenderCrop")
null;
else
oCustomProperty = ActiveSceneRoot.AddProperty("CustomProperty", false, "Renderrop");
-
Yo me hago una función que llamo como la última operación del script para que se autoelimine (si es que hace falta, como en este caso), es bastante simple :)
function closePPG(myCP){
DeleteObj(myCP);
PPG.close();
};
por myCP me refiero a la variable que contiene el Custom Property O0
Espero que sea de ayuda, suerte!
-
Muchas gracias por los comentarios. Ya he conseguí lo que me comentabáis, aunque resulta que una vez que lo hago, me doy cuenta de que es muy interesante no destruir el PPG y dejarlo en el Object Explorer, ya que almacena el número de filas y de columnas, así como el valor de la última celda renderizada. De otro modo, no lo alamacenaría y es un peñazo (cuando veais el script entenderéis a lo que me refiero).
Bueno, pues resulta que tengo el script prácticamente terminado, a falta de solucionar un problema que me está volviendo loco y que seguro que es una chorrada.
Resulta que desde un evento de pulsación de boton llamado RenderCrop_Apply_OnClicked() quiero llamar a una función llamada SetCrop() y que tengo definida más arriba. Pues bien al ejecutar en XSI me da un error apuntando a la línea donde llamo a la función diciendo que "se esperaba un objeto". Es como si desde el evento no viese la función que tengo definida más arriba ¿?
Podría copiar todo el código de la función dentro del evento, pero como se trata de aprender por qué me da este error, por eso lo pregunto. :)
-
Ya te puedes dar prisa con tu plugin, porque XSI 7 trae una herramienta para hacer slice image xDDDDDDD
-
Ya te puedes dar prisa con tu plugin, porque XSI 7 trae una herramienta para hacer slice image xDDDDDDD
Donde? ???
-
mmm... la función SetCrop() se la estás asignando a una variable??? ('var mycrop = SetCrop();' ? )
Retorna algo la función? quizás no tiene un 'return *algo*' y no sabe que asignar a la hipotética variable mycrop.
Por otro lado... la funcion que elimina el ppg yo la llamaba al final de todo, es lo último que hace, el PPG puede servir perfectamente como un almacenador de variables (puedes tener parameters no expuestos en el PPG que sirven muy bien para guardar cosas útiles durante la ejecución). Seguro que no te digo nada nuevo y no lo autoeliminas por la forma en que funciona tu script, cada script es un mundillo :)
-
Jejeje, de hecho en la versión 6 ya existe algo parecido a un slice y que es lo que estoy utilizando en mi script. Cuando lo publique (que espero que sea mañana) os explico todo.
César, no lo asigno a nada y por tanto no hago un return... es algo raro. Por ahora lo pongo dentro del function y cuando librere el código le echas un vistazo y me dices. :-)
Aprovecho para una última duda. Me acabo de dar cuenta de que cuando le digo que mi imagen tendrá (por ejemplo) 2 filas por 2 columnas y luego tengo que seleccionar la celda a renderizar no hay ningún problema ya que en los campos de fila y columna a renderizar pongo menor valor permitido 1, mayor valor permitido 2.
El problema viene cuando le digo que mi imagen tendrá (por ejemplo) 1 fila por 2 columnas. En este caso el campo fila a renderizar deberá tener un valor mínimo permitido a 1 y un valor máximo permitido de 1. Esto al usar la función
EditParameterDefinition( PPG.setSelectedRow, null, null, Min, Max, MinUI, MaxUI ) ;
Me da un error ya que Min, Max, MinUI y MaxUI valen todos 1 y por lo visto los valores Max deben ser mayores que los Min. ¿Entonces como hago para controlar que no me metan nada distinto a un 1?
Gracias de nuevo
-
Por cierto he probado a poner el atributo siUINoSlider a true para que el control no sea de tipo Slilder sino de campo de texto numérico, y también me da error.
-
El problema viene cuando le digo que mi imagen tendrá (por ejemplo) 1 fila por 2 columnas. En este caso el campo fila a renderizar deberá tener un valor mínimo permitido a 1 y un valor máximo permitido de 1. Esto al usar la función
EditParameterDefinition( PPG.setSelectedRow, null, null, Min, Max, MinUI, MaxUI ) ;
Me da un error ya que Min, Max, MinUI y MaxUI valen todos 1 y por lo visto los valores Max deben ser mayores que los Min. ¿Entonces como hago para controlar que no me metan nada distinto a un 1?
No sé si entendí bien pero si el único valor posible en ese caso es 1 para que pedírselo al usuario? yo en tu lugar lo setearía manualmente a 1 con el script y redibujaría el PPGLayout sin el campo o bien (y más simple) lo congelaría para que no fuera editable ('parametro.ReadOnly = True') :)
Si el usuario sólo puede elegir una opción no tiene mucho sentido preguntársela :)
-
Por cierto he probado a poner el atributo siUINoSlider a true para que el control no sea de tipo Slilder sino de campo de texto numérico, y también me da error.
Por acá funciona perfecto, quizás el atributo no lo estás estableciendo con SetAttribute, prueba algo asi:
PPGItem.SetAttribute(siUINoSlider, True);
donde PPGItem es el item en tu PPGLayout O0
-
Muchas gracias.
Lo de deshabilitar el campo y aisgnarle el valor que debe tomar es la mejor opción sin duda.