cvp
Jan 16, 2020 - 19:11
AR Quick Look to display USDZ files of virtual objects in 3D or AR.
Download an example usdz file from f.i. here and run this quick and dirty script using a QLPreviewController.
from objc_util import *
import os
import ui
# create delegate for QLPreviewController
def previewControllerDidDismiss_(_self, _cmd, _controller):
global uiview
#print('previewControllerDidDismiss_')
uiview.close()
methods = [previewControllerDidDismiss_,]
protocols = ['QLPreviewControllerDelegate']
try:
MyQLPreviewControllerDelegate = ObjCClass('MyQLPreviewControllerDelegate')
except:
MyQLPreviewControllerDelegate = create_objc_class('MyQLPreviewControllerDelegate', methods=methods, protocols=protocols)
# create datasource for QLPreviewController
def numberOfPreviewItemsInPreviewController_(_self, _cmd, _controller):
#print('numberOfPreviewItemsInPreviewController_ called')
return 1
def previewController_previewItemAtIndex_( _self, _cmd, _controller, index):
#print('previewController_previewItemAtIndex_ called, index=',index)
global uiview
return uiview.nsurl.ptr
methods = [numberOfPreviewItemsInPreviewController_, previewController_previewItemAtIndex_]
protocols = ['QLPreviewControllerDataSource']
try:
MyQLPreviewControllerDataSource = ObjCClass('MyQLPreviewControllerDataSource')
except:
MyQLPreviewControllerDataSource = create_objc_class('MyQLPreviewControllerDataSource', methods=methods, protocols=protocols)
@on_main_thread
def MyQLPreviewController(ns_url, w, h, mode='sheet', popover_location=None):
global uiview
uiview = ui.View()
uiview.frame = (0,0,w,h)
uiview.background_color = 'white'
if mode == 'sheet':
uiview.present('sheet',hide_title_bar=False)
elif mode == 'popover':
if popover_location:
uiview.present('popover', hide_title_bar=True, popover_location=popover_location)
else:
return
else:
return
QLPreviewController = ObjCClass('QLPreviewController').new()
#print(dir(QLPreviewController))
# Use new delegate class:
delegate = MyQLPreviewControllerDelegate.alloc().init()
QLPreviewController.delegate = delegate
# Use new datasource class:
datasource = MyQLPreviewControllerDataSource.alloc().init()
QLPreviewController.dataSource = datasource
QLPreviewController.setModalPresentationStyle_(3)
objc_uiview = ObjCInstance(uiview)
SUIViewController = ObjCClass('SUIViewController')
vc = SUIViewController.viewControllerForView_(objc_uiview)
uiview.nsurl = ns_url # used in datasource to display url
vc.presentViewController_animated_completion_(QLPreviewController, True, None)
def main():
# demo code
ns_url = nsurl(os.path.expanduser('~/Documents/wheelbarrow.usdz'))
MyQLPreviewController(ns_url,600,500)
if __name__ == '__main__':
main()
You can pinch and rotate...
