ClaverTech_AlignToSurface

13 votes
Version: 
2.00
Date Updated: 
10/28/2009

 AlignToSurfaceLogo

Description: This MouseTool is made to help place a node onto the surface of some geometry based upon mouse click location. it will place the node by its pivot point and orient its local z axis to the normal of the intersection. (Additional: Added a new Ability to click and drag to rotate around the Nodes Local Z axis)  Hope its helpful to someone besides me. Heres the code... Enjoy

macroScript AlignToSurface

        category:"ClaverTech"

        toolTip:"AlignToSurface"

(

           

tool AlignToSurfaceTool

            (

                        local somethin=undefined

                        local OrgPos=undefined

                        local OrgRot=undefined

                        local target_mesh=undefined

                        local StartDragging=0

                        local posy=undefined

                        local roty=undefined

                        local OrgViewY=undefined

                       

                        fn g_filter o =

                        (

                                    if o!=somethin then

                                    (

                                    superclassof o == Geometryclass

                                    )

                                    else

                                    (

                                                false

                                    )

                        )

                                    fn ResetStuff str=

                        (

                                    somethin.pos = OrgPos

                                    somethin.dir = OrgRot

                        )

                        fn DoMyStuff str=

                        (

                                    local myRay=mapScreenToWorldRay viewPoint   -- make a ray from active viewport

                                    local tempRay=intersectRay target_mesh myRay --see if the ray hits the picked object

                                                                        if tempRay!=undefined then --if we actually hit the picked object set to surface

                                                                        (

                                                                                    somethin.pos = tempRay.pos

                                                                                    somethin.dir = tempRay.dir

                                                                        )

                                                                        else -- otherwise make it reset

                                                                        (

                                                                                    ResetStuff now

                                                                        )

                                                                        str --functions need to return somethin right

                        )

                       

                        on start do

                        (

                                   

                                    --if something is selected

                                    if $!=undefined then

                                    (

                                                somethin=$

                                                OrgPos=somethin.pos  --save original position

                                                OrgRot=somethin.dir --save original rotation

                                                target_mesh = pickObject message:"Pick Target Surface" forceListenerFocus:false filter:g_filter

                                    )

                                    else -- if nothing is selected

                                    (

                                                messageBox "Start this tool with an object selected"

                                                #stop

                                    )

                        )

                        on mouseAbort clicker do 

                        (                       --reset position and rotation

                                    ResetStuff now

                        )

                        on mousePoint clickno do

                        (

                                    if (clickno == 1 and target_mesh!=undefined)then

                                    (

                                                DoMyStuff now -- function calls dont seem to work without a parameter

                                    )

                                    else

                                    (

                                                #stop --bail

                                    )

                        )

                        on freeMove do

                        (

                                    if target_mesh!=undefined then

                                    (

                                    DoMyStuff now --this way it actually shows it is workin

                                    )

                                    else

                                    (

                                                #stop --bail

                                    )

                        )

                        on mouseMove clickno do

                        (

                                    if StartDragging==0 then

                                    (

                                                posy = somethin.pos -- dont ask why i need this

                                                roty = somethin.rotation -- dont ask why i need this

                                                OrgViewY=viewPoint.y -- store click loc for later

                                                StartDragging=1 -- make sure this dont happen again

                                    )

                                    somethin.rotation = roty -- dont ask why setting rotation moves the object

                                    somethin.pos = posy -- but now we got to move it back... theres got to be a better way

                                    local tempRot = eulerangles 0 0 0   -- make a blank euler

                                    tempRot.z=((viewPoint.y-OrgViewY)/2) -- make it only rotate more or less by initial screen click loc

                                    in coordsys local rotate somethin tempRot -- and finally rotate locally

                                    --somethin.pos = posy

                        )

            )

 

            startTool AlignToSurfaceTool

)

 

Additional Info: 

installation:
i didnt know this until recently, but u can start a new maxscript, paste the code, and evaluate (Ctrl+E) and u can then select the macro in the customize user interface [toolbar section]. once youve made a button for it, you can then right click on the button and 'edit the appearance' of the button to look better. i suggest the normal align button in the 'maintoolbar' section.

usage:
have an object selected prior to usage (any Node type), then click the Button you just created, it will change the mouse to a pickobject cursor. click on any type of geometry and then move the mouse -or- click the mouse over the object to see it be placed and oriented from surface. Additionally you can now click and drag to make the Node rotate around its local Z axis. then let go of the mouse to set it to the current position.

next ideas:
option for whether it will orient to surface or not.
Make it so you can spawn a bunch of nodes on the surface of an object.

additional:
free use to all, but if you make a better version or want some more options please email me at clavery@slco.org

credits: this mouse tool was brought to you by mass amounts of PBR

Version Requirement: 
2010
Video URL: 

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
fajar's picture

Tested using 3dsMax 9-32bit

Tested using 3dsMax 9-32bit and worked.........

fajar's picture

or something like this on

or something like this

on start do
if selection.count == 1 then
(
somethin=$
OrgPos=somethin.pos --save original position
OrgRot=somethin.dir --save original rotation
target_mesh = pickObject message:"Pick Target Surface" forceListenerFocus:false filter:g_filter
)
else if selection.count==0 then messageBox "Start this tool with an object selected" title: "Selection Error"
else messageBox "Please select one object only" title: "Selection Error"

fajar's picture

there was some error when

there was some error when you select more than one object....

on start do
if selection.count == 1 then
(
bla...bla...bla
)
else messageBox "Please select one object only" title: "Selection Error"

that will help remove error when selection more than 1 object, unless you make it support for more than 2 object or even group.

brittnell's picture

What a great, and handy

What a great, and handy little script. 

I owe you a PBR.

titane357's picture

at the risk of repeating

at the risk of repeating myself, best script to populate and reposition people and cars in architectural scene !!! Thanks

titane357's picture

Hello Thanks to your PBR

Hello
Thanks to your PBR dealer, it is the tool I needed !!!
If I want to add "toolMode.coordsys #local" for rotation, where do I need to add in your script ?
So I can rotate in local coord orientation of my objects .
Thanks !!! :-)))

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.