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
-
I actually need people to help make an API for scenekit so we can do this type of stuff with a python AI
-
I would like to help but I think I know not enough objective c for that...
When I program in objc, I spend hours before it works. -
https://github.com/scj643/objc_tools is my repo
-
I know your repo, often checked...
-
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)
-
@momorprods No, sorry, I didn't success...
-
It wouldn't be POINTER here. Try byref.
-
Actually, verts must be a ctypes array, not a python list.
-
oh ok thanks, going to try that and keep you posted!
-
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)
-
@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],)
-
wooohoooo thanks!!
-
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)
-
@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, sorryverts = [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_impThread 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
-
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],)
-
@JonB Yes, but in my code,,the crash was in
geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_(sources, elements)
-
@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
-
@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))
-
-
dataWithBytes_length_ expects sizeof(verts_array)
datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,sizeof(indexes_array))
as a check:
geometry.geometryElements()[0].data()