找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 6341|回复: 7

[求助] UG二次开发UF_MODL_create_fitted_spline()应用

[复制链接]

4

主题

19

回帖

990

积分

五级士官

积分
990
发表于 2015-3-9 08:34:27 | 显示全部楼层 |阅读模式
采用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里面不能生成曲线。
希望大侠给出一个具体实例,这方面的参考资料太少了。
附录源程序:
  1. // ugopen.cpp : Defines the initialization routines for the DLL.
  2. //

  3. #include "stdafx.h"
  4. #include "ugopen.h"

  5. #include <stdio.h>
  6. #include <uf.h>
  7. #include <uf_ui.h>
  8. #include <uf_curve.h>
  9. #include<uf_modl.h> //建模

  10. #define  NUMBER_POINTS  5
  11. #define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))

  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif


  17. //
  18. //                For example:
  19. //
  20. //                extern "C" BOOL PASCAL EXPORT ExportedFunction()
  21. //                {
  22. //                        AFX_MANAGE_STATE(AfxGetStaticModuleState());
  23. //                        // normal function body here
  24. //                }
  25. //
  26. //                It is very important that this macro appear in each
  27. //                function, prior to any calls into MFC.  This means that
  28. //                it must appear as the first statement within the
  29. //                function, even before any object variable declarations
  30. //                as their constructors may generate calls into the MFC
  31. //                DLL.
  32. //
  33. //                Please see MFC Technical Notes 33 and 58 for additional
  34. //                details.
  35. //

  36. /////////////////////////////////////////////////////////////////////////////
  37. // CUgopenApp

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

  44. /////////////////////////////////////////////////////////////////////////////
  45. // CUgopenApp construction

  46. CUgopenApp::CUgopenApp()
  47. {
  48.         // TODO: add construction code here,
  49.         // Place all significant initialization in InitInstance
  50. }

  51. /////////////////////////////////////////////////////////////////////////////
  52. // The one and only CUgopenApp object

  53. CUgopenApp theApp;

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


  59.          SPLINE_FIT_p_t spdata; //截面点数据
  60.          
  61.                  double sp1;
  62.          
  63.                    double pt[15]={1.1000,  0.5320,  2.0000,
  64.                                   1.5240,  0.6789,  2.3000,
  65.                                        2.0000,  0.9000,  3.5956,
  66.                                        2.3456,  1.3456,  3.7890,
  67.                                         3.1000,  2.4567,  3.3214};
  68.                  int err_pt;
  69.                  int i;
  70.                  tag_p_t curved_id;
  71.                  spdata->degree=3;
  72.                  spdata->num_of_points=5;
  73.                  spdata->num_of_segments=1;

  74. //                     points                        
  75. //                         double *
  76. //                        
  77. //                         coordinates for the points to be fitted.
  78. //                         points[0~2] = (x, y, z) for the 1st point,
  79. //                         points[3~5] = (x, y, z) for the 2nd point,
  80. //                         ...
  81.                         

  82.                
  83.                  for(i=0;i<15;i++)
  84.                  {
  85.                          spdata->points=pt;
  86.                  }
  87.          
  88.                 //通过点的样条曲线
  89.                  UF_MODL_create_fitted_spline(spdata,&sp1,&err_pt,curved_id);

  90. }

  91. extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
  92. {
  93.     /* Initialize the API environment */
  94.     int errorCode = UF_initialize(); //初始化 获得权限
  95.         
  96.     if ( 0 == errorCode )
  97.     {
  98.         /* TODO: Add your application code here 添加如下代码*/
  99.                 AFX_MANAGE_STATE(AfxGetStaticModuleState()); //切换模块状态

  100.         do_ugopen_api(); //调用该程序

  101.                 /* Terminate the API environment */
  102.         errorCode = UF_terminate();  //释放NX执行许可权限
  103.     }
  104.     /* Print out any error messages */
  105.     PrintErrorMessage( errorCode );
  106. }
  107. /*****************************************************************************
  108. **  Utilities
  109. *****************************************************************************/

  110. /* Unload Handler
  111. **     This function specifies when to unload your application from Unigraphics.
  112. **     If your application registers a callback (from a MenuScript item or a
  113. **     User Defined Object for example), this function MUST return
  114. **     "UF_UNLOAD_UG_TERMINATE". */
  115. extern int ufusr_ask_unload( void ) //卸载函数
  116. {
  117.     return( UF_UNLOAD_IMMEDIATELY );
  118. }

  119. /* PrintErrorMessage
  120. **
  121. **     Prints error messages to standard error and the Unigraphics status
  122. **     line. */
  123. static void PrintErrorMessage( int errorCode ) //错误输出
  124. {
  125.     if ( 0 != errorCode )
  126.     {
  127.         /* Retrieve the associated error message */
  128.         char message[133];
  129.         UF_get_fail_message( errorCode, message );
  130.         /* Print out the message */
  131.         UF_UI_set_status( message );
  132.         fprintf( stderr, "%s\n", message );
  133.     }
  134. }
复制代码

2293

主题

1万

回帖

3万

积分

Administrator

积分
32454

站长优秀版主论坛技术员论坛元老论坛贡献推广达人

发表于 2015-3-9 09:07:08 | 显示全部楼层

回帖奖励 +1 G币

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

4

主题

19

回帖

990

积分

五级士官

积分
990
 楼主| 发表于 2015-3-9 10:04:20 | 显示全部楼层
谢谢版主关注 主要是UG二次开发的人少,新手又多。
发表于 2015-3-9 14:56:21 | 显示全部楼层
不会,帮楼主顶一下。

0

主题

19

回帖

240

积分

一级士官

积分
240
发表于 2015-6-12 22:10:35 | 显示全部楼层
问题都解决了,不贴出来?

14

主题

257

回帖

8511

积分

贵宾

积分
8511

论坛技术员论坛贡献

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

0

主题

9

回帖

107

积分

上等兵

积分
107
发表于 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[3]={0};
                fit_data.points=new double[count_pnt_ol*3];
                for (int i=0; i<count_pnt_ol; i++)
                {
                        temp[0] = points_ol[i].pt[0];
                        temp[1] = points_ol[i].pt[1];
                        temp[2] = points_ol[i].pt[2];
                        fit_data.points[3*i] = temp[0];
                        fit_data.points[3*i+1] = temp[1];
                        fit_data.points[3*i+2] = temp[2];
                }
                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);

0

主题

102

回帖

1144

积分

六级士官

积分
1144
发表于 2016-10-28 23:48:46 | 显示全部楼层
guo752091410 发表于 2016-7-11 20:54
那个数据体应该设置为SPLINE_fit_t,而不能用_p_t,否则你这样是很难创建出来的

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

尝试了一下,可以成功,但是拟合完之后会有一个fatal error
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

咨询QQ:1359218528|发帖须知!|Archiver|手机版|小黑屋|UG爱好者论坛 ( 京ICP备10217105号-2 )

GMT+8, 2024-12-23 04:14

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表