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.


    For the fun, a Photos cube

    Pythonista
    5
    35
    18758
    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.
    • scj643
      scj643 last edited by

      https://github.com/scj643/objc_tools is my repo

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

        I know your repo, often checked...

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

          hey, digging out this old topic - did you have chance into the triangle mesh generation?

          I have started converting the Obj-c snippet above, but it crashes Pythonista at the geometrySourceWithVertices call. Probably my bad, but I’m clueless about how to fiw this:

          verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
          
          src = SCNGeometrySource.geometrySourceWithVertices_count_(POINTER(verts),3)
          cvp 2 Replies Last reply Reply Quote 0
          • cvp
            cvp @momorprods last edited by

            @momorprods No, sorry, I didn't success...

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

              It wouldn't be POINTER here. Try byref.

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

                Actually, verts must be a ctypes array, not a python list.

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

                  oh ok thanks, going to try that and keep you posted!

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

                    Made this, but still crashing. Am I making another noob mistake?

                    verts=[0.0,0.0,0.0 , 1.0,0.0,0.0 , 0.0,1.0,0.0]
                    arr = (ctypes.c_float * len(verts))(*verts)
                    src = SCNGeometrySource.geometrySourceWithVertices_count_(byref(arr),3)
                    cvp 1 Reply Last reply Reply Quote 0
                    • cvp
                      cvp @momorprods last edited by cvp

                      @momorprods Perhaps this (at least, no crash šŸ˜€)

                      class SCNVector3(Structure):
                      	_fields_ = [('x', c_double), ('y', c_double), ('z', c_double)]
                      

                      And

                          verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
                          verts_array = (SCNVector3 * len(verts))(*verts)
                          SCNGeometrySource = ObjCClass('SCNGeometrySource').geometrySourceWithVertices_count_(
                          verts_array,len(verts),
                          restype=c_void_p,
                          argtypes=[POINTER(SCNVector3), c_ulong],)
                      
                      1 Reply Last reply Reply Quote 0
                      • momorprods
                        momorprods last edited by

                        wooohoooo thanks!!

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

                          Making some good progress thanks to your help. But I’m getting a last crash on the very last instruction - any idea?

                          #triangle generation
                          verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
                          verts_array = (SCNVector3 * len(verts))(*verts)
                          
                          src = ObjCClass('SCNGeometrySource').geometrySourceWithVertices_count_(
                              verts_array,len(verts),
                              restype=c_void_p,
                              argtypes=[POINTER(SCNVector3), c_ulong],)
                              
                          indexes=[0,1,2]
                          indexes_array = (c_ulong*len(indexes))(*indexes)
                          datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,len(indexes_array))
                           
                          ele=ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,SCNGeometryPrimitiveTypeTriangles,1,4)
                             
                          # CRASH Here: 
                          geo = ObjCClass('SCNGeometry').geometryWithSources_elements_(src,ele)
                          cvp 2 Replies Last reply Reply Quote 0
                          • cvp
                            cvp @momorprods last edited by cvp

                            @momorprods I've read that indices must contain a first element with the number of points but I don't know if it is true.
                            sources and elements must be arrays
                            But I have also a crash with my code
                            See faultlog below but I can't solve the problem, sorry

                                verts = [SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
                                verts_array = (SCNVector3 * len(verts))(*verts)
                                SCNGeometrySource = ObjCClass('SCNGeometrySource').geometrySourceWithVertices_count_(
                                verts_array,len(verts),
                                restype=c_void_p,
                                argtypes=[POINTER(SCNVector3), c_ulong],)
                                sources = NSArray([SCNGeometrySource])
                                
                                indices = [3,0,1,2]	# number points and their indices
                                indices_data = ns(indices)
                                # primitiveType = 0 for triangle
                                # primitiveCount = 1
                                SCNGeometryElement = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(indices_data,0,1,4)
                                elements = NSArray([SCNGeometryElement])
                                
                                geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_(sources, elements)    	
                            

                            Fatal Python error: Aborted

                            Current thread 0x0000000100d62b80 (most recent call first):
                            File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 773 in call
                            File "/private/var/mobile/Containers/Shared/AppGroup/668A7D98-7216-47ED-917D-AA0B6173167E/Pythonista3/Documents/test6.py", line 51 in demo
                            File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 1066 in OMMainThreadDispatcher_invoke_imp

                            Thread 0x000000016fa5f000 (most recent call first):
                            File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 898 in call
                            File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 1095 in new_func
                            File "/private/var/mobile/Containers/Shared/AppGroup/668A7D98-7216-47ED-917D-AA0B6173167E/Pythonista3/Documents/test6.py", line 76 in <module>


                            Objective-C exception details:

                            NSInvalidArgumentException: -[SCNGeometrySource count]: unrecognized selector sent to instance 0x283276100

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

                              this works

                              from ctypes import *
                              from objc_util import *
                              
                              class SCNVector3(Structure):
                                  _fields_ = [('x', c_double), ('y', c_double), ('z', c_double)]
                              
                              verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
                              
                              SCNVector3Array3=SCNVector3 * len(verts)
                              verts_array=SCNVector3Array3(*verts)
                              SCNGeometrySource = ObjCClass('SCNGeometrySource')
                              
                              s=SCNGeometrySource.geometrySourceWithVertices_count_(byref(verts_array),len(verts),restype=c_void_p,argtypes=[POINTER(SCNVector3Array3), c_ulong],)
                              
                              cvp 1 Reply Last reply Reply Quote 0
                              • cvp
                                cvp @JonB last edited by

                                @JonB Yes, but in my code,,the crash was in

                                    geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_(sources, elements)    	
                                
                                1 Reply Last reply Reply Quote 0
                                • cvp
                                  cvp @momorprods last edited by cvp

                                  @momorprods @JonB No crash with

                                      verts = [SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]     
                                      SCNVector3Array3=SCNVector3 * len(verts)
                                      verts_array=SCNVector3Array3(*verts)
                                      SCNGeometrySource = ObjCClass('SCNGeometrySource')
                                      s = SCNGeometrySource.geometrySourceWithVertices_count_(byref(verts_array),len(verts),restype=c_void_p,argtypes=[POINTER(SCNVector3Array3), c_ulong],)
                                     
                                      indexes=[0,1,2]
                                      indexes_array = (c_ulong*len(indexes))(*indexes)
                                      datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,len(indexes_array))
                                      # primitiveType = 0 for triangle
                                      # primitiveCount = 1  
                                      e = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,0,1,4)
                                      
                                      geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_([s],[e])
                                  	```
                                  
                                  Edit: but nothing visible
                                  1 Reply Last reply Reply Quote 0
                                  • cvp
                                    cvp @momorprods last edited by

                                    @momorprods I'm not sure if you should take in account the length of c_ulong
                                    Just an idea, rally not sure.
                                    Anyway, Scene stays blank 😢

                                        #indexes=[0,1,2]
                                        indexes = [c_ulong(0),c_ulong(1),c_ulong(2)]
                                        indexes_array = (c_ulong*len(indexes))(*indexes)
                                        #datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array, len(indexes_array))
                                        datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array, len(indexes_array)*sizeof(c_ulong))
                                        # primitiveType = 0 for triangle
                                        # primitiveCount = 1  
                                        #e = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,0,1,4)
                                        e = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,0,1,sizeof(c_ulong))
                                    
                                    1 Reply Last reply Reply Quote 0
                                    • momorprods
                                      momorprods last edited by

                                      @cvp @JonB thanks for your help, I am going to investigate that empty scene stuff.

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

                                        dataWithBytes_length_ expects sizeof(verts_array)

                                        datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,sizeof(indexes_array))
                                        

                                        as a check:

                                        geometry.geometryElements()[0].data()
                                        
                                        cvp 1 Reply Last reply Reply Quote 0
                                        • cvp
                                          cvp @JonB last edited by

                                          @JonB Thanks for the correction but obviously not the only error because still blank Scene...

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

                                            @momorprods Eureka, same code but with other vertices shows a triangle

                                            One more time, thanks to @JonB without whom we would never solve these problems.

                                                verts = [SCNVector3(0, 0, 1), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)]
                                            
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Powered by NodeBB Forums | Contributors