Esempio n. 1
0
int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result)
{
	PyObject *pyctx = (PyObject *)CTX_py_dict_get(C);
	PyObject *item = PyDict_GetItemString(pyctx, member);
	PointerRNA *ptr = NULL;
	int done = 0;

	if (item == NULL) {
		/* pass */
	}
	else if (item == Py_None) {
		/* pass */
	}
	else if (BPy_StructRNA_Check(item)) {
		ptr = &(((BPy_StructRNA *)item)->ptr);

		//result->ptr = ((BPy_StructRNA *)item)->ptr;
		CTX_data_pointer_set(result, ptr->id.data, ptr->type, ptr->data);
		done = 1;
	}
	else if (PySequence_Check(item)) {
		PyObject *seq_fast = PySequence_Fast(item, "bpy_context_get sequence conversion");
		if (seq_fast == NULL) {
			PyErr_Print();
			PyErr_Clear();
		}
		else {
			int len = PySequence_Fast_GET_SIZE(seq_fast);
			int i;
			for (i = 0; i < len; i++) {
				PyObject *list_item = PySequence_Fast_GET_ITEM(seq_fast, i);

				if (BPy_StructRNA_Check(list_item)) {
#if 0
					CollectionPointerLink *link = MEM_callocN(sizeof(CollectionPointerLink), "bpy_context_get");
					link->ptr = ((BPy_StructRNA *)item)->ptr;
					BLI_addtail(&result->list, link);
#endif
					ptr = &(((BPy_StructRNA *)list_item)->ptr);
					CTX_data_list_add(result, ptr->id.data, ptr->type, ptr->data);
				}
				else {
					printf("List item not a valid type\n");
				}

			}
			Py_DECREF(seq_fast);

			done = 1;
		}
	}

	if (done == 0) {
		if (item) printf("PyContext '%s' not a valid type\n", member);
		else      printf("PyContext '%s' not found\n", member);
	}
	else {
		if (G.debug & G_DEBUG_PYTHON) {
			printf("PyContext '%s' found\n", member);
		}
	}

	return done;
}
Esempio n. 2
0
int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result)
{
	PyGILState_STATE gilstate;
	bool use_gil = !PyC_IsInterpreterActive();

	PyObject *pyctx;
	PyObject *item;
	PointerRNA *ptr = NULL;
	bool done = false;

	if (use_gil)
		gilstate = PyGILState_Ensure();

	pyctx = (PyObject *)CTX_py_dict_get(C);
	item = PyDict_GetItemString(pyctx, member);

	if (item == NULL) {
		/* pass */
	}
	else if (item == Py_None) {
		done = true;
	}
	else if (BPy_StructRNA_Check(item)) {
		ptr = &(((BPy_StructRNA *)item)->ptr);

		//result->ptr = ((BPy_StructRNA *)item)->ptr;
		CTX_data_pointer_set(result, ptr->id.data, ptr->type, ptr->data);
		CTX_data_type_set(result, CTX_DATA_TYPE_POINTER);
		done = true;
	}
	else if (PySequence_Check(item)) {
		PyObject *seq_fast = PySequence_Fast(item, "bpy_context_get sequence conversion");
		if (seq_fast == NULL) {
			PyErr_Print();
			PyErr_Clear();
		}
		else {
			int len = PySequence_Fast_GET_SIZE(seq_fast);
			PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast);
			int i;

			for (i = 0; i < len; i++) {
				PyObject *list_item = seq_fast_items[i];

				if (BPy_StructRNA_Check(list_item)) {
#if 0
					CollectionPointerLink *link = MEM_callocN(sizeof(CollectionPointerLink), "bpy_context_get");
					link->ptr = ((BPy_StructRNA *)item)->ptr;
					BLI_addtail(&result->list, link);
#endif
					ptr = &(((BPy_StructRNA *)list_item)->ptr);
					CTX_data_list_add(result, ptr->id.data, ptr->type, ptr->data);
				}
				else {
					printf("PyContext: '%s' list item not a valid type in sequece type '%s'\n",
					       member, Py_TYPE(item)->tp_name);
				}

			}
			Py_DECREF(seq_fast);
			CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
			done = true;
		}
	}

	if (done == false) {
		if (item) {
			printf("PyContext '%s' not a valid type\n", member);
		}
		else {
			printf("PyContext '%s' not found\n", member);
		}
	}
	else {
		if (G.debug & G_DEBUG_PYTHON) {
			printf("PyContext '%s' found\n", member);
		}
	}

	if (use_gil)
		PyGILState_Release(gilstate);

	return done;
}