admin 发表于 2017-10-25 16:33:48

关于NX二次开发中选择对象mask triple的详细讲解

关于NX二次开发中选择对象mask triple的详细讲解
很多人对这个可能不是太了解,在NX中选择对象,是通过这个进行过滤的 mask triple,你可以翻译成掩码三元组。
如果您需要更多地控制要选择的对象类型,可以在Selection对象上使用其他SelectTaggedObject重载方法。 这些方法使用掩码三元组来特定要选择的对象的类型。 Mask三元组是一个名为MaskTriple的结构中的三个整数。 该结构的部分是称为Type,Subtype和SolidBodySubtype的整数。 NXOpen.UF.UFConstants类包含NX Open中使用的标记整数常量,其中一些常量是掩码的部分。 通常,您设置类型Type以选择特定类型的对象,而Subtype则选择具有特定属性的该类型的对象。 掩码三元组中的类型和子类型通常对应于对象的类型和子类型。 除了实体几何类型和其他特殊对象类型之外,SolidBodySubtype通常为0,它代表另一个细节子类型。
一些常见的类型和子类型如下:

如果要选择特定类型的所有对象,可以使用特殊值UF_all_subtype作为掩码三重的子类型。
实体或片体(体,面和边)的元素的三元组使用UF_solid_type类型,子类型为0,并使用SolidBodyType来指定几何类型。 下表列出了体或片体上不同类型几何体的一些SolidBodySubtype值。




选择不外乎通过SelectTaggedObject(单选) SelectTaggedObjects(多选)或者block styler的选择类型进行选择。所有的内容里面都有相关类型的限定功能。





对于block UI的选取,只要通过控件的block ID 直接设置 SetSelectionFilter 或者通过AddFilter 方法实现,注意这里面的mask triples 或者type subtype solidbodytype都是我们前面提到的,直接赋值即可。


SetSelectionFilter (NXOpen::Selection::SelectionAction maskAction, const std::vector< NXOpen::Selection::MaskTriple > &maskTriples);


AddFilter (NXOpen::BlockStyler::SelectObject::FilterType filterTypes);


AddFilter (int type, int subType, int solidBodyType);


对于单选和多选大部分都是通过SelectTaggedObject和SelectTaggedObjects的函数重载实现,方法基本都差不多,代码参考如下:



//------------------------------------------------------------------------------
// Selection with mask
//------------------------------------------------------------------------------
TaggedObject* MyClass::select_by_mask()
{
      NXString message("Select an object by mask:");
      NXString title("Select object");
      Selection::SelectionScope scope = Selection::SelectionScopeUseDefault;
      Selection::SelectionAction action = Selection::SelectionActionClearAndEnableSpecific;
      bool include_features = 0;
      bool keep_highlighted = 0;


      // Define the mask triple(s), see also uf_object_types.h.
      // Uncomment or combine the desired mask triples
      std::vector<Selection::MaskTriple> maskArray(1);
      maskArray = Selection::MaskTriple( UF_solid_type, UF_solid_body_subtype, 0 ); // Bodies
      /*
      maskArray = Selection::MaskTriple( UF_solid_type, UF_all_subtype, UF_UI_SEL_FEATURE_ANY_FACE); // Faces
      maskArray = Selection::MaskTriple( UF_solid_type, UF_all_subtype, UF_UI_SEL_FEATURE_ANY_EDGE); // Edges
      maskArray = Selection::MaskTriple( UF_component_type, 0, 0 ); // Components
      maskArray = Selection::MaskTriple( UF_line_type, 0, 0 ); // Lines
      maskArray = Selection::MaskTriple( UF_drafting_entity_type, 0, 0 ); // Drafting objects
      */
      Point3d cursor;
      TaggedObject *object;


      // Select objects using filter defined by maskArray triples
      Selection::Response res = selmgr->SelectTaggedObject(
                        message, title, scope, action, include_features,
            keep_highlighted, maskArray, &object, &cursor );


      if( res == Selection::ResponseObjectSelected )
      {
                return object;
      }
      return 0;
}


//------------------------------------------------------------------------------
// Selection with type array
//------------------------------------------------------------------------------
TaggedObject* MyClass::select_by_type()
{
      NXString message("Select an object by type:");
      NXString title("Select object");
      Selection::SelectionScope scope = Selection::SelectionScopeUseDefault;
      bool keep_highlighted = 0;


      // Define type array, see Selection::SelectionType Enumeration
      // Uncomment or combine the desired types
      std::vector<Selection::SelectionType> typeArray(1);
      typeArray = Selection::SelectionTypeAll;
      /*
      typeArray = Selection::SelectionTypeFeatures;
      typeArray = Selection::SelectionTypeCurves;
      typeArray = Selection::SelectionTypeFaces;
      typeArray = Selection::SelectionTypeEdges;
      typeArray = Selection::SelectionTypeCurvesAndEdges;
      */
      Point3d cursor;
      TaggedObject *object;


      // Select objects using filter defined by type array
      Selection::Response res = selmgr->SelectTaggedObject(
                        message, title, scope, keep_highlighted,
                        typeArray, &object, &cursor );


      if( res == Selection::ResponseObjectSelected )
      {
                return object;
      }
      return 0;
}


//------------------------------------------------------------------------------
// Selection any objects
//------------------------------------------------------------------------------
std::vector< NXOpen::TaggedObject * > MyClass::select_any_objects()
{
      NXString message("Select any objects:");
      NXString title("Select objects");
      Selection::SelectionScope scope = Selection::SelectionScopeUseDefault;
      bool include_features = 0;      
      bool keep_highlighted = 0;
      std::vector< NXOpen::TaggedObject * > objectArray;


      // Select any object array
      Selection::Response res = selmgr->SelectTaggedObjects(
                        message, title, scope, include_features,
                        keep_highlighted, objectArray );


      return objectArray;
}







页: [1]
查看完整版本: 关于NX二次开发中选择对象mask triple的详细讲解