Hola a todos. He creado el siguiente script que sirve para lo siguiente.
Supongamos que estamos modelando la mitad de un coche (ahorraros las críticas, el que he puesto de ejemplo no está terminado
) y al duplicarlo resulta que en la juntura aparecen las dichosas crestas o valles que arruinan el modelo. Por ejemplo:
Se puede observar que en la parte central hay una cresta muy fea debido a que los vertices que componen las aristas del "parallel edge loop" central no están alineados.
Pues bien, seleccionamos la mitad original. Seleccionamos el "parallel edge loop" central:
y aplicamos el script, alineando en YZ (ya que el modelo se extiende a lo largo del eje Z):
Y este es el resultado:
Como veis no crestas, no valles... un resultado perfecto y en cuestión de segundos!!!!
Bueno y este es el script para que lo podáis utilizar:
' ==============================================================
' 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
LogMessage oSel & " is a " & oSel.Type
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 objeto seleccionado
' Obtenemos el nombre del objeto padre
parentObject = oSelection(i).Subcomponent.Parent3DObject.Name
LogMessage parentObject
' Obtenemos las aristas seleccionadas
set subComponent = oSelection(i).SubComponent
LogMessage subComponent
IndicesAristas = subComponent.ElementArray
for j=0 to Ubound(IndicesAristas)
set oSegment = oSelection(i).subcomponent.Parent3DObject.activePrimitive.geometry.segments(indicesAristas(j))
LogMessage "Procesando arista: " & oSegment.Index
LogMessage "Procesando vertice: " & oSegment.Points(0).Index
set p = oSelection(i).subcomponent.Parent3DObject.activePrimitive.geometry.points(oSegment.Points(0).Index)
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
LogMessage "Procesando vertice: " & oSegment.Points(1).Index
if alignDirection =0 then
translate parentObject & ".pnt[" &oSegment.Points(1).Index& "]" , xPos , yPos , zPos, siAbsolute,, siObj, siXY
elseif alignDirection =1 then
translate parentObject & ".pnt[" &oSegment.Points(1).Index& "]" , xPos , yPos , zPos, siAbsolute,, siObj, siXZ
elseif alignDirection =2 then
translate parentObject & ".pnt[" &oSegment.Points(1).Index& "]" , xPos , yPos , zPos, siAbsolute,, siObj, siYZ
end if
next
next
end ifComo siempre, espero comentarios y mejoras.
Saludos