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

Ug/open


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

Что бы создать ассоциативную копию объекта надо

1) создать преобразование (так называемый xform)

Это функции

UF_SO_create_xform_doubles (...),UF_SO_create_xform_pnt_xy_dirs (...), ...

2) собственно вызов ассоциативной копии.

Функция UF_WAVE_create_linked_body (...), где xform 2-й параметр

Ну и вопрос в следующем.

Когда xform создан ф-ей UF_SO_create_xform_doubles (...) все проходит так как надо

Когда xform создан ф-ей UF_SO_create_xform_pnt_xy_dirs(...) при вызове

WAVE_create_linked_body (...) система UG сообщает про invalid second parameter и не строит никаких линкед боди.

Если сказанного мало для ответа, где проблема, могу прислать исходники

С надеждой на помощь

tALEX

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


2 tALEX

1. Первое что надо проверять после вызова UgOpen ф-ции - это код возврата.

Смотрим в справку:

   int UF_SO_create_xform_pnt_xy_dirs (

        const tag_t object_in_part, 

        const UF_SO_update_option_t update_option, 

        const tag_t point, 

        const tag_t x_direction, 

        const tag_t y_direction, 

        const tag_t scale, 

        tag_p_t xform );
Эта ф-ция возвращает int. Если он == 0 то ф-ция выполнилась без ошибок, если != 0 то надо воспользоваться

   int UF_get_fail_message (

        int fail_code, 

        char message[ 133 ] );
для того чтобы посмотреть сам текст ошибки.

2. (Хотя это должен быть пункт 0) ДО вызова UgOpen ф-ции неплохо проверять параметры, которые ей передаются. Т.е. в для ф-ции UF_SO_create_xform_pnt_xy_dirs неплохо проверить

const tag_t object_in_part <- этот параметр передается в ф-цию для того чтобы она могла определить в каком part-е создавать данный объект. (Обычно сюда подается tag самого part-a )

const tag_t point

const tag_t x_direction

const tag_t y_direction

const tag_t scale

Проверка простая ( для данного случая ) - надо проверить условие tag == NULL_TAG. Если он == NULL_TAG - то UF_SO_create_xform_pnt_xy_dirs выполнится с ошибкой.

То же самое касается ф-ций из которых ты получил таги point, x_direction, y_direction, scale.

Для предотвращения наведённых ошибок рекомендуется при объявлении переменных, в которых будет размещаться результат выполнения UgOpen ф-ции (в данном случае tag_t ) сразу их занулять.

Хотя может показаться занудным каждый раз занулять данный и проверять ошибки, но это необходимо для быстрого поиска "неисправности" и минимизации самых неприятных - "наведённых" ошибок.

Вот небольшой примерчик создания scalar_double-a:

#include <stdio.h>



#include <uf.h>

#include <uf_ui.h>

#include <uf_assem.h>

#include <uf_so.h>







//// объявления ф-ций

void printError ( const char * error );

void printError ( int ug_error )    ;



////////////////////////////////////////////////////////////////////////////////////////

void printError ( int ug_error ) {

    ///// Захватим лицензию

    if ( UF_initialize() ) return;



    int erc = 0;

    char message [133+1]; //// добавим 1 для нуль терминатора 



    erc = UF_get_fail_message ( ug_error, message );

    //// проверим результат

    if ( erc ) {

        //// Отпустим лицензию

        UF_terminate();

        return;

    }



    //// распечатаем текст ошибки

    printError ( message );



    //// Отпустим лицензию

    UF_terminate();

}





////////////////////////////////////////////////////////////////////////////////////////

void printError ( const char * error ) {



    //// для начала проверим указатель который нам передали

    if ( !error ) return;



    ///// Захватим лицензию

    if ( UF_initialize() ) return;



    int erc = 0;



    //// попробуем открыть инфо окно

    erc = UF_UI_open_listing_window ( );



    //// окно не открылось :( соответственно и печатать текст некуда;

    if ( erc )  {

        //// Отпустим лицензию

        UF_terminate();

        return;

    }



    //// напечатаем текст ошибки и перевод строки

    UF_UI_write_listing_window ( error );

    UF_UI_write_listing_window ( "\n" );



    //// Отпустим лицензию

    UF_terminate();

}



////////////////////////////////////////////////////////////////////////////////////////

//// Entry Point

////////////////////////////////////////////////////////////////////////////////////////

extern DllExport void ufusr( char *parm, int *returnCode, int rlen ) {



    ///// Захватим лицензию

    if ( UF_initialize() ) return;



    //// Спросим рабочую часть

    tag_t work_part_tag = UF_ASSEM_ask_work_part ( );



    //// если ничего не загружено в UG - отваливаемся с ошибкой

    if ( NULL_TAG == work_part_tag ) {

        //// печатаем ошибку

        printError ( "There is no work part" );

        //// Отпустим лицензию

        UF_terminate();

        //// выходим

        return;

    }



    //// сразу занулим tag

    tag_t  scalar_tag = NULL_TAG;

    double scalar_double = 100;

    int erc = 0;



    erc = UF_SO_create_scalar_double ( work_part_tag , UF_SO_update_after_modeling , scalar_double, &scalar_tag);

    if ( erc ) {

        //// печатаем ошибку

        printError ( erc );

        //// Отпустим лицензию

        UF_terminate();

        //// выходим

        return;

    }



    //// Можно проверить результат на валидность

    if ( NULL_TAG == scalar_double ) {

        //// печатаем ошибку

        printError ( "Null tag is not allowed" );

        //// Отпустим лицензию

        UF_terminate();

        //// выходим

        return;

    }

 

    //// Отпустим лицензию

    UF_terminate();

}

Regardzzz ...

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

Спешу оправдаться...

ВСЕ функции вызывались через UG_CALL() где проверяются коды возврата.

ошибку при создании xform функция UF_SO_create_xform_pnt_xy_dirs не выдает.

Так же не выдают ошибок ф-ии создания точек,направлений, скаляров

WAVE_create_linked_body жалуется на xform ЕСЛИ xform создан UF_SO_create_xform_pnt_xy_dirs

WAVE_create_linked_body выполняется без ошибок ЕСЛИ xform создан

UF_SO_create_xform_doubles (...)

Данные для ф-ии UF_SO_create_xform_doubles (...) берутся через экстракт построенных точек, направлений и скаляров, построенных перед этим для использования в ф-ии UF_SO_create_xform_pnt_xy_dirs()

Вот такая ерунда получается

tALEX

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

Блин мужики! Я над вами неподдельно диву даюсь! Тут многие в стандартных командах разобраться не могут...(не исключая меня)

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

Блин мужики! Я над вами неподдельно диву даюсь! Тут многие в стандартных командах разобраться не могут...(не исключая меня)

<{POST_SNAPBACK}>

Так ведь не работает не фига...

А вот вогда заработает, тогда О-го-го !!!

Может поделюсь потом(когда заработает)

А пока то не работает :wallbash:

tALEX

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

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

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

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

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

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

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

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

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

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

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




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