NX二次開發-使用NXOPEN C++嚮導模板做二次開發

阿飛2018發表於2021-09-02

版本

NX9+VS2012

 

1.怎麼往VS軟體裡新增VC,C#,VB嚮導模板

先到NX安裝目錄下UGOPEN資料夾裡找到這三個資料夾

 拷貝到VS的安裝目錄下

 這裡有幾個注意事項,VS2017,VS2019以下的版本這樣操作沒問題,

VS2017和VS2019微軟調整了VC資料夾的目錄,換位置了,所以你加過去發現開啟VS裡面沒有C++的嚮導模板。

去你的VS2017或者VS2019安裝目錄下找到\Common7\IDE資料夾目錄,把VC嚮導模板放進去。

下面我們新建專案,使用NX嚮導模板

兩個嚮導模板使用哪個都可以的,

嚮導模板是為我們提供的一個現成的NX二次開發模板框架,有C++模板,C模板,C#模板,VB模板,開發環境都是自動配置好的,可直接呼叫UFUN和NXOPEN,省去了我們自己配置開發環境的時間,

我還發現從NX1980開始,UGOPEN目錄裡還加入了開發嚮導的差勁,不需要手動在考檔案了,直接雙擊外掛,就可直接安裝開發嚮導。

外掛就是和這種VS外掛外掛一樣

 放一張我之前安裝NX1980的時候截的圖,現在已經解除安裝掉了。

 

一組新舊對比圖片

 

 

 在放一張西門子官網的介紹說明

有點類似微軟基礎類庫MFC,除了是一個C++類庫外,還提供一個應用程式框架。給開發者使用。

 

這裡有幾個要注意的事項,在NX8.5和NX9中,不安裝大補丁小布丁,預設應該是沒有NXOPENCPP嚮導模板的,

一定要安裝補丁才會有NXOPENCPP的嚮導模板,NX8.5以下的版本,我就不知道有沒有NXOPENCPP模板了,沒用過。

不過沒用的話,自己手動也能改個出來的,嚮導模板裡的內容也可以自己更改。https://www.cnblogs.com/nxopen2018/p/15221264.html

 

回到正題,我們選擇嚮導模板,進入專案

先選NXOPENCPP專案模板,這是一個用C++類物件導向方式的一個模板

 

 預設下一步

 

 編譯成功,這就是一個C++的模板框架

//NX9_NXOpenCPP_Wizard7

// Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h>

// Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx>

// Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx>

// Std C++ Includes
#include <iostream>
#include <sstream>

using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr;


//------------------------------------------------------------------------------
// NXOpen c++ test class 
//------------------------------------------------------------------------------
class MyClass
{
    // class members
public:
    static Session *theSession;
    static UI *theUI;

    MyClass();
    ~MyClass();

    void do_it();
    void print(const NXString &);
    void print(const string &);
    void print(const char*);

private:
    Part *workPart, *displayPart;
    NXMessageBox *mb;
    ListingWindow *lw;
    LogFile *lf;
};

//------------------------------------------------------------------------------
// Initialize static variables
//------------------------------------------------------------------------------
Session *(MyClass::theSession) = NULL;
UI *(MyClass::theUI) = NULL;

//------------------------------------------------------------------------------
// Constructor 
//------------------------------------------------------------------------------
MyClass::MyClass()
{

    // Initialize the NX Open C++ API environment
    MyClass::theSession = NXOpen::Session::GetSession();
    MyClass::theUI = UI::GetUI();
    mb = theUI->NXMessageBox();
    lw = theSession->ListingWindow();
    lf = theSession->LogFile();

    workPart = theSession->Parts()->Work();
    displayPart = theSession->Parts()->Display();
    
}

//------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
MyClass::~MyClass()
{
}

//------------------------------------------------------------------------------
// Print string to listing window or stdout
//------------------------------------------------------------------------------
void MyClass::print(const NXString &msg)
{
    if(! lw->IsOpen() ) lw->Open();
    lw->WriteLine(msg);
}
void MyClass::print(const string &msg)
{
    if(! lw->IsOpen() ) lw->Open();
    lw->WriteLine(msg);
}
void MyClass::print(const char * msg)
{
    if(! lw->IsOpen() ) lw->Open();
    lw->WriteLine(msg);
}




//------------------------------------------------------------------------------
// Do something
//------------------------------------------------------------------------------
void MyClass::do_it()
{

    // TODO: add your code here
    
}

//------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
//  Explicit Execution
extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
    try
    {
        // Create NXOpen C++ class instance
        MyClass *theMyClass;
        theMyClass = new MyClass();
        theMyClass->do_it();
        delete theMyClass;
    }
    catch (const NXException& e1)
    {
        UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
    }
    catch (const exception& e2)
    {
        UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
    }
    catch (...)
    {
        UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
    }
}


//------------------------------------------------------------------------------
// Unload Handler
//------------------------------------------------------------------------------
extern "C" DllExport int ufusr_ask_unload()
{
    return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
}

自己的程式碼寫到void MyClass::do_it()裡,

演示一下,怎麼加程式碼,怎麼ctrl+u執行。

在來看看OPEN C的嚮導模板。

 

 這裡還是選C++吧,我覺得沒必要選C了,選C沒辦法用NXOPEN C++那些,只能用純C的UFUN。

 

 編譯成功

/*****************************************************************************
**
** NX9_Open_Wizard1.cpp
**
** Description:
**     Contains Unigraphics entry points for the application.
**
*****************************************************************************/

/* Include files */
#include <stdarg.h>
#include <strstream>
#include <iostream>
using std::ostrstream;
using std::endl;    
using std::ends;
using std::cerr;
#include <uf.h>
#include <uf_ui.h>
#include <uf_exit.h>

static void ECHO(char *format, ...)
{
    char msg[1025];
    va_list args;
    va_start(args, format);
    vsnprintf_s(msg, sizeof(msg), 1024, format, args);
    va_end(args);
    UF_UI_open_listing_window();
    UF_UI_write_listing_window(msg);
    UF_print_syslog(msg, FALSE);
}

#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))

static int report_error( char *file, int line, char *call, int irc)
{
    if (irc)
    {
        char err[133];

        UF_get_fail_message(irc, err);
        ECHO("*** ERROR code %d at line %d in %s:\n",
            irc, line, file);
        ECHO("+++ %s\n", err);
        ECHO("%s;\n", call);
    }

    return(irc);
}


/*****************************************************************************
**  Activation Methods
*****************************************************************************/
/*  Explicit Activation
**      This entry point is used to activate the application explicitly, as in
**      "File->Execute UG/Open->User Function..." */
extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
    /* Initialize the API environment */
    if( UF_CALL(UF_initialize()) ) 
    {
        /* Failed to initialize */
        return;
    }
    
    /* TODO: Add your application code here */

    /* Terminate the API environment */
    UF_CALL(UF_terminate());
}

/*****************************************************************************
**  Utilities
*****************************************************************************/

/* Unload Handler
**     This function specifies when to unload your application from Unigraphics.
**     If your application registers a callback (from a MenuScript item or a
**     User Defined Object for example), this function MUST return
**     "UF_UNLOAD_UG_TERMINATE". */
extern int ufusr_ask_unload( void )
{
    return( UF_UNLOAD_IMMEDIATELY );
}

我們來看看模板的程式碼,也是可以用C++語言,但是是基於程式導向的。沒按物件導向去生成模板。

這個程式碼寫到/* TODO: Add your application code here */就行了,我就不演示了。

 

至於附加依賴性,附加庫目錄,預處理,那些就都不用管了,嚮導自動給設定好了。我們只要專注寫程式碼開發就行了。

結尾到最後,無論哪種專案,建議設定字符集為多位元組。

 

 本來還想在寫一下怎麼檢視幫助手冊,找UFUN函式和NXOPEN的,但是一看23.26了,有點晚了。

 該準備睡覺了,要不然一會又該失眠焦慮症了。一晚上睡不著。怎麼檢視幫助那部分內容就放到後面單獨在開一篇

部落格文章。

 

阿飛

2021年9月2日

 

相關文章