top of page

3ds Max Copy And Paste Script | 2026 |

I will fetch related search-term suggestions to help you refine further.

The most famous script addressing this issue (often just called the "CopyPaste script") performs two primary functions:

Have you ever wanted to copy a complex stack of 30 modifiers (TurboSmooth, Bend, UVW Map, Edit Poly) from one object and paste it onto fifty others? Dragging and dropping modifiers one by one is insane.

A specialized script allows you to:

Where to find: Search for CopyPasteModifiers.ms on GitHub.

Copies all modifiers from one object to another.

-- Copy Modifier Stack Script
global copiedModifiers = #()

macroScript copyModifiers category:"My Tools" tooltip:"Copy Modifier Stack" ( if selection.count == 1 then ( copiedModifiers = #() for m in selection[1].modifiers do append copiedModifiers (copy m) format "Copied % modifier(s) from %\n" copiedModifiers.count selection[1].name ) else messageBox "Select exactly one object to copy modifiers from." ) 3ds max copy and paste script

macroScript pasteModifiers category:"My Tools" tooltip:"Paste Modifier Stack" ( if copiedModifiers.count > 0 and selection.count > 0 then ( for obj in selection do ( for m in copiedModifiers do addModifier obj (copy m) ) format "Pasted % modifier(s) to % object(s)\n" copiedModifiers.count selection.count ) else messageBox "No modifiers copied or no objects selected." )

How to use:


Out of the box, 3ds Max provides a standard clipboard functionality rooted in the Windows Operating System’s OLE (Object Linking and Embedding) framework. When a user performs a native "Copy" (Ctrl+C) and "Paste" (Ctrl+V), the software attempts to duplicate the scene object entirely. This native process is often cumbersome, triggering a dialog box asking the user to choose between Copy, Instance, or Reference.

The friction arises because the native system treats objects as monolithic entities. It copies the geometry, the topology, and the transforms. However, in a high-production pipeline, an artist rarely wants to duplicate the whole object in that specific moment. They may only want the transform (position, rotation, scale), or they may want to paste the attributes (material IDs, mapping channels) onto an entirely different object.

This is where the "Copy and Paste Script" transcends utility and becomes a philosophical tool. It shifts the definition of "the object" from a physical entity to a collection of data vectors. I will fetch related search-term suggestions to help

Open the MAXScript Editor (F11 or Scripting > New Script).

The Copy Function:

global clipboard_obj = undefined

fn copyScript = ( clipboard_obj = selection[1] -- Store first selected object format "Copied: %\n" clipboard_obj.name )

macroScript CopyButton category:"My Tools" buttonText:"CopyObj" ( copyScript() )

The Paste Function:

fn pasteScript =
(
 if clipboard_obj != undefined do
 (
 new_obj = copy clipboard_obj -- Creates a deep copy
 new_obj.name = clipboard_obj.name + "_Pasted"
 select new_obj
 format "Pasted: %\n" new_obj.name
 )
)

macroScript PasteButton category:"My Tools" buttonText:"PasteObj" ( pasteScript() )

Limitation: This script fails if you close the original Max session. The variable clipboard_obj is stored in RAM, not the hard drive. For a true "Copy and Paste Script" that survives a program restart, you would need to write to a .dat file using saveTempObject.

fn pasteObjects atOriginalPos:true offset:[0,0,0] =
(
    if copiedObjectsData.count == 0 do
    (
        messageBox "Nothing to paste. Copy objects first." title:"Paste Error"
        return false
    )
local pastedObjects = #()
for objData in copiedObjectsData do
(
    local newObj = undefined
    local objClass = getProperty objData #class
    local objName = getProperty objData #name
-- Create object based on stored data
    local hasMesh = findItem (getPropNames objData) #mesh > 0
    if hasMesh then
    (
        local meshData = getProperty objData #mesh
        newObj = snapshot meshData
    )
    else
    (
        -- Create dummy helper if no geometry
        newObj = point name:(objName + "_copy") size:10
    )
-- Apply transform
    if atOriginalPos then
        newObj.transform = getProperty objData #transform
    else
        newObj.pos = offset
-- Apply modifiers
    local mods = getProperty objData #modifiers
    if mods != undefined do
    (
        for m in mods do
            addModifier newObj m
    )
-- Apply material
    local mat = getProperty objData #material
    if mat != undefined do
        newObj.material = mat
-- Apply wirecolor
    local wc = getProperty objData #wirecolor
    if wc != undefined do
        newObj.wirecolor = wc
newObj.name = uniquename (objName + "_copy")
    append pastedObjects newObj
)
select pastedObjects
format "Pasted % object(s)\n" pastedObjects.count
return true

)

bottom of page