ScriptSpot

Script

ClaverTech_AlignToSurface

By Clavery · 2009-10-23

Version
2.00
Version requirement
2010
Date updated
2009-10-28
Votes
26
Description

 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

Tags: align, surface, Orientation, Placement, Placing, Orient

Comments (10)

Thanks for the great stuff.

BobSchneider · 2020-07-08

ClaverTech_AlignToSurface so relevant project now. It is so important for the gambling industry and new front-end development. I think that my casinosistersites site can provide good usability due to your script.

Any idea how to make it work in Max2019?

FJ · 2020-05-20

It works on 2017 as i tested. but it is not working in 2019. and after restarting the program, the option even disappears entirely.
Any idea how to make it work in Max2019?

Work fine...

narizon · 2020-04-13

Thank´s a lot...
Work fine en 3dsmax 2018.

Install Problems

smann · 2019-07-25

Can't seem to get it to run on 3ds Max 2016, Windows 10.
In theory it installed, but does nothing - at least it shows up in the Customize User Interface

There may be an issue with a temp file it is trying to write to
C:\Users\\AppData\Local\Autodesk\3dsMax\2016 - 64bit\ENU\usermacros

Any suggestions?

Nevermind - works fine! (User error)

fajar · 2009-10-29

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

fajar · 2009-10-29

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 · 2009-10-29

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 · 2009-10-29

What a great, and handy little script.

I owe you a PBR.

titane357 · 2009-10-23

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

titane357 · 2009-10-23

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 !!! :-)))