Hallo,
ich sehe den Beitrag nur heute. Es ist vielleicht jetzt zu spät, aber ich antworte trotzdem: Ja, es ist möglich.
Ich versuche einen Beispiel als Anhang zu dieser Nachricht zu Uploaden und hoffe, dass es klappt. Es ist ein Beispiel, der ich geschrieben hatte, um einen Bug an Dassault Systemes zu melden. Er besteht aus 2 Dateien: eine fast leere .iuaproc Datei und eine .c Datei.
Gruss
Jérôme PARENT
PS: Bei meiner Firma (CEGOS aus Frankreich) würde einen C++ Treiber entwickelt, um Catia leichter steuern zu können. Dieser Treiber ist aber kostenpflichtig. Bei Interesse kann ich Ihnen gerne in Verbindung mit der Kontaktperson setzen.
PS2: Das mit der Anlage scheint nicht zu funktionnieren. Also hier wäre die Datei BUG.iuaproc:
LOAD BUG
Und hier wäre die Datei BUG.c :
/* This program tries twice to replace a branch in the CSG-Tree using
GBMBRE. This operation fails at the second time on
Catia V4 Release 2.4 Refresh 02.
*/
#include <stdio.h>
/* CATIA fonctions */
void gilerr(int *ier);
void gicbrp(int *mnum,int *ibrp,int *ier);
void gcwspl(int *mnum,int *ivtx,double pt[3],double v1[3],double v2[3],double v3[3],double xlng[3],int *jsol,int *ier);
void gbride(int *mnum,int *jsol,int *iprim,int *nbcar,char *ident, int *ier);
void giwbop(int *mnum,int *ioper,int *jsol1,int *jsol2,int *ier);
void gicbrn(int *mnum,int *jsol1,int *ibran,int *jpath,int *ier);
void girbrn(int *mnum,int *jpath,int *jsol,int *ibran,int *ier);
void gbmbre(int *mnum,int *jsol,int *ibran,int *ioper,int *jslin,int *ier);
void gbuexe(int *mnum,int *jsol,int *ier);
void gircsl(int *mnum,int *jsol,int *lhis,int *ier);
void gircsg(int *mnum,int *jsol,int *lhis,int *tabHist,int *ier);
/* main program */
int bug()
{
int jsol1 = 0, jsol2 = 0, jsol3 = 0, jsol4 = 0;
/* solid exact */
{
int mnum = 1;
int ibrp = 2;
int ier = 0;
gicbrp( &mnum, &ibrp, &ier );
if ( ier != 0 ) gilerr( &ier );
}
/* 1. creating 1st solid. */
{
int mnum = 1;
int ivtx = 1;
double pt[3] = {0,0,0};
double v1[3] = {1,0,0};
double v2[3] = {0,1,0};
double v3[3] = {0,0,1};
double xlng[3] = {100,100,100};
int ier = 0;
int jsol = 0;
printf("1. creating 1st solid.\n");
gcwspl( &mnum, &ivtx, pt, v1, v2, v3, xlng, &jsol, &ier );
if ( ier != 0 ) gilerr( &ier ); else jsol1 = jsol;
}
/* 2. creating 2nd solid. */
if (0!=jsol1)
{
int mnum = 1;
int ivtx = 1;
double pt[3] = {25,25,-10};
double v1[3] = {1,0,0};
double v2[3] = {0,1,0};
double v3[3] = {0,0,1};
double xlng[3] = {50,50,120};
int ier = 0;
int jsol = 0;
printf("2. creating 2nd solid.\n");
gcwspl( &mnum, &ivtx, pt, v1, v2, v3, xlng, &jsol, &ier );
if ( ier != 0 ) gilerr( &ier ); else jsol2 = jsol;
}
/* 3. cut between jsol1 and jsol2. */
if (0!=jsol2)
{
int mnum = 1;
int ioper = 3;
int ier = 0;
int ibran;
int jpath;
printf("3. cut between jsol1 and jsol2.\n");
giwbop( &mnum, &ioper, &jsol1, &jsol2, &ier );
if ( ier != 0 )
{
gilerr( &ier );
jsol1 = 0;
}
gbuexe( &mnum, &jsol1, &ier );
if ( ier != 0 )
{
gilerr( &ier );
jsol1 = 0;
}
/* Here the following path element will just be created
and not used any more. In the real application it
is used later */
ibran = -1;
jpath = 0;
gicbrn( &mnum, &jsol1, &ibran, &jpath, &ier );
if ( ier != 0 ) gilerr( &ier );
}
/* 4. creating 3rd solid. */
if (0!=jsol1)
{
int mnum = 1;
int ivtx = 1;
double pt[3] = {25,25,-10};
double v1[3] = {1,0,0};
double v2[3] = {0,1,0};
double v3[3] = {0,0,1};
double xlng[3] = {25,25,120};
int ier = 0;
int jsol = 0;
printf("4. creating 3rd solid.\n");
gcwspl( &mnum, &ivtx, pt, v1, v2, v3, xlng, &jsol, &ier );
if ( ier != 0 ) gilerr( &ier ); else jsol3 = jsol;
}
/* 5. Replacing a local solid. */
if (0!=jsol3)
{
int i,j;
int mnum = 1;
int lhis = 0;
int *hist;
int ibran;
int ioper = 0;
int ier = 0;
printf("5. Replacing a local solid.\n");
gircsl( &mnum, &jsol1, &lhis, &ier );
if ( ier != 0 ) gilerr( &ier );
hist = (int *)malloc(lhis*3*sizeof(int));
gircsg( &mnum, &jsol1, &lhis, hist, &ier );
if ( ier != 0 ) gilerr( &ier );
for (i=0;i<lhis;i++)
{
printf(" hist[%d] = ",i);
for ( j=0; j<3; j++ )
{
printf("%d ",hist[i*3+j]);
}
printf("\n");
}
ibran = hist[2];
printf(" lhis = %d ibran = %d\n",lhis,ibran);
free(hist);
gbmbre( &mnum, &jsol1, &ibran, &ioper, &jsol3, &ier );
if ( ier != 0 )
{
gilerr( &ier );
jsol1 = 0;
}
gbuexe( &mnum, &jsol1, &ier );
if ( ier != 0 )
{
gilerr( &ier );
jsol1 = 0;
}
}
/* 6. creating 4th solid. */
if (0!=jsol1)
{
int mnum = 1;
int ivtx = 1;
double pt[3] = {25,25,-10};
double v1[3] = {1,0,0};
double v2[3] = {0,1,0};
double v3[3] = {0,0,1};
double xlng[3] = {40,40,120};
int ier = 0;
int jsol = 0;
printf("6. creating 4th solid.\n");
gcwspl( &mnum, &ivtx, pt, v1, v2, v3, xlng, &jsol, &ier );
if ( ier != 0 ) gilerr( &ier ); else jsol4 = jsol;
}
/* 7. Replacing again a local solid. */
if (0!=jsol4)
{
int i,j;
int mnum = 1;
int lhis = 0;
int *hist;
int ibran = -1;
int ioper = 0;
int ier = 0;
printf("7. Replacing again a local solid.\n");
gircsl( &mnum, &jsol1, &lhis, &ier );
if ( ier != 0 ) gilerr( &ier );
hist = (int *)malloc(lhis*3*sizeof(int));
gircsg( &mnum, &jsol1, &lhis, hist, &ier );
if ( ier != 0 ) gilerr( &ier );
for (i=0;i<lhis;i++)
{
printf(" hist[%d] = ",i);
for ( j=0; j<3; j++ )
{
printf("%d ",hist[i*3+j]);
}
printf("\n");
}
ibran = hist[2];
printf(" lhis = %d ibran = %d\n",lhis,ibran);
free(hist);
gbmbre( &mnum, &jsol1, &ibran, &ioper, &jsol4, &ier );
if ( ier != 0 )
{
gilerr( &ier );
jsol1 = 0;
}
gbuexe( &mnum, &jsol1, &ier );
if ( ier != 0 )
{
gilerr( &ier );
jsol1 = 0;
}
}
return 0;
}
IP