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
    14151
    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.
    • emkay_online
      emkay_online last edited by

      Hi,

      I'm just dipping my toes into objc_util and have fallen at the first hurdle.

      I want to write a small script that calls VisionKit to scan a document and return the result to Pythonista. API is here: https://developer.apple.com/documentation/visionkit

      I've started with:

      from objc_util import *
      VNDocumentCameraViewController = ObjCClass('VNDocumentCameraViewController')
      
      

      But Pythonista says that the class VNDocumentCameraViewController doesn't exist.

      I'd love some help getting past this (and if anyone could take the example further, that would be amazing).

      Thank you,

      Martin

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

        @emkay_online said:

        VNDocumentCameraViewController = ObjCClass('VNDocumentCameraViewController')

        from objc_util import *
        load_framework('VisionKit')
        VNDocumentCameraViewController = ObjCClass('VNDocumentCameraViewController') 
        
        1 Reply Last reply Reply Quote 1
        • cvp
          cvp @emkay_online last edited by

          @emkay_online try this but not finished, only a first step to help you. No time more now

          from objc_util import *
          import ui
          load_framework('VisionKit')
          
          @on_main_thread	
          def main():
          	VNDocumentCameraViewController = ObjCClass('VNDocumentCameraViewController').alloc().init()
          	#print(dir(VNDocumentCameraViewController))
          
          	uiview = ui.View()
          	uiview.frame = (0,0,500,500)
          	uiview.present('sheet')
          		
          	objc_uiview = ObjCInstance(uiview)
          	SUIViewController = ObjCClass('SUIViewController')
          	vc = SUIViewController.viewControllerForView_(objc_uiview)	
          
          	VNDocumentCameraViewController.setModalTransitionStyle_(3)	
          	vc.presentViewController_animated_completion_(VNDocumentCameraViewController, True, None)
          	
          main() 
          
          1 Reply Last reply Reply Quote 2
          • emkay_online
            emkay_online last edited by

            You are amazing - thank you. You have saved me so much frustration and guessing.

            Thank you so much,

            Martin

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

              @emkay_online next step but documentCameraViewController_didFinishWith_ not called.
              Either my bug either iOS bug (other people seem to meet the same problem)

              from objc_util import *
              import ui
              load_framework('VisionKit')
              
              #========= VNDocumentViewController 
              def documentCameraViewController_didFinishWith_(_self, _cmd, _controller, _scan):
              	print('documentCameraViewController_didFinishWith_')
              	VNDocumentViewController = ObjCInstance(_controller)
              	scan = ObjCInstance(_scan)	# VNDocumentCameraScan
              	#print(scan)
              
              
              methods = [documentCameraViewController_didFinishWith_,]
              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()
              	#print(dir(VNDocumentCameraViewController))
              	delegate = MyVNDocumentCameraViewControllerDelegate.alloc().init()
              	VNDocumentCameraViewController.delegate = delegate		
              
              	uiview = ui.View()
              	uiview.frame = (0,0,500,500)
              	uiview.present('sheet')
              	
              	objc_uiview = ObjCInstance(uiview)
              	SUIViewController = ObjCClass('SUIViewController')
              	vc = SUIViewController.viewControllerForView_(objc_uiview)	
              
              	VNDocumentCameraViewController.setModalTransitionStyle_(4)	
              	vc.presentViewController_animated_completion_(VNDocumentCameraViewController, True, None)
              	
              main() 
              
              1 Reply Last reply Reply Quote 0
              • emkay_online
                emkay_online last edited by

                Thank you for your code. I'm as puzzled as you as to why it doesn't work. I added the other methods in case an error or a cancel was being returned, but nothing.

                I'll keep playing and hope I stumble on the answer.

                Thanks again.

                Martin

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

                  @emkay_online I did it also and cancel reacts

                  def documentCameraViewController_didFailWithError_(_self, _cmd, _controller, _error):
                  	print('documentCameraViewController_didFailWithError_')
                  	
                  def documentCameraViewControllerDidCancel_(_self, _cmd, _controller):
                  	print('documentCameraViewControllerDidCancel_')
                  
                  methods = [documentCameraViewController_didFinishWith_, documentCameraViewController_didFailWithError_, documentCameraViewControllerDidCancel_]
                  
                  1 Reply Last reply Reply Quote 0
                  • cvp
                    cvp last edited by

                    Cancel is called but you still need to tap save to terminate...

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

                      @cvp the recent iPadOS update seems to have effected accesing different areas of the sandbox. and unless someone finds the new access classes, Apple will have some upset developers on thier hands lol

                      1 Reply Last reply Reply Quote 1
                      • 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
                                            • First post
                                              Last post
                                            Powered by NodeBB Forums | Contributors