Hola a todos. Estoy haciendo mis primeros pinitos con el scripting de XSI y me estoy volviendo loco
La idea es solucionar aquellos modelos poligonales simétricos en los que al duplicar una mitad quedan pequeñas crestas o valles justo en la juntura de las dos mitades (sobre todo tras utilizar la Proportional Modeling tool) y que son debidas simplemente a que las coordenadas YZ (en caso de tener alineado el modelo a lo largo del eje Z) son distintas para los dos puntos que forman cada una de las aristas del "parallel edge loop" central. Ver imagen adjunta.
Un script que permitiera igualar dichas coordenadas para cada una de las aristas centrales (preseleccionadas antes de ejecutar el script) de un modelo dado solucionaría este problema en 10 segundos.
A ver si con una ayudita puedo acabarlo y ponerlo a disposición de todos vosotros. Conozco muy bien el lenguaje VBScript, lo que no conozco tan bien es el modelo de objetos de XSI.
Ahí va el script que he hecho por ahora.
El principal problema es que no tengo ni idea de como seleccionar los dos vértices que componen cada arista (he probado de todo y siempre me da error) para luego alinearlos.
===========================================================================
' Script para el alineado de aristas. Por Moebius4u.5 de Enero de 2006
' ===========================================================================
' Muy útil en las aristas centrales de un modelo poligonal simétrico, previo
' a la realización de la simetría. Evita crestas o valles en el centro del
' modelo.
' ===========================================================================
SonAristas = true
For Each oSel in Application.Selection
if oSel.Type <> "edgeSubComponent" then
SonAristas = false
end if
Next
if SonAristas = false then
logMessage "Atención: Este script sólo funciona con aristas"
else
set xsiDial = createObject("xsidial.xsidialog")
alignDirection = xsidial.combo("¿En que dirección (global) quiere alinear los vertices de cada arista?", array("xy", "xz", "yz"))
set oSelection = Application.Selection
for i = 0 to (oSelection.Count - 1) ' Para cada arista...
' Obtenemos el nombre del objeto padre
parentObject = oSelection(i).Subcomponent.Parent3DObject.Name
' Obtenemos los vertices que la forman
set subComponent = oSelection(i).SubComponent
selectedIndices = subComponent.ElementArray
set p = oSelection(i).subcomponent.Parent3DObject.activePrimitive.geometry.points(selectedIndices(0))
set parentObjSpace = oSelection(i).subComponent.Parent3DObject.Kinematics.Local.Transform
set oGlobalPos = XSIMath.MapObjectPositionToWorldSpace(parentObjSpace , p.position)
xPos = oGlobalPos.x
yPos = oGlobalPos.y
zPos = oGlobalPos.z
if alignDirection =0 then
translate parentObject & ".pnt[" &selectedIndices(1)& "]" , xPos , yPos , zPos, siAbsolute,, siObj, siXY
elseif alignDirection =1 then
translate parentObject & ".pnt[" &selectedIndices(1)& "]" , xPos , yPos , zPos, siAbsolute,, siObj, siXZ
elseif alignDirection =2 then
translate parentObject & ".pnt[" &selectedIndices(1)& "]" , xPos , yPos , zPos, siAbsolute,, siObj, siYZ
end if
next
end ifEl resultado (erroneo) de ejecutar este script es que coge el vértice cuyo número es igual a la segunda arista seleccionada y lo mueve a la posición de una de las aristas seleccionadas.
No sé que he hecho pero es un desastre...
Gracias por adelantado. Saludos.