parasolid内核PK函数(C语言) 运行速度 比 ufun 和 nxopen 快,目前本人只用于兴趣研究,有关lib库 和 头文件 自己去百度找。

下面是常用的 函数以及 基础列子

注意PK单位是米  1米=1000毫米


#include <uf.h>

#include <uf_ui.h>

#include <uf_exit.h>

#include <uf_modl.h>

#include <uf_obj.h>

#include <uf_csys.h>

#include <uf_part.h>

#include <uf_ps.h>

#include "parasolid_kernel.h"

#include "parasolid_ifails.h"

#include "parasolid_tokens.h"

#include <math.h>

#include <list>

——————————————————————————————

PK_BODY_ask_memory_usage 返回实体占用内存


PK_EDGE_ask_vertices 返回边缘顶点

PK_FACE_ask_vertices 返回表面顶点

PK_BODY_ask_vertices 返回实体顶点

PK_EDGE_find_extreme 返回边缘极点坐标

PK_FACE_find_extreme 返回面极点坐标

PK_BODY_find_extreme 返回实体极点 坐标

PK_TOPOL_find_box 粗量对象极点坐标


PK_TOPOL_eval_mass_props 获得对象信息(体积等)


PK_EDGE_ask_type  分析边缘类型

PK_FACE_ask_type  分析表面类型

PK_BODY_ask_type  分析实体类型


PK_EDGE_ask_body  根据边缘获得实体

PK_EDGE_ask_curve 根据边缘获得曲线

PK_EDGE_ask_faces 根据边缘获得面


PK_CURVE_ask_edges 根据线返回边缘


PK_FACE_ask_body  根据面获得实体

PK_FACE_ask_loops 根据面获得loops

PK_FACE_ask_edges 根据面获得边缘


PK_BODY_ask_faces 根据实体获得面

PK_BODY_ask_edges 根据实体获得边


PK_BODY_ask_first_edge 根据实体获得第一个边

PK_BODY_ask_first_face 根据实体获得第一个面


PK_EDGE_check 检查边

PK_FACE_check 检查面

PK_BODY_check 检查体


PK_EDGE_find_end_tangents 获得相切的边

PK_EDGE_ask_oriented_curve 获得边和方向

PK_EDGE_reverse  边反向


PK_FACE_delete 删除面

PK_ENTITY_delete 删除视实体

PK_ENTITY_delete_attribs 删除实体所有属性

PK_ENTITY_copy 复制实体


PK_POINT_ask 分析点坐标

PK_LINE_ask 分析直线信息

PK_CIRCLE_ask 分析圆弧信息

PK_ELLIPSE_ask 分析椭圆信息

PK_CURVE_ask_param 返回曲线信息

PK_CURVE_find_length 返回曲线弧长


PK_FACE_find_uvbox 返回面uv值

PK_SURF_ask_uvbox 返回面uv大小

PK_SURF_parameterise_vector 获得点在面上的uv值


PK_CURVE_find_min_radius 返回曲线最小半径

PK_SURF_find_min_radii 返回面最小半径

PK_SURF_find_non_aligned_box返回面大小

PK_CURVE_find_non_aligned_box返回曲线大小


PK_SURF_ask_faces 返回给定的表面被附加的一组面。

PK_SURF_offset 偏移面


PK_ENTITY_is 是否实体

PK_ENTITY_is_curve 是否曲线

PK_ENTITY_is_geom 是否geom

PK_ENTITY_is_part 是否部件

PK_ENTITY_is_surf 是否surf

PK_ENTITY_is_topol 是否topol


PK_FACE_is_coincident 分析2个面是否重合

PK_EDGE_is_planar 分析边缘是否在平面上

PK_EDGE_is_smooth 分析边缘是否平滑光滑


PK_POINT_create 创建点

PK_LINE_create 创建直线

PK_CIRCLE_create 创建圆弧

PK_ELLIPSE_create 创建椭圆

PK_PLANE_create 创建平面

PK_BODY_create_solid_block创建块

PK_BODY_create_solid_cone 创建圆锥

PK_BODY_create_solid_cyl 创建圆柱

PK_BODY_create_solid_prism 创建棱柱

PK_BODY_create_solid_sphere 创建球

PK_BODY_create_solid_topology 创建拓扑

PK_BODY_create_solid_torus 创建环

PK_BODY_create_wire_topology 创建连线体的拓扑结构

PK_BODY_offset_2 偏移

PK_BODY_extend 扩展一个片体

PK_BODY_extrude 拉神

PK_BODY_sweep 扫描扫略

PK_BODY_thicken_3 片体加厚

PK_BODY_hollow_2 孔

PK_BODY_sew_bodies 缝合

PK_BODY_trim修剪体

PK_BODY_trim_gap_analysis这个函数在提供给失败的修剪操作的边缘找到缺口。

PK_BODY_taper 分离

PK_BODY_boolean_2 布尔运算

PK_BODY_unite_bodies 布尔加

PK_BODY_subtract_bodies 布尔减

PK_BODY_intersect_bodies 布尔求交

PK_BODY_spin 旋转对象

PK_BODY_transform_2 变换实体

PK_FACE_offset_2 偏移面


PK_CURVE_intersect_curve 2个曲线交点

PK_SURF_find_curves_common 获得2个面的交线

PK_FACE_intersect_curve 获得曲线和面的交点


————————————————————————————————————————

例子:PK创建 长方体大小 20*20*30 (单位mm)


// PK创建 长方体大小 20*20*30 (单位mm)

double mm=0.001;

tag_t  partition = NULL_TAG;

UF_PS_create_partition(&partition);//为Parasolid创建一个隔层分区,并将其设置为当前分区

PK_BODY_t Output1=PK_ENTITY_null;

PK_AXIS2_sf_s basis_set;

PK_VECTOR_t origpoint={10.0*mm,10.0*mm,0.0*mm}; //点位置 10,10,0

PK_VECTOR1_t zDir={0.0,0.0,1.0};

PK_VECTOR1_t refDir={1.0,0.0,0.0};

basis_set.location=origpoint;

basis_set.axis=zDir;

basis_set.ref_direction=refDir;

PK_ERROR_code_t err=PK_BODY_create_solid_block(20.0*mm,20.0*mm,30.0*mm,&basis_set,&Output1);

if(err == PK_ERROR_no_errors)

{

tag_t ug_tag = NULL_TAG;

UF_PS_create_obj_from_ps_tag(Output1, &ug_tag);//通过Parasolid创建一个NX对象tag

UF_DISP_regenerate_display();//恢复显示

//获得实体表面数量

int numFaces=0;

PK_FACE_t *faces=NULL;

PK_BODY_ask_faces(Output1,&numFaces,&faces);

PK_MEMORY_free(faces);

char msg[132]="";

sprintf(msg,"梅雷提示!面数量=%d",numFaces);

uc1601(msg,1);

}

————————————————————————————————————————

例子:ufun选择对象,pk内核函数粗量获得对象极点坐标和大小


char *message="梅雷提示!请选择实体。";

char *title="pk内核获得实体面数量";

int  scope=UF_UI_SEL_SCOPE_WORK_PART;//选取范围

int  response;

tag_t object_tag=NULL_TAG;

double  cursor[3]={0,0,0};

tag_t view=NULL_TAG;

UF_UI_lock_ug_access (UF_UI_FROM_CUSTOM);

UF_UI_select_with_single_dialog(message,title,scope,MEI_init_proc,NULL,&response,&object_tag,cursor,&view);

UF_DISP_set_highlight(object_tag,0);

UF_UI_unlock_ug_access (UF_UI_FROM_CUSTOM);

if (response==UF_UI_OBJECT_SELECTED)

{

PK_BODY_t body=PK_ENTITY_null;

tag_t ps_tag=NULL_TAG;

UF_PS_ask_ps_tag_of_object(object_tag, &ps_tag);

if (ps_tag==NULL_TAG)

{

uc1601("找不到ps_tag",1);

}

else

{

body=(PK_BODY_t )ps_tag;

PK_BOX_t box;

box.coord[0]=0;

box.coord[1]=0;

box.coord[2]=0;

box.coord[3]=0;

box.coord[4]=0;

box.coord[5]=0;

PK_TOPOL_find_box(body,&box);

char msg[133]="";

sprintf(msg, "粗量对象外形=%.2f,%.2f,%.2f\n",(box.coord[3]-box.coord[0])*1000,(box.coord[4]-box.coord[1])*1000,(box.coord[5]-box.coord[2])*1000);

UF_UI_open_listing_window();

UF_UI_write_listing_window(msg);


}

}