heromo 发表于 2015-11-9 08:37:08

UG二次开发中,怎么选取特定的面

比如,第一步创建了一个长方体,第二步在其中一个面打沉头孔,那么怎么获取自己想要的面呢

15757753770 发表于 2016-12-12 12:24:21

01、选择对象

捕捉
PointOverlay             是否显示捕捉点
SmartUpdateOption      智能更新选项
                           Within Modeling   在建模
                           After Modeling    建模后
                           After Parent Body 实体父后
                           Mixed             混合

SnapPointTypesEnabled    设置捕捉点类型的可见性
SnapPointTypesOnDefault设置捕捉点类型相关的内容被启用

常规
BlockID控件id
Enable   是否可选/禁用控件
Group    组
Show   是否可见

其它
附着
    Bottom底
    Left    左
    Right   右
    Top   顶

特定于块
AutomaticProgression   选择后焦点是否自动跳到下一个控件
BalloonTooltipImage      动态提示图片(鼠标移动到控件是显示图片)
BalloonTooltipLayout   动态提示布局
BalloonTooltipText       动态提示文本内容
Bitmap                   指定图片
BlendVirtualCurveOverlay 是否显示虚拟交线
CreateInterpartLink      是否显示部件间连接图标在选择条上
Cue                      提示

InterpartSelection       部件间选择设置
                           Simple                                           简单
                           Non-associative Interpart Copy Only            只复制部件间非关联
                           Associative and Non-associative Interpart Copy   复制部件间关联和非关联
                           Associative Interpart Copy                     复制部件间关联

LabelString            标签标题
MaximumScops             设置选择范围
                           Entire Assembly               所有组件/装配
                           Within Work Part Only         只是工作部件
                           Within Work Part and Components 工作部件和组件/装配)

SelectMode                设置单选/多选
                           Single   单选
                           Multiple 多选

StepStatus               设置确定和应用按钮什么时候高亮 (Required 必需的时候)(Optional 可选的时候)(Satisfied 满意/满足的时候)
Tooltip                  动态提示文本标题(Bitmap指定图片时,鼠标移动到图片时提示文字)

————————————————————————————————————————————
————————————————————————————————————————————
咧子:获得selection0控件选择的对象
      UF_initialize();
      std::vector<TaggedObject*>objects=this->selection0->GetProperties()->GetTaggedObjectVector("SelectedObjects");
      for ( int i=0;i<objects.size();i++) // size 列表长度,这里指的是 对象个数
      {      
         UF_OBJ_set_color(objects->Tag(),1);
      }
      UF_terminate();

————————————————————————————————————————————
咧子:对象加入到selection0选择控件的对象列表

      tag_t obj=NULL_TAG;
      double point={0,0,10};
      double XYZ={60,50,80};
      char C="";
      char K="";
      char G="";
      sprintf(C, "%f",XYZ);
      sprintf(K, "%f",XYZ);
      sprintf(G, "%f",XYZ);
      char * edge_len={C,K,G};
      UF_MODL_create_block1(UF_NULLSIGN,point,edge_len,&obj); //创建方
      UF_MODL_ask_feat_body (obj,&obj); //从特征中取出实体

      Body *body1(dynamic_cast<Body *>(NXObjectManager::Get(obj))); //tag转换给nxopen
      std::vector<TaggedObject*>objects;
      objects.push_back(body1); //对象加入到selection0选择控件的对象列表
      selection0->GetProperties()->SetTaggedObjectVector("SelectedObjects",objects);
————————————————————————————————————————————

//清除对象
std::vector<TaggedObject*>objects;
objects.empty();
selection0->GetProperties()->SetTaggedObjectVector("SelectedObjects",objects);

————————————————————————————————————————————
咧子:只选择面
      initialize_cb() 初始化里加代码 或 dialogShown_cb()显示对话框里加代码 可进行对象选择过滤

        selection0->GetProperties()->SetEnum("SelectMode",1);//多选模式

        //对象选择过滤 只能选表面
        selection0->GetProperties()->SetString("LabelString","选择表面");
        std::vector< NXOpen::Selection::MaskTriple > maskTriple;
        Selection::MaskTriple mask1(UF_face_type,0,0);
        maskTriple.push_back(mask1);
        selection0->GetProperties()->SetSelectionFilter("SelectionFilter", Selection::SelectionAction::SelectionActionEnableSpecific ,maskTriple);


咧子:只选择面 【UG本身过滤器跟着变】
      initialize_cb() 初始化里加代码 或 dialogShown_cb()显示对话框里加代码 可进行对象选择过滤   

        selection0->GetProperties()->SetEnum("SelectMode",1);//多选模式

        std::vector< NXOpen::Selection::MaskTriple > maskTriple;
        Selection::MaskTriple mask1(UF_face_type,0,0);
        maskTriple.push_back(mask1);
        NXOpen::BlockStyler::PropertyList *selComponentProps = selection0->GetProperties();
      selComponentProps->SetSelectionFilter("SelectionFilter",Selection::SelectionActionClearAndEnableSpecific,maskTriple);
        delete selComponentProps;
        selComponentProps = NULL;

15757753770 发表于 2016-12-12 12:24:54

列子

————————————————————————————————————————————
————————————————————————————————————————————
咧子:只选择 实体边缘 直线和圆弧

initialize_cb() 初始化里加代码 可进行对象选择过滤

        selection0->GetProperties()->SetEnum("SelectMode",1);//多选模式
                        selection0->GetProperties()->SetString("LabelString","选择边缘");//只选择 实体边缘 直线和圆弧
                        std::vector< NXOpen::Selection::MaskTriple > maskTriple;
                        Selection::MaskTriple mask1(UF_solid_type,UF_solid_edge_subtype,2);
                        Selection::MaskTriple mask2(UF_solid_type,UF_solid_edge_subtype,3);
                        maskTriple.push_back(mask1);
                        maskTriple.push_back(mask2);
                        selection0->GetProperties()->SetSelectionFilter("SelectionFilter", Selection::SelectionAction::SelectionActionEnableSpecific ,maskTriple);

//过滤无效的边缘
int ML_NX001::filter_cb(NXOpen::BlockStyler::UIBlock* block, NXOpen::TaggedObject* selectObject)
{       
    tag_t obj=NULL_TAG;
    UF_MODL_ask_edge_body(selectObject->Tag(),&obj);
    if (obj==NULL_TAG) return(UF_UI_SEL_REJECT); //不加入到对象预览列表
    return(UF_UI_SEL_ACCEPT);                  //加入到对象预览列表
}
————————————————————————————————————————————
————————————————————————————————————————————
咧子:通过枚举控件选项来 时实分别过滤 边缘、表面、实体

   int enumValue = this->enum01->GetProperties()->GetEnum("Value");
                  if (enumValue==0)
                  {
                          selection0->GetProperties()->SetString("LabelString","选择边缘");
                          std::vector< NXOpen::Selection::MaskTriple > maskTriple;
                          Selection::MaskTriple mask1(UF_solid_type,UF_solid_edge_subtype,2);
                          Selection::MaskTriple mask2(UF_solid_type,UF_solid_edge_subtype,3);
                          maskTriple.push_back(mask1);
                          maskTriple.push_back(mask2);
                          selection0->GetProperties()->SetSelectionFilter("SelectionFilter", Selection::SelectionAction::SelectionActionEnableSpecific ,maskTriple);
                  }
                  if (enumValue==1)
                  {
                          selection0->GetProperties()->SetString("LabelString","选择表面");
                          std::vector< NXOpen::Selection::MaskTriple > maskTriple;
                          Selection::MaskTriple mask1(UF_face_type,0,0);
                          maskTriple.push_back(mask1);
                          selection0->GetProperties()->SetSelectionFilter("SelectionFilter", Selection::SelectionAction::SelectionActionEnableSpecific ,maskTriple);
                  }
                  if (enumValue==2)
                  {
                          selection0->GetProperties()->SetString("LabelString","选择实体");
                          std::vector< NXOpen::Selection::MaskTriple > maskTriple;
                          Selection::MaskTriple mask1(UF_solid_type,0,0);
                          maskTriple.push_back(mask1);
                          selection0->GetProperties()->SetSelectionFilter("SelectionFilter", Selection::SelectionAction::SelectionActionEnableSpecific ,maskTriple);
                  }


//------------------------------------------------------------------------------
//Callback Name: filter_cb 过滤不符合对象
//------------------------------------------------------------------------------
int ML_NX001::filter_cb(NXOpen::BlockStyler::UIBlock* block, NXOpen::TaggedObject* selectObject)
{
      
        int enumValue = this->enum01->GetProperties()->GetEnum("Value");
        if (enumValue ==0)
        {
               tag_t obj=NULL_TAG;
               int err=UF_MODL_ask_edge_body(selectObject->Tag(),&obj);
               if (err!=0 && obj==NULL_TAG)
             return(UF_UI_SEL_REJECT); //不加入到对象预览列表
        }
        else if (enumValue ==1)
        {
               int type=-1;
               int err=UF_MODL_ask_face_type(selectObject->Tag(),&type);
               if (err!=0 || type==-1)
             return(UF_UI_SEL_REJECT); //不加入到对象预览列表
        }
        else if (enumValue ==2)
        {
               int type=-1;
               int err=UF_MODL_ask_body_type(selectObject->Tag(),&type);
               if (err!=0 || type==-1)
             return(UF_UI_SEL_REJECT); //不加入到对象预览列表
        }

        return(UF_UI_SEL_ACCEPT); //加入到对象预览列表
}
页: [1]
查看完整版本: UG二次开发中,怎么选取特定的面