zhouruihu* 发表于 2015-3-9 08:34:27

UG二次开发UF_MODL_create_fitted_spline()应用

采用UG二次开发,UG6.0 VC6.0 采用MFC进入应用程序向导。通过点生成样条曲线,
使用UF_MODL_create_fitted_spline(SPLINE_FIT_p_tspline_data,double *max_err,int *max_err_pt ,tag_p_t obj_id)函数
主要是 spline_data这项参数不会用,UG里面不能生成曲线。
希望大侠给出一个具体实例,这方面的参考资料太少了。
附录源程序:
// ugopen.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "ugopen.h"

#include <stdio.h>
#include <uf.h>
#include <uf_ui.h>
#include <uf_curve.h>
#include<uf_modl.h> //建模

#defineNUMBER_POINTS5
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//
//                For example:
//
//                extern "C" BOOL PASCAL EXPORT ExportedFunction()
//                {
//                        AFX_MANAGE_STATE(AfxGetStaticModuleState());
//                        // normal function body here
//                }
//
//                It is very important that this macro appear in each
//                function, prior to any calls into MFC.This means that
//                it must appear as the first statement within the
//                function, even before any object variable declarations
//                as their constructors may generate calls into the MFC
//                DLL.
//
//                Please see MFC Technical Notes 33 and 58 for additional
//                details.
//

/////////////////////////////////////////////////////////////////////////////
// CUgopenApp

BEGIN_MESSAGE_MAP(CUgopenApp, CWinApp)
      //{{AFX_MSG_MAP(CUgopenApp)
                // NOTE - the ClassWizard will add and remove mapping macros here.
                //    DO NOT EDIT what you see in these blocks of generated code!
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUgopenApp construction

CUgopenApp::CUgopenApp()
{
      // TODO: add construction code here,
      // Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CUgopenApp object

CUgopenApp theApp;

// ufusr()是直接激活的用户出口
// param retcode 是输出参数,rlen是指参数param的长度,由NX系统自动处理
//给出了一个函数的范例 可以写成子函数的形式 也方便调试 自己先定义一个子函数
static void do_ugopen_api(void)
{


         SPLINE_FIT_p_t spdata; //截面点数据
         
               double sp1;
         
                   double pt={1.1000,0.5320,2.0000,
                                  1.5240,0.6789,2.3000,
                                       2.0000,0.9000,3.5956,
                                       2.3456,1.3456,3.7890,
                                        3.1000,2.4567,3.3214};
               int err_pt;
               int i;
               tag_p_t curved_id;
               spdata->degree=3;
               spdata->num_of_points=5;
               spdata->num_of_segments=1;

//                     points                        
//                         double *
//                        
//                         coordinates for the points to be fitted.
//                         points = (x, y, z) for the 1st point,
//                         points = (x, y, z) for the 2nd point,
//                         ...
                        

               
               for(i=0;i<15;i++)
               {
                         spdata->points=pt;
               }
         
                //通过点的样条曲线
               UF_MODL_create_fitted_spline(spdata,&sp1,&err_pt,curved_id);

}

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 添加如下代码*/
                AFX_MANAGE_STATE(AfxGetStaticModuleState()); //切换模块状态

      do_ugopen_api(); //调用该程序

                /* Terminate the API environment */
      errorCode = UF_terminate();//释放NX执行许可权限
    }
    /* 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_IMMEDIATELY );
}

/* 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;
      UF_get_fail_message( errorCode, message );
      /* Print out the message */
      UF_UI_set_status( message );
      fprintf( stderr, "%s\n", message );
    }
}

guo752091410 发表于 2016-7-11 20:54:52

那个数据体应该设置为SPLINE_fit_t,而不能用_p_t,否则你这样是很难创建出来的

//通过点选择器选择需要拟合的数据点
        char *message_pnt_select="选择测量数据点";
        logical coincident_points=FALSE;                        //是否返回重合点,true返回false不返回
        UF_UI_chained_points_p_t points_ol;
        int count_pnt_ol=0;
        int response=0;
        UF_UI_select_point_collection( message_pnt_select,coincident_points, &points_ol,&count_pnt_ol,&response);
       
        //若用户选点选择cancel键本程序结束
        //if (*response != 3 || *response!=4)
       
                double max_fit_err=0;
                int max_fit_pnt=0;

                //tag_p_t里存放的是tag_t的地址,若直接创建p_t则相当于没有为函数提供放置ID的空间,函数无法创建对象并写入ID
                tag_t fit_curve_id=0;
               
                //将获取的pnt放入spline_fit_p_t中,创建拟合曲线用
                SPLINE_FIT_t fit_data={0};
                //zero_strcut_fit_spline(fit_data,count_pnt_ol);
                fit_data.num_of_points=count_pnt_ol;
                double temp={0};
                fit_data.points=new double;
                for (int i=0; i<count_pnt_ol; i++)
                {
                        temp = points_ol.pt;
                        temp = points_ol.pt;
                        temp = points_ol.pt;
                        fit_data.points = temp;
                        fit_data.points = temp;
                        fit_data.points = temp;
                }
                fit_data.degree=3;
                fit_data.tolerance=0.005;
                UF_MODL_create_fitted_spline(&fit_data,&max_fit_err,&max_fit_pnt,&fit_curve_id);
                char fit_message=0;
                sprintf(&fit_message,"最大误差为%lf",max_fit_err);
                uc1601(&fit_message,1);//0显示在状态栏,1显示在消息盒中,为用户提示该输入第几条截面线
                UF_free(points_ol);

Jefft* 发表于 2016-7-10 16:07:20

你问的问题,是一些非常基础和简单的问题,看你的代码就知道,你根本就没有理解输入的参数是什么。
拿你的数据做了一下,可以看看结果;(你可以把你的点整到NX,然后手工拟合,看看与我动画的曲线形状是不是一样的。
二次开发相关的资料目前在网络上少得可怜,能找到的也是一些老的MFC在搞,那些代码:
1、教授也是乱抄的,拿过来直接编译都是不通过的;
2、已经过时,建议不要学了;
3、要学就学最新版的UI界面来做二次开发。
在整个网络上,目前能将二次开发,从入门讲解做到高级的二次开发工具做出来的教程,只有我做过。
有兴趣关注一下:(可以看目录,还有前面的试看教程)
http://www.chuanke.com/3405460-153615.html


副总经理 发表于 2015-3-9 09:07:08

确实,做NX二次开发的人还太少,交流的人不多,仅靠论坛的二次开发版块汇集人才。

zhouruihu* 发表于 2015-3-9 10:04:20

谢谢版主关注 主要是UG二次开发的人少,新手又多。

请叫我老师头 发表于 2015-3-9 14:56:21

不会,帮楼主顶一下。

visahc* 发表于 2015-6-12 22:10:35

问题都解决了,不贴出来?

Sser_KODance 发表于 2016-10-28 23:48:46

guo752091410 发表于 2016-7-11 20:54
那个数据体应该设置为SPLINE_fit_t,而不能用_p_t,否则你这样是很难创建出来的

//通过点选择器选择需要 ...

尝试了一下,可以成功,但是拟合完之后会有一个fatal error
页: [1]
查看完整版本: UG二次开发UF_MODL_create_fitted_spline()应用