@@ -403,7 +403,7 @@ def __init__(self, parserData, resolverContextFn):
403403 self ._ui = Ui_MainWindow ()
404404 self ._ui .setupUi (self ._mainWindow )
405405
406- self ._mainWindow .setWindowTitle (parserData .usdFile )
406+ self ._mainWindow .setWindowTitle (parserData .usdFile or "Empty Stage" )
407407 self ._statusBar = QtWidgets .QStatusBar (self ._mainWindow )
408408 self ._mainWindow .setStatusBar (self ._statusBar )
409409
@@ -1203,7 +1203,16 @@ def _MuteMatchingLayers():
12031203 # layers populated after loading
12041204 _MuteMatchingLayers ()
12051205
1206- def _openStage (self , usdFilePath , sessionFilePath ,
1206+ def _getEmptyStage (self ):
1207+
1208+ with self ._makeTimer ('create empty stage' ):
1209+ stage = Usd .Stage .CreateInMemory ()
1210+
1211+ if not stage :
1212+ sys .stderr .write ('Error: Unable to create empty stage\n ' )
1213+ return stage
1214+
1215+ def _getStageForFile (self , usdFilePath , sessionFilePath ,
12071216 populationMaskPaths , muteLayersRe ):
12081217
12091218 def _GetFormattedError (reasons = None ):
@@ -1281,6 +1290,25 @@ def _GetFormattedError(reasons=None):
12811290
12821291 return stage
12831292
1293+ def _openStage (self , usdFilePath , sessionFilePath ,
1294+ populationMaskPaths , muteLayersRe ):
1295+
1296+ if self ._mallocTags != 'none' :
1297+ Tf .MallocTag .Initialize ()
1298+
1299+ if not usdFilePath :
1300+ stage = self ._getEmptyStage ()
1301+
1302+ else :
1303+ stage = self ._getStageForFile (usdFilePath , sessionFilePath ,
1304+ populationMaskPaths , muteLayersRe )
1305+ stage .SetEditTarget (stage .GetSessionLayer ())
1306+
1307+ if self ._mallocTags == 'stage' :
1308+ DumpMallocTags (stage , "stage-loading" )
1309+
1310+ return stage
1311+
12841312 def _closeStage (self ):
12851313 # Close the USD stage.
12861314 if self ._stageView :
@@ -2795,6 +2823,12 @@ def _cleanAndClose(self):
27952823
27962824 # Start timer to measure Qt shutdown time
27972825 self ._startQtShutdownTimer ()
2826+
2827+
2828+ def _getRecommendedFilenamePrefix (self ):
2829+ return (self ._parserData .usdFile .rsplit ('.' , 1 )[0 ]
2830+ if self ._parserData .usdFile
2831+ else 'new_file' )
27982832
27992833 def _openFile (self ):
28002834 extensions = Sdf .FileFormat .FindAllFileFormatExtensions ()
@@ -2836,14 +2870,13 @@ def _getSaveFileName(self, caption, recommendedFilename):
28362870 return saveName
28372871
28382872 def _saveOverridesAs (self ):
2839- recommendedFilename = self ._parserData .usdFile .rsplit ('.' , 1 )[0 ]
2840- recommendedFilename += '_overrides.usd'
2873+ recommendedFilename = self ._getRecommendedFilenamePrefix () + '_overrides.usd'
28412874
28422875 saveName = self ._getSaveFileName (
28432876 'Save Overrides As' , recommendedFilename )
28442877 if len (saveName ) == 0 :
28452878 return
2846- elif (os .path .isfile (saveName ) and
2879+ elif (os .path .isfile (saveName ) and self . _parserData . usdFile and
28472880 os .path .samefile (saveName , self ._parserData .usdFile )):
28482881 msg = QtWidgets .QMessageBox ()
28492882 msg .setIcon (QtWidgets .QMessageBox .Critical )
@@ -2857,13 +2890,13 @@ def _saveOverridesAs(self):
28572890 return
28582891
28592892 with BusyContext ():
2860- # In the future, we may allow usdview to be brought up with no file,
2861- # in which case it would create an in-memory root layer, to which
2862- # all edits will be targeted. In order to future proof
2863- # this, first fetch the root layer, and if it is anonymous, just
2864- # export it to the given filename. If it isn't anonmyous (i.e., it
2865- # is a regular usd file on disk), export the session layer and add
2866- # the stage root file as a sublayer.
2893+ # usdview can be brought up with no file, in which case it
2894+ # creates an in-memory root layer, to which all edits are
2895+ # targeted. This first fetches the root layer, and if it is
2896+ # anonymous, just exports it to the given filename. If it
2897+ # isn't anonymous (i.e., it is a regular usd file on disk),
2898+ # exports the session layer and add the stage root file
2899+ # as a sublayer.
28672900 rootLayer = self ._dataModel .stage .GetRootLayer ()
28682901 if not rootLayer .anonymous :
28692902 self ._dataModel .stage .GetSessionLayer ().Export (
@@ -2889,8 +2922,7 @@ def _saveOverridesAs(self):
28892922 saveName , 'Created by UsdView' )
28902923
28912924 def _saveFlattenedAs (self ):
2892- recommendedFilename = self ._parserData .usdFile .rsplit ('.' , 1 )[0 ]
2893- recommendedFilename += '_flattened.usd'
2925+ recommendedFilename = self ._getRecommendedFilenamePrefix () + '_flattened.usd'
28942926
28952927 saveName = self ._getSaveFileName (
28962928 'Save Flattened As' , recommendedFilename )
@@ -2905,7 +2937,7 @@ def _copyViewerImage(self):
29052937
29062938 def _saveViewerImage (self ):
29072939 recommendedFilename = "{}_{}{:04d}.png" .format (
2908- self ._parserData . usdFile . rsplit ( '.' , 1 )[ 0 ] ,
2940+ self ._getRecommendedFilenamePrefix () ,
29092941 "" if not self .getActiveCamera ()
29102942 else self .getActiveCamera ().GetName () + "_" ,
29112943 int (self ._dataModel .currentFrame .GetValue ()))
0 commit comments