XSIforum.com

Script: csGlue

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

aiTOR

Re: Script: csGlue
« Respuesta #10 en: 09 Enero 2008, 07:27:57 »
Vaya, muchas gracias Cesar.

Re: Script: csGlue
« Respuesta #11 en: 16 Enero 2008, 16:23:21 »
Gracias por los comentarios, vengo llegando de una semanita de vacaciones y estube desconectado de la "ciber-vida", ahora cuando retome el script te contacto alan para ver si te sirve ;)

Re: Script: csGlue
« Respuesta #12 en: 18 Enero 2008, 00:58:23 »
Estube mirando y haciendo pruebas sobre la sugerencia de Alan y no es tan simple como pensaba, es decir... funciona pero se torna inestable, tendría que cambiar la forma en que funciona el script, sé conceptualmente como hacerlo pero no sé traducir todo lo que necesito a código, de momento queda anotado para más adelante.

eduardito

  • *****
  • 3064
  • hola holita
Re: Script: csGlue
« Respuesta #13 en: 30 Enero 2008, 12:46:17 »
Estube mirando y haciendo pruebas sobre la sugerencia de Alan y no es tan simple como pensaba, es decir... funciona pero se torna inestable, tendría que cambiar la forma en que funciona el script, sé conceptualmente como hacerlo pero no sé traducir todo lo que necesito a código, de momento queda anotado para más adelante.
si te puedo ayudar en algo en el codigo , me lo dices.

Re: Script: csGlue
« Respuesta #14 en: 01 Febrero 2008, 14:35:54 »
Gracias Eduardito :)

Te explico para que te hagas una idea, el tema es que actualmente el script crea un pequeño grid por cada objeto, ajusta ese grid a la superficie de referencia mediante un skinwrap, hace un cluster a ese grid mediante un Constraint object to cluster mete un null desde el cual finalmente se sacan las transformaciones para alinear los objetos uno por uno (luego elimina todos los grid "wrap" y los nulls).

Si lo quisiera mantener ligado a la superficie (como propuso Alan) supongo que debería crear un cluster a la superficie de referencia en un componente cercano a las coordenadas donde "calló" el null del skinwrap y luego hacer un object to cluster (un nuevo null que sería padre de cada objeto a distribuir) a ese cluster para mentener esa conexión viva entre objetos y superficies. Mi problema es que no sé como seleccionar el o los componentes más cercano a una coordenada específica, he visto muy poco de manipulacion de componentes mediante scripting y actualmente no sabría hacerlo :(

De paso actualizo el addon en el primer mensaje, actualmente no resetea el escalado y traté de limpiar código O0
« Última modificación: 01 Febrero 2008, 14:42:29 por César Sáez »

eduardito

  • *****
  • 3064
  • hola holita
Re: Script: csGlue
« Respuesta #15 en: 01 Febrero 2008, 16:06:56 »
podrias pasarme el codigo y me lo miro??

Re: Script: csGlue
« Respuesta #16 en: 01 Febrero 2008, 16:13:13 »
Si claro, te lo pego por aquí :)

Código: (JScript) [Seleccionar]
//===========================================
// csGlue! - v0.2
//
// Whats New v0.2:
// Now when 'Align with Normals' is on don't change
// the scale to 1, 1, 1.
//
//===========================================
//
// Description:
// This script aligns the pivot point of
// selected objects over the surface of
// other object.
//
// Ussage:
// Select the objects you want to 'glue' and
// use the 'Glue! button. Finally pick the base
// object to glue the objects to it.
//
// The 'Align with normals' checkbox make the
// objects follow the normal of surface.
//
// by César Sáez (cesarte@gmail.com)
//===========================================

csGlue();

function csGlue(){
var myCP = makeCP();
makePPG(myCP);
};

//============================
//       USER INTERFACE
//============================

function makeCP(){
var oRoot = Application.ActiveProject.ActiveScene.Root;
var myCP = oRoot.AddProperty("CustomProperty",false,"csGlue");
myCP.AddParameter3("normal",siBool,0,0,1,false,false);
InspectObj(myCP,null,null,3,null);
return myCP;
};

function makePPG(myCP){
var UI=myCP.PPGLayout;
UI.Clear();
UI.AddGroup("Options");
UI.AddItem("normal","Align with normals");
UI.EndGroup();
UI.AddRow();
UI.AddSpacer();
UI.AddButton("glue","Glue!");
UI.AddButton("cancel","Cancel");
UI.EndRow();
UI.Language = "JScript"
UI.Logic=glue_OnClicked.toString()+cancel_OnClicked.toString()+findFloor.toString()+rivet.toString()+align.toString()+closePPG.toString();
};

//============================
//           LOGIC
//============================

function glue_OnClicked(){
var log = GetValue("preferences.scripting.cmdlog");
SetValue("preferences.scripting.cmdlog", false, null);
var oSel = GetValue("SelectionList");
var myCP = PPG.Inspected(0);
var normal = myCP.normal;
if (oSel==null){
LogMessage("Select an objects!",siError);
closePPG(myCP);
return;
};
var oFloor = PickObject("Pick the floor");
oFloor = oFloor.item(2);
var oPos = findFloor(oSel,oFloor);
var oRivet = rivet(oPos);
align(oSel,oRivet,normal);
DeleteObj(oPos);
DeleteObj(oRivet);
closePPG(myCP);
SetValue("preferences.scripting.cmdlog", log, null);
};

function cancel_OnClicked(){
var myCP = PPG.Inspected(0);
closePPG(myCP);
};

function findFloor(oSel,oFloor){
var oPos = new ActiveXObject( "XSI.Collection" );
for (var i=0;i<oSel.Count;i++){
var oGrid = oFloor.AddGeometry("Grid", "MeshSurface", "Wrap"+i);
oGrid.subdivu.value = 1;
oGrid.subdivv.value = 1;
oGrid.ulength.value = 0.01;
oGrid.vlength.value = 0.01;
oGrid.Kinematics.Global.Transform = oSel(i).Kinematics.Global.Transform;
var sWrap = ApplyOperator ("ShrinkWrap", oGrid+";"+oFloor, null);
sWrap.proj.value=3;
sWrap.closestifnointer = true;
oPos.Add(oGrid);
};
return oPos;
};

function rivet(oPos){
var oRivet = new ActiveXObject( "XSI.Collection" );
for (var i=0; i<oPos.Count; i++){
var oNull = ActiveSceneRoot.AddNull("rivetNull");
var oPoly = oPos(i).ActivePrimitive.Geometry.Facets;
var subComponent = oPoly(0).subComponent;
var cnsCls = subComponent.CreateCluster("cnsCls");
var cns = oNull.Kinematics.AddConstraint("ObjectToCluster",cnsCls);
cns.tangent.value = 1;
cns.upvct_active.value = 1;
oRivet.Add(oNull);
};
return oRivet;
};

function align(oSel,oRivet,normal) {
for (var i=0;i<oSel.Count;i++) {
oSel(i).Kinematics.Global.posx.value = oRivet(i).Kinematics.Global.posx.value;
oSel(i).Kinematics.Global.posy.value = oRivet(i).Kinematics.Global.posy.value;
oSel(i).Kinematics.Global.posz.value = oRivet(i).Kinematics.Global.posz.value;
if (normal.value==true){
oSel(i).Kinematics.Global.rotx.value = oRivet(i).Kinematics.Global.rotx.value;
oSel(i).Kinematics.Global.roty.value = oRivet(i).Kinematics.Global.roty.value;
oSel(i).Kinematics.Global.rotz.value = oRivet(i).Kinematics.Global.rotz.value;
};
};
};

function closePPG(myCP){
DeleteObj(myCP);
PPG.close();
};

Re: Script: csGlue
« Respuesta #17 en: 27 Abril 2008, 13:43:06 »
Que buen trabajo Cesar.

Esto de que ayas pegado el codigo esta muy bien, para mi que estoy empezando con este mundillo y que me interesa lo de la programacion(de donde vengo).

Soy unos maquinas leches.

Se que no va relacionado con este tema pero ya que pasais por aqui,

Timidamente me atrevo a preguntar.

Yo vengo de la programacion de BBDD, HTML,Aplicaciones en C y C++

Como puedo adaptar mi pensamiento que siempre pensaba en matrices y usuarios y login y demas

a plantear programar pues esto un script o plugin para hacer algo en un entorno 3D.

Es decir, teoricamente tengo una base de programacion(entiendo todo lo que haces en el codigo que as pegado y pudiese haberlo escrito yo) pero no se por donde empezar ni nada.

Re: Script: csGlue
« Respuesta #18 en: 27 Abril 2008, 20:07:12 »
Hola Clybaun, muchas gracias por los comentarios :)

A mi me parece que teniendo la base que tienes no te va a resultar complicado, el pénsamiento lógico para llegar al algoritmo necesario ya lo tienes y lo que te falta es simplemente estudiar un poco el SDK (la ayuda de XSI en ese sentido es buenísima!) y comenzar a practicar con cosas simples.

En mi caso soy un simple intruso en todo esto, no tengo ni idea de programación y las cosillas que hago son cosas que todos podríamos hacer fácilmente si conocemos un poco el SDK de XSI. Según lo que comentas tienes una muy buena base para arrancar, te falta conocer el SDK del software y quizás (esto no sé si lo conoces) las herramientas del software para saber como harías eso "a mano" y luego recién pensar en como optimizarlo mediante scripting.

Confío que si te pones y con tu experiencia en un par de meses tendremos a otro scripter rondando por el foro y seguro crece el "departamento de tools" de XSIForum, espero que así sea! ;)

Mucha suerte! O0

Re: Script: csGlue
« Respuesta #19 en: 26 Agosto 2008, 14:24:16 »
Tuve que hacer un trabajo de unas burbujas que se adherian a una tela y necesitaba que  quedaran ahi ante el movimiento. Era una buena opcion.
Gracias.