iCAx开思工具箱

标题: 如果不用点构造器还有其他的方法选择曲面上的点吗? [打印本页]

作者: suiyubing    时间: 2005-7-14 12:06
标题: 如果不用点构造器还有其他的方法选择曲面上的点吗?
各位高手,我的问题是这样的:我在曲面上划线,每次都要用点构造器先在曲面上确定点,这样很麻烦,因为点一个点就要点一次ok按钮,我想象ug中的curve on surface功能一样,可以直接左键点击曲面上的任意位置就可以划线,而不是像现在这样需要在曲面上左键点击以后,还要点击点构造器上的ok按钮,这样才完成选择。也就是说我可不可以不点击ok按钮就完成点的选择呢?如果有人知道,麻烦指点一下,谢谢。
作者: thriller    时间: 2005-7-14 14:34
提供一个思路
当用户用鼠标拾取某一个面的时候,能够得到所点击的点的坐标,通过坐标变换可以将该点映射到面上,也就说得到该面上的一个点。这样通过程序控制用户多次选择这个面,也就得到了多个点。有点麻烦,不过可以试试。
作者: suiyubing    时间: 2005-7-14 15:41
谢谢,我会试一下的,不知道还有没有其他的办法,望高手指点.
作者: suiyubing    时间: 2005-7-16 09:43
to thriller:您说的方法挺好,但是我还想问的是怎么通过坐标变幻把点映射到面上呢,能具体说一下吗?
作者: mizzle    时间: 2005-7-16 16:46
UF_SO_create_point_on_surface
作者: suiyubing    时间: 2005-7-19 11:02
to mizzle: 这几天一直在研究您告诉我的UF_SO_create_point_on_surface这个函数,可就是不知道怎么用它,我用doc文档里与其相似的例子参考,不知道是为什么怎么看不出来创建的点呢?下面是我从doc里节选的例子,编译链接都没有错,就是看不到用函数创建的点,还请再指点一二。
#include <uf.h>
#include <uf_exit.h>
#include <uf_ui.h>
#include <stdio.h>
#include <uf.h>
#include <uf_curve.h>
#include <uf_modl.h>
#include <uf_part.h>
#include <uf_so.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 origin[3] = {0.0,0.0,0.0};
    double vect[3] = {250.0, 0.0, 0.0};
tag_t  smart_point;
  tag_t  line_tag,block_tag,part_tag,block_feat;  
tag_t  object_in_part, dbl_tag;
  
    const UF_SO_dirr_on_curve_option_t  option = UF_SO_dirr_on_curve_tangent;
UF_CURVE_line_t                  line_data;
char  *part_name = "section_curves";
  
    char  *edge_lens[3] = {"300.0","25.0","150.0"};
    char buffer[133];
    
    UF_CALL (UF_PART_new (part_name, ENGLISH, [$part_tag))]
  
    UF_CALL (UF_MODL_create_block1 (UF_NULLSIGN, origin, edge_lens,
                              [$block_feat))]
  
    UF_CALL (UF_MODL_ask_feat_body (block_feat, [$block_tag))]
object_in_part =  block_tag;
  
    line_data.start_point[0] = 25.0;
    line_data.start_point[1] = 50.0;
    line_data.start_point[2] = 25.0;
  
    line_data.end_point[0]   = line_data.start_point[0] + vect[0];
    line_data.end_point[1]   = line_data.start_point[1] + vect[1];
    line_data.end_point[2]   = line_data.start_point[2] + vect[2];
  
    UF_CALL (UF_CURVE_create_line ([$line_data, &line_tag))]
UF_CALL (UF_SO_create_scalar_double (object_in_part,
                       UF_SO_update_within_modeling, 0.5, [$dbl_tag) )]
  
    UF_CALL (UF_SO_create_point_on_curve (object_in_part,  
            UF_SO_update_within_modeling, line_tag, dbl_tag, [$smart_point) )]
UF_UI_open_listing_window();
    sprintf (buffer," smart point is %d\n", smart_point);
UF_UI_write_listing_window(buffer);
}
  
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
#  include <strstream>
#   include <iostream>
  using stdstrstream;
  using stdndl;  
  using stdnds;
  using stderr;
#else
#  include <strstream.h>
#   include <iostream.h>
#endif
#include "3333333.h"
  
//----------------------------------------------------------------------------
//  Activation Methods
//----------------------------------------------------------------------------
  
//  Unigraphics Startup
//      This entry point activates the application at Unigraphics startup
extern "C" DllExport void ufsta( char *param, int *returnCode, int rlen )
{
    /* Initialize the API environment */
    int errorCode = UF_initialize();
  
    if ( 0 == errorCode )
    {
        /* TODO: Add your application code here */
do_ugopen_api();
        /* Terminate the API environment */
        errorCode = UF_terminate();
    }
  
    /* Print out any error messages */
   &nbsprintErrorMessage( 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 "C" int ufusr_ask_unload( void )
{
    return( UF_UNLOAD_UG_TERMINATE );
}
  
/* PrintErrorMessage
**
**     Prints error messages to standard error and the Unigraphics status
**     line. */
static void PrintErrorMessage( int errorCode )
{
    if ( 0 != errorCode )
    {
        /* Retrieve the associated error message */
        char message[133];
        UF_get_fail_message( errorCode, message );
  
        /* Print out the message */
        UF_UI_set_status( message );
  
        // Construct a buffer to hold the text.
        ostrstream error_message;
  
        // Initialize the buffer with the required text.
        error_message << endl
                      << "Error:" << endl
                      << message
                      << endl << endl << ends;
  
      // Write the message to standard error
        cerr << error_message.str();
    }
}
我就纳闷为什么可以知道点的tag值,可怎么看不到点呢?
作者: 深夜摔键盘    时间: 2005-7-19 11:23
smart point本来就是不可见的吧。它仅是一个UG对象,比如两条直线的交点,就是一个smart point,它是不可见的,但在点构造器选择交点捕捉时系统能访问到这个点。
  
你可以使用UF_OBJ_is_type_displayable()查询一下,看看它是否为可显示的对象。
作者: mizzle    时间: 2005-7-19 20:18
既然那个点的tag值也知道了,是不是可以查到那个点的坐标了,那么坐标都知道了,用最常用的方法创建一个点UF_CURVE_create_point是不是就可以创建一个可见的点,然后再把开始那个点给删掉(那个看不到的),只能用这个笨办法了,嘿嘿,参考一下,欧就这么用的。
作者: suiyubing    时间: 2005-7-20 14:44
多谢两位前辈的指导,原来是这样,要不还一直蒙在股里,好的,参考你们的提示,我会试试,如果有不明白的地方,还要麻烦你们多多帮助,真得很感谢!
作者: suiyubing    时间: 2005-7-23 09:25
又要求助了,使用UF_SO_create_point_on_surface 需要知道u,v值,如果给定固定的u,v值可以创建点,但是我怎么才可以随时都能更新u,v值呢,那样我才可以在曲面上任意划线阿。UF_SO_create_point_on_surface 的函数结构是这样的:
extern int UF_SO_create_point_on_surface (
const tag_t object_in_part,  
const UF_SO_update_option_t update_option,  
const tag_t face,  
const tag_t u,  
const tag_t v,  
tag_p_t point );
其中u,v都是输入,请求高手帮助,感觉自己在这个问题上困的时间不短了,怎么还是没有头绪呢,真愁人。
作者: 深夜摔键盘    时间: 2005-7-23 12:02
一直都没忍心说。以前我碰到过类似的问题,也是没找到好的方法,就没有再找下去。你的问题的根源是UG没有给我们提供可以获取鼠标在当前视图平面上的位置这样的函数。
  
基本上,你的要求是实现不了的。尽量寻找其他可以替代的方法吧。要不,干脆就别做这个功能了。换个思路吧,直接使用UG的曲面画线工具能不能完成你的需求?
作者: suiyubing    时间: 2005-7-23 16:40
听您这么一说,我的心又跌到谷底了,因为我不仅仅要在曲面上划线,在其对应的展开面上也要同时划线,应用ug的曲面划线工具好像不能实现,更何况那个功能也无法用程序调用阿。您说我的问题的根源是UG没有给我们提供可以获取鼠标在当前视图平面上的位置这样的函数。我想问一下这个函数可以吗:UF_UI_ask_sel_cursor_pos()这个函数我没试,这是我在其他的地方查资料时 记下的,因为您很厉害,我不想自己盲目的乱试一气,所以就直接拿来问了,当然我自己也会试试的, 希望您能再帮帮忙,谢谢您了。
作者: 深夜摔键盘    时间: 2005-7-23 17:35
UF_UI_ask_sel_cursor_pos应该是与带有选择功能的UISTYLER对话框的配套函数,你试试吧。我也只是看了看文档的说明,可能你把它实现出来,结果仅是一个点构造器。如果是那样,不如直接用点构造器,
作者: suiyubing    时间: 2005-7-23 20:09
好的,我来试试,不过先回家调整一个星期,估计像您说的没什么希望,不过就让我走到死角吧,要不不甘心,呵呵。
作者: 深夜摔键盘    时间: 2005-7-23 20:50
鼠标位置的追踪,以前,我用windows 鼠标钩子辅以OPENGL的视图变换函数实现过。但总感觉不是很稳定。那个程序找不到了。如果你非要实现你所说的那种功能,可以从此入手。
作者: suiyubing    时间: 2005-8-7 20:29
键盘大哥你好,这些天一直没有做课题,现在又要接着做了,谢谢您的指导,听您那么一说,我又要问了,因为vc学得不好,所以说的不对的地方您别笑我,我要问的是您当初编这样的程序的时候是通过mfc dll框架来编的吗,因为要和ug连在一起,所以我想知道一下,谢谢。
作者: 深夜摔键盘    时间: 2005-8-8 10:02
win32的DLL只有一种,可导出变量和函数。
  
不要受到VC向导的蒙蔽,认为DLL也分为这格式那格式的。虽然"MFC格式"的DLL能导出C++类,MFC类等等,细想一下,类也是一种变量,只不过样子有点特殊罢了。
  
在任何一个系统下写程序,用的工具实际上也只有一种,那就是系统暴露出来的最基本的编程接口,windows系统钩子,就是这样的接口。
  
不管你用的是哪一种类库,只要最终出来的程序是win32 dll,就可以与UG连在一起。所以你可以在你的程序中使用OWL或其他的类库。
  
再把视野搞的开阔一些,只要是能制作DLL的编程工具,都能参与UG的二次开发。不用等到NX3,NX4提供JAVA,VB之类的接口,也可以用这些工具进行二次开发,就是麻烦点。




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