Every now and then, I stumbled upon an undocumented command or optional keyword. Some of them were later added to the documentation, many of them are still undocumented. Some of those are listed in this article (I'm skipping a lot of stuff I don't find useful like the non-creatable MEditBkgnd texture map, creatable PFlow related classes etc).
Box3
returned by the getNodeBBox
method is much more flexible than the min+max array that's usually used instead. Edit: now documented, see Box3 Values.Box3() -- returns new 'empty' Box3 value
Box3 <min_point3> <max_point3>
<Box3>.min: Point3
<Box3>.max: Point3
<Box3>.center: Point3
contains <Box3> <point3> intersects <Box3> <Box3> translate <Box3> <point3> scale <Box3> <point3> enlargeBy <Box3> <float> rectify <Box3> makeCube <Box3> <point3> <float> empty <Box3> isEmpty <Box3> getNodeBBox <node> getModContextBBox <node> <modifier> |
-- bool test for contained position -- bool test for overlapping boxes -- move box coords by offset -- scale from the center of the box -- expand box coords by offset -- doesn't work -- cube by center and size -- set the box to a special 'empty' state -- bool test for the special 'empty' state -- node bounding box as a Box3 value -- modContext bounding box as a Box3 value |
rendLockImageAspectRatio: Boolean
rendImageAspectRatio: Float
rendPixelAspectRatio: Float
rendUseImgSeq: Boolean
rendImgSeqType
: IntegerrendViewID
: Integer
getMultiplierCurve <controller> <index>
getEaseCurve <controller> <index>
inverseHighPrecision <matrix3>
<XRefScene>.overlay Boolean default:false
convertToBody <node>
convertToJoinBodies <node>
convertToBodyCutter <node>
<enum><EditablePoly>.getCommandMode()
<EditablePoly>.ReadyToBridgeFlagged()
, only for Edit Poly modifier.
editPolyModReadyToBridge()
<void>setVert <&bitArray>vertSet <&point3>point node:<node>
<void>getVertsUsingFace <&bitArray>vertSet <&bitArray>faceSet node:<node>
<void>getVertsUsingEdge <&bitArray>vertSet <&bitArray>edgeSet node:<node>
<void>getFacesUsingEdge <&bitArray>faceSet <&bitArray>edgeSet node:<node>
<void>getEdgesUsingVert <&bitArray>edgeSet <&bitArray>vertSet node:<node>
<void>getFacesUsingVert <&bitArray>faceSet <&bitArray>vertSet node:<node>
<void>getElementsUsingFace <&bitArray>elementSet <&bitArray>faceSet <&bitArray>fenceSet node:<node>
<point3 by value>GetFaceNormal <index>faceID node:<node>
<point3 by value>GetFaceCenter <index>faceID node:<node>
<float>GetFaceArea <index>faceID node:<node>
<bitArray>GetOpenEdges node:<node>
<integer>getVertexFlags <index>vertexID node:<node>
<integer>getEdgeFlags <index>edgeID node:<node>
<integer>getFaceFlags <index>faceID node:<node>
<void>setVertexFlags <&bitArray>vertexSet <DWORD>flagsToSet flagMask:<DWORD> generateUndoRecord:<bool> node:<node>
<void>setEdgeFlags <&bitArray>edgeSet <DWORD>flagsToSet flagMask:<DWORD> generateUndoRecord:<bool> node:<node>
<void>setFaceFlags <&bitArray>faceSet <DWORD>flagsToSet flagMask:<DWORD> generateUndoRecord:<bool> node:<node>
<bool>getVerticesByFlag <&bitArray>vertexSet <DWORD>flagsRequested flagMask:<DWORD> node:<node>
<bool>getEdgesByFlag <&bitArray>edgeSet <DWORD>flagsRequested flagMask:<DWORD> node:<node>
<bool>getFacesByFlag <&bitArray>faceSet <DWORD>flagsRequested flagMask:<DWORD> node:<node>
<bool>SmGrpFloaterVisible()
<void>SmGrpFloater()
<bool>MatIDFloaterVisible()
<void>MatIDFloater()
<void>CommitPaintDeform()
<void>CancelPaintDeform()
There's also a method that's listed with no description:
<void>List node:<node>
It outputs the complete printout of the operations stored by the Edit Poly into the Macro Recorder window. To use it, open the MAXScript Listener window, make sure Macro Recorder is active, and with the Edit Poly modifier active in the stack run:
(modPanel.getCurrentObject()).List()
An example printout in the MacroRecorder window might look like this:
-- Describing all Edit Poly Operations: subobjectLevel = 2 $.modifiers[#Edit_Poly].SetSelection #Edge #{1, 5, 13, 20, 25, 29, 35, 40, 44, 50, 56, 59, 64, 70, 74, 77, 83, 88, 93, 96, 99, 104, 107, 110, 141, 145, 149, 152, 159, 163, 166..167} $.modifiers[#Edit_Poly].extrudeEdgeHeight = 1.8 $.modifiers[#Edit_Poly].extrudeEdgeWidth = 0.49 $.modifiers[#Edit_Poly].ButtonOp #ExtrudeEdge subobjectLevel = 2 $.modifiers[#Edit_Poly].SetSelection #Edge #{1, 5, 13, 20, 25, 29, 35, 40, 44, 50, 56, 59, 64, 70, 74, 77, 83, 88, 93, 96, 99, 104, 107, 110, 141, 145, 149, 152, 159, 163, 166..167} $.modifiers[#Edit_Poly].chamferEdgeAmount = 1 $.modifiers[#Edit_Poly].chamferEdgeOpen = off $.modifiers[#Edit_Poly].edgeChamferSegments = 1 $.modifiers[#Edit_Poly].edgeChamferTension = 0.5 $.modifiers[#Edit_Poly].edgeChamferInvert = off $.modifiers[#Edit_Poly].edgeChamferType = 0 $.modifiers[#Edit_Poly].edgeChamferSmooth = off $.modifiers[#Edit_Poly].edgeChamferSmoothType = 0 $.modifiers[#Edit_Poly].edgeChamferSmoothThreshold = 30 $.modifiers[#Edit_Poly].edgeChamferQuadIntersections = off $.modifiers[#Edit_Poly].ButtonOp #ChamferEdge subobjectLevel = 1 $.modifiers[#Edit_Poly].SetSelection #Vertex #{1, 3, 5, 7, 15, 22, 24, 26..28, 30, 33, 36, 39, 41..42, 45..46, 49..50, 53, 56, 60, 70, 77..78, 80..81, 84..85, 91, 94, 163..194} $.modifiers[#Edit_Poly].relaxAmount = 0.5 $.modifiers[#Edit_Poly].relaxIterations = 5 $.modifiers[#Edit_Poly].relaxHoldBoundaryPoints = off $.modifiers[#Edit_Poly].relaxHoldOuterPoints = off $.modifiers[#Edit_Poly].ButtonOp #Relax
meshop.getNumVelocity <mesh>
meshop.getVelocity <mesh> <vertex>
meshop.deleteIsoMapVerts <mesh> <mapChannel>
meshOps.clearAllSG <editable_mesh_node_or_modifier>
meshOps.selectBySG <editable_mesh_node_or_modifier>
meshOps.selectByColor <editable_mesh_node_or_modifier>
meshOps.showNormal <editable_mesh_node_or_modifier>
meshOps.autoSmooth <editable_mesh_node_or_modifier>
meshOps.selectByID <editable_mesh_node_or_modifier>
meshOps.attachList <editable_mesh_node_or_modifier>
polyop.checkTriangulation <poly>
polyop.makeVertsPlanar <poly> <vertlist>
polyOps.startDivideFace <editable_poly_node>
polyOps.makePlanar <editable_poly_node>
polyOps.startCreateFace <editable_poly_node>
polyOps.weld <editable_poly_node>
polyOps.startCreateVertex <editable_poly_node>
polyOps.resetPlane <editable_poly_node>
polyOps.startWeldTarget <editable_poly_node>
polyOps.autoSmooth <editable_poly_node>
polyOps.break <editable_poly_node>
polyOps.delete <editable_poly_node>
polyOps.startCutEdge <editable_poly_node>
polyOps.selectByID <editable_poly_node>
polyOps.attachList <editable_poly_node>
polyOps.startSlicePlane <editable_poly_node>
polyOps.retriangulate <editable_poly_node>
polyOps.cap <editable_poly_node>
polyOps.startChamferEdge <editable_poly_node>
polyOps.tessellate <editable_poly_node>
polyOps.namedSelCopy <editable_poly_node>
polyOps.startExtrudeFace <editable_poly_node>
polyOps.removeIsolatedVerts <editable_poly_node>
polyOps.hide <editable_poly_node>
polyOps.startEditTri <editable_poly_node>
polyOps.startExtrudeVertex <editable_poly_node>
polyOps.gridAlign <editable_poly_node>
polyOps.startDivideEdge <editable_poly_node>
polyOps.createShapeFromEdges <editable_poly_node>
polyOps.startCreateEdge <editable_poly_node>
polyOps.slice <editable_poly_node>
polyOps.clearAllSG <editable_poly_node>
polyOps.collapse <editable_poly_node>
polyOps.startCutFace <editable_poly_node>
polyOps.selectBySG <editable_poly_node>
polyOps.split <editable_poly_node>
polyOps.startCutVertex <editable_poly_node>
polyOps.flipNormal <editable_poly_node>
polyOps.detach <editable_poly_node>
polyOps.startBevel <editable_poly_node>
polyOps.selectByColor <editable_poly_node>
polyOps.update <editable_poly_node>
polyOps.namedSelPaste <editable_poly_node>
polyOps.startChamferVertex <editable_poly_node>
polyOps.meshSmooth <editable_poly_node>
polyOps.unhide <editable_poly_node>
polyOps.startExtrudeEdge <editable_poly_node>
polyOps.viewAlign <editable_poly_node>
splineOps.startCrossSection <editable_spline_or_line_node_or_modifier>
splineOps.startIntersect <editable_spline_or_line_node_or_modifier>
<bool>maxOps.affectChildren
<void>maxOps.activateSetKeyMode <void>onOff
<matrix3>maxOps.getTransformGizmoTM()
<TSTR by value>maxOps.incrementFileName <TSTR by value>fileName versionSeparatorString:<TSTR by value="">
<TSTR by value>maxOps.incrementSceneFileName <TSTR by value>fileName
<TSTR by value>maxOps.incrementImageFileName <TSTR by value>fileName
<bool>maxOps.useCodePageSpecifiedInSceneFile
<bool>maxOps.legacyFilesCanBeStoredUsingUTF8
<enum>maxOps.languageToUseForFileIO -- enums: {#current|#English|#German|#French|#Japanese|#Korean|#Chinese}
<void>maxOps.persistFileLanguageSettings()
<point3><RayMeshGridIntersect>.getHitPoint <integer>index
Returns the hit position for the indexed hit in world space.
<integer><RayMeshGridIntersect>.closestFaceThreshold <point3>p <float>threshold
Similar to closestFace but with a distance limit. The threshold is the farthest distance before it gives up and stops trying to find intersections.
genGUID() --> "{F2FBBC06-1A6B-49C8-9FD6-31C597BA3265}"
viewport.appendTooltip <tooltip_def>
tipSystem.showTip <integer>elapsedTime <string>tipContent <float>xRatio <float>yRatio <HWND>hParent
viewport.getClipScale()
viewport.setClipScale <float>scale
DisplayManager.IsEnabled()
Waveform_Float
are undocumented:
<integer><Waveform_Float>.nbWaves
<boolean><Waveform_Float>.Append()
<boolean><Waveform_Float>.Insert <index>waveIndex
<boolean><Waveform_Float>.Delete <index>waveIndex
<string><Waveform_Float>.GetName <index>waveIndex
<void><Waveform_Float>.SetName <index>waveIndex <string>name
<float><Waveform_Float>.GetPeriod <index>waveIndex
<void><Waveform_Float>.SetPeriod <index>waveIndex <float>period
<float><Waveform_Float>.GetDutyCycle <index>waveIndex
<void><Waveform_Float>.SetDutyCycle <index>waveIndex <float>duty cycle
<float><Waveform_Float>.GetAmplitude <index>waveIndex
<void><Waveform_Float>.SetAmplitude <index>waveIndex <float>amplitude
<float><Waveform_Float>.GetPhase <index>waveIndex
<void><Waveform_Float>.SetPhase <index>waveIndex <float>phase
<enum><Waveform_Float>.GetBiasType <index>waveIndex -- enums: {#centered|#positive|#negative|#manual}
<void><Waveform_Float>.SetBiasType <index>waveIndex <enum>bias type -- enums: {#centered|#positive|#negative|#manual}
<float><Waveform_Float>.GetBias <index>waveIndex
<void><Waveform_Float>.SetBias <index>waveIndex <float>bias
<enum><Waveform_Float>.GetType <index>waveIndex -- enums: {#square|#sine|#sawtooth|#triangle|#halfsine}
<void><Waveform_Float>.SetType <index>waveIndex <enum>effect type -- enums: {#square|#sine|#sawtooth|#triangle|#halfsine}
<enum><Waveform_Float>.GetEffect <index>waveIndex -- enums: {#add|#multiply|#clamp_above|#clamp_below}
<void><Waveform_Float>.SetEffect <index>waveIndex <enum>effect type -- enums: {#add|#multiply|#clamp_above|#clamp_below}
<boolean><Waveform_Float>.IsEnabled <index>waveIndex
<void><Waveform_Float>.Enable <index>waveIndex <boolean>enabled state
<boolean><Waveform_Float>.GetInverted <index>waveIndex
<void><Waveform_Float>.SetInverted <index>waveIndex <boolean>inverted
<boolean><Waveform_Float>.GetFlipped <index>waveIndex
<void><Waveform_Float>.SetFlipped <index>waveIndex <boolean>flipped
<bool>thePainterInterface.useSplineConstraint
<bool>thePainterInterface.setSplineConstraintNode <node>node
<bool>thePainterInterface.isSplineConstraintNodeValid()
SceneExplorerManager.GetActiveExplorer()
SceneExplorerManager.SetActiveExplorer <&TSTR>explorerName
SceneExplorerManager.CreateLayerManager <&TSTR>explorerName
SceneExplorerManager.IsDefaultLayer <RefTarget>layer
addGizmoMesh
method accepts an additional undocumented gizmoScaleToViewport flag. Mesh gizmo added with this flag will try and scale itself to have a constant size in the viewport. This size in pixels is given by the private ManipulatorGizmo::mGizmoSize
variable which is not accessible from MAXScript (although there's getGizmoSize/setGizmoSize
function ID pair, the property is not published).#BackgroundOdd -- background of odd layers
#BackgroundEven -- background of even layers
#Button -- button background
#ButtonText -- button text
#FocusBorder
#UIBorder
#ToolTipUIBackground
#ToolTipUIText
#ToolTipViewportBackground
#ToolTipViewportText
#PreviewHighlights
#SelectionHighlights
#AnimationKeyBrackets
#ManipulatorsActive
#ManipulatorsSelected
#ManipulatorsInactive
#ViewportGradientBackgroundTop
#ViewportGradientBackgroundBottom
#PressedHierarchyButton
#ImageViewerBackground
#TrackViewBackground
#TrackViewInactiveBackground
#TrackbarCacheLine
#TrackbarCachedLine
#AssemblyOutline
#AdapDegActive
#OutOfRangeLow
#OutOfRangeHigh
#iRenderProgHoriz
#iRenderProgVert
#Background -- deprecated since 3ds Max 2017, use #BackgroundOdd instead
#Window -- deprecated since 3ds Max 2017, use #BackgroundOdd instead
#WindowText -- deprecated since 3ds Max 2017, use #Text instead
#Hilight -- deprecated since 3ds Max 2017, won't be used any more
#Shadow -- deprecated since 3ds Max 2017, won't be used any more
#filePostOpenProcessFinalized
#filePostMergeProcessFinalized
#preProjectFolderChange
#postProjectFolderChange
getEnableProfiling()
setEnableProfiling()
ValidcustAttributes.getSceneLoadVersionHandlingBehavior()
custAttributes.setSceneLoadVersionHandlingBehavior <behavior_name>
custAttributes.getSceneMergeVersionHandlingBehavior()
custAttributes.setSceneMergeVersionHandlingBehavior <behavior_name>
behavior_name
values are:
#neverUpdate #alwaysUpdate #updateWhenLoadVersionGreaterThanCurrentVersion #updateWhenLoadVersionGreaterThanOrEqualToCurrentVersion
schematicView.numSchematicViews()
schematicView.getSchematicViewName <int>index
schematicView.open <string>name
schematicView.zoomSelected <string>name
schematicView.close <string>name
getMaxAssertDisplay()
assert_point2_equal <point2>expected <expression>actual [tolerance:<float>] [message:<string>]
assert_point4_equal <point4>expected <expression>actual [tolerance:<float>] [message:<string>]
<integer>MxsUnitResults.GetAssertFailCount()
<integer>MxsUnitResults.GetExceptionCount()
<integer>MxsUnitResults.GetMessageCount()
<string>MxsUnitResults.GetAssertFailure <index>index
<string>MxsUnitResults.GetExceptionFailure <index>index
<string>MxsUnitResults.GetMessage <index>index
<string>MxsUnitResults.GetUserData()
<void>MxsUnitResults.Clear()
preferences.enableTMCache = off
with dontRepeatMessages off ...
as integer
cast, thiw one will error out when a string is passed to it.
int <number>
IndirectRefTargContainer..
nodeMonitor <node>
snapshotAsMesh <node> [ renderMesh:<boolean> ]
<boolean>renderPresets.Load <integer>which <filename>file <bitArray>categories [ loadNodes:<enum: {#Yes|#No|#Cancel|#Prompt}> ]
Specifying loadNodes
with #Yes
, #No
or #Cancel
will not display the Prompt window and will perform the same actions as pressing the respective buttons in the prompt. Specifying #Prompt
will display the dialog and require user input. If you do not specify loadNodes
and the file contains nodes associated, the prompt window will be displayed.createInstance
function, you can pass any of the constructor arguments when creating a cloned object (say copy obj transform:TM
).
copy <MAXWrapper_object> [ keyarg1:v ] [ keyarg2:v ] ..
instance <MAXWrapper_object> [ keyarg1:v ] [ keyarg2:v ] ..
reference <MAXWrapper_object> [ keyarg1:v ] [ keyarg2:v ] ..
Runtime error: Not creatable
.
createInstance <MAXClass> forceCreate:<boolean=false> [ keyarg1:v ] [ keyarg2:v ] ...
mesh
variable, a bezierShape
one is used. See for example my Arrow spline primitive script for example usage.
plugin simpleSpline ...
on buildShape do <expr>
getSimilarNodes <node>
"Create Selection"
if empty.
getCurNameSelSet()
's'
character to indicate the passed argument is a string you can also pad strings:
There are other undocumented types used by the format literal, such asformattedPrint "string" format:"10s"
--> " string"
c/C
(wide/single-byte char), a/A
([−]0xh.hhhh p/P±dd
hexadecimal double) or p
(hexadecimal pointer address). For more details see the '_snwprintf'
function documentation.registerDisplayFilterCallback <filterFunction> <name>
unregisterDisplayFilterCallback <filterFunction>
skinOps.getVertexDQWeight <Skin> <vertexID>
skinOps.setVertexDQWeight <Skin> <vertexID> <weight>
skinOps.WeightTable <Skin>
mapPath : path to Texture Checker map used in Unwrap UVW
uvChecker_mtl : standard material using the texture in mapPath
isNetworkRenderServer()
enableUndo
function.
isUndoDisabled()
theHold.Begin()
calls.
theHold.isUndoDisabled()
theHold.getBeginDepth()
productAppID : same as maxOps.productAppID
playbackLoop : same as timeConfiguration.PlaybackLoop
systemTools.isSubscription()
refs.getAddr
.
getAnimPointer <MAXWrapper_object>
showDialog <rollout> <boolean>
isChecked
macroScript event handler). Similar to <rollout>.inDialog
.
isDialogVisible <rollout>
windows.getParentHWND <IntegerPtr>hWnd
createNumberedFilename <name> <frameNr>
<integer>biped.numCopies <collection_value> (#pose|#posture|#track)
<ICP_MXBipedCopy>biped.getCopy <collection_value> (#pose|#posture|#track) <index>
biped.deleteCopy <collection_value> (#pose|#posture|#track) <index>
biped.deleteAllCopies <collection_value> (#pose|#posture|#track)
isParticleSystem <node>
setD3DMeshCacheSize <number>
And related Editable Poly methods:<bool><EditablePoly>.GetCache_SystemOn()
<void><EditablePoly>.SetCache_SystemOn <bool>on
<bool><EditablePoly>.GetCache_SuspendDXCache()
<void><EditablePoly>.SetCache_SuspendDXCache <bool>suspend
<integer><EditablePoly>.GetCache_Cutoff()
<void><EditablePoly>.SetCache_Cutoff <integer>count
Link_Control
and were later removed as a part of the cleanup. They belong to the Link_Constraint chapter.
LinkCtrl.getLinkCount <controller>
LinkCtrl.getLinkTime <controller> <index>
LinkCtrl.setLinkTime <controller> <index> <time>
LinkCtrl.getLinkNode <controller> <index>
LinkCtrl.setLinkNode <controller> <index> <node>
LinkCtrl.addLink <controller> <node> <time>
LinkCtrl.deleteLink <controller> <index>
SetKey.commitBuffer <MAXWrapper_object>
SetKey.bufferPresent <MAXWrapper_object>
SetKey.revertBuffer <MAXWrapper_object>
SetKey.subAnimRevertBuffer <MAXWrapper_object> <index>
SetKey.subAnimCommitBuffer <MAXWrapper_object> <index>
SetKey.subAnimBufferPresent <MAXWrapper_object> <index>
<bool>maxOps.allTracksCommitSetKeyBuffer()
<void>maxOps.allTracksRevertSetKeyBuffer()
<void>maxOps.allTracksSetKeyBufferPresent()
VLD.Disable()
VLD.Enable()
VLD.Restore()
VLD.ReportLeaks()
VLD.RefreshModules()
VLD.ResolveCallstacks()
VLD.EnableModule <unused> -- just returns OK
VLD.DisableModule <unused> -- just returns OK
VLD.TestLeakMemory <int_amount>
pathConfig.getExchangeStorePlugInInstallPath <string>plugin
There are of course many more, like the numerousStartupTemplate.ShowUI()
StartupTemplate.ShowNewSceneUI()
StartupTemplate.GetAllNames()
StartupTemplate.GetAvailWorkspaces()
StartupTemplate.Activate <string>
StartupTemplate.GetWorkspace <string>
StartupTemplate.SetWorkspace <string> <string>
StartupTemplate.GetScene <string>
StartupTemplate.GetName <string>
StartupTemplate.GetDescription <string>
StartupTemplate.GetProjectFolder <string>
StartupTemplate.GetThumbnail <string>
StartupTemplate.SelectProjectFolder <string>
StartupTemplate.SelectThumbnail <string>
StartupTemplate.SelectScene <string>
StartupTemplate.SetScene <string> <string>
StartupTemplate.SetName <string> <string>
StartupTemplate.SetDescription <string> <string>
StartupTemplate.SetProjectFolder <string> <string>
StartupTemplate.GetViewSettings <string>
StartupTemplate.GetViewCubeConfig <string>
StartupTemplate.GetRollupConfig <string>
StartupTemplate.GetUIColorSettings <string>
StartupTemplate.GetUserPaths <string>
StartupTemplate.SnapshotViewSettings <string>
StartupTemplate.SnapshotViewCubeConfig <string>
StartupTemplate.SnapshotRollupConfig <string>
StartupTemplate.SnapshotUIColorSettings <string>
StartupTemplate.SnapshotUserPaths <string>
StartupTemplate.Delete <string>
StartupTemplate.Import <filename>
StartupTemplate.Export <string> <filename>
StartupTemplate.Load <filename>
StartupTemplate.LoadAll <???>
StartupTemplate.Save <string> <filename>
StartupTemplate.SaveAll <???>
PolyB*
methods, and then a whole lot of global scripted structs like uvwManipUtils, PolyBoost, PolyToolsUI, Ribbon_Modeling, Main_Ribbon and heaps of others but while not documented, those are easy to find and study in the stdscripts folder.DISCLAIMER: All scripts and snippets are provided as is under Creative Commons Zero (public domain, no restrictions) license. The author and this blog cannot be held liable for any loss caused as a result of inaccuracy or error within these web pages. Use at your own risk.
This Post needs Your Comment!
Thank you!!!
this is valuable resources...i got some solution from this.
This rocks! Thanks!
Cool!
But why is AD not adding it to their doc?
Leave a Comment