'###########################################################################
#####
'NAME: Add Null To Point v2.0
'AUTHOR: Olivier Ozoux <olivi...@softimage.com>
'LAST MODIFIED: 2001-05-22
'
'v2.0 is a complete rewrite using the Object Model where possible
'
'INSTALL
'
'1. Copy the SPDL file:
'       {5CD342AD-2FB1-4646-9D14-3E82C805177D}.spdl
'       to the spdl directory of XSI (for example):
'       C:\Softimage\XSI_1.5\Application\spdl
'
'2. Copy the Preset file:
'       AddNullToPointDialog.Preset
'       to the Preset Property directory of XSI (for example):
'       D:\Softimage\XSI_1.5\DSPresets\Properties
'
'3. Restart XSI
'
'4. Run the Script or Create a Command/Button on a toolbar
'       
'
'This tool will create a single Null for each point of the selected
object(s).
'(you can also select a point cluster, or tag points). Then based on the
dialog
'choice, it will either Constrain the Null to the Point using Object to
Cluster
'constraint, or Deform the point to the Null with a Cluster Center operator.
'
'-Olivier Ozoux
'###########################################################################
####
Option Explicit


AddNullToPointProc


'---------'---------'---------'---------'---------'---------'---------'-----
----
sub AddNullToPointProc()
'---------'---------'---------'---------'---------'---------'---------'-----
----
        Dim oSel, Name, Parent, Mode, oDialog
        
        'Create the dialog
        set oDialog = CreateUIDialog
        On Error Resume Next
        InspectObj oDialog,,,4
        if Err.Number = 0 then
                On Error Goto 0
                'Read the dialog values
                Mode = oDialog.parameters("CnsType").value
                Name = oDialog.parameters("NullName").value
                Parent = oDialog.parameters("ParentObj").value
                'loop over the selection
                for each oSel in selection
                        addNullToPoint oSel, Mode,Name,Parent 
                next
        end if

        'Cleanup
        DeleteObj oDialog
end sub

'---------'---------'---------'---------'---------'---------'---------'-----
----
function CreateUIDialog()
'---------'---------'---------'---------'---------'---------'---------'-----
----
        Dim oRoot, oDialog, oParam

        set oRoot = ActiveProject.ActiveScene.Root
        On Error Resume Next
        'Try to load the edited dialog first
        set oDialog =
oRoot.AddProperty("AddNullToPointDialog",,"AddNullToPoint")
        if Err.Number <> 0 then
                'Build a custom dialog
                set oDialog =
oRoot.AddProperty("Custom_Parameter_List",,"AddNullToPoint")
                set oParam = oDialog.AddParameter("CnsType", siInt4,,4,,
"Constrain Type", , 0, 0, 1)
                set oParam = oDialog.AddParameter("NullName",
siString,,4,,"Null Names",,"<name>_Null")
                set oParam = oDialog.AddParameter("ParentObj",
siBool,,4,,"Parent Nulls ",,TRUE)
        end if
        
        oDialog.parameters("NullName").Value = "<obj>_pnt"
        'Return the Dialog Object
        set CreateUIDialog = oDialog 
end function



'---------'---------'---------'---------'---------'---------'---------'-----
----
sub addNullToPoint(oSel, Mode, Name, Parent)
'---------'---------'---------'---------'---------'---------'---------'-----
----
        Dim oRoot, oGeom, oPoints, oCls, oNull
        Dim aTmp(), i, aIndex, tmp, pntName
        
        'There are 3 cases we support
        '1 oSel is a Geometry object (poly,srf,curve)
        '2 oSel is a tagged selection
        '3 oSel is a point Cluster

        set oRoot = ActiveProject.ActiveScene.root
        'First Case
        if oSel.type = "polymsh"_
                Or oSel.type = "surfmsh"_
                Or oSel.type = "crvlist" then
                
                set oGeom = oSel.ActivePrimitive.Geometry
                set oPoints = oGeom.Points

                'Create a 1:1 index array
                redim aTmp(oPoints.count -1)
                for i=0 to oPoints.count -1
                        aTmp(i) = i
                next
                aIndex = aTmp

        'Second Case    
        elseif oSel.type = "pntSubComponent" then
        
                'this is a tag selection.
                aIndex = oSel.subelements
                
                'Workaround to get the object from the selection
                        tmp = split(oSel, ".")
                        if ubound(tmp) = 2 then
                                'under a model
                                oSel =  tmp(0) & "." & tmp(1)
                        else
                                'under the scene_root
                                oSel = tmp(0)
                        end if
                        set oSel = getvalue(oSel)
                        
                if oSel.type = "polymsh"_
                        Or oSel.type = "polymsh"_
                        Or oSel.type = "surfmsh"_
                        Or oSel.type = "crvlist" then
                        set oGeom = oSel.ActivePrimitive.Geometry
                        set oPoints = oGeom.Points
                else
                        logmessage "Not a valid Geometry!"
                        exit sub
                end if
        
        'Third Case
        elseif oSel.type = "pnt" then

                'It's a Point Cluster
                aIndex = oSel.Elements.Array
                set oGeom = oSel.Parent
                
                'workaround to get the object from the cluster
                        tmp = split(oSel, ".")
                        if ubound(tmp) = 4 then
                                'under a model
                                oSel =  tmp(0) & "." & tmp(1)
                        else
                                'under the scene_root
                                oSel = tmp(0)
                        end if
                        set oSel = getvalue(oSel)
                
                set oPoints = oGeom.Points
        else
                logmessage "Not a Geometry!"
                exit sub
        end if
        
        'Mangle a name together, replacing <obj> with the real name of the
object.
        pntName = Replace(Name, "<obj>", oSel.name)

        'Start going thru the points in the index
        for i=0 to uBound(aIndex)

                'Create a Cluster with that point
                set oCls = oGeom.addCluster( "pnt", "pnt" & aIndex(i),
array(aIndex(i)) )
                
                'Create a Null
                set oNull = oSel.AddNull( pntName & aIndex(i) )

                Select Case Mode
                        Case 0 'Null to Point
                                'Constrain the Null to the Cluster
                                oNull.Kinematics.AddConstraint
"ObjectToCluster", oCls, False

                        Case 1 'Point to Null
                                'Move the Null in position
        
oNull.kinematics.local.parameters("posx").value =
oPoints(aIndex(i)).position.x
        
oNull.kinematics.local.parameters("posy").value =
oPoints(aIndex(i)).position.y
        
oNull.kinematics.local.parameters("posz").value =
oPoints(aIndex(i)).position.z

                                'Create ClusterCenter
                                ApplyOperator "ClusterCenter", oCls & ";" &
oNull , 0
                End Select
                
                'Cut The Null iff needed
                if Parent = False then
                                CutObj oNull
                end if
        next
end sub





-----Original Message-----
From: softimage-boun...@listproc.autodesk.com
[mailto:softimage-boun...@listproc.autodesk.com] On Behalf Of Gerbrand Nel
Sent: Thursday, July 19, 2012 1:50 PM
To: xsi group
Subject: OO_addnullstopoint script

Ok this might give away my age, but I remember a time when the "add nulls to
points" script gave you a choice between constrain to nulls, and constrain
points to nulls.
In 2013 it only constrains to the nulls.
Anyone know where I can find a script to create nulls on selected points,
constrained to those points?
I saw some Ice stuff to do this on rray.de, but I miss the old way.
Thanks guys
G

Reply via email to