Добрый день Юра,
Посылаю тебе исходные коды программы, которая удаляет
неиспользуемые фасеты, которые созданы в модуле обработки.
Эту проблему мне описали ваши технологи-программисты во
время нашего последнего визита на КНААПО.
============НАЧАЛО КОДА========================
/*****************************************************************************
**
** Программа delete_unuse_facet_bodies.c
**
** Описание:
** Удаляет все фасетные тела созданные в модуле обработки из
файла детали.
** Разработчик: Чиж Олег
** Email:
** Версия: 1.0
*****************************************************************************/
/* Файлы включения */
#include
<stdio.h>
#include <stdlib.h>
#include
<string.h>
#include
<malloc.h>
#include
<uf.h>
#include
<uf_ui.h>
#include
<uf_cfi.h>
#include
<uf_obj.h>
#include
<uf_object_types.h>
#include
<uf_modl.h>
#include
<uf_part.h>
#include
<uf_attr.h>
#include
<uf_curve.h>
#include
<uf_csys.h>
#include
<uf_disp.h>
#define UF_CALL(X)
(report_error( __FILE__, __LINE__, #X, (X)))
static int
report_error( char *file, int line, char *call, int irc)
{
if(irc)
{
char err[133],
msg[133];
sprintf(msg, "*** ERROR code %d at line %d in
%s:\n+++ ",
irc, line, file);
UF_get_fail_message(irc, err);
UF_print_syslog(msg, FALSE);
UF_print_syslog(err, FALSE);
UF_print_syslog("\n", FALSE);
UF_print_syslog(call, FALSE);
UF_print_syslog(";\n", FALSE);
if(!UF_UI_open_listing_window())
{
UF_UI_write_listing_window(msg);
UF_UI_write_listing_window(err);
UF_UI_write_listing_window("\n");
UF_UI_write_listing_window(call);
UF_UI_write_listing_window(";\n");
}
}
return(irc);
}
/*****************************************************************************
** Метод запуска
*****************************************************************************/
/* Для запуска этой программы используйте
** "File->Execute UG/Open->User Function..."
*/
extern DllExport void ufusr( char *parm, int
*returnCode, int rlen )
{
int count = 0,
i;
int type,
subtype;
char
tmp_str[256+1] = "";
tag_t *facet_to_delete;
tag_t part_tag, object = NULL_TAG;
/* Инициализация API */
if(UF_CALL(UF_initialize()))
{
/* Ошибка инициализации */
return;
}
/* Запрашиваем тег отображаемой детали */
part_tag = UF_PART_ask_display_part();
/* Резервируем память для первого элемента массива тегов */
facet_to_delete = (tag_t *) malloc(sizeof(tag_t));
/* Запускаем цикл по всем объектам в детали и формируем массив
фасетных тел.
ЗАМАЧАНИЕ: Этот массив необходимо создать по причине того, что в
этом цикле
нельзя сразу удалять объекты, так как алоритм работы этой функции
предусматривает
ссылку на предидущий объект, и если мы его удаляем, цикл
заканчивается */
while((object =
UF_OBJ_cycle_all(part_tag, object)) != NULL_TAG)
{
/* Запрашивает тип и подтип объекта */
UF_OBJ_ask_type_and_subtype(object, &type,
&subtype);
/* Если тип == фасетное тело */
if(type ==
UF_faceted_model_type) {
/* Записываем его в массив */
facet_to_delete[count] = object;
/* Уваличиваем счетчик количества фасетов в массиве */
count++;
/* Перераспределяем память массива фасетных тел */
facet_to_delete = (tag_t *) realloc(facet_to_delete,
sizeof(tag_t)*(count+1));
}
}
/* Запускаем цикл для удаления фасетных тел */
for(i = 0; i < count; i++)
{
UF_CALL(UF_OBJ_delete_object(facet_to_delete[i]));
}
/* Освобождаем память */
free(facet_to_delete);
/* Выходим из API */
UF_CALL(UF_terminate());
}
/*****************************************************************************
** Утилиты
*****************************************************************************/
/* Выгружаем програму из памяти при окончании приложения */
extern int
ufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
}
============НАЧАЛО КОДА========================
С уважением,
Oleg Chizh
CAD/CAM Consultant
Siemens Automation and Drives
UGS PLM Software
Krasnopresnenskaya nab., 12, office 504B
123610
Tel: ++7 495 967 07 73
Fax: ++7 495 967 07 75
WWW: www.siemens.com/ugs
E-mail: Oleg.Chizh@siemens.com