Перейти к публикации

ITK runtime property


Рекомендованные сообщения

Здравствуйте!

Вообщем есть runtime свойство у объекта, там отображаются объекты (те куда входит наш объект с определенным отношением)

Пытаемся реализовать на itk с помощью GRM_list_primary_objects_only(obj, relation_type, &numberOfObjects, &objects);

При выводе printf("numberOfObjects=%d\n", numberOfObjects); видно что объект 1 есть, но как правильно его отобразить в runtime свойстве?

Вот 

 была очень похожая проблема, но решения там нет. Может кто сталкивался, подскажите пожалуйста)

Ссылка на сообщение
Поделиться на других сайтах


UnPinned posts
// объявление функции аттрибута (получение списка заказов для УП)
int ncRequestList(METHOD_message_t* m, va_list args);

//определение
int ncRequestList(METHOD_message_t* m, va_list args) {
	va_arg(args, tag_t);
	const auto valueCount = va_arg(args, int*);
	const auto values = va_arg(args, tag_t**);
	const auto isNull = va_arg(args, logical**);
	const auto isEmpty = va_arg(args, logical**);

	const auto requests = getRequestsFromResult(m->object_tag, "Object_Revision");
	*valueCount = requests.size();
	*isNull = static_cast<logical*>(MEM_alloc(sizeof(logical) * *valueCount));
	*isEmpty = static_cast<logical*>(MEM_alloc(sizeof(logical) * *valueCount));
	*values = static_cast<tag_t*>(MEM_alloc(sizeof(tag_t) * *valueCount));
	*values = TCUtility::convertToTagArray(requests);

	return ITK_ok;
}
     //где getRequestsFromResult функция  прохожения по первичным обектам и нахождения заявок, внутри используется getPrimaryObjects
     // Преобразует вектор объектов в массив тэгов
TCObjectVector TCObject::getPrimaryObjects(const string& relation_name) const {
	TCObjectVector res = TCObjectVector();
	if (tag == NULLTAG) return res;

	tag_t relType = NULLTAG;
	ITKCALLLOG(GRM_find_relation_type(relation_name.c_str(), &relType));

	int obj_count;
	tag_t* obj_array;
	ITKCALLLOG(GRM_list_primary_objects_only(tag, relType, &obj_count, &obj_array));

	for (int i = 0; i < obj_count; i++) {
		res.push_back(TCObject(obj_array[i]));
	}

	MEM_free(obj_array);

	return res;
}
                                  
                                  
tag_t* TCUtility::convertToTagArray(const TCObjectVector& values) {
	tag_t* tag_arr = (tag_t*) MEM_alloc(values.size() * sizeof(tag_t));

	for (int i = 0; i < values.size(); i++) {
		TCObject val = values[i];
		tag_arr[i] = val.getTag();
	}

	return tag_arr;
}

 

Вот как-то примерно так реализую

 

Естественно все  классы самописные

Ссылка на сообщение
Поделиться на других сайтах

Спасибо за пример!

Примерно так я и пытался сделать, но из за отсутствия ваших самописных классов не очень понятно некоторые моменты

 

Могли помочь, вот что у меня получилось

extern DLLAPI int getBackSolutionItem(METHOD_message_t *m, va_list args)
{

    int ifail = ITK_ok;
    va_arg(args, tag_t);
    const auto valueCount = va_arg(args, int*);
    const auto values = va_arg(args, tag_t**);
    const auto isNull = va_arg(args, logical**);
    const auto isEmpty = va_arg(args, logical**);

    *isNull = static_cast<logical*>(MEM_alloc(sizeof(logical)* *valueCount));
    *isEmpty = static_cast<logical*>(MEM_alloc(sizeof(logical)* *valueCount));
    *values = static_cast<tag_t*>(MEM_alloc(sizeof(tag_t)* *valueCount));
     
    tag_t obj = m->object_tag;   //это собственно таг ревизии
    tag_t relType = NULLTAG;
    GRM_find_relation_type("CMHasSolutionItem", &relType);
    int obj_count;
    tag_t* obj_array;

    GRM_list_primary_objects_only(obj, relType, &obj_count, &obj_array);
    tag_t* tag_arr = (tag_t*)MEM_alloc(obj_count * sizeof(tag_t));
    printf("obj_count=%d\n", obj_count);
    for (int i = 0; i < obj_count; i++) {
        tag_arr[i] = obj_array[i];
    }
    *values = tag_arr;
    MEM_free(obj_array);
 

    return ifail;
}

printf("obj_count=%d\n", obj_count); здесь выводится количество верное

и ранее я пытался WSOM_ask получить имя, оно тоже выводится, проблема именно добавить объекты в свойство 

Ссылка на сообщение
Поделиться на других сайтах
extern DLLAPI int getBackSolutionItem(METHOD_message_t *m, va_list args)
{
    
    int ifail = ITK_ok;
    tag_t** values = va_arg(args, tag_t**);
    
    tag_t obj = m->object_tag;  
    tag_t relType = NULLTAG;
    int obj_count;
    tag_t* obj_array;

    GRM_find_relation_type("CMHasSolutionItem", &relType);
    GRM_list_primary_objects_only(obj, relType, &obj_count, &obj_array);

    char name[WSO_name_size_c + 1];
    char *id[WSO_name_size_c + 1];
    WSOM_ask_name(obj_array[0], name);
    WSOM_ask_id_string(obj_array[0], id);
    printf("obj_count=%d\n", obj_count);
    printf("II - %s-%s", *id, name);
    *values = static_cast<tag_t*>(MEM_alloc(sizeof(tag_t)* obj_count));
    *values = obj_array;
    MEM_free(obj_array);
   return ifail;
       
}

image.png

 

а в runtime свойстве все равно его нет, видимо 

*values = obj_array;

 

надо как то по другому

Ссылка на сообщение
Поделиться на других сайтах

вопрос закрыт

делали его классически как custom_exit

там просто он забыл параметр один получить,а так все верно

Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, lexx174 сказал:

вопрос закрыт

делали его классически как custom_exit

там просто он забыл параметр один получить,а так все верно

Молодцы! :good: Если еще и выложите решение, то это будет полезно и другим участникам форума, которые могут столкнуться с похожей проблемой.

Ссылка на сообщение
Поделиться на других сайтах

Да всем спасибо, действительно код который выше был с самописными классами рабочий, забыли что помимо присвоения массива надо еще присвоить количество

02.04.2021 в 11:36, LongerSnake сказал:

*valueCount = requests.size();

Вот этот момент мы упустили, но он оказался важным :D

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...