Jump to content

ITK runtime property


Recommended Posts

butulec

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

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

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

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

Вот 

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

Link to post
Share on other sites


UnPinned posts
LongerSnake
// объявление функции аттрибута (получение списка заказов для УП)
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;
}

 

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

 

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

Link to post
Share on other sites
butulec

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

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

 

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

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 получить имя, оно тоже выводится, проблема именно добавить объекты в свойство 

Link to post
Share on other sites
butulec
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;

 

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

Link to post
Share on other sites
LongerSnake

А вы его в  BMIDE то сделали?

На вскидку  вроде  код  рабочий.

Link to post
Share on other sites
lexx174

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

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

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

  • Нравится 1
Link to post
Share on other sites
3 часа назад, lexx174 сказал:

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

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

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

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

Link to post
Share on other sites
butulec

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

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

*valueCount = requests.size();

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.



×
×
  • Create New...