NX/UG二次开发—Parasolid—PK_BODY_pick_topols

最近在写一个判断圆孔深度和通盲状态的功能,发现PK_BODY_pick_topols射线函数可以设置到射线垂直距离,相当于一个圆柱空间,但在测试发现,R7的孔,设置:

max_edge_dist = 0.007; max_vertices = 0.007;

结果测试发现返回值中小于7mm,通过设置pick_approx = PK_pick_approximate_no_c,也没有起作用。

在尝试调整离散曲线,并设置曲线弦长之后,结果越来越接近7mm,但如果将公差调整非常小,测试结果又恢复到默认值。

如果是直线边,测试结果准确,对于曲线边界,需要公差设置,而且必须在合理范围内的公差。

以上是我的测试记录,遇到问题的可以参考。如果有哪个参数可以直接设置,还望留言指正。

    /*获取圆柱空间内面、体对象*/ 

    //初始化射线区域
 	PK_BODY_pick_topols_o_t rayOptions;
	PK_BODY_pick_topols_o_m(rayOptions);
	rayOptions.max_faces = 1;
	rayOptions.max_edges = 1;
	rayOptions.max_vertices = 1;
	rayOptions.method = PK_BODY_pick_radial_c;
	rayOptions.is_curve_chord_tol = PK_LOGICAL_true;
	rayOptions.curve_chord_tol = 0.00001 * 0.001;
	rayOptions.pick_approx = PK_pick_approximate_no_c;
	rayOptions.max_edge_dist = radius * 0.001;
	rayOptions.max_vertices = radius * 0.001;
	rayOptions.near_plane = PK_LOGICAL_true;
	rayOptions.near_point.coord[0] = topCenterPt[0] * 0.001;
	rayOptions.near_point.coord[1] = topCenterPt[1] * 0.001;
	rayOptions.near_point.coord[2] = topCenterPt[2] * 0.001;
	rayOptions.far_plane = PK_LOGICAL_true;
	rayOptions.far_point.coord[0] = (topCenterPt[0] + refDir[0] * depth ) * 0.001;
	rayOptions.far_point.coord[1] = (topCenterPt[1] + refDir[1] * depth ) * 0.001;
	rayOptions.far_point.coord[2] = (topCenterPt[2] + refDir[2] * depth ) * 0.001;
	
	//
	PK_AXIS1_sf_t rayAxis;
	rayAxis.location.coord[0] = topCenterPt[0] * 0.001;
	rayAxis.location.coord[1] = topCenterPt[1] * 0.001;
	rayAxis.location.coord[2] = topCenterPt[2] * 0.001;
	rayAxis.axis.coord[0] = refDir[0];
	rayAxis.axis.coord[1] = refDir[1];
	rayAxis.axis.coord[2] = refDir[2];
	
	//
	PK_BODY_pick_topols_r_t pickedInfor;
	PK_PART_t bodies[1] = { t_pkObject };
	
	//
	PK_BODY_pick_topols(1, bodies, PK_ENTITY_null, &rayAxis,&rayOptions, &pickedInfor);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
下面是一个示例,展示如何使用 Parasolid API 中的 PK_BODY_pick_topols 函数: ``` #include "PKAPI/PKAPI.h" // 定义一个函数,用于在给定的实体上选择拓扑结构 void selectTopology(PK_PART_t *part, PK_BODY_t *body) { // 定义一个拓扑选择器 PK_TOPOLOGY_SELECT_t *selector = PK_TOPOLOGY_SELECT_create(); // 设置选择器的模式为“单选” PK_TOPOLOGY_SELECT_set_mode(selector, PK_TOPOLOGY_SELECT_MODE_SINGLE); // 使用 PK_BODY_pick_topols 函数选择拓扑结构 int num_topols = 0; PK_TOPOLOGY_t **topols = PK_BODY_pick_topols(body, selector, &num_topols); // 输出选择的拓扑结构的数量 printf("Selected %d topologies:\n", num_topols); // 遍历选择的拓扑结构并输出它们的类型和 ID for (int i = 0; i < num_topols; i++) { PK_TOPOLOGY_t *topol = topols[i]; printf(" Topology %d: type=%d, ID=%d\n", i, PK_TOPOLOGY_get_type(topol), PK_TOPOLOGY_get_id(topol)); } // 释放选择器和拓扑结构数组 PK_TOPOLOGY_SELECT_destroy(selector); PK_TOPOLOGY_delete_array(topols, num_topols); } int main() { // 初始化 Parasolid API PK_INITIALIZE(""); // 打开一个示例文件 PK_PART_t *part = PK_PART_open("example.x_t"); // 获取文件中的所有实体 int num_bodies = 0; PK_BODY_t **bodies = PK_PART_ask_bodies(part, &num_bodies); // 遍历实体并选择它们的拓扑结构 for (int i = 0; i < num_bodies; i++) { PK_BODY_t *body = bodies[i]; printf("Selecting topologies for body %d:\n", i); selectTopology(part, body); } // 释放实体数组和文件 PK_BODY_delete_array(bodies, num_bodies); PK_PART_close(part); // 终止 Parasolid API PK_TERMINATE(""); return 0; } ``` 该示例首先初始化 Parasolid API,然后打开一个名为 "example.x_t" 的示例文件。然后,它获取文件中的所有实体,并使用 PK_BODY_pick_topols 函数选择每个实体的拓扑结构。最后,它释放实体数组和文件,并终止 Parasolid API。 在 selectTopology 函数中,我们首先创建一个拓扑选择器,并将其模式设置为“单选”。然后,我们使用 PK_BODY_pick_topols 函数选择拓扑结构,并输出选择的拓扑结构的数量和类型/ID。最后,我们释放选择器和拓扑结构数组。 请注意,此示例仅演示了如何使用 PK_BODY_pick_topols 函数选择拓扑结构。在实际应用中,您可能需要进一步处理所选的拓扑结构,并执行其他操作,例如修改它们的属性或创建新的实体。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

恩·艾克斯·红

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

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

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

打赏作者

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

抵扣说明:

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

余额充值