zoukankan      html  css  js  c++  java
  • 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++开发、数据库、三维建模领域,请多多赐教!

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

  • 相关阅读:
    HDU5597/BestCoder Round #66 (div.2) GTW likes function 打表欧拉函数
    HDU5596/BestCoder Round #66 (div.2) 二分BIT/贪心
    HDU 5596/BestCoder Round #66 (div.2) GTW likes math 签到
    BZOJ 1877: [SDOI2009]晨跑 费用流
    BZOJ 1452: [JSOI2009]Count 二维树状数组
    BZOJ 1143 1143: [CTSC2008]祭祀river 最长反链
    Codeforces Round #335 (Div. 2) D. Lazy Student 贪心
    Codeforces Round #335 (Div. 2) C. Sorting Railway Cars 连续LIS
    Codeforces Round #335 (Div. 2) A. Magic Spheres 模拟
    UVALive 6187 Never Wait for Weights 带权并查集
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/14882567.html
Copyright © 2011-2022 走看看