iCAx开思工具箱

标题: 【求助】UG 中如何实现对象的transform? [打印本页]

作者: ddp_    时间: 2004-12-7 16:21
标题: 【求助】UG 中如何实现对象的transform?
比如要使UG中的一个实体进行旋转变换!
UG open API中说明使用:
  
uf5947_
  
Transform objects according to a previously defined matrix.
  
The upper limit on the number of objects to transform is 32767. The object types supported for non-uniform scaling are the same as those supported by non-uniform scaling in interactive Unigraphics.
  
函数原型如下:
extern void uf5947_ (
const double * rp1,  
const tag_t * np2,  
const int * ip3,  
const int * ip4,  
const int * ip5,  
const int * ip6,  
tag_t * nr7,  
tag_t * nr8,  
int * ir9 );
  
可是在使用此函数时返回值表明成功,但是实际没有完成;郁闷ing!!
  
程序代码如下:
/*****************************************************************************
**
**  test_trans.c
**
**  Description:
**     Contains Unigraphics entry points for the application.
**
*****************************************************************************/
  
/*  Include files */
  
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
  
#include <uf.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_obj.h>
#include <uf_object_types.h>
#include <uf_group.h>
#include <uf_eval.h>
#include <uf_process_aid.h>
#include <uf_mtx.h>
#include <uf_layer.h>
  
#include <uf_trns.h>
#include "test_trans.h"
  
/*****************************************************************************
**  Activation Methods
*****************************************************************************/
  
#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], messg[300];
      
         UF_get_fail_message(irc, err);
         sprintf(messg, "\n%s\nerror %d at line %d in %s\n%s",
             err, irc, line, file, call);
         printf("%s\n", messg);
         strcpy([$messg[129], "...")]
         uc1601(messg, TRUE);  /* Internal only - remove for external */
       UF_terminate();
  
     }
     return(irc);
}
  
void do_it(void)
{
   double  from_origin[3] = {0.0, 0.0, 0.0};
   double  from_x_axis[3] = {1.0, 0.0, 0.0};
   double  from_y_axis[3] = {0.0, 1.0, 0.0};
   double  to_origin[3] = {0.0, 0.0, 0.0};
   double  to_x_axis[3] = {0.0, 1.0, 0.0};
   double  to_y_axis[3] = {1.0, 0.0, 0.0};
   
   double  transform[16];
   char cc[256];
   double bound[6];
  
//Transform 参数
//input
//  double * rp1;  //Defined Transformation Matrix
//  tag_t * np2;  //Array of object identifiers.
   int ip3=1;    //Number of objects in np2 array
   int ip4 = 1;         // 1-move, 2-copy
   int ip5 = 0;       //Destination Layer, 0-the original layer, -1 - the work layer
   int ip6 = 1;      //Trace Curve Status, 1 means on, 2 means off
//output
   tag_t nr7[100];  //List of copied object identifiers
   tag_t nr8[100];  //Group of trace curves
   int  ir9;    //Status Code: 0 - Success
      
   tag_t  solid_tag[1] = {NULL_TAG};
   
   UF_CALL ( UF_MODL_ask_object( UF_solid_type, UF_solid_body_subtype, [$solid_tag[0]))]
   sprintf( cc, "\nthe solid object is : %d\n" , solid_tag[0]);
   UF_CALL(UF_UI_open_listing_window());
   UF_CALL(UF_UI_write_listing_window(cc));
  
   //* fetch the matrix containing mirro information to move an
   //* object around X-Y mirror plane   
//得到实体的边界筐
   UF_CALL ( UF_MODL_ask_bounding_box ( solid_tag[0], bound ));
  
/*//使用此函数生产旋转变换的矩阵
extern void uf5945_ (  //Returns a matrix to perform a rotation around an arbitrary axis
double * rp1,      //Origin Of The Axis - Absolute Coordinates
double * rp2,      //Direction Vector - Absolute Coordinates
double * rp3,      //Rotation Angle In Degrees
double * rr4,      //Rotation Matrix
int * ir5 );      //Status Code: 0 - Success; 1 - Direction Vector Is A Zero Vector
*/
  
   {
     double rp1[3] = {0.0, 1.0 , 0.0};
     double rp2[3] = {0.0, 0.0 , 1.0};
     double  rp3 = 90;
     int    ir5;
      
      
     rp1[0] = (bound[0] +bound[3])/2;
     rp1[1] = (bound[1] +bound[4])/2;
     rp1[2] = (bound[2] +bound[5])/2;
     rp2[1] = rp1[1] +1;
     uf5945_ ( rp1, rp2, [$rp3, transform, [$ir5)]    //生产旋转矩阵
     sprintf( cc, "\nthe Matrix Status Code is : %d\n" , ir5);
     UF_CALL(UF_UI_open_listing_window());
     UF_CALL(UF_UI_write_listing_window(cc));
   }
   
//对实体进行旋转变换:   
   uf5947_( transform, solid_tag, [$ip3, &ip4, &ip5, &ip6, nr7, nr8, &ir9)]
   sprintf( cc, "\nthe trans Status Code is : %d\n" , ir9);
   UF_CALL(UF_UI_open_listing_window());
   UF_CALL(UF_UI_write_listing_window(cc));
   
   
   
   
}
  
/*  Explicit Activation
**      This entry point is used to activate the application explicitly, as in
**      "File->Execute UG/Open->User Function..." */
extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
     /* Initialize the API environment */
     int errorCode = UF_initialize();
  
     if ( 0 == errorCode )
     {
         /* TODO: Add your application code here */
  
     do_it();
  
         /* Terminate the API environment */
         errorCode = UF_terminate();
     }
  
     /* Print out any error messages */
     PrintErrorMessage( errorCode );
}
/*****************************************************************************
**  Utilities
*****************************************************************************/
  
/* Unload Handler
**     This function specifies when to unload your application from Unigraphics.
**     If your application registers a callback (from a MenuScript item or a
**     User Defined Object for example), this function MUST return
**     "UF_UNLOAD_UG_TERMINATE". */
extern int ufusr_ask_unload( void )
{
     return( UF_UNLOAD_UG_TERMINATE );
}
作者: 深夜摔键盘    时间: 2004-12-7 17:31
uf5947_( transform, solid_tag, [$ip3, &ip4, &ip5, &ip6, nr7, nr8, &ir9)]  
用这个函数的前提是必须知道旋转矩阵,就是你想让你的对象沿X,Y,Z转多少个角度,你就要生成你的旋转矩阵,4*4的方阵,然后使用这个函数进行几何变换。
  
没有见你的代码中有对transform矩阵赋值的语句。
作者: ddp_    时间: 2004-12-8 09:58
转换矩阵的生产是使用uf5945_ 来实现的,代码在程序中段:
  
  {  
    double rp1[3] = {0.0, 1.0 , 0.0};  
    double rp2[3] = {0.0, 0.0 , 1.0};  
    double rp3 = 90;  
    int    ir5;  
         
    rp1[0] = (bound[0] +bound[3])/2;  
    rp1[1] = (bound[1] +bound[4])/2;  
    rp1[2] = (bound[2] +bound[5])/2;  
    rp2[1] = rp1[1] +1;  
    uf5945_ ( rp1, rp2, [$rp3, transform, &ir5)]  
~~~~~~~~~~~~~~~~~~~~~~~~~~~
    sprintf( cc, "\nthe Matrix Status Code is : %d\n" , ir5);  
    UF_CALL(UF_UI_open_listing_window());  
    UF_CALL(UF_UI_write_listing_window(cc));  
  }  
   
谢谢键盘兄~, 请继续指正!
作者: 深夜摔键盘    时间: 2004-12-8 16:25
参考一下这个贴子https://www.icax.org/viewthread. ... %3D1&page=#pid=
作者: 深夜摔键盘    时间: 2004-12-8 17:04
翻了翻老贴,才想起来,你要操作的的对象很可能是特征。
static void do_ugopen_api(void)
{
char *part_name = "bound";
tag_t part;
double box[6];
UF_PART_new(part_name, UF_PART_ENGLISH, [$part)]
  
UF_FEATURE_SIGN sign = UF_NULLSIGN;
double block_orig[3] = {0.0,0.0,0.0};
char *block_len[3] = {"1","2","3"};
tag_t blk_featrue_obj,blk_obj;
UF_MODL_create_block1(sign, block_orig, block_len, [$blk_featrue_obj)]
                //创建的是特征,特征不能参于几何变换
  
UF_MODL_ask_feat_body(blk_featrue_obj,[$blk_obj)]  
  //这个函数是取关联在特征上的对象ID
  
uc1601("绕对象中心,平行X轴的向量旋转45度",1);
  
double bound[6];  
  UF_MODL_ask_bounding_box (blk_obj, bound );  
double rp1[3] = {0.0, 0.0 , 0.0};  
double rp2[3] = {1.0, 0.0 , 0.0};  
double rp3 =45;   
int ir5;
  
rp1[0] = (bound[0] +bound[3])/2;  
rp1[1] = (bound[1] +bound[4])/2;  
rp1[2] = (bound[2] +bound[5])/2;
  
double transformMatrix[16];
double length[3]={10,10,0};
uf5945_( rp1, rp2, [$rp3, transformMatrix, &ir5)] //生产旋转矩阵
  
int ip3=1, ip4=1,ip5=-1, ip6=1, ir9;  
tag_t nr7,nr8;  
  
const tag_t np2[1]={blk_obj};
uf5947_(transformMatrix, [$blk_obj , & pi3, & ip4, & ip5r, & ip6, &nr7, &nr8, &ir9)]  
}
作者: ddp_    时间: 2004-12-8 17:29
谢谢键盘兄!
  
就最初的程序,使用uf5947_进行Move不能实现,但是将操作改为Copy就可以了,而且copy的实体可以使用uf4957_来进行Move变换。这些是否与feature有关呢?
  
还有一个问题:   
UF_CALL ( UF_MODL_ask_object( UF_solid_type, UF_solid_body_subtype, &solid_tag[0] ) ) ]
此函数输出的solid_tag[0]是属于feature类型还是对象?
作者: landgrave    时间: 2004-12-14 13:29
ddp_ wrote:
  
  还有一个问题:   
  UF_CALL ( UF_MODL_ask_object( UF_solid_type, UF_solid_body_subtype, &solid_tag[0] ) ) ]  
  此函数输出的solid_tag[0]是属于feature类型还是对象?

  
是对象!(Object's object identifier within a file)
作者: zhouym71    时间: 2004-12-14 14:59
在建模时要注意:特征, 对象, 体  之间的区别
在装配中要注意:事例,实例,原型之间的区别
作者: frecar    时间: 2005-1-2 21:35
请问,装配中,实例和事例的区别和联系是什么?到现在都还没有搞清楚。
大虾能否实例说明?




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3