Skip to content

Commit 72519e9

Browse files
committed
Open usdview without specifying a file
Signed-off-by: Divyansh Mishra <[email protected]>
1 parent 43b8c71 commit 72519e9

File tree

2 files changed

+54
-16
lines changed

2 files changed

+54
-16
lines changed

pxr/usdImaging/usdviewq/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,9 @@ def RegisterPositionals(self, parser):
111111
register positional arguments on the ArgParser
112112
'''
113113
parser.add_argument('usdFile', action='store',
114+
nargs='?',
114115
type=str,
115-
help='The file to view')
116+
help='The file to view (Optional)')
116117

117118
def RegisterOptions(self, parser):
118119
'''
@@ -372,10 +373,15 @@ def GetResolverContext(self, usdFile):
372373
context is provided. For usdview, configuring an asset context by
373374
default is reasonable, and allows clients that embed usdview to
374375
achieve different behavior when needed.
376+
377+
If usdFile path is not provided, it returns default context.
375378
"""
376379
from pxr import Ar
377380

378381
r = Ar.GetResolver()
382+
383+
if not usdFile:
384+
return r.CreateDefaultContext()
379385

380386
# ConfigureResolverForAsset no longer exists under Ar 2.0; this
381387
# is here for backwards compatibility with Ar 1.0.

pxr/usdImaging/usdviewq/appController.py

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)