NX二次开发-NXOpenC++属性操作

版本NX9+VS2012

  NX对象属性(Attribute)是NX中的一个重要概念,是用户附加到NX对象上的字符串、

整形数值、实型数字的字段,用于对NX对象的解析或说明,广泛应用于实际的设计制造过程中。

NXOpen API通过基类NXObject来实现所有NX对象的Attribute操作。NXAttribute按照属性值类型

可以分为Integer,Real,String,Null,Time,Regerence六类,对应的NXOpen API枚举变量定义为。

通过NXObject对象,开发人员可以实现以下Attribute相关操作。

-设置NX对象属性

-遍历NX对象上某个类型的所有属性

-删除NX对象上某个类型名字的属性

-删除NX对象上某个类型的所有属性

-通过指定属性名称获得NX对象上的属性值

  • 设置属性值

NXObject类通过成员函数重载的方式实现对NX对象属性的设置,这些成员函数的定义方式如下:

NX9+VS2012

#include <uf_defs.h>
#include <NXOpen/NXException.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/AttributeManager.hxx>
#include <NXOpen/AttributePropertiesBaseBuilder.hxx>
#include <NXOpen/AttributePropertiesBuilder.hxx>
#include <NXOpen/BasePart.hxx>
#include <NXOpen/Builder.hxx>
#include <NXOpen/DateBuilder.hxx>
#include <NXOpen/DateItemBuilder.hxx>
#include <NXOpen/DateItemBuilderList.hxx>
#include <NXOpen/Expression.hxx>
#include <NXOpen/MassPropertiesBuilder.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/PreviewPropertiesBuilder.hxx>
#include <NXOpen/PropertiesManager.hxx>
#include <NXOpen/SelectNXObjectList.hxx>
#include <NXOpen/SelectObjectList.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Update.hxx>
#include <NXOpen/ExpressionCollection.hxx>
#include <NXOpen/Features_BlockFeatureBuilder.hxx>
#include <NXOpen/Features_Feature.hxx>
#include <NXOpen/Features_FeatureBuilder.hxx>
#include <NXOpen/Features_FeatureCollection.hxx>
#include <NXOpen/GeometricUtilities_BooleanOperation.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Point.hxx>
#include <NXOpen/PointCollection.hxx>
#include <NXOpen/Preferences_PartModeling.hxx>
#include <NXOpen/Preferences_PartPreferences.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Unit.hxx>
#include <NXOpen/UnitCollection.hxx>


using namespace NXOpen;

extern "C" DllExport int ufusr_ask_unload()
{
    return (int)Session::LibraryUnloadOptionImmediately;
}

extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen)
{
    Session *theSession = Session::GetSession();
    Part *workPart(theSession->Parts()->Work());
    Part *displayPart(theSession->Parts()->Display());
    
    //创建块
    Features::Feature *nullFeatures_Feature(NULL);
    Features::BlockFeatureBuilder *blockFeatureBuilder1;
    blockFeatureBuilder1 = workPart->Features()->CreateBlockFeatureBuilder(nullFeatures_Feature);
    blockFeatureBuilder1->SetType(Features::BlockFeatureBuilder::TypesOriginAndEdgeLengths);
    Point3d originPoint1(0.0, 0.0, 0.0);
    blockFeatureBuilder1->SetOriginAndLengths(originPoint1, "100", "100", "100");
    Features::Feature *feature1;
    feature1 = blockFeatureBuilder1->CommitFeature();
    blockFeatureBuilder1->Destroy();

    //创建或编辑一个Null属性
    feature1->SetAttribute("AAA");
    feature1->SetAttribute("BBB", Update::OptionLater);

    //创建或编辑一个String属性
    feature1->SetAttribute("标题C", "值C");
    feature1->SetAttribute("标题D", "值D", Update::OptionLater);

    //创建或编辑一个Real属性
    feature1->SetAttribute("标题E", 1.55);
    feature1->SetAttribute("标题F", 2.66, Update::OptionLater);

    //创建或编辑一个Integer属性
    feature1->SetAttribute("标题G", 4);
    feature1->SetAttribute("标题H", 5, Update::OptionLater);

    //创建或编辑一个Reference属性
    feature1->SetReferenceAttribute("标题I", "值I");
    feature1->SetReferenceAttribute("标题J", "值J", Update::OptionLater);

    //创建或编辑一个Time属性
    feature1->SetTimeAttribute("标题K", "14-Jun-2021 00:00:00");
    feature1->SetTimeAttribute("标题L", "15-Jun-2021 10:00:00", Update::OptionLater);

    //后退标记
    Session::UndoMarkId myUndoMark;
    myUndoMark = theSession->SetUndoMark(Session::MarkVisibilityVisible, NULL);

    //调用Update对象的DoUpdate方法来一次性更新所有的Attribute设置
    theSession->UpdateManager()->DoUpdate(myUndoMark);
    
}

阿飞
2021年6月14日

在这些函数中,NXString类型的title输入参数是NX对象属性的属性名称;

NXOpen::Update::Option是一个枚举类型的参数,定义如下:

 当开发人员需要设置一系列的Attribute时,建议使用包含该输入参数的重载函数,并

设置更新选项为NXOpen::Update::OptionLater,最后显示调用Update对象的DoUpdate方法

来一次性更新所有的Attribute设置。

  •  遍历对象属性

NXOpen API提供了遍历NX对象上某个类型的所有属性的方法

NX9+VS2012

#include <uf_defs.h>
#include <NXOpen/NXException.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/AttributeManager.hxx>
#include <NXOpen/AttributePropertiesBaseBuilder.hxx>
#include <NXOpen/AttributePropertiesBuilder.hxx>
#include <NXOpen/BasePart.hxx>
#include <NXOpen/Builder.hxx>
#include <NXOpen/DateBuilder.hxx>
#include <NXOpen/DateItemBuilder.hxx>
#include <NXOpen/DateItemBuilderList.hxx>
#include <NXOpen/Expression.hxx>
#include <NXOpen/MassPropertiesBuilder.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/PreviewPropertiesBuilder.hxx>
#include <NXOpen/PropertiesManager.hxx>
#include <NXOpen/SelectNXObjectList.hxx>
#include <NXOpen/SelectObjectList.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Update.hxx>
#include <NXOpen/ExpressionCollection.hxx>
#include <NXOpen/Features_BlockFeatureBuilder.hxx>
#include <NXOpen/Features_Feature.hxx>
#include <NXOpen/Features_FeatureBuilder.hxx>
#include <NXOpen/Features_FeatureCollection.hxx>
#include <NXOpen/GeometricUtilities_BooleanOperation.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Point.hxx>
#include <NXOpen/PointCollection.hxx>
#include <NXOpen/Preferences_PartModeling.hxx>
#include <NXOpen/Preferences_PartPreferences.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Unit.hxx>
#include <NXOpen/UnitCollection.hxx>
#include <NXOpen/ListingWindow.hxx>


using namespace NXOpen;

extern "C" DllExport int ufusr_ask_unload()
{
    return (int)Session::LibraryUnloadOptionImmediately;
}

extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen)
{
    Session *theSession = Session::GetSession();
    Part *workPart(theSession->Parts()->Work());
    Part *displayPart(theSession->Parts()->Display());
    
    //创建块
    Features::Feature *nullFeatures_Feature(NULL);
    Features::BlockFeatureBuilder *blockFeatureBuilder1;
    blockFeatureBuilder1 = workPart->Features()->CreateBlockFeatureBuilder(nullFeatures_Feature);
    blockFeatureBuilder1->SetType(Features::BlockFeatureBuilder::TypesOriginAndEdgeLengths);
    Point3d originPoint1(0.0, 0.0, 0.0);
    blockFeatureBuilder1->SetOriginAndLengths(originPoint1, "100", "100", "100");
    Features::Feature *feature1;
    feature1 = blockFeatureBuilder1->CommitFeature();
    blockFeatureBuilder1->Destroy();

    //创建或编辑一个Null属性
    feature1->SetAttribute("AAA");
    feature1->SetAttribute("BBB", Update::OptionLater);

    //创建或编辑一个String属性
    feature1->SetAttribute("标题C", "值C");
    feature1->SetAttribute("标题D", "值D", Update::OptionLater);

    //创建或编辑一个Real属性
    feature1->SetAttribute("标题E", 1.55);
    feature1->SetAttribute("标题F", 2.66, Update::OptionLater);

    //创建或编辑一个Integer属性
    feature1->SetAttribute("标题G", 4);
    feature1->SetAttribute("标题H", 5, Update::OptionLater);

    //创建或编辑一个Reference属性
    feature1->SetReferenceAttribute("标题I", "值I");
    feature1->SetReferenceAttribute("标题J", "值J", Update::OptionLater);

    //创建或编辑一个Time属性
    feature1->SetTimeAttribute("标题K", "14-Jun-2021 00:00:00");
    feature1->SetTimeAttribute("标题L", "15-Jun-2021 10:00:00", Update::OptionLater);

    //后退标记
    Session::UndoMarkId myUndoMark;
    myUndoMark = theSession->SetUndoMark(Session::MarkVisibilityVisible, NULL);

    //调用Update对象的DoUpdate方法来一次性更新所有的Attribute设置
    theSession->UpdateManager()->DoUpdate(myUndoMark);
    
    //遍历NX对象上某个类型的所有属性的方法
    theSession->ListingWindow()->Open();
    std::vector<NXObject::AttributeInformation> attr1 = feature1->GetAttributeTitlesByType(NXObject::AttributeTypeString);
    //遍历返回的NXObject::AttributeInformation结构体对象容器获得所有该类型属性的属性名称
    for (int i = 0; i < attr1.size(); i++)
    {
        NXObject::AttributeType type1 = attr1[i].Type;//类型
        NXString title1 = attr1[i].Title;//名称
        //打印内容
        theSession->ListingWindow()->WriteLine(title1.GetLocaleText());
    }


}

阿飞
2021年6月14日

  • 删除对象属性

NXOpen API提供了两种删除对象属性的方法,通过指定对象属性类型和属性名称删除

一个属性,通过指定对象属性类型删除所有该类型的属性,其定义方式如下:

NX9+VS2012

// NX 9.0.3.4
// Journal created by Administrator on Mon Jun 14 14:14:23 2021 新西伯利亚标准时间
//
#include <uf_defs.h>
#include <NXOpen/NXException.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/AttributeManager.hxx>
#include <NXOpen/AttributePropertiesBaseBuilder.hxx>
#include <NXOpen/AttributePropertiesBuilder.hxx>
#include <NXOpen/BasePart.hxx>
#include <NXOpen/Builder.hxx>
#include <NXOpen/DateBuilder.hxx>
#include <NXOpen/DateItemBuilder.hxx>
#include <NXOpen/DateItemBuilderList.hxx>
#include <NXOpen/Expression.hxx>
#include <NXOpen/MassPropertiesBuilder.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/PreviewPropertiesBuilder.hxx>
#include <NXOpen/PropertiesManager.hxx>
#include <NXOpen/SelectNXObjectList.hxx>
#include <NXOpen/SelectObjectList.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Update.hxx>
#include <NXOpen/ExpressionCollection.hxx>
#include <NXOpen/Features_BlockFeatureBuilder.hxx>
#include <NXOpen/Features_Feature.hxx>
#include <NXOpen/Features_FeatureBuilder.hxx>
#include <NXOpen/Features_FeatureCollection.hxx>
#include <NXOpen/GeometricUtilities_BooleanOperation.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Point.hxx>
#include <NXOpen/PointCollection.hxx>
#include <NXOpen/Preferences_PartModeling.hxx>
#include <NXOpen/Preferences_PartPreferences.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Unit.hxx>
#include <NXOpen/UnitCollection.hxx>
#include <NXOpen/ListingWindow.hxx>


using namespace NXOpen;

extern "C" DllExport int ufusr_ask_unload()
{
    return (int)Session::LibraryUnloadOptionImmediately;
}

extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen)
{
    Session *theSession = Session::GetSession();
    Part *workPart(theSession->Parts()->Work());
    Part *displayPart(theSession->Parts()->Display());
    
    //创建块
    Features::Feature *nullFeatures_Feature(NULL);
    Features::BlockFeatureBuilder *blockFeatureBuilder1;
    blockFeatureBuilder1 = workPart->Features()->CreateBlockFeatureBuilder(nullFeatures_Feature);
    blockFeatureBuilder1->SetType(Features::BlockFeatureBuilder::TypesOriginAndEdgeLengths);
    Point3d originPoint1(0.0, 0.0, 0.0);
    blockFeatureBuilder1->SetOriginAndLengths(originPoint1, "100", "100", "100");
    Features::Feature *feature1;
    feature1 = blockFeatureBuilder1->CommitFeature();
    blockFeatureBuilder1->Destroy();

    //创建或编辑一个Null属性
    feature1->SetAttribute("AAA");
    feature1->SetAttribute("BBB", Update::OptionLater);//延迟更新

    //创建或编辑一个String属性
    feature1->SetAttribute("标题C", "值C");
    feature1->SetAttribute("标题D", "值D", Update::OptionLater);

    //创建或编辑一个Real属性
    feature1->SetAttribute("标题E", 1.55);
    feature1->SetAttribute("标题F", 2.66, Update::OptionLater);

    //创建或编辑一个Integer属性
    feature1->SetAttribute("标题G", 4);
    feature1->SetAttribute("标题H", 5, Update::OptionLater);

    //创建或编辑一个Reference属性
    feature1->SetReferenceAttribute("标题I", "值I");
    feature1->SetReferenceAttribute("标题J", "值J", Update::OptionLater);

    //创建或编辑一个Time属性
    feature1->SetTimeAttribute("标题K", "14-Jun-2021 00:00:00");
    feature1->SetTimeAttribute("标题L", "15-Jun-2021 10:00:00", Update::OptionLater);

    //后退标记
    Session::UndoMarkId myUndoMark;
    myUndoMark = theSession->SetUndoMark(Session::MarkVisibilityVisible, NULL);

    //调用Update对象的DoUpdate方法来一次性更新所有的Attribute设置
    theSession->UpdateManager()->DoUpdate(myUndoMark);

    //通过指定属性类型和属性名称删除NX对象属性
    feature1->DeleteAttributeByTypeAndTitle(NXObject::AttributeTypeString, "标题C");
    feature1->DeleteAttributeByTypeAndTitle(NXObject::AttributeTypeTime, "标题K", Update::OptionNow);//立即更新

    //通过指定属性类型删除NX对象上所有该类型属性
    feature1->DeleteAllAttributesByType(NXObject::AttributeTypeInteger);
    feature1->DeleteAllAttributesByType(NXObject::AttributeTypeReal, Update::OptionNow);

}

阿飞
2021年6月14日

  • 获得属性对象值

NXOpen API为每种不同的对象属性类型提供了不同的对象属性值查询函数,开发人员根据

NX对象属性的类型,通过属性名称调用NXObject对象中不同的成员函数获得属性值,

这些函数的定义方式如下:

NX9+VS2012

#include <uf_defs.h>
#include <NXOpen/NXException.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/AttributeManager.hxx>
#include <NXOpen/AttributePropertiesBaseBuilder.hxx>
#include <NXOpen/AttributePropertiesBuilder.hxx>
#include <NXOpen/BasePart.hxx>
#include <NXOpen/Builder.hxx>
#include <NXOpen/DateBuilder.hxx>
#include <NXOpen/DateItemBuilder.hxx>
#include <NXOpen/DateItemBuilderList.hxx>
#include <NXOpen/Expression.hxx>
#include <NXOpen/MassPropertiesBuilder.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/PreviewPropertiesBuilder.hxx>
#include <NXOpen/PropertiesManager.hxx>
#include <NXOpen/SelectNXObjectList.hxx>
#include <NXOpen/SelectObjectList.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Update.hxx>
#include <NXOpen/ExpressionCollection.hxx>
#include <NXOpen/Features_BlockFeatureBuilder.hxx>
#include <NXOpen/Features_Feature.hxx>
#include <NXOpen/Features_FeatureBuilder.hxx>
#include <NXOpen/Features_FeatureCollection.hxx>
#include <NXOpen/GeometricUtilities_BooleanOperation.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Point.hxx>
#include <NXOpen/PointCollection.hxx>
#include <NXOpen/Preferences_PartModeling.hxx>
#include <NXOpen/Preferences_PartPreferences.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Unit.hxx>
#include <NXOpen/UnitCollection.hxx>
#include <NXOpen/ListingWindow.hxx>


using namespace NXOpen;

extern "C" DllExport int ufusr_ask_unload()
{
    return (int)Session::LibraryUnloadOptionImmediately;
}

extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen)
{
    Session *theSession = Session::GetSession();
    Part *workPart(theSession->Parts()->Work());
    Part *displayPart(theSession->Parts()->Display());
    
    //创建块
    Features::Feature *nullFeatures_Feature(NULL);
    Features::BlockFeatureBuilder *blockFeatureBuilder1;
    blockFeatureBuilder1 = workPart->Features()->CreateBlockFeatureBuilder(nullFeatures_Feature);
    blockFeatureBuilder1->SetType(Features::BlockFeatureBuilder::TypesOriginAndEdgeLengths);
    Point3d originPoint1(0.0, 0.0, 0.0);
    blockFeatureBuilder1->SetOriginAndLengths(originPoint1, "100", "100", "100");
    Features::Feature *feature1;
    feature1 = blockFeatureBuilder1->CommitFeature();
    blockFeatureBuilder1->Destroy();

    //创建或编辑一个Null属性
    feature1->SetAttribute("AAA");
    feature1->SetAttribute("BBB", Update::OptionLater);//延迟更新

    //创建或编辑一个String属性
    feature1->SetAttribute("标题C", "值C");
    feature1->SetAttribute("标题D", "值D", Update::OptionLater);

    //创建或编辑一个Real属性
    feature1->SetAttribute("标题E", 1.55);
    feature1->SetAttribute("标题F", 2.66, Update::OptionLater);

    //创建或编辑一个Integer属性
    feature1->SetAttribute("标题G", 4);
    feature1->SetAttribute("标题H", 5, Update::OptionLater);

    //创建或编辑一个Reference属性
    feature1->SetReferenceAttribute("标题I", "值I");
    feature1->SetReferenceAttribute("标题J", "值J", Update::OptionLater);

    //创建或编辑一个Time属性
    feature1->SetTimeAttribute("标题K", "14-Jun-2021 00:00:00");
    feature1->SetTimeAttribute("标题L", "15-Jun-2021 10:00:00", Update::OptionLater);

    //后退标记
    Session::UndoMarkId myUndoMark;
    myUndoMark = theSession->SetUndoMark(Session::MarkVisibilityVisible, NULL);

    //调用Update对象的DoUpdate方法来一次性更新所有的Attribute设置
    theSession->UpdateManager()->DoUpdate(myUndoMark);

    //根据属性名称获得Integer属性值
    int intatte1 = feature1->GetIntegerAttribute("标题G");
    
    //根据属性名称获得Real属性值
    double realattr1 = feature1->GetRealAttribute("标题E");

    //根据属性名称获得String属性值
    NXString stringattr1 = feature1->GetStringAttribute("标题I");

    //根据属性名称和Time格式获得Time属性值
    //DateAndTimeFormatNumeric/** 2004/04/28 22:06:15  */,
    //DateAndTimeFormatTextual/** 28-Apr-2004 22:06:15 */
    NXString timeattr1 = feature1->GetTimeAttribute(NXObject::DateAndTimeFormatTextual, "标题K");

    //根据属性名称获得Reference
    NXString refattr1 = feature1->GetReferenceAttribute("标题I");

    theSession->ListingWindow()->Open();
    char msg[256];
    sprintf(msg, "标题G:%d
标题E:%f
标题I:%s
标题K:%s
标题I:%s", intatte1, realattr1, stringattr1.GetLocaleText(), timeattr1.GetLocaleText(), refattr1.GetLocaleText());
    theSession->ListingWindow()->WriteLine(msg);

}

阿飞
2021年6月14日

阿飞

2021年6月14日

作者: 阿飞

出处: https://www.cnblogs.com/nxopen2018/>

关于作者:专注NX开发、VC++开发、数据库、三维建模领域,请多多赐教!

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可留言(博客文章底部留言)咨询.

原文地址:https://www.cnblogs.com/nxopen2018/p/14882567.html