omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    How to access VisionKit?

    Pythonista
    help needed objcutil
    5
    43
    14191
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • JonB
      JonB last edited by

      Have you checked supported?

      cvp 1 Reply Last reply Reply Quote 0
      • cvp
        cvp @JonB last edited by

        @JonB I tried but does not exist in dir(VNDocumentCameraViewController).
        And the process seems to be realized, you receive the camera, take a photo, system aligns a frame, you tap save ..... and the viewcontroller closes but does not call the didfinish

        mikael 1 Reply Last reply Reply Quote 0
        • mikael
          mikael @cvp last edited by

          @cvp, @JonB, same behavior on iPhone.

          isSupported returns True.

          cvp 2 Replies Last reply Reply Quote 0
          • cvp
            cvp @mikael last edited by cvp

            @mikael @JonB strange, on my iPad mini 4, three different prints and their results

            	print('VNDocumentCameraViewController.isSupported')
            	print(VNDocumentCameraViewController.isSupported)
            	print()
            	print('dir(VNDocumentCameraViewController.isSupported)')
            	print(dir(VNDocumentCameraViewController.isSupported))
            	print()
            	print('VNDocumentCameraViewController.isSupported()')
            	print(VNDocumentCameraViewController.isSupported())
            '''
            VNDocumentCameraViewController.isSupported
            <objc_util.ObjCInstanceMethodProxy object at 0x113ca84e0>
            
            dir(VNDocumentCameraViewController.isSupported)
            ['__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'method_cache', 'name', 'obj']
            
            VNDocumentCameraViewController.isSupported()
            Traceback (most recent call last):
              File "_ctypes/callbacks.c", line 234, in 'calling callback function'
              File "/var/containers/Bundle/Application/34BAEE1A-BC33-4D6F-A0C1-B733E4991F31/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 1066, in OMMainThreadDispatcher_invoke_imp
                retval = func(*args, **kwargs)
              File "/private/var/mobile/Containers/Shared/AppGroup/668A7D98-7216-47ED-917D-AA0B6173167E/Pythonista3/Documents/VNDocumentCameraViewController.py", line 37, in main
                print(VNDocumentCameraViewController.isSupported())
              File "/var/containers/Bundle/Application/34BAEE1A-BC33-4D6F-A0C1-B733E4991F31/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 798, in __call__
                method_name, kwarg_order = resolve_instance_method(obj, self.name, args, kwargs)
              File "/var/containers/Bundle/Application/34BAEE1A-BC33-4D6F-A0C1-B733E4991F31/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 405, in resolve_instance_method
                raise AttributeError('No method found for %s' % (name,))
            AttributeError: No method found for isSupported
            ''' 
            
            1 Reply Last reply Reply Quote 0
            • cvp
              cvp @mikael last edited by cvp

              @mikael @jonb class without alloc and init returns True

              	VNDocumentCameraViewController = ObjCClass('VNDocumentCameraViewController')#.alloc().init()
              	print('VNDocumentCameraViewController.isSupported()')
              	print(VNDocumentCameraViewController.isSupported()) 
              
              1 Reply Last reply Reply Quote 0
              • JonB
                JonB last edited by

                I bet the function name is wrong, or the arguments are wrong.

                Shouldn't it be
                documentCameraViewController_didFinishWithScan_?

                You could also swizzle respondsToSelector on your delegate, and log what gets queried.
                Have you checked what the protocol

                cvp 3 Replies Last reply Reply Quote 1
                • cvp
                  cvp @JonB last edited by

                  @JonB doc gives this name and we are not alone with this problem, see here

                  1 Reply Last reply Reply Quote 0
                  • cvp
                    cvp @JonB last edited by cvp

                    @JonB said:

                    documentCameraViewController_didFinishWithScan_

                    You're right. I sincerely don't understand how I could do so big mistake.
                    Thanks, I'll try

                    Édit: save button does not close the view

                    JonB 1 Reply Last reply Reply Quote 0
                    • cvp
                      cvp last edited by cvp

                      The delegate is called but the view is not closed as I though thus I have proven by writing in a file. And restart Pythonista because I could not close the view.

                      def documentCameraViewController_didFinishWithScan_(_self, _cmd, _controller, _scan):
                      	with open('a.txt',mode='wt') as fil:
                      		fil.write('documentCameraViewController_didFinishWithScan_')
                      	print('documentCameraViewController_didFinishWithScan_')
                      	VNDocumentViewController = ObjCInstance(_controller)
                      	scan = ObjCInstance(_scan)	# VNDocumentCameraScan
                      	#print(scan) 
                      .
                      .
                      .
                      
                      methods = [documentCameraViewController_didFinishWithScan_, documentCameraViewController_didFailWithError_, documentCameraViewControllerDidCancel_]
                      
                      
                      JonB 1 Reply Last reply Reply Quote 0
                      • JonB
                        JonB last edited by

                        This post is deleted!
                        1 Reply Last reply Reply Quote 0
                        • JonB
                          JonB @cvp last edited by

                          @cvp perhaps you need to dismiss the _controller?

                          cvp 1 Reply Last reply Reply Quote 0
                          • cvp
                            cvp @JonB last edited by

                            @JonB I was busy to post this

                            def documentCameraViewController_didFinishWithScan_(_self, _cmd, _controller, _scan):
                            	VNDocumentViewController = ObjCInstance(_controller)
                            	scan = ObjCInstance(_scan)	# VNDocumentCameraScan
                            	#print(scan)
                            	VNDocumentViewController.dismissViewControllerAnimated_completion_(True, None)
                            
                            1 Reply Last reply Reply Quote 0
                            • JonB
                              JonB @cvp last edited by JonB

                              @cvp re: getting the name wrong, in Swift, they omit the "nouns", i think. So the docs show the selectors without nouns. In objc_util it lets you do this too, if you use kwargs.

                              Re: dismissing... So did that work? If not, maybe need to on_main_thread it?

                              1 Reply Last reply Reply Quote 1
                              • cvp
                                cvp last edited by

                                scan returns an UIImage

                                	print(scan.imageOfPageAtIndex_(0)) 
                                
                                1 Reply Last reply Reply Quote 0
                                • cvp
                                  cvp @JonB last edited by

                                  @JonB said:

                                  documentCameraViewController_didFinishWithScan_

                                  One more time, thanks for your help.

                                  I really become too old for this stuff. Shame on me, I'm so sad to have not seen that myself.
                                  Sorry to all people who tried to help us.😢😪

                                  1 Reply Last reply Reply Quote 0
                                  • cvp
                                    cvp @emkay_online last edited by

                                    @emkay_online quick an dirty to see the UIImage

                                    	import ctypes
                                    	from PIL import Image
                                    	UIImage = scan.imageOfPageAtIndex_(0)	
                                    	# Save UIImage to jpg file
                                    	func = c.UIImageJPEGRepresentation
                                    	func.argtypes = [ctypes.c_void_p, ctypes.c_float]
                                    	func.restype = ctypes.c_void_p
                                    	x = ObjCInstance(func(UIImage.ptr, 1.0))
                                    	x.writeToFile_atomically_('test.jpg', True)
                                    	# Display jpg file
                                    	image = Image.open("test.jpg")
                                    	image.show()
                                    
                                    1 Reply Last reply Reply Quote 0
                                    • cvp
                                      cvp @emkay_online last edited by

                                      @emkay_online operational

                                      from objc_util import *
                                      import ui
                                      load_framework('VisionKit')
                                      
                                      def documentCameraViewController_didFinishWithScan_(_self, _cmd, _controller, _scan):
                                      	VNDocumentViewController = ObjCInstance(_controller)
                                      	scan = ObjCInstance(_scan)	# VNDocumentCameraSca
                                      	
                                      	UIImage = scan.imageOfPageAtIndex_(0)	
                                      	ObjCInstance(VNDocumentViewController.ui_view['iv']).setImage_(UIImage)
                                      
                                      	VNDocumentViewController.dismissViewControllerAnimated_completion_(True, None)
                                      	
                                      def documentCameraViewController_didFailWithError_(_self, _cmd, _controller, _error):
                                      	print('documentCameraViewController_didFailWithError_')
                                      	
                                      def documentCameraViewControllerDidCancel_(_self, _cmd, _controller):
                                      	print('documentCameraViewControllerDidCancel_')
                                      
                                      methods = [documentCameraViewController_didFinishWithScan_, documentCameraViewController_didFailWithError_, documentCameraViewControllerDidCancel_]
                                      protocols = ['VNDocumentCameraViewControllerDelegate']
                                      try:
                                      		MyVNDocumentCameraViewControllerDelegate = ObjCClass('MyVNDocumentCameraViewControllerDelegate')
                                      except:
                                      	MyVNDocumentCameraViewControllerDelegate = create_objc_class('MyVNDocumentCameraViewControllerDelegate', methods=methods, protocols=protocols)
                                      
                                      @on_main_thread	
                                      def main():
                                      	VNDocumentCameraViewController = ObjCClass('VNDocumentCameraViewController').alloc().init()
                                      	delegate = MyVNDocumentCameraViewControllerDelegate.alloc().init()
                                      	VNDocumentCameraViewController.delegate = delegate	
                                      
                                      	uiview = ui.View()
                                      	iv = ui.ImageView(name='iv')
                                      	iv.frame = uiview.bounds
                                      	iv.flex = 'wh'
                                      	uiview.add_subview(iv)
                                      	uiview.present('fullscreen')
                                      	VNDocumentCameraViewController.ui_view = uiview	# to pass to delegate
                                      	
                                      	objc_uiview = ObjCInstance(uiview)
                                      	SUIViewController = ObjCClass('SUIViewController')
                                      	vc = SUIViewController.viewControllerForView_(objc_uiview)	
                                      	vc.presentViewController_animated_completion_(VNDocumentCameraViewController, True, None)
                                      	
                                      main() 
                                      
                                      mikael emkay_online 2 Replies Last reply Reply Quote 0
                                      • mikael
                                        mikael @cvp last edited by

                                        @cvp, good stuff. It gives the straightened-out picture, right? Can I get a multi-page PDF, or is the framework for single pictures only?

                                        cvp 1 Reply Last reply Reply Quote 0
                                        • cvp
                                          cvp @mikael last edited by

                                          @mikael no,no, the framework is for multiple scans but my little script not.
                                          I think that if you don't dismiss the camera view controller, you could continue to scan multiple images, but I did not test it.

                                          1 Reply Last reply Reply Quote 0
                                          • JonB
                                            JonB last edited by

                                            i think the document object guves you UIImages only, but you could create a pdf using some UIKit functions:

                                            https://developer.apple.com/documentation/uikit/images_and_pdf?language=objc

                                            (you need to acces the functions using c.UIGraphicsBeginPDFContextToFile etc and set argtypes and restype)

                                            I think the basic flow is, you have to create a pdf context to a file, begn a pdf page, draw your content (UiImage's drawAtPoint ), begn a new page, etc, then finally end the context.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Powered by NodeBB Forums | Contributors