NX二次开发UF_CURVE_create_spline 函数介绍

文章作者:里海
来源网站:https://blog.csdn.net/WangPaiFeiXingYuan

UF_CURVE_create_spline

Defined in: uf_curve.h 
int UF_CURVE_create_spline(UF_CURVE_spline_p_t spline_data, tag_p_t spline_tag, int * num_states, UF_CURVE_state_p_t * states )

overview 概述

A spline curve is created from the data in the spline_data structure.
The spline is a NURBS (NonUniform Rational B-Spline) curve. See
the description of the structure for a basic description of the data items.
If the is_rational field is nonzero, the weights must be positive. If it is
0 (non-rational), the weights are ignored.
If the is_spcurve field is nonzero, the Z coordinates are ignored.
NURBS curves need not have Bezier end conditions (be clamped).
NX currently requires that the parameter range of a spline be
0 to 1. The User Function API normalizes the knot vector and returns
a state indicating the parameter transformation thus induced.
The multiplicity of a knot is the number of times the same value
appears in the sequence. The multiplicity of the end knots cannot
exceed the order of the spline; the multiplicity of interior knots cannot
exceed order-1. The knot sequence must be monotonically
increasing. These problems and degeneracies are fixed using
tolerances assigned by Open API.
Utilities are provided to assist in removing many of these conditions
from your splines using larger tolerances.
Periodicity is determined directly from the spline data by Open API
on create. A periodic spline is identified as follows:

  1.  Evaluate the location and tangent vectors at the start and
     end parameter values.
    
  2.  If the location vectors are the same, it is closed and is
     made periodic, but it might not be smooth at the closure.
    
  3.  If the tangent vectors have the same direction, it is smooth
     (G1). If the tangent vectors also have the same length, it is
     parameter smooth (C1).
    
  4.  If the spline is rational, and it is also C1 in homogeneous
     space, it can be unclamped. If the spline is not rational,
     Cartesian space is equivalent to homogeneous space and
     so it can be unclamped.
    
  5.  If it can be unclamped, the closure is made  as high as
     the data allows (up to degree - 1). If the closure cannot
     be made C1, it is made G1. If it cannot be made G1, it is
     left closed, but not smooth. (Unclamping applies knot
     removal to both ends of the spline. NX chooses
     knot intervals for this process that yield wrap-around
     control points if the closure is C1.)
    

The period is determined from the parameter range as defined above,
largest minus smallest allowed values.
If the closure for a periodic curve must be checked using tolerances
larger than Open APIs defaults, use UF_CURVE_smooth_spline_data. If
degeneracies and knot problems must be fixed using tolerances larger
than Open APIs defaults, use UF_CURVE_fix_spline_data.
Specific errors: spline contains fixable problems, or unfixable
problems. An unfixable overrides the fixable return code.

样条曲线是根据 spline _ data 结构中的数据创建的。样条是 NURBS (非均匀有理 B 样条)曲线。有关数据项的基本说明,请参见结构说明。如果是 _ 有理域是非零的,权值必须是正的。如果为0(非理性) ,则忽略权重。如果 is _ spCurve 字段非零,则忽略 Z 坐标。NURBS 曲线不需要有贝塞尔端部条件(被夹紧)。NX 当前要求样条的参数范围为0到1。用户函数 API 规范化节点向量并返回一个状态,指示由此引发的参数转换。一个结的多重性是同一值在序列中出现的次数。末端节点的多样性不能超过样条函数的阶; 内部节点的多样性不能超过1阶。绳结序列必须是单调增加的。这些问题和退化是固定使用公差分配的开放 API。提供实用程序,以协助消除这些条件从您的样条使用更大的公差许多。周期性是由创建时的 OpenAPI 直接从样条数据确定的。一个周期样条被识别如下: 1。计算开始和结束参数值的位置和切向量。2.如果位置向量是相同的,那么它是闭合的,并且是周期性的,但是它在闭合时可能不是平滑的。3.如果切向量的方向相同,它是光滑的(G1)。如果切向量也具有相同的长度,则为参数平滑(C1)。4.如果花键是有理的,而且它的齐性空间也是 C1,它就可以松开。如果样条曲线不是有理的,笛卡尔空间等价于齐性空间,因此它可以被解开。5.如果可以取消夹紧,则在数据允许的范围内尽可能高地设置闭包(直到达到1度)。如果闭包不能做成 C1,那么就做成 G1。如果它不能成为 G1,它是封闭的,但不是光滑的。(取消夹紧适用于结移除花键的两端。NX 为这个过程选择节点间隔,如果闭包是 C1,则产生环绕控制点。)周期由上面定义的参数范围确定,最大值减去允许的最小值。如果周期曲线的闭包必须使用大于 Open API 默认值的公差进行检查,则使用 UF _ CURVE _ ooth _ spline _ data。如果必须使用大于 Open API 默认值的公差来修复退化和节点问题,则使用 UF _ CURVE _ fix _ spline _ data。具体错误: 样条包含可修复的问题,或不可修复的问题。不可修复的重写可修复的返回代码。

UFUN例子

欢迎订阅《里海NX二次开发3000例专栏》https://blog.csdn.net/wangpaifeixingyuan/category_8840986.html,点击链接扫码即可订阅(持续更新中)。已经有几百人订阅,订阅是永久的,无限期阅读,如需帮助请私信

parameters 参数

UF_CURVE_spline_p_tspline_dataInputAddress of spline structure describing the desired curve.
描述所需曲线的样条结构地址。
tag_p_tspline_tagOutputTag of curve is returned
返回曲线标记
int *num_statesOutputNumber of entries in states array
状态数组中的条目数
UF_CURVE_state_p_t *statesOutput to UF_freeArray of states indicating what kinds of problems are present; if NULL no state return is needed. This array must be freed by calling UF_free.
状态数组,指示存在哪些类型的问题; 如果为 NULL,则不需要状态返回。必须通过调用 UF _ free 来释放此数组。

分割

C++语言在UG二次开发中的应用及综合分析

  1. C++ 是C语言的扩展,它既可以执行C语言的过程化程序设计,也可以进行以抽象数据类型为特点的基于对象的设计,以及面向对象的程序设计。C++ 在处理问题规模上具有很大的适应性。
  2. C++不仅具有计算机高效运行的实用性特征,并且致力于提升大规模程序的编程质量以及程序设计语言的问题描述能力。

在UG二次开发中,C++语言具有以下特点

  1. C++语言支持多种程序设计风格
  2. C++的许多特性以库的形式存在,保证了语言的简洁和开发运行的效率
  3. 与C语言相比,C++引入了面向对象的概念,使得UG二次开发的人机交互界面更加简洁
  4. 通过借助UG自带的2000多种API函数,结合高级语言C++以及编程软件Visual Studio,可以对UG进行二次开发
  5. 需要注意的是,市场上的Visual Studio和UG版本众多,并非所有版本都能兼容

程序设计过程通常包括以下步骤:

  1. 问题分析:对要解决的问题进行深入的分析,理解问题的具体需求和限制。
  2. 需求定义:明确程序的目标和功能,包括用户需求、系统需求等。
  3. 设计:根据需求进行设计,包括算法设计、数据结构设计、界面设计等。
  4. 编码:根据设计的结果,使用一种编程语言将程序代码实现出来。
  5. 测试:通过各种测试方法来确保程序的正确性,包括单元测试、集成测试、系统测试等。
  6. 维护:对程序进行修改和完善,以解决可能出现的问题或满足新的需求。
  7. 文档编写:编写程序文档,描述程序的功能、操作方法、注意事项等。

以下是一个创建体素特征(块、柱、锥、球)的二次开发例子

#include <stdio.h>
#include <stdarg.h>
#include <uf_modl_primitives.h>
#include <uf_ui_ugopen.h>
#include <uf.h>
#include <uf_defs.h>
//封装打印函数,用于将信息打印到信息窗口
//QQ3123197280
int ECHO(const char* szFormat, ...)
{
	char szMsg[5000] = "";
	va_list arg_ptr;
	va_start(arg_ptr, szFormat);
	vsprintf_s(szMsg, szFormat, arg_ptr);
	va_end(arg_ptr);
	UF_UI_open_listing_window();
	
	UF_UI_write_listing_window(szMsg);
	return 0;
}
extern DllExport void ufusr(char* param, int* returnCode, int rlen)
{
	UF_initialize();
	//创建块
	UF_FEATURE_SIGN sign = UF_NULLSIGN;
	//块起点相对于ABS
	double block_orig[3] = { 0.0,0.0,0.0 };
	//方向相对于WCS
	char* block_len[3] = { "10", "30", "10" };
	tag_t blk_obj;//体特征
	UF_MODL_create_block1(sign, block_orig, block_len, &blk_obj);
	int iEdit = 0;  
	char* size[3];
	UF_MODL_ask_block_parms(blk_obj, iEdit, size);
	ECHO("%s,%s,%s\n", size[0], size[1], size[2]);//输出: p6=10,p7=30,p8=10
	//创建圆柱
	UF_FEATURE_SIGN sign1 = UF_NULLSIGN;
	double origin[3] = { 10.0,0.0,10.0 };
	char  height[] = "20";
	char  diam[] = "10";
	double direction[3] = { 0,0,1 };//方向
	tag_t  cyl_obj_id;
	UF_MODL_create_cyl1(sign1, origin, height, diam, direction, &cyl_obj_id);
	int iEdit2 = 0;  
	char* cDiameter;
	char* cHeight;
	UF_MODL_ask_cylinder_parms(cyl_obj_id, iEdit2, &cDiameter, &cHeight);
	ECHO("%s,%s\n", cDiameter, cHeight);//输出:p9=10,p10=20
	UF_free(cDiameter);
	UF_free(cHeight);
	//创建圆锥
	UF_FEATURE_SIGN sign2 = UF_NULLSIGN;
	double origin2[3] = { 0.0,0.0,10.0 };
	char  height2[] = "20";
	char* diam2[2] = { "10" ,"5" };
	double direction2[3] = { 0,0,1 };//方向
	tag_t  cone_obj_id;
	UF_MODL_create_cone1(sign2, origin2, height2, diam2, direction2, &cone_obj_id);
	int iEdit3 = 0;  
	char* cD1;
	char* cD2;
	char* cH;
	char* cAngle;
	UF_MODL_ask_cone_parms(cone_obj_id, iEdit3, &cD1, &cD2, &cH, &cAngle);
	ECHO("%s,%s,%s,%s\n", cD1, cD2, cH, cAngle);//输出:p11=10,p12=5,p13=20,p14=7.1250163489018
	UF_free(cD1);
	UF_free(cD2);
	UF_free(cH);
	UF_free(cAngle);
	//创建球
	UF_FEATURE_SIGN sign3 = UF_NULLSIGN;
	double douCenter2[3] = { 0.0,0.0,30.0 };
	char  cDiam[] = "8";
	tag_t  sphere_obj_id;
	UF_MODL_create_sphere1(sign3, douCenter2, cDiam, &sphere_obj_id);
	int iEdit4 = 0;  
	char* cDiam_parm;
	UF_MODL_ask_sphere_parms(sphere_obj_id, iEdit4, &cDiam_parm);
	ECHO("%s\n", cDiam_parm);//输出:p15=8
	UF_free(cDiam_parm);
	UF_terminate();
}
extern int ufusr_ask_unload(void)
{
	return (UF_UNLOAD_IMMEDIATELY);
}

效果:
效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王牌飞行员_里海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值