Interface: PlacementTool

Interfaces > Core Interfaces > PlacementTool

 

   

Core Interfaces - Quick Navigation

NEW in 3ds Max 2015: The PlacementTool Core Interface exposes the Placement Tool's controls and functionality to MAXScript.

   

Properties:

PlacementTool.ActiveMode : bool : Read|Write

Get/set the Enabled state of the Placement Tool.

When set to False (default), the Placement Tool will be disabled.

When set to True, selected objects can be placed interactively in the scene by performing ray intersection will all other scene geometry, or can be rotated in place depending on the PlacementTool.RotateMode property state.

   

PlacementTool.RotateMode : bool : Read|Write

Get/set the state of the Rotate mode.

When set to False (default), moving the mouse in the viewport will perform ray intersection with the scene geometry and place the selection to the intersection point.

When set to True, moving the mouse up and down will rotate the selected objects about their up axes.

   

PlacementTool.UseBase : bool : Read|Write

Get/set the state of Use Base As Pivot option.

When set to False (default), the object's pivot will be used to perform the alignment / rotation.

When set to True, the base of the object will be used instead.

   

PlacementTool.PillowMode : bool : Read|Write

Get/set the state of the Pillow Mode option.

   

PlacementTool.AutoParent : bool : Read|Write

Get/set the state of the Auto-Parent option.

When set to False (default), objects will be placed without changing parent-child relationship.

When set to True, objects will be automatically parented to the object whose surface they were placed on.

   

PlacementTool.UpAxis : enum : Read|Write 
    UpAxis enums: {#Positive_X | #Positive_Y | #Positive_Z | #Negative_X | #Negative_Y | #Negative_Z}

Get/set the state of the Object Up Axis option.

Default is #Positive_Z .

This option controls which axis of the placed object will be oriented along the surface's normal.

   

Methods:

<value>PlacementTool.HitTestScene <&ray>Ray
    Ray is In parameter

Performs a hit test against the scene using the ray value passed as by-reference In parameter.

   

<bool>PlacementTool.PlaceNode <time>Time <node>SelectedNode <&point3>Position <&point3>Normal <node>TargetNode <bool>bRotateUpAxisToNormal
    Position is In parameter 
    Normal is In parameter

Places the specified node on the surface of the specified target at the given time using the Position and Normal values acquired from the PlacementTool.HitTestScene() method.

The Time argument specifies the time at which to evaluate the objects.

The SelectedNode argument provides the node to be placed.

The &Position argument passes the position as a by-reference in parameter.

The &Normal argument passes the Normal vector as a by-reference in parameter.

The TargetNode argument specifies the node whose surface to use for placement.

The bRotateUpAxisToNormal boolean argument specifies whether to orient the up axis (determined by PlacementTool.UpAxis ) of the placed node to the surface normal at the intersection point.

   

EXAMPLE

(
	resetMaxFile #noprompt
	
 --Create some geometry to test against
	local p = plane width:210 length:210 widthsegs:200 lengthsegs:200 
	local s = sphere radius:50 segs:100 pos:[14,15,-25]
	local n = noiseModifier()
	addModifier p n
	n.strength = [0,0,50]
	n.scale = 50.0

	local theObjects = #() --collect objects to be placed in this array
	for y = -100 to 100 by 5 do
	(
		for x = -100 to 100 by 5 do
		(
			local c = cone pos:[x,y,100] radius1:3 height:5 wirecolor:blue --create a grid of cones above the surfaces
			append theObjects c --collect the cones in the array
		)
	)
	local st = timestamp() --get a time stamp
	for o in theObjects do --loop though all cones
	(
		local result = PlacementTool.HitTestScene (Ray o.pos [0,0,-1]) --intersect a ray down the -Z
		local minDist = 100000.0 --initialize a variable for the minimum distance
		local newPos = o.pos --set the new position to the current position of the current cone
		local newNormal = o.dir --set the new normal to the current direction of the current cone
		local theTarget = undefined
		for i in result do --loop through all results
		(
			local dist = (distance i[2].pos o.pos) --calculate the distance to the hit
			if dist < minDist do  --if it was closer, 
			(
				minDist = dist --set the minimum distance to the current distance value
				newPos = i[2].pos --record the position
				newNormal = i[2].dir --and the normal
				theTarget = i[1] --remember the object that was hit
			)
		)
		if theTarget != undefined do --only place the object if a target was found
			PlacementTool.PlaceNode currentTime o &newPos &newNormal theTarget true
	)
	format "Placement of % objects took % ms.\n" theObjects.count (timestamp()-st) --print the time
)