iCAx开思工具箱

标题: 【求助】关于UG二次开发的问题,急!!! [打印本页]

作者: gzxzl    时间: 2002-11-12 10:40
标题: 【求助】关于UG二次开发的问题,急!!!
各位大虾好!由于初学UG的二次开发(UG/Open API),有难题须向高人请教,请不吝赐教!
      我想获得打开的UG文件中模型的tag,不知用何函数,是当前对象的tag,请各位大虾帮助解决,谢谢!
作者: stranger    时间: 2002-11-12 16:21
什么叫当前对象?
作者: darkhorse    时间: 2002-11-12 16:34
/**********************************************************
本来不想麻烦了,我也不太熟悉,不过看了一段时间还么有人回复,只好帮你找了找,希望对你有所帮助。
********************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uf.h>
#include <uf_ugmgr.h>
#include <uf_part.h>
#include <uf_assem.h>
#define CHECK( func_ ) \
{ int  ifail_ = 0; \
  char message[133]; \
  ifail_ = (func_);  
  if ( ifail_ != 0 ) { \
    UF_get_fail_message( ifail_, message ); \
    printf("ERROR: %s returned from %s\n", message, # func_); \
    return ifail_; } }
static int create_part( void );
static int print_work_part_info( void );
/*---------------------------------------------------------------*/
int main(int argc, char *argv[])
{
  int  ifail = 0;
  ifail = UF_UGMGR_initialize(argc,(const char**)argv);
  if (ifail != 0)
  {
    printf("ERROR: Failed to initialize with error code %d",
    ifail);
    exit(1);
  }
  create_part();
  print_work_part_info();
  UF_PART_close_all();
  UF_UGMGR_terminate();
  return 0;
}
/*---------------------------------------------------------------*/
static int create_part( void )
{
  char*                   part_number = "600-A-wej-mk1-eng";
  char*                   part_revision = "A";
  char*                   part_file_type = "master";
  char*                   part_file_name = "";
  char                    encoded_name[MAX_FSPEC_SIZE + 1];
  tag_t                   part_tag;
  UF_UGMGR_tag_t          db_part_tag;
  UF_UGMGR_tag_t          root_folder;
  char                    root_folder_name[UF_UGMGR_NAME_SIZE];
  int                     i, count;
  UF_UGMGR_tag_t          *folder_contents;
  UF_UGMGR_object_type_t  object_type;
  char                    folder_name[UF_UGMGR_NAME_SIZE];
  logical                 folder_exists = false;
  CHECK(UF_UGMGR_ask_root_folder([$root_folder))]
  CHECK(UF_UGMGR_ask_folder_name(root_folder, root_folder_name));   
  printf("Root folder is %s\n", root_folder_name);
  /* Scan through the root folder, looking for a folder called
     "Test Set Default Folder". If this folder exists, set it to be
     the default folder into which newly created parts are
     placed.
  */
  CHECK(UF_UGMGR_list_folder_contents(root_folder, &count,
              [$folder_contents))]
  for ( i=0; i<count; i++ )
  {
    CHECK(UF_UGMGR_ask_object_type(folder_contents,
               [$object_type))]
    if (object_type == UF_UGMGR_type_folder)
    {
      CHECK(UF_UGMGR_ask_folder_name(folder_contents,
              folder_name));
      if ( strcmp( folder_name, "Test Set Default Folder" ) == 0 )
      {
        printf("Test Set Default Folder exists\n");
        CHECK(UF_UGMGR_set_default_folder(folder_contents));
        folder_exists = true;
        printf("Set default folder to %s\n", folder_name);
      }
    }
  }
  /* If the folder "Test Set Default Folder" doesn't exist, set the
     default folder to be the root folder.
  */
  if (!folder_exists)
  {
    printf("Test Set Default Folder does not exist\n");
    CHECK(UF_UGMGR_set_default_folder(root_folder));
    printf("Set default folder to %s\n", root_folder_name);
  }
  printf("Encoding UG/Manager part filename...\n");
  CHECK(UF_UGMGR_encode_part_filename( part_number, part_revision,
               part_file_type,
               part_file_name,
               encoded_name ));
  CHECK(UF_PART_new( encoded_name, 1, [$part_tag ))]
  printf("Created part...\n");
  CHECK(UF_PART_save());
  printf("Saved part...\n");
  CHECK(UF_UGMGR_ask_part_tag( part_number, [$db_part_tag ))]
  CHECK(UF_UGMGR_set_part_name_desc( db_part_tag, "engine",
              "Mk3 Engine" ));
  printf("Set part name and description...\n");
  return 0;
}
/*---------------------------------------------------------------*/
static int print_work_part_info( void )
{
  char             work_part_name[MAX_FSPEC_SIZE+1];
  tag_t            work_part_tag;
  char             part_number[UF_UGMGR_PARTNO_SIZE+1];
  char             part_revision[UF_UGMGR_PARTREV_SIZE+1];
  char             part_file_type[UF_UGMGR_FTYPE_SIZE+1];
  char             part_file_name[UF_UGMGR_FNAME_SIZE+1];
  UF_UGMGR_tag_t   db_tag;
  char             part_name[UF_UGMGR_NAME_SIZE+1];
  char             part_desc[UF_UGMGR_DESC_SIZE+1];
  work_part_tag = UF_ASSEM_ask_work_part();
  UF_PART_ask_part_name( work_part_tag, work_part_name );
  
CHECK(UF_UGMGR_decode_part_filename( work_part_name,
                part_number,
                part_revision,
                part_file_type,
                part_file_name ));
  printf( "For the current Work Part\n\n" );
  printf( "  Part Number      : %s\n", part_number );
  printf( "  Part Revision    : %s\n", part_revision );
  printf( "  Part File Type   : %s\n", part_file_type );
  printf( "  Part File Name   : %s\n", part_file_name );
  CHECK(UF_UGMGR_ask_part_tag( part_number, [$db_tag ))]
  CHECK(UF_UGMGR_ask_part_name_desc( db_tag, part_name,  
              part_desc ));
  printf( "  Part Name        : %s\n", part_name );
  printf( "  Part Description : %s\n", part_desc );
  return 0;
}
作者: gzxzl    时间: 2002-11-13 09:38
谢谢二位大侠!
     对于第二位说的,我觉得还不是我想要的。比如,我建立了一个名为ug_example.prt的文件,我只在这个文件里画了个长方体,现在我打开这个文件,然后执行UG/Open API程序,在这个长方体上作截面。同样我打开其他的文件,也能用同一程序对文件中的部件进行操作。程序在实现时,首先要取得“长方体”的tag,是吗?请大虾帮助解决!
作者: zzz    时间: 2002-11-13 11:15
gzxzl wrote:
谢谢二位大侠!
      对于第二位说的,我觉得还不是我想要的。比如,我建立了一个名为ug_example.prt的文件,我只在这个文件里画了个长方体,现在我打开这个文件,然后执行UG/Open API程序,在这个长方体上作截面。同样我打开其他的文件,也能用同一程序对文件中的部件进行操作。程序在实现时,首先要取得“长方体”的tag,是吗?请大虾帮助解决!

  
UF_PART_ask_displayed_part()
UF_OBJ_cycle_objs_in_part()
作者: gzxzl    时间: 2002-11-13 17:42
非常感谢zzz,以及前两位大侠。不知你们是否有QQ号,我的是123621747。希望能经常交流技术问题。
作者: gzxzl    时间: 2002-11-14 10:12
各位好!我的问题还没有解决,我使用了函数UF_PART_ask_displayed_part()  
编译时就不成功,我又使用了函数UF_ASSEM_ask_work_part,虽然编译成功但到UG中去执行就是不行。哎,谁能帮我!!!
作者: stranger    时间: 2002-11-14 16:10
这两个都是文件的tag,要获得长方体的tag,可以通过用户选择或者uf_obj_cycle_by_name
  
                                   注:彼处出力,此处加分,--darkhorse
作者: gzxzl    时间: 2002-11-14 22:18
stranger wrote:
这两个都是文件的tag,要获得长方体的tag,可以通过用户选择或者uf_obj_cycle_by_name

  
你好!感谢您的热心帮助。我还有个疑问,当使用uf_obj_cycle_by_name函数时需要输入名字,可是我想对打开的文件都适用,如果输入一个名字,那么这个程序不是对别的文件不起作用了吗?
作者: zzz    时间: 2002-11-14 23:12
gzxzl wrote:
各位好!我的问题还没有解决,我使用了函数UF_PART_ask_displayed_part()  
编译时就不成功,我又使用了函数UF_ASSEM_ask_work_part,虽然编译成功但到UG中去执行就是不行。哎,谁能帮我!!!

  
UF_ASSEM_ask_work_part()只能用在装配中,UF_PART_ask_displayed_part()YING应该没有问题,只要把libufun.lib和LIBUGOPENINT.LIB连到你的程序中就可以了。
作者: zzz    时间: 2002-11-14 23:14
gzxzl wrote:
[quote]stranger wrote:
这两个都是文件的tag,要获得长方体的tag,可以通过用户选择或者uf_obj_cycle_by_name

  
你好!感谢您的热心帮助。我还有个疑问,当使用uf_obj_cycle_by_name函数时需要输入名字,可是我想对打开的文件都适用,如果输入一个名字,那么这个程序不是对别的文件不起作用了吗? [/quote]
  
就用UF_OBJ_cycle_objs_in_part()嘛
作者: zzz    时间: 2002-11-15 12:21
对不起,前面写错了,应为:
  
UF_PART_ask_display_part()
作者: gz96514    时间: 2002-11-15 15:32
我也在用ug open欢迎交流 ,QQ=45532603.
password=ug open
作者: stranger    时间: 2002-11-15 16:37
也许可以多次使用UF_ASSEM_set_work_part 来指定当前part,然后操作!
作者: gzxzl    时间: 2002-11-16 15:24
感谢各位!但这些函数我都试了,达不到我想要的目的。
作者: darkhorse    时间: 2002-11-16 15:39
.说你想做什么,宁多勿少.一开始我就不明白你想干什么.
作者: zzz    时间: 2002-11-16 16:01
是啊,根据你说的,这些函数得到一个body的tag不是足够了吗?
作者: gzxzl    时间: 2002-11-18 10:30
各位不要急吗,我认为我说得比较清楚了。正如前面我说的,假如我想利用函数:extern int UF_CURVE_section_from_planes (UF_CURVE_section_general_data_p_t general_data, UF_CURVE_section_planes_data_p_t planes_data, tag_t * section_curves )
在一个打开的prt文件中对一个实体做截面线,那么就需要知道这个实体的tag,是吧?我的意思是在任意一个打开的文件中都适用,那么要识别tag的函数就不能需要输入某个实体的name等参数,这样才能普遍适用。
请大虾解释。THANK YOU VERY MUCH!
作者: zzz    时间: 2002-11-18 13:16
gzxzl wrote:
各位不要急吗,我认为我说得比较清楚了。正如前面我说的,假如我想利用函数:extern int UF_CURVE_section_from_planes (UF_CURVE_section_general_data_p_t general_data, UF_CURVE_section_planes_data_p_t planes_data, tag_t * section_curves )
在一个打开的prt文件中对一个实体做截面线,那么就需要知道这个实体的tag,是吧?我的意思是在任意一个打开的文件中都适用,那么要识别tag的函数就不能需要输入某个实体的name等参数,这样才能普遍适用。
请大虾解释。THANK YOU VERY MUCH!

  
UF_OBJ_cycle_objs_in_part() can get any object in your part. I have told you before. Did you use it?
作者: gzxzl    时间: 2002-11-20 12:09
zzz wrote:
  
UF_OBJ_cycle_objs_in_part() can get any object in your part. I have told you before. Did you use it?

  
大虾,我都试过数次了。干脆这样,你用ug画个曲面或者长方体等实体,然后编一段程序(内部程序),对这个实体取截面线,可以吗?谢谢!请将您的程序贴至此处。::y::y::y
作者: zzz    时间: 2002-11-21 11:06
gzxzl wrote:
[quote]zzz wrote:
  
UF_OBJ_cycle_objs_in_part() can get any object in your part. I have told you before. Did you use it?

  
大虾,我都试过数次了。干脆这样,你用ug画个曲面或者长方体等实体,然后编一段程序(内部程序),对这个实体取截面线,可以吗?谢谢!请将您的程序贴至此处。::y::y::y [/quote]
  
你是得不到实体,还是生不成截面线?
要不你把你的这段程序贴出来看一下。
作者: gzxzl    时间: 2002-11-21 15:41
zzz你好,假如有如下程序,对一打开的prt文件做如下操作;
#include <stdio.h>
#include <uf.h>
#include <uf_curve.h>
#include <uf_modl.h>
#include <uf_part.h>
#include <uf_so.h>
#include <uf_defs.h>
#include <uf_object_types.h>
  
#include <uf_csys.h>
#include <uf_obj.h>
  
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))
  
static int report (char *file, int line, char *call, int irc)
{
    if (irc)
    {
        char   messg[133];
        printf("%s, line %d, %s\n", file, line, call);
        UF_get_fail_message (irc, messg);
  
        printf("  returned a %d\n", irc);
        printf("  returned error %d, %s\n", irc, messg);
    }
    return (irc);
}
  
static void do_ugopen_api (void)
{
    double plane_data[9] = {100.0,0.0,50.0, 100.0,0.0,49.0,   100.0,1.0,50.0};
     double vect[3] = {250.0, 0.0, 0.0};
     double vect2[3] = {250.0, 50.0, 0.0};
     int   curr_part,num_parts,count_1;
  
    tag_t  part_tag, block_tag, plane_tag;
  
    tag_t  objects[1], planes[1];
    tag_t  section_curves_feature, *section_curves;
   
    tag_t  feature;
       const logical   flip = TRUE;
  
    int    num_section_curves, type;
  
   
  
    UF_CURVE_section_general_data_t  general_data;
    UF_CURVE_section_planes_data_t   planes_data;
    UF_CURVE_section_parallel_data_t parallel_data;
  
    char  *part_name = "section_curves";
  
    char  *edge_lens[3] = {"300.0","25.0","150.0"};
  
  在此应获得block_tag的值(也就是打开的part中的值),我不知如何处理,请大侠帮助解决?    
   
   objects[0] = block_tag;
  
    FTN(uf5374) (&plane_data[0], &plane_data[3], &plane_data[6],
                     [$plane_tag)]
  
  
   planes[0] = plane_tag;
  
    general_data.associate     = 1;
    general_data.objects       = objects;
    general_data.num_objects   = 1;
    general_data.grouping      = 0;
    general_data.join_type     = 0;
    general_data.tolerance     = 0.0254;
  
    planes_data.planes         = planes;
    planes_data.num_planes     = 1;
  
  UF_CALL (UF_CURVE_section_from_planes (&general_data, &planes_data,
                     [$section_curves_feature))]
  
    printf (" section curves feature tag is %d\n", section_curves_feature);
  
  parallel_data.base_plane     = plane_tag;
    parallel_data.step_distance  = 3.0;
    parallel_data.start_distance = 0.0;
    parallel_data.end_distance   = 10.0;
  
    UF_CALL (UF_CURVE_section_from_parallel_planes (&general_data, &parallel_data,
                     [$section_curves_feature))]
  
    UF_CALL (UF_CURVE_ask_feature_curves (section_curves_feature,
                       [$num_section_curves, &section_curves))]
  
    UF_free (section_curves);
  
}
  
void ufusr (char *param, int *retcode, int paramLen)
{
    if (!UF_CALL(UF_initialize()))
    {
        do_ugopen_api();
        UF_CALL(UF_terminate());
    }
}
   
int ufusr_ask_unload(void)
{
    return (UF_UNLOAD_IMMEDIATELY);
}
作者: gzxzl    时间: 2002-11-21 15:49
zzz你好,我给你一个简单的prt文件,请在此中实现上贴中的程序。谢谢!!!
作者: zzz    时间: 2002-11-21 16:51
继续努力,互相交流,共同提高,谢谢您的支持---darkhorse
gzxzl wrote:
zzz你好,假如有如下程序,对一打开的prt文件做如下操作;
#include <stdio.h>
#include <uf.h>
#include <uf_curve.h>
#include <uf_modl.h>
#include <uf_part.h>
#include <uf_so.h>
#include <uf_defs.h>
#include <uf_object_types.h>
  
#include <uf_csys.h>
#include <uf_obj.h>
  
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))
  
static int report (char *file, int line, char *call, int irc)
{
     if (irc)
     {
         char   messg[133];
         printf("%s, line %d, %s\n", file, line, call);
         UF_get_fail_message (irc, messg);
  
         printf("  returned a %d\n", irc);
         printf("  returned error %d, %s\n", irc, messg);
     }
     return (irc);
}
  
static void do_ugopen_api (void)
{
     double plane_data[9] = {100.0,0.0,50.0, 100.0,0.0,49.0,   100.0,1.0,50.0};
      double vect[3] = {250.0, 0.0, 0.0};
      double vect2[3] = {250.0, 50.0, 0.0};
      int   curr_part,num_parts,count_1;
  
     tag_t  part_tag, block_tag, plane_tag;
  
     tag_t  objects[1], planes[1];
     tag_t  section_curves_feature, *section_curves;
     
     tag_t  feature;
        const logical   flip = TRUE;
  
     int    num_section_curves, type;
  
     
   
     UF_CURVE_section_general_data_t  general_data;
     UF_CURVE_section_planes_data_t   planes_data;
     UF_CURVE_section_parallel_data_t parallel_data;
  
     char  *part_name = "section_curves";
  
     char  *edge_lens[3] = {"300.0","25.0","150.0"};
  
   在此应获得block_tag的值(也就是打开的part中的值),我不知如何处理,请大侠帮助解决?   
   
int type, subtype;
  
part_tag = UF_PART_ask_display_part();
   block_tag = NULL_TAG;
   UF_OBJ_cycle_objs_in_part(part_tag, UF_solid_type, [$block_tag)]
   while(block_tag)
   {
     UF_OBJ_ask_type_and_subtype(block_tag, [$type, &subtype)]
     if(subtype == UF_solid_body_subtype)
     {
              break;
     }
       UF_OBJ_cycle_objs_in_part(part_tag, UF_solid_type, [$block_tag)]
   }
   objects[0] = block_tag;
   
     FTN(uf5374) (&plane_data[0], &plane_data[3], &plane_data[6],
                      [$plane_tag)]
  
   
    planes[0] = plane_tag;
  
     general_data.associate     = 1;
     general_data.objects       = objects;
     general_data.num_objects   = 1;
     general_data.grouping      = 0;
     general_data.join_type     = 0;
     general_data.tolerance     = 0.0254;
  
     planes_data.planes         = planes;
     planes_data.num_planes     = 1;
  
   UF_CALL (UF_CURVE_section_from_planes (&general_data, &planes_data,
                      [$section_curves_feature))]
  
     printf (" section curves feature tag is %d\n", section_curves_feature);
  
   parallel_data.base_plane     = plane_tag;
     parallel_data.step_distance  = 3.0;
     parallel_data.start_distance = 0.0;
     parallel_data.end_distance   = 10.0;
  
     UF_CALL (UF_CURVE_section_from_parallel_planes ([$general_data, [$para]]llel_data,
                      [$section_curves_feature))]
  
     UF_CALL (UF_CURVE_ask_feature_curves (section_curves_feature,
                        [$num_section_curves, §ion_curves))]
  
     UF_free (section_curves);
  
}
  
void ufusr (char *param, int *retcode, int paramLen)
{
     if (!UF_CALL(UF_initialize()))
     {
         do_ugopen_api();
         UF_CALL(UF_terminate());
     }
}
   
int ufusr_ask_unload(void)
{
     return (UF_UNLOAD_IMMEDIATELY);
}

作者: gzxzl    时间: 2002-11-22 17:36
大侠,你好!
我用如上的程序后,出现如下错误:
  Internal error:memory access violation.
  File name:F:\vcxuexi\gzx_ugexample\Debug\gzx_ugexample.dll.
  Function name:ufusr.
请问这是怎么回事?
再次感谢大侠的热情帮助。
作者: zzz    时间: 2002-11-22 21:23
debug
作者: darkhorse    时间: 2002-11-22 22:40
你的这个程序他的原型是/ugopen_doc/uf_curve/ufd_curve_section_example.c吧?总体来说该程序思路没错,ZZZ的方法也对,
到底什么原因不太清楚,
其中FTN(uf5374) ()
函数比较旧,用他的替代函数 UF_MODL_create_relative_dplane ()
我估计你是在学习而不是必须解决的问题,所以就不再耗费精力了,自己测试看看.
作者: gzxzl    时间: 2002-11-23 21:49
感谢各位!可我还有些失望,没有最终解决问题。
作者: EMeiMonkey    时间: 2002-11-26 13:24
市面是有一本《UG/OPEN API编程基础》清华大学出版社出的,上周末刚买回来研究,推荐买一本,作者是董正卫、田立中、付宜利。
作者: jhcome2002    时间: 2002-11-26 21:53
可惜没有toolkit的
作者: gzxzl    时间: 2002-11-26 22:54
谢谢,我也在上周末买了那本书。总的来讲,一般。把ug的帮助文档翻译并总结了一下,例子也是那上面的。
作者: gzxzl    时间: 2003-4-5 08:35
各位版主,大家好!在此,感谢各位的帮助。我这个问题,可以说是重提了,希望能帮助解决。我有如下代码:
static void do_section(void)  
{
    tag_t autobody_tag,part_tag,section_tag;
  double section_point[3];
  double plane_normal[3];
  tag_t *objects;
  tag_t planes[1];  
  int type, subtype;
    UF_CURVE_section_general_data_t general_data;  
    UF_CURVE_section_planes_data_t planes_data;  
    UF_CURVE_section_parallel_data_t parallel_data;  
  tag_t section_curves_feature,*section_curves;
    int num_section_curves;
  int num_objects1=0;
  
   part_tag = UF_PART_ask_display_part();  
    autobody_tag = NULL_TAG;  
    UF_OBJ_cycle_objs_in_part(part_tag, UF_solid_type, [$autobody_tag)]  
   while(autobody_tag!=NULL_TAG)  
   {   
     UF_OBJ_ask_type_and_subtype(autobody_tag, [$type, &subtype)]
       if(subtype ==UF_solid_face_subtype)
     {
  
             num_objects1++;
       objects=[$autobody_tag]
     }
     UF_OBJ_cycle_objs_in_part(part_tag, UF_solid_type, [$autobody_tag)]    }  
       
    section_point[0] = 0.0;
    section_point[1] = 20.0;
    section_point[2] = 0.0;
  
    plane_normal[0] = 0.0;
    plane_normal[1] = 1.0;
    plane_normal[2] = 0.0;
    UF_CALL(UF_MODL_create_plane(section_point, plane_normal, [$section_tag))]   
   
    planes[0] = section_tag;  
  
    general_data.associate = 1;  
    general_data.objects = objects;  
    general_data.num_objects =num_objects1;  
    general_data.grouping = 0;  
    general_data.join_type = 0;  
    general_data.tolerance = 0.0254;  
  
    planes_data.planes = planes;  
    planes_data.num_planes = 1;  
  
     UF_CALL (UF_CURVE_section_from_planes (&general_data, &planes_data,  
                     [$section_curves_feature))]  
  
    printf (" section curves feature tag is %d\n", section_curves_feature);  
  
    parallel_data.base_plane = section_tag;  
    parallel_data.step_distance = 50.0;  
    parallel_data.start_distance = 0.0;  
    parallel_data.end_distance = 500.0;  
  
    UF_CALL (UF_CURVE_section_from_parallel_planes (&general_data,&parallel_data,  
                     [$section_curves_feature))]  
  
    UF_CALL (UF_CURVE_ask_feature_curves (section_curves_feature,  
                       [$num_section_curves, &section_curves))]  
  
    UF_free (section_curves);  
}
我用这段代码对如下图的件做截面线,总是不行,我还改变许多别的方式,都没成功,请版主帮忙看一下,谢谢!!!
作者: lcfq    时间: 2003-4-5 09:10
你用下面的代码没有作出来,那就是你的问题了。我自己前两天才编了,使用良好。
//include the head files needed.
tag_t body_tag=NULL_TAG;
tag_t feat_tag=NULL_TAG;
tag_t part_tag=NULL_TAG;
  
//get the tag of the current display part.
Part_tag=UF_PART_ask_display_part();
// find the solid body by a feature associated with it.
  feat_type=UF_feature_type;
  UF_OBJ_cycle_objs_in_part(part, feat_type, [$feat_tag)]
  if(feat_tag==NULL_TAG)
  {
    uc1601("no feature found",1);
    UF_terminate();
  }
  UF_MODL_ask_feat_body(feat_tag, [$body_tag)]
  if(body_tag==NULL_TAG)
  {
    uc1601("no feature found",1);
    UF_terminate();
  }
作者: gzxzl    时间: 2003-4-5 11:34
lcfq wrote:
你用下面的代码没有作出来,那就是你的问题了。我自己前两天才编了,使用良好。  
  //include the head files needed.  
  tag_t body_tag=NULL_TAG;  
  tag_t feat_tag=NULL_TAG;  
  tag_t part_tag=NULL_TAG;  
  
  //get the tag of the current display part.  
  Part_tag=UF_PART_ask_display_part();  
  // find the solid body by a feature associated with it.  
    feat_type=UF_feature_type;  
    UF_OBJ_cycle_objs_in_part(part, feat_type, [$feat_tag)]  
    if(feat_tag==NULL_TAG)  
    {  
      uc1601("no feature found",1);  
      UF_terminate();  
    }  
    UF_MODL_ask_feat_body(feat_tag, [$body_tag)]  
    if(body_tag==NULL_TAG)  
    {  
      uc1601("no feature found",1);  
      UF_terminate();  
    }

  
谢谢楼上的兄弟!我考虑,如果用你这段代码取代我的那段的前半部分,那么我后面的函数UF_CURVE_section_from_planes 的参数将如何设置,尤其是参数general_data.num_objects 将如何设置?再者,你的这段代码是否能将件的所有部分都读取出来呢?
作者: lcfq    时间: 2003-4-5 15:05
我写的部分只是找到block的tag。
作者: gzxzl    时间: 2003-4-5 21:54
lcfq wrote:
我写的部分只是找到block的tag。

  
如果找block的tag,不用你的那段了,用前面版主提供的那段更好吗。你能不能考虑一下我目前这个问题,另外版主和其他兄弟都来献计献策啊,谢谢!
作者: gzxzl    时间: 2003-4-6 20:45
各位版主,麻烦您从百忙中抽时间帮我看看好吗,谢谢!!!
作者: gzxzl    时间: 2003-4-7 14:06
郁闷啊,怎么没人回答呢?
作者: zzz    时间: 2003-4-7 14:44
我觉得你的函数用的有问题。UF_CURVE_section_from_planes是用来获得一个section,不是截面线。求截面线必须用求交的方法。
作者: zzz    时间: 2003-4-7 14:53
对不起,这个函数应该可以。如果对其中的参数设置没有什么心得的话,我建议你先摸一下交互环境中的操作。
作者: gzxzl    时间: 2003-4-8 08:01
谢谢版主!在交互式环境中,件的选择是用鼠标来选的,而我想用程序来做到这一点。我用上面的代码不行,我还试了一些方法,有的只能对件的一个部分进行操作,如下面这个图比较明显。请指教如何才能将整个件都读出,并传给做截面的函数?
作者: zzz    时间: 2003-4-8 09:06
件的选择不就是选择一个body的tag吗?一般情况下,一个零件只有一个body,如果有多个body,用前面的函数都可以得到。
因为交互环境的参数和函数的参数是一致的,我让你摸一下交互环境,就是通过应用来正确的设置函数的参数。
作者: gzxzl    时间: 2003-4-8 15:16
我在交互式环境中试过,我在4月5号贴的那个件中,如果交互式中filter设为body,选择时得选很多次。
因此,我在4月5号的帖子的前半部分代码是:
tag_t autobody_tag,part_tag,section_tag;  
   double section_point[3];  
   double plane_normal[3];  
   tag_t *objects;
   tag_t planes[1];  
   int type, subtype;  
     UF_CURVE_section_general_data_t general_data;  
     UF_CURVE_section_planes_data_t planes_data;  
     UF_CURVE_section_parallel_data_t parallel_data;  
   tag_t section_curves_feature,*section_curves;  
     int num_section_curves;  
   int num_objects1=0;  
  
    part_tag = UF_PART_ask_display_part();  
     autobody_tag = NULL_TAG;  
     UF_OBJ_cycle_objs_in_part(part_tag, UF_solid_type, [$autobody_tag)]  
    while(autobody_tag!=NULL_TAG)  
    {  
    UF_OBJ_ask_type_and_subtype(autobody_tag, [$type, &subtype)]  
        if(subtype ==UF_solid_face_subtype)  
    {  
  
              num_objects1++;  
        objects=[$autobody_tag]
    }  
      UF_OBJ_cycle_objs_in_part(part_tag, UF_solid_type, [$autobody_tag)]    }  
     
     section_point[0] = 0.0;  
     section_point[1] = 20.0;  
     section_point[2] = 0.0;  
     
     plane_normal[0] = 0.0;  
     plane_normal[1] = 1.0;  
     plane_normal[2] = 0.0;  
     UF_CALL(UF_MODL_create_plane(section_point, plane_normal, §ion_tag));  
      
     planes[0] = section_tag;  
  
     general_data.associate = 1;  
     general_data.objects = objects;
     general_data.num_objects =num_objects1;  
     general_data.grouping = 0;  
     general_data.join_type = 0;  
     general_data.tolerance = 0.0254;  
  
     planes_data.planes = planes;  
     planes_data.num_planes = 1;  
  
      UF_CALL (UF_CURVE_section_from_planes ([$general_data, &planes_data,  §ion_curves_feature))]  
请高手帮看看红颜色处的用法是否正确,或者如果整个代码不对,请指教!!
作者: zzz    时间: 2003-4-8 15:57
你这样之得到了一个body。建议你先建一个列表,把搜索到的所有body放到列表中,在巴列表中的body转到一个数组中,再代入上面的结构中去。
作者: gzxzl    时间: 2003-4-9 08:29
谢谢版主,我再试试!
感谢版主的指点,我的问题解决了!!!::y::y::y:-d:-d:-d::y::y::y




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