-- Moved startup scripts to here to keep main RS DCC startup script folder clean or added missing scripts not called on startup filein (RsConfigGetWildWestDir() + "script\\max\\rockstar_london\\startup\\coverAttributeDefinitions.ms") filein (RsConfigGetWildWestDir() + "script\\max\\rockstar_london\\startup\\payne_CornerPopout.ms") filein (RsConfigGetWildWestDir() + "script\\max\\rockstar_london\\startup\\payneGravityWell.ms") --------------------------------------------------------------------------------------------- filein (RsConfigGetWildWestDir() + "script\\max\\Rockstar_London\\GrabCoverTool\\SpatialUtils.ms") filein (RsConfigGetWildWestDir() + "script\\max\\Rockstar_London\\GrabCoverTool\\RSV_CoverLineUtils.ms") filein (RsConfigGetWildWestDir() + "script\\max\\Rockstar_London\\GrabCoverTool\\SpatialDataFlags.ms") filein (RsConfigGetWildWestDir() + "script\\max\\Rockstar_London\\GrabCoverTool\\CoverExporter.ms") -- I'm going to move this into it's own rollout... Fuck the old tool. -- It sucks, and there is way too much stuff in there to support multiple rollouts on one form. try (destroyDialog ro_CoverLineTool) catch () rollout ro_CoverEdgeTool "Spatial Data Tool" width:325 ( --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== -- Local Variables --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== local INITIAL_SC_RADIUS_VALUE = 2.0; local INITIAL_HEIGHT_VALUE = 1.0; local TOOL_SETTINGS_LOCATION = (RsConfigGetProjRootDir() + "Tools\\dcc\\current\\max2009\\plugcfg\\CoverEdgeTool.ini"); local cb_ManualAdjustMode = undefined; local manualHeightModeModifiedList = undefined; local settingsStruct = undefined; local cornerRange = [0.0,180.0,100.0]; local wallWidthRange = [0.0,10.0,1.0]; -- Max doesn't like to delete things so I have to create an array of objects I want to delete, and then delete them in the post delete callback.... -- Holy shit. local derelictChild = #(); local neglectingParent = #(); local deletrionArrayCount = 0; --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== -- UI Items --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== group "Line Modification" ( button btn_InitLine "Initialize Line" width:280; button btn_flipNormal "Flip Line Normal" width:280; ) group "Cover Modification" ( -- Get undo working on all of these adjustments. spinner spn_HeightAdjusterA "Adjust Cover Height A" range:[0.0,20.0,1.0] type:#float scale:0.01 align:#left width:280; spinner spn_HeightAdjusterB "Adjust Cover Height B" range:[0.0,20.0,1.0] type:#float scale:0.01 align:#left width:280; spinner spn_HeightAdjusterBOTH "Adjust Both Heights" range:[0.0,20.0,1.0] type:#float scale:0.01 align:#left width:280; checkbox cbx_LinkCoverHeights "Link Cover Heights"; checkbutton ckb_ManualAdjustmentMode "Manual Adjustment Mode" width:280; -- Cover lines can now generate vault and NM information as well. -- Should automatically apply the flags to the line when you change one of the options. ) group "Gravity Wells" ( button btn_GravityWells "Gravity Well Helper" width:280; ) group "SD Flags" ( MultiListBox mlb_FlagArray; ) group "Corner Generation" ( checkbox cbx_CreateOnSplineEnds "Create Corners on Leaf Nodes" align:#left; spinner spn_MinWallWidth "Min Wall Width" range:wallWidthRange type:#float scale:0.1 align:#left; --spinner spn_AngularDifferenceThresh "CB Angular Difference" range:[0.0,360.0,90.0] type:#float scale:0.01 label lb_cornerAngle "Maximum Corner Angle" align:#left angle ang_MaxCornerAngle color:blue degrees:100.0 diameter:50 range:cornerRange align:#center across:2 spinner spn_CornerAngle range:cornerRange type:#float scale:0.1 button btn_GenerateCorners "Generate Cover Corners" width:280; ) group "Visibility Helpers" ( button btn_SelectParentLine "Select Parent Line" width:280; button btn_ShowCoverEdges "UnHide All Spatial Data Objects" width:280; checkbox ckb_FilterBasedOnUpDir "Filter Visibility Based On Cover Up Direction" align:#center --label lb_HeightMeshes "Height Meshes" align:#left button btn_ShowHeightMeshes "Regenerate Height Meshes" width:145 across:2; --button btn_HideHeightMeshes "Hide" width:135 --label lb_NormalMeshes "Normals" align:#left button btn_ShowNormalMeshes "Regenerate Normal Meshes" width:145 across:2; --button btn_HideNormalMeshes "Hide" width:135; spinner spn_angleOfUp "Angular Difference Off Up Tolerance" range:[0.0,180,30.0] type:#float scale:0.01 align:#left width:235; ) group "Import/Export" ( button btn_ValidateCoverScene "Validate the cover scene for XML Export" width:280; button btn_ExportCover "Export Spatial Data to XML" width:280; button btn_LoadCover "Reload Spatial Data From File" width:280; button btn_DestroySceneSpatialData "Destroy Scene Spatial Data" width:280; editText etx_SectionName "Section Name" width:280 height:17 align:#left; ) on etx_SectionName changed value do ( SetSectionNameFromBox etx_SectionName.text; ) on spn_CornerAngle changed value do ( ang_MaxCornerAngle.degrees = value; ) on ang_MaxCornerAngle changed value do ( spn_CornerAngle.value= value; ) on btn_GravityWells pressed do ( filein (RsConfigGetWildWestDir() + "script\\max\\Rockstar_London\\GrabCoverTool\\Menu_Helper_Scripts\\GravityWellHelper.ms") ) --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== -- Local Helper Functions --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== fn FilterOnUp = ( return ckb_FilterBasedOnUpDir.checked ; ) local TOOL_SETTINGS_FILE = RsConfigGetWildWestDir()+"script\\max\\Rockstar_London\\config\\CoverEdgeTool.ini" local KEY_SETTINGS_KEY = "UI_DEFAULT" local MAP_WINDOWPOSX = "WindowPosX"; local MAP_WINDOWPOSY = "WindowPosY"; local MAP_CREATEONLEAF = "CreateOnLeaf"; local MAP_FILTERBASEDONUP = "FilterBasedOnUp"; local MAP_ANGULARUPTOLERANCE = "AngularUpTolerance"; local MAP_MAXCORNERANGLE = "MaxCornerAngle"; local MAP_LINKCOVERHEIGHTS = "LinkCoverHeights"; local MAP_MINIMUMWALLLENGTH = "MinimumWallLength"; --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== -- UI Save/Load Tunables -- Loads the tool settings from an INI File specified in TOOL_SETTINGS_LOCATION fn LoadToolSettings = ( local theValue = GetINISetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_WINDOWPOSX; if theValue != "" then ( local theSubValue = GetINISetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_WINDOWPOSY; if theSubValue != "" then ( local WindowPosition = point2 ( theValue as float ) ( theSubValue as float ); SetDialogPos ro_CoverEdgeTool WindowPosition; ) ) theValue = GetINISetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_CREATEONLEAF; if theValue != "" then ( cbx_CreateOnSplineEnds.checked = ( theValue as booleanClass ); ) theValue = GetINISetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_FILTERBASEDONUP; if theValue != "" then ( ckb_FilterBasedOnUpDir.checked = ( theValue as booleanClass ); ) theValue = GetINISetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_LINKCOVERHEIGHTS; if theValue != "" then ( cbx_LinkCoverHeights.checked = ( theValue as booleanClass ); ) theValue = GetINISetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_ANGULARUPTOLERANCE; if theValue != "" then ( spn_angleOfUp.value = ( theValue as float ); ) theValue = GetINISetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_MINIMUMWALLLENGTH; if theValue != "" then ( spn_MinWallWidth.value = ( theValue as float ); ) theValue = GetINISetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_MAXCORNERANGLE; if theValue != "" then ( spn_CornerAngle.value = ( theValue as float ); ang_MaxCornerAngle.degrees = ( theValue as float ); ) ) -- Saves the tool settings from an INI File specified in TOOL_SETTINGS_LOCATION fn SaveToolSettings = ( SetIniSetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_WINDOWPOSX ( (GetDialogPos ro_CoverEdgeTool).x as string ); SetIniSetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_WINDOWPOSY ( (GetDialogPos ro_CoverEdgeTool).y as string ); SetIniSetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_CREATEONLEAF ( cbx_CreateOnSplineEnds.checked as string ); SetIniSetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_FILTERBASEDONUP ( ckb_FilterBasedOnUpDir.checked as string ); SetIniSetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_LINKCOVERHEIGHTS ( cbx_LinkCoverHeights.checked as string ); -- Note: Need to change ang_MaxCornerAngle along with the spinner for settings. SetIniSetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_ANGULARUPTOLERANCE ( spn_angleOfUp.value as string ); SetIniSetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_MAXCORNERANGLE ( spn_CornerAngle.value as string ); SetIniSetting TOOL_SETTINGS_FILE KEY_SETTINGS_KEY MAP_MINIMUMWALLLENGTH ( spn_MinWallWidth.value as string ); ) local sd_FlagTypes = #(); function LoadSDFlags= ( LoadSpatialDataFlags(); mlb_FlagArray.items = GetSpatialDataFlags(); ) --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== -- System Callback functions local bCoverEdgeDeleted = false; local derelictChild = #(); local neglectingParent = #(); fn cb_NodeUnlinked = ( local node = callbacks.notificationParam(); if ( IsTempCoverObject ( node ) ) then ( appendIfUnique neglectingParent node.ParentCoverLine; appendIfUnique derelictChild node; ) if ( classOf(node) == Payne_CornerPopout ) then ( if ( node.parent != undefined ) then ( node.height = Cover_Line.GetEdgeHeight node.parent node.SegmentIndex node.SideIndex node.SegmentIndex = -1; node.SideIndex = -1; node.wirecolor = orange; ) ) ) fn cb_PreDeleteCoverEdge= ( local node = callbacks.notificationParam(); -- Check to see if this node is a neglecting parent local theParentsAddress = findItem neglectingParent node; -- Check to see if the address is real if theParentsAddress > 0 then ( -- Starting at the end of the list move backwards seeing if the parent -- has left any children we need to destroy. local i = derelictChild.count; while i > 0 do ( if ( derelictChild[i] != undefined ) and ( not isDeleted ( derelictChild[i] ) ) and ( IsTempCoverObject ( derelictChild[i] ) )then ( if neglectingParent[theParentsAddress] == derelictChild[i].ParentCoverLine then ( delete derelictChild[i]; deleteItem ( derelictChild ) ( i ); ) ) i = i - 1; ) deleteItem ( neglectingParent ) ( theParentsAddress ); ) ) fn cb_coverLineHeightMeshChanged ev nd = ( local heightMesh = GetAnimByHandle (nd[1]); if IsTempCoverHeightMesh ( heightMesh ) then ( append manualHeightModeModifiedList heightMesh.ParentCoverLine; AdjustLineFromHeightMesh ( heightMesh ); ) ) -- Appends flags to an array. fn AppendFlagsFromObjectToArray obj &flagArray= ( if( ObjectCanHaveSDFlags ( obj ) ) then ( local sdFlagArray = GetSpatialDataFlags(); for i = 1 to sdFlagArray.count do ( local currentFlag = sdFlagArray[i]; if ( ObjectHasSDFlag ( obj ) ( currentFlag ) ) then ( appendIfUnique ( flagArray ) ( currentFlag ); ) ) ) ) fn cb_CoverEdgeSelectionChanged = ( if selection.count > 0 then ( /********************************************************************************************** 1. If Every object selected has flags, go through them all and build a list of common flags that bind these groups together. ***********************************************************************************************/ mlb_FlagArray.selection = #(); if selection.count == 1 then ( local SelectionList = #(); AppendFlagsFromObjectToArray (selection[1]) &SelectionList; local selectionIndexArray = #(); for entry in SelectionList do ( local index = findItem ( mlb_FlagArray.items ) ( entry ); if ( index > 0 ) then ( append selectionIndexArray index; ) ) mlb_FlagArray.selection = selectionIndexArray; ) /**********************************************************************************************/ -- instead check if multiple Meshes are in the selection. local UndeterminedHeight = false; local FoundHeightMesh = false; for obj in selection do ( if IsTempCoverHeightMesh ( obj ) then ( if ( FoundHeightMesh ) then ( UndeterminedHeight = true; ) else ( local parentCoverLine = obj.ParentCoverLine; local MeshIndex = obj.MeshIndex; local PointAHeight = Cover_Line.GetEdgeHeight ( parentCoverLine ) ( MeshIndex ) ( 1 ); local PointBHeight = Cover_Line.GetEdgeHeight ( parentCoverLine ) ( MeshIndex ) ( 2 ); spn_HeightAdjusterA.value = PointAHeight; spn_HeightAdjusterB.value = PointBHeight; spn_HeightAdjusterBOTH.value = (( PointAHeight + PointBHeight ) / 2.0); ) ) else if ( classOf(obj) == Cover_line ) then ( local PointAHeight = Cover_Line.GetEdgeHeight ( obj ) ( 1 ) ( 1 ); local PointBHeight = Cover_Line.GetEdgeHeight ( obj ) ( 1 ) ( 2 ); spn_HeightAdjusterA.value = PointAHeight; spn_HeightAdjusterB.value = PointBHeight; spn_HeightAdjusterBOTH.value = (( PointAHeight + PointBHeight ) / 2.0); ) ) ) ) fn EnterManualAdjustmentMode = ( if manualHeightModeModifiedList == undefined then ( manualHeightModeModifiedList = #(); ) cb_ManualAdjustMode = NodeEventCallback geometryChanged:cb_coverLineHeightMeshChanged ) fn StopManualAdjustmentMode = ( if cb_ManualAdjustMode != undefined then ( cb_ManualAdjustMode = undefined; gc(); ) if manualHeightModeModifiedList != undefined then ( for obj in manualHeightModeModifiedList do ( if ( FilterOnUp() ) then ( GenerateCoverHeightMeshes ( obj ) ( false ) angularThreshold:spn_angleOfUp.value; ) else ( GenerateCoverHeightMeshes ( obj ) ( false ); ) ) ) manualHeightModeModifiedList = undefined; ) function ModifyFlagsOnSelection flagToChange flagState= ( for obj in selection do ( if ( ( classOf ( obj ) == Cover_Line ) or (classOf ( obj ) == GrabSpline ) )then ( if flagState then ( AddNMFlagToNode obj flagToChange; ) else ( RemoveNMFlagFromNode obj flagToChange; ) ) ) ) function ShowAllCoverObjects theNode= ( if ( classOf ( theNode ) == Cover_Line ) or ( classOf ( theNode ) == Payne_CornerPopout ) then ( unhide ( theNode ); ) for child in theNode.children do ( ShowAllCoverObjects ( child ); ) ) --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== -- Event Handlers --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== on btn_flipNormal pressed do ( local coverLineSelected = BuildCoverLineListFromSelection(); if coverLineSelected != undefined then ( for obj in coverLineSelected do ( if ( classOf ( obj ) == Cover_Line ) then ( FlipCoverLineNormals ( obj ); DrawCoverLineNormalMeshes ( obj ); ) ) ) local grabSplineSelected = BuildGrabLineListFromSelection(); if grabSplineSelected != undefined then ( for obj in grabSplineSelected do ( if ( classOf ( obj ) == GrabSpline ) then ( FlipCoverLineNormals ( obj ); DrawCoverLineNormalMeshes ( obj ); ) ) ) ) on btn_ShowCoverEdges pressed do ( ShowAllCoverObjects ( rootNode ); ) -- Height Adjustment UI Components on spn_HeightAdjusterA changed spinnerValue do ( SetSelectedCoverHeights ( spinnerValue ) ( RSCL_GetSideAKey() ) ( cbx_LinkCoverHeights.checked ) ) on spn_HeightAdjusterB changed spinnerValue do ( SetSelectedCoverHeights ( spinnerValue ) ( RSCL_GetSideBKey() ) ( cbx_LinkCoverHeights.checked ) ) on spn_HeightAdjusterBOTH changed spinnerValue do ( SetSelectedCoverHeights ( spinnerValue ) ( RSCL_GetBothSideKey() ) ( cbx_LinkCoverHeights.checked ) ) on btn_ShowHeightMeshes pressed do ( if selection.count > 0 then ( for obj in selection do ( obj = FindCoverLineInParents ( obj ); if classOf(obj) == Cover_Line then ( if ( FilterOnUp() ) then ( GenerateCoverHeightMeshes ( obj ) ( true ) angularThreshold:spn_angleOfUp.value; ) else ( GenerateCoverHeightMeshes ( obj ) ( true ); ) ) ) ) else ( local result = yesNoCancelBox "Regenerate all Cover Height Meshes, this can be slow. Do you wish to proceed?" if result == #yes then ( if ( FilterOnUp() ) then ( RecursiveShowAllCoverLineMeshes ( rootNode ) angularDiff:spn_angleOfUp.value; ) else ( RecursiveShowAllCoverLineMeshes ( rootNode ); ) ) ) ) on btn_HideHeightMeshes pressed do ( if selection.count > 0 then ( for obj in selection do ( obj = FindCoverLineInParents ( obj ); if classOf(obj) == Cover_Line then ( DeleteLineHeightMeshes ( obj ); ) ) ) else ( local result = yesNoCancelBox "Hide All Cover meshes?" if result == #yes then ( RecursiveDestroyHeightMeshes ( rootNode ); ) ) ) on btn_ShowNormalMeshes pressed do ( clearListener(); if selection.count > 0 then ( for obj in selection do ( obj = FindCoverLineInParents ( obj ); if classOf(obj) == Cover_Line then ( format "DEUBG: btn_ShowNormalMeshes() Found CoverLine!\n" if ( FilterOnUp() ) then ( DrawCoverLineNormalMeshes ( obj ) angularThreshold:spn_angleOfUp.value; ) else ( DrawCoverLineNormalMeshes ( obj ); ) ) ) ) else ( local result = yesNoCancelBox "Regenerate all Normal Meshes, this can be slow. Do you wish to proceed?" if result == #yes then ( if ( FilterOnUp() ) then ( RecursiveShowAllCoverNormalMeshes ( rootNode ) angularDiff:spn_angleOfUp.value; ) else ( RecursiveShowAllCoverNormalMeshes ( rootNode ); ) ) ) ) on btn_HideNormalMeshes pressed do ( if selection.count > 0 then ( for obj in selection do ( obj = FindCoverLineInParents ( obj ); if classOf(obj) == Cover_Line then ( DeleteNormalMeshes ( obj ); ) ) ) else ( local result = yesNoCancelBox "Hide All Normal Meshes?" if result == #yes then ( RecursiveDestroyNormalMeshes ( rootNode ); ) ) ) on btn_SelectParentLine pressed do ( local theSelected = selection[1]; local parentCoverLine = FindCoverLineInParents ( theSelected ); if parentCoverLine != undefined then ( clearSelection(); select ( parentCoverLine ); ) ) on ckb_ManualAdjustmentMode changed state do ( if ( state == true ) then ( EnterManualAdjustmentMode(); ) else ( StopManualAdjustmentMode(); ) ) on btn_InitLine pressed do ( for obj in selection do ( if ( classOf ( obj ) == Cover_Line ) then ( InitializeCoverLine( obj ); if ( FilterOnUp() ) then ( GenerateCoverHeightMeshes ( obj ) ( true ) angularThreshold:spn_angleOfUp.value; DrawCoverLineNormalMeshes ( obj ) angularThreshold:spn_angleOfUp.value; ) else ( GenerateCoverHeightMeshes ( obj ) ( true ); DrawCoverLineNormalMeshes ( obj ); ) ) if ( classOf ( obj ) == GrabSpline ) then ( InitializeGrabline( obj ); if ( FilterOnUp() ) then ( DrawCoverLineNormalMeshes ( obj ) angularThreshold:spn_angleOfUp.value; ) else ( DrawCoverLineNormalMeshes ( obj ); ) ) ) ) on btn_GenerateCorners pressed do ( for obj in selection do ( if ( classOf ( obj ) == Cover_Line ) then ( AddCornersToCoverLine ( obj ) ( ang_MaxCornerAngle.degrees ) ( cbx_CreateOnSplineEnds.checked ) ( spn_MinWallWidth.value ); ) ) ) fn DEBUG_PrintFlags obj= ( if ( ObjectCanHaveSDFlags ( obj ) ) then ( format "SD Object: %\n" obj.name; for item in mlb_FlagArray.items do ( local bStateofFlag = ObjectHasSDFlag ( obj ) ( item ); format "\t% => <%>\n" item ( bStateofFlag as string ); ) ) else ( format "Non-SD Object: %\n" obj.name; ) ) on mlb_FlagArray selected index do ( local theFlag = mlb_FlagArray.items[index]; local bSetFlag = mlb_FlagArray.selection[index]; for currentNode in selection do ( --format "\tOn Node<%>\n" currentNode.name; if ( ObjectCanHaveSDFlags ( currentNode ) ) then ( --format "\t\tCan Have SD FLAG\n" if ( bSetFlag ) then ( --format "\t\Adding Flag!\n" AddSDFlagToObject ( currentNode ) ( theFlag ); ) else ( --format "\t\Removing Flag!\n" RemoveSDFlagFromObject ( currentNode ) ( theFlag ); ) local bStateofFlag = ObjectHasSDFlag ( currentNode ) ( theFlag ); --format "\tFlag % State:<%>\n" theFlag (bStateofFlag as string); ) else ( --format "\t\tNot an SD Flag Node\n" ) --DEBUG_PrintFlags ( currentNode ); ) ) fn cb_NodeCreated= ( local node = callbacks.notificationParam(); if ( node != undefined ) then ( local layer = undefined if( classOf( node ) == Cover_line ) then ( layer = layermanager.getLayerFromName "Cover_line" if layer == undefined then ( layer = LayerManager.newLayerFromName "Cover_line" ) layer.addnode node; ) else if( classOf( node ) == Payne_CornerPopout ) then ( layer = layermanager.getLayerFromName "Payne_CornerPopout" if layer == undefined then ( layer = LayerManager.newLayerFromName "Payne_CornerPopout" ) layer.addnode node; ) else if( classOf( node ) == GrabSpline ) then ( layer = layermanager.getLayerFromName "GrabSpline" if layer == undefined then ( layer = LayerManager.newLayerFromName "GrabSpline" ) layer.addnode node; ) else if( classOf( node ) == PayneGravityWell ) then ( layer = layermanager.getLayerFromName "PayneGravityWell" if layer == undefined then ( layer = LayerManager.newLayerFromName "PayneGravityWell" ) layer.addnode node; ) ) ) on btn_ValidateCoverScene pressed do ( ValidateCoverScene(); ) function AddCallbacks= ( callbacks.addScript #selectionSetChanged "ro_CoverEdgeTool.cb_CoverEdgeSelectionChanged()" id:#COVEREDGE_SELECTION_CALLBACKS -- These two callbacks handle dangling cover meshes when a parent line is deleted. callbacks.addScript #nodeUnlinked "ro_CoverEdgeTool.cb_NodeUnlinked()" id:#COVEREDGE_SELECTION_CALLBACKS callbacks.addScript #nodePreDelete "ro_CoverEdgeTool.cb_PreDeleteCoverEdge()" id:#COVEREDGE_SELECTION_CALLBACKS callbacks.addScript #nodeCreated "ro_CoverEdgeTool.cb_NodeCreated()" id:#COVEREDGE_SELECTION_CALLBACKS ) function RemoveCallbacks= ( callbacks.removeScripts id:#COVEREDGE_SELECTION_CALLBACKS ) on btn_DestroySceneSpatialData pressed do ( local returnVal = yesNoCancelBox "Are you sure you want to Delete all the Spatial Data in the Scene? Any unsaved or unexported work will be lost!"; if returnVal == #yes then ( RemoveCallbacks(); PurgeSceneSpatialData(); AddCallbacks(); ) ) fn ExportSpatialData= ( RecursiveDestroyHeightMeshes ( rootNode ); RecursiveDestroyNormalMeshes ( rootNode ); BreakUpSceneCompoundCoverLines(); if ( ValidateCoverScene() ) then ( RemoveCallbacks(); Export_SpatialData(); gc(); AddCallbacks(); messagebox "Spatial Data Export Complete!"; ) else ( messagebox "Error Validating Cover Scene! Export Aborted."; ) RecursiveShowAllCoverLineMeshes ( rootNode ); RecursiveShowAllCoverNormalMeshes ( rootNode ); ) fn LoadSpatialData bPurgeExisting= ( RemoveCallbacks(); Import_SpatialData ( bPurgeExisting ); gc(); AddCallbacks(); ) fn LoadSpatialDataWithQuery= ( local returnVal = yesNoCancelBox "Do You Want To Purge Existing Data in the Scene?"; if returnVal == #yes then ( LoadSpatialData( true ); ) else if returnVal == #no then ( LoadSpatialData( false ); ) ) --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--== on btn_ExportCover pressed do ( ExportSpatialData(); etx_SectionName.text = GetSectionNameForBox(); ) on btn_LoadCover pressed do ( LoadSpatialDataWithQuery(); etx_SectionName.text = GetSectionNameForBox(); ) --==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==' fn QueryExportDataBeforeClose= ( local returnVal = yesNoCancelBox "Do you want export before shutting down the tool? Any unexported data will be lost!"; if returnVal == #yes then ( ExportSpatialData(); ) ) on ro_CoverEdgeTool open do ( LoadToolSettings(); LoadSDFlags(); RemoveCallbacks(); AddCallbacks(); RecursiveDestroyNormalMeshes ( rootNode ); RecursiveDestroyHeightMeshes ( rootNode ); RecursiveShowAllCoverLineMeshes ( rootNode ); RecursiveShowAllCoverNormalMeshes ( rootNode ); ) on ro_CoverEdgeTool close do ( RemoveCallbacks(); SaveToolSettings(); -- Just in case it's still running. StopManualAdjustmentMode(); RecursiveDestroyNormalMeshes ( rootNode ); RecursiveDestroyHeightMeshes ( rootNode ); gc(); ) ) try ( createDialog ro_CoverEdgeTool ) catch ( -- If this craps out, we really want to make sure we are removing all the callbacks. MessageBox ("Error Detected In Spatial Data Tool!"); -- print out the ecception for debugging purposes format "*** % ***\n" (getCurrentException()); callbacks.removeScripts id:#COVEREDGE_SELECTION_CALLBACKS; )