4 from pyfbsdk_additions
import *
6 from PySide2
import QtCore, QtWidgets
7 from ReferencingSampleUI2
import Ui_ReferencingSample
9 import NamespaceTableModel
16 lBtnClicked, lFileRefName =
FBMessageBoxGetUserValue(
'File Reference',
'Enter your file reference name',
'', FBPopupInputType.kFBPopupString,
'OK',
'Cancel',
None, 1,
True )
17 if lBtnClicked == 2:
return lBtnClicked, lFileRefName
19 lFileRefName = lFileRefName.replace(
' ',
'')
20 while lFileRefName
is '':
21 FBMessageBox(
'File Reference',
'Error, please enter a file reference name',
"OK")
22 lBtnClicked, lFileRefName = PickRefName()
23 if lBtnClicked == 2:
break
25 return lBtnClicked, lFileRefName
27 class MainForm( QtWidgets.QWidget, Ui_ReferencingSample ):
28 def __init__( self, parent ):
29 QtWidgets.QWidget.__init__( self, parent )
34 self.mDefaultPath = inspect.currentframe().f_code.co_filename
35 self.mSingleSelection =
False
39 self.mApp.OnFileNew.Add( self.OnFileNew )
41 self.mNSModel = NamespaceTableModel.NamespaceTableModel( self )
42 self.uiTableNamespace.setModel( self.mNSModel )
44 self.mTimer = QtCore.QTimer( self )
46 self.mIsInitialized =
False
50 self.mNSModel.namespaceRenamed.connect( self.OnNamespaceRenamed )
52 lSelectionModel = self.uiTableNamespace.selectionModel()
53 QtCore.QObject.connect( lSelectionModel, QtCore.SIGNAL(
'selectionChanged(const QItemSelection&, const QItemSelection&)' ), self.OnTableNamespaceSelectionChanged )
55 QtCore.QObject.connect( self.mTimer, QtCore.SIGNAL(
'timeout()' ), self.OnTimer )
56 self.mTimer.start( 2000 )
59 self.mIsInitialized =
True
64 QtCore.QObject.disconnect( self.mTimer, QtCore.SIGNAL(
'timeout()' ), self.OnTimer )
67 lSelectionModel = self.uiTableNamespace.selectionModel()
68 QtCore.QObject.disconnect( lSelectionModel, QtCore.SIGNAL(
'selectionChanged(const QItemSelection&, const QItemSelection&)' ), self.OnTableNamespaceSelectionChanged )
70 self.mNSModel.namespaceRenamed.disconnect( self.OnNamespaceRenamed )
72 self.mIsInitialized =
False
75 if not self.mIsInitialized:
77 self.mNSModel.Connect()
80 if self.mIsInitialized:
82 self.mNSModel.Disconnect()
84 def OnFileNew( self, pControl, pEvent ):
88 def OnNamespaceRenamed( self, pOldName, pNewName ):
89 self.UpdateTreeNamespace()
91 def OnBtnBrowsePathClicked( self ):
92 lFileToLoad = QtWidgets.QFileDialog.getOpenFileName(self,
"Pick FBX to reference", self.mDefaultPath,
"*.fbx" )[0]
93 lQFileInfo = QtCore.QFileInfo( lFileToLoad )
94 if lQFileInfo.exists()
and lQFileInfo.suffix() ==
'fbx':
95 self.uiEditFilePath.setText( lFileToLoad )
96 self.mDefaultPath = lQFileInfo.filePath()
99 def OnBtnLoadClicked( self ):
100 print 'Load as a file reference'
102 lLoadCount = self.uiSpinLoadTimes.value()
103 lBtnClicked, lName = PickRefName()
104 if lBtnClicked == 2:
return
108 lNameList.Add( lName )
110 for lCount
in range( 0, lLoadCount ):
111 if self.mSys.Scene.NamespaceGet( lName + str(lCount+1) ) <>
None:
112 lMsgBox = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Information,
'Loading',
'Creation of file reference %s will be skipped as it is already there.' % ( lName + str(lCount+1) ), QtWidgets.QMessageBox.Ok, self )
115 lNameList.Add( lName + str(lCount+1) )
117 self.mSys.Scene.NamespaceImportToMultiple( lNameList, str(self.uiEditFilePath.text()),
True )
118 self.mNSModel.Refresh()
121 def OnBtnUnloadClicked( self ):
122 lIndexes = self.uiTableNamespace.selectedIndexes()
123 for lIndex
in lIndexes:
124 if lIndex.column() == 0:
125 lNSObj = self.mSys.Scene.Namespaces[lIndex.row()]
126 self.mNSModel.RemoveFileFromWatcher( lNSObj )
127 lNSObj.IsLoaded =
False
129 self.mNSModel.Refresh( lIndex )
131 self.UpdateTreeNamespace()
133 def OnBtnReloadClicked( self ):
134 lIndexes = self.uiTableNamespace.selectedIndexes()
135 for lIndex
in lIndexes:
136 if lIndex.column() == 0:
137 lNSObj = self.mSys.Scene.Namespaces[lIndex.row()]
138 lNSObj.IsLoaded =
True
139 self.mNSModel.Refresh( lIndex )
141 self.UpdateTreeNamespace()
143 def OnBtnDeleteClicked( self ):
144 lIndexes = self.uiTableNamespace.selectedIndexes()
146 for lIndex
in lIndexes:
147 if lIndex.column() == 0:
148 lNSObj = self.mSys.Scene.Namespaces[lIndex.row()]
149 lNameList.append( lNSObj.LongName )
150 self.mNSModel.RemoveFileFromWatcher( lNSObj )
152 for lName
in lNameList:
153 self.mSys.Scene.NamespaceDelete( lName )
155 self.mNSModel.Refresh()
157 self.UpdateTreeNamespace()
159 def OnBtnInstanceClicked( self ):
160 lIndexes = self.uiTableNamespace.selectedIndexes()
161 for lIndex
in lIndexes:
162 if lIndex.column() == 0:
163 lNSObj = self.mSys.Scene.Namespaces[lIndex.row()]
165 lInstanceCount = self.uiSpinInstanceTimes.value()
166 lBtnClicked, lName = PickRefName()
167 if lBtnClicked == 2:
return
170 if lInstanceCount == 1:
171 lNameList.Add( lName )
173 for lCount
in range( 0, lInstanceCount ):
174 lNameList.Add( lName + str(lCount+1) )
176 lApplyRefEdits =
False
177 if lNSObj.GetContentModified( FBPlugModificationFlag.kFBContentAllModifiedMask ):
178 lMsgBox = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Question,
'Instancing',
'Do you want to apply reference edits after instancing?', QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, self )
179 if lMsgBox.exec_() == QtWidgets.QMessageBox.Yes:
180 lApplyRefEdits =
True
182 lNSObj.DuplicateFileRef( lNameList, lApplyRefEdits )
184 self.mNSModel.Refresh()
186 self.UpdateTreeNamespace()
188 def OnBtnRestoreClicked( self ):
189 lIndexes = self.uiTableNamespace.selectedIndexes()
190 for lIndex
in lIndexes:
191 if lIndex.column() == 0:
192 lNSObj = self.mSys.Scene.Namespaces[lIndex.row()]
193 lNSObj.RevertRefEdit()
194 self.mNSModel.Refresh( lIndex )
197 def OnBtnShowEditsClicked( self ):
198 lIndexes = self.uiTableNamespace.selectedIndexes()
199 for lIndex
in lIndexes:
200 if lIndex.column() == 0:
201 lNSObj = self.mSys.Scene.Namespaces[lIndex.row()]
202 if lNSObj.GetContentModified( FBPlugModificationFlag.kFBContentAllModifiedMask ):
203 lMsgBox = QtWidgets.QMessageBox( self )
204 lMsgBox.setText( lNSObj.GetRefEdit() )
207 def OnTableNamespaceSelectionChanged( self, pSelected, pUnselected ):
209 self.UpdateTreeNamespace()
211 def UpdateTreeNamespace( self ):
212 self.uiTreeNamespace.clear()
214 if self.mSingleSelection:
215 lIndexes = self.uiTableNamespace.selectedIndexes()
216 lNSObj = self.mSys.Scene.Namespaces[lIndexes[0].row()]
218 lStrList = [lNSObj.LongName]
219 if lNSObj.ClassGroupName <>
'':
220 lStrList.append( lNSObj.ClassGroupName )
222 lItem = QtWidgets.QTreeWidgetItem( lStrList )
223 self.uiTreeNamespace.addTopLevelItem( lItem )
224 self.UpdateTreeNamespaceRecursively( lItem, lNSObj )
225 self.uiTreeNamespace.expandItem( lItem )
227 def UpdateTreeNamespaceRecursively( self, pParentItem, pNSObj ):
229 pNSObj.GetContentList( lList, FBPlugModificationFlag.kFBPlugAllContent,
False )
231 lStrList = [lPlug.LongName]
232 if lPlug.ClassGroupName <>
'':
233 lStrList.append( lPlug.ClassGroupName )
235 lItem = QtWidgets.QTreeWidgetItem( lStrList )
236 pParentItem.addChild( lItem )
237 self.uiTreeNamespace.expandItem( lItem )
238 if lPlug.TypeInfo == FBNamespace.TypeInfo:
239 self.UpdateTreeNamespaceRecursively( lItem, lPlug )
251 def UpdateUI( self ):
252 luiBtnBrowsePath =
True
254 luiSpinLoadTimes =
False
258 luiBtnInstance =
False
259 luiBtnRestore =
False
260 luiBtnShowEdits =
False
261 luiSpinInstanceTimes =
False
263 if os.path.exists( self.uiEditFilePath.text() ):
265 luiSpinLoadTimes =
True
270 lIndexes = self.uiTableNamespace.selectedIndexes()
273 lHasSelection =
False
274 if len( lIndexes ) > 0:
277 lAllSelectionFileReference =
True
278 lAllSelectionLoaded =
True
279 lAllSelectionUnLoaded =
True
280 lSelectionHasRefEdits =
False
281 for lIndex
in lIndexes:
282 if lIndex.column() == 0:
283 lRows.append( lIndex.row() )
284 lNSObj = self.mSys.Scene.Namespaces[lIndex.row()]
285 if lNSObj.TypeInfo == FBNamespace.TypeInfo:
286 lAllSelectionFileReference =
False
289 if lNSObj.GetContentModified( FBPlugModificationFlag.kFBContentAllModifiedMask ):
290 lSelectionHasRefEdits =
True
291 lAllSelectionUnLoaded =
False
293 lAllSelectionLoaded =
False
295 self.mSingleSelection =
False
296 if len( lRows ) == 1:
297 self.mSingleSelection =
True
302 if lAllSelectionFileReference:
303 if lSelectionHasRefEdits:
306 if self.mSingleSelection:
307 if lSelectionHasRefEdits:
308 luiBtnShowEdits =
True
309 luiBtnInstance =
True
310 luiSpinInstanceTimes =
True
314 if lAllSelectionLoaded:
316 if lAllSelectionUnLoaded:
319 self.uiBtnBrowsePath.setEnabled( luiBtnBrowsePath )
320 self.uiBtnLoad.setEnabled( luiBtnLoad )
321 self.uiSpinLoadTimes.setEnabled( luiSpinLoadTimes )
322 self.uiBtnUnload.setEnabled( luiBtnUnload )
323 self.uiBtnReload.setEnabled( luiBtnReload )
324 self.uiBtnDelete.setEnabled( luiBtnDelete )
325 self.uiBtnInstance.setEnabled( luiBtnInstance )
326 self.uiBtnRestore.setEnabled( luiBtnRestore )
327 self.uiBtnShowEdits.setEnabled( luiBtnShowEdits )
328 self.uiSpinInstanceTimes.setEnabled( luiSpinInstanceTimes )
331 for lFilePath, lReload
in self.mNSModel.mRefFileReload.items():
333 FBMessageBox(
"External File Changed",
"The referenced file '%s' has been changed externally!" % ( lFilePath ),
"OK" )
334 if lFilePath
in self.mNSModel.mRefFilePath:
335 for lFileRefName
in self.mNSModel.mRefFilePath[lFilePath]:
337 lOption =
FBMessageBox(
"External File Changed",
"Please choose the following action for Reference: %s!" % ( lFileRefName ),
"Load",
"Merge",
"Ignore" )
341 lFileRefObj.IsLoaded =
False
342 lFileRefObj.IsLoaded =
True
345 if lFileRefObj.GetContentModified( FBPlugModificationFlag.kFBContentAllModifiedMask ):
346 lFileRefObj.ApplyRefEditPyScriptFromString( lFileRefObj.GetRefEdit() )
348 self.mNSModel.mRefFileReload[lFilePath] =
False
350 self.mNSModel.UpdateFileWatcher()