我已经尽我所能确保信息的准确性,但是如果您发现任何错误或不准确的地方,请随时在评论区指出。我非常感谢您的反馈,这将帮助我改进我的内容。
1. 获取某点坐标
直接展示update_cb中的代码:
void get_curve_point(tag_t curve_edge, double point_pos[3], double relative_pos) {
double junk[3] = { 0.0, 0.0, 0.0 };
UF_MODL_ask_curve_props(curve_edge, relative_pos, point_pos, junk, junk, junk, junk, junk);
}
int demo::update_cb(NXOpen::BlockStyler::UIBlock* block)
{
try
{
if (block == blockStyler1){
UF_initialize();
// 定义接收选择对象的容器
vector<TaggedObject*> selectobs;
// 从对象edge_select0中得到选择对象
selectobs = edge_select0->GetSelectedObjects();
// 获取的选择对象的tag_t值
tag_t curve_edge = selectobs[0]->Tag();
// 想要获取的点在曲线上的相对位置,范围0~1
double relative_pos = 0.0;
// 定义获取点
double point_pos[3];
get_curve_point(curve_edge, point_pos[3], relative_pos)
}
else if (block == blockStyler2){
}
}
catch(exception& ex)
{
//---- Enter your exception handling code here -----
demo::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
}
return 0;
}
2. 获取多个点的坐标
// 通过vector<TaggedObject*>对象获取曲线上多个点的坐标
vector<array<double, 3>> get_selectobs_curves_point_set(vector<TaggedObject*> tag_objs) {
// 计算在复合曲线上选取点的步长(在NX二次开发中,选取的曲线可能是多条曲线结合的结果,在这里通过求一定点数的坐标,每两点间的弧长取一致,可在此基础上通过设置一定规则灵活选取点)
double curves_length = 0.0;
for (TaggedObject* tag_obj : tag_objs) {
tag_t tag = tag_obj->Tag();
double curve_length;
UF_CURVE_ask_arc_length(tag, (0, 0, 0), (0, 0, 1), UF_MODL_MMETER, &curve_length);
curves_length += curve_length;
}
// 此处NUM_POINTS为需要求取的点个数,自己设置
double stol = curves_length / double(NUM_POINTS);
vector<array<double, 3>> points_list;
for (TaggedObject* tag_obj : tag_objs) {
tag_t tag = tag_obj->Tag();
double ctol = 0.0; // 弦长误差
double atol = 0.0; // 角度误差
//double stol = 0.0; // 最大步长
double* pts;
int numpts;
int flag = UF_MODL_ask_curve_points(tag, ctol, atol, stol, &numpts, &pts);
if (flag == 0) {
for (int i = 0; i < numpts; ++i) {
array<double, 3> point;
point[0] = pts[i * 3];
point[1] = pts[i * 3 + 1];
point[2] = pts[i * 3 + 2];
points_list.push_back(point);
}
}
}
return points_list;
}
int demo::update_cb(NXOpen::BlockStyler::UIBlock* block)
{
try
{
if (block == blockStyler1){
UF_initialize();
// 定义接收选择对象的容器
vector<TaggedObject*> selectobs;
// 从对象edge_select0中得到选择对象
selectobs = edge_select0->GetSelectedObjects();
vector<array<double, 3>> points_pos_on_curve = get_selectobs_curves_point_set(selectobs);
}
else if (block == blockStyler2){
}
}
catch(exception& ex)
{
//---- Enter your exception handling code here -----
demo::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
}
return 0;
}