亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于M icroStation平臺構(gòu)建國標(biāo)元器件參數(shù)化模型庫

        2018-03-19 06:00:20管華明
        關(guān)鍵詞:元器件視圖螺栓

        管華明

        (安徽省水利水電勘測設(shè)計(jì)院,安徽 合肥 230088)

        目前,不少水利設(shè)計(jì)單位選擇Microstation作為三維協(xié)同設(shè)計(jì)的基礎(chǔ)平臺軟件。在水利工程三維協(xié)同設(shè)計(jì)中,有很多專業(yè)的設(shè)備經(jīng)常用到國標(biāo)常用元器件,如果讓設(shè)計(jì)人員從頭去建模型庫非常麻煩,并且要花費(fèi)相當(dāng)?shù)臅r(shí)間和精力。最新的MicrostationCE基礎(chǔ)平臺具備一些簡單的參數(shù)化設(shè)計(jì)功能,但較難實(shí)現(xiàn)復(fù)雜的模型。

        由于每個(gè)國標(biāo)元器件的參數(shù)都是固定的,可以將常用的國標(biāo)元器件參數(shù)預(yù)先分門別類存儲在數(shù)據(jù)庫的表中,逐步形成專業(yè)覆蓋面廣、標(biāo)準(zhǔn)件齊全的專業(yè)三維參數(shù)化元器件數(shù)據(jù)庫。建模時(shí)設(shè)計(jì)人員只需選擇需要的零件的標(biāo)記規(guī)格,二次開發(fā)的插件即可直接到庫里抽取相應(yīng)的參數(shù)組,自動生成模型,動態(tài)放置于需要的位置。

        1 設(shè)計(jì)

        本文以構(gòu)建 GB/T5780-2016《六角頭螺栓 C級》螺栓零件庫為例,采用輕型的SQLite數(shù)據(jù)庫平臺存儲參數(shù),實(shí)現(xiàn)方案的編程語言采用C++NativeCode。SQLite是關(guān)系型數(shù)據(jù)庫管理系統(tǒng),包含在一個(gè)相對小的C庫中,零配置 (無需安裝和管理配置),占用資源非常的低,沒有額外依賴,處理速度快,支持C++開發(fā)語言。在最新的MicroStation CE提供的SDK中,C++NativeCode的功能最強(qiáng)大,接口都是以C++接口形式提供。設(shè)計(jì)方案由數(shù)據(jù)層、數(shù)據(jù)訪問層、業(yè)務(wù)層三層結(jié)構(gòu)構(gòu)成。

        2 實(shí)現(xiàn)

        2.1 數(shù)據(jù)層實(shí)現(xiàn)

        數(shù)據(jù)層定義數(shù)據(jù)庫結(jié)構(gòu)、創(chuàng)建數(shù)據(jù)庫表并存儲元器件的所有參數(shù)系列。如圖1所示,一個(gè)螺栓的三維模型由螺栓頭、螺栓長度部分以及螺紋修飾面組成,主要參數(shù)有大徑d、小徑d1、s、k、倒圓角半徑r、長度l、螺紋長度b、倒角chamfer。步驟如下:

        圖1 螺栓參數(shù)示意圖

        (1)在sqlite中創(chuàng)建數(shù)據(jù)庫 (假設(shè)數(shù)據(jù)庫名為hms)

        $sqlite3 hms.db

        (2)構(gòu)建數(shù)據(jù)庫表Bolt_GBT5780_2016

        CREATE TABLE Bolt_GBT5780_2016(

        IDINTEGER PRIMARY KEY AUTOINCREMENT,

        ModelNameVARCHAR(100)NOT NULL,

        Dreal NOT NULL,

        d1real NOT NULL,

        sreal NOT NULL,

        kreal NOT NULL,

        rreal NOT NULL,

        lreal NOT NULL,

        breal NOT NULL,

        chamferreal NOT NULL

        );

        表中字段名ModelName表示元器件的標(biāo)記規(guī)格。

        (3)在數(shù)據(jù)表中存儲元器件參數(shù)數(shù)據(jù) (表中數(shù)字單位為mm)

        INSERT INTO Bolt_GBT5780_2016 VALUES(NULL,'GBT5780-2016 M5x25',5,4.134,8,3.5,0.25,25,16,0.25);

        ……

        INSERT INTO Bolt_GBT5780_2016VALUES(NULL,'GBT5780-2016 M16x70',16,13.835,24,10.0,0.8,70,38,0.8);

        ……

        2.2 數(shù)據(jù)訪問層實(shí)現(xiàn)

        數(shù)據(jù)訪問層的作用是訪問數(shù)據(jù)庫表,抽取某一類元器件的所有參數(shù)組。在具體實(shí)現(xiàn)時(shí),插件需要連接、打開數(shù)據(jù)庫,查詢數(shù)據(jù)庫表。由于Sqlite對多進(jìn)程操作支持效果不理想,在項(xiàng)目中,為了避免頻繁讀寫文件數(shù)據(jù)庫帶來的性能損耗,可以采用操作Sqlite內(nèi)存數(shù)據(jù)庫。實(shí)現(xiàn)思路如下:

        (1)創(chuàng)建內(nèi)存數(shù)據(jù)庫

        sqlite3*memoryDb;

        int ret=0;

        ret = sqlite3_open ( ": memory:",&memoryDb);

        (2)在內(nèi)存數(shù)據(jù)庫中attach文件數(shù)據(jù)庫

        實(shí)現(xiàn)的函數(shù)聲明如下:

        int loadOrSaveDb(sqlite3*p InMemeory,const char*zFilename,int isSave);

        loadOrSaveDb函數(shù)的形參p InMemory指向內(nèi)存數(shù)據(jù)庫指針;zFilename指向文件數(shù)據(jù)庫目錄的字符串指針;isSave如果為0,則從文件數(shù)據(jù)庫載入到內(nèi)存數(shù)據(jù)庫。

        為方便理解,假設(shè)數(shù)據(jù)庫文件的路徑為D:\sqlite\hms.db。以下代碼確保文件數(shù)據(jù)庫中的內(nèi)容在內(nèi)存數(shù)據(jù)庫中可見。

        char*filename="D: \sqlite\hms.db";

        int ret=loadOrSaveDb(memoryDb,filename,0);

        (3)在內(nèi)存數(shù)據(jù)庫表中查詢元器件參數(shù)數(shù)據(jù)

        getParmList函數(shù)負(fù)責(zé)在內(nèi)存數(shù)據(jù)庫中采用select操作查詢元器件參數(shù)數(shù)據(jù)。下面代碼中變量sqlliteTableName表示元器件參數(shù)數(shù)據(jù)的表名,parmList容器用于存儲每行參數(shù)數(shù)據(jù)。

        extern sqlite3*memoryDb;

        string sqlliteTableName;

        vector<std::vector<WString>>parmList;

        static void getParmList(const string&sqlliteTable){

        int rc;

        char*zErrMsg=0;

        const string sql1="SELECT*from" +sqlliteTable;

        const char*sql=sql1.c_str();

        const char*data="";

        rc=sqlite3_exec(memoryDb,sql,callback,(void*)data,&zErrMsg);

        return;

        static int callback(void*data,intargc,char**argv,char**azColName){

        WString ColName(""),ColValue("");

        vector<WString>parmVec;

        for(int i=0;i! =argc;i++){

        BeStringUtilities::Utf8ToWChar(ColName,azColName[i],255);

        BeStringUtilities::Utf8ToWChar(ColValue,argv[i],255);

        parmVec.push_back(ColValue);

        parmList.push_back(parmVec);

        return 0;

        2.3 業(yè)務(wù)層實(shí)現(xiàn)

        業(yè)務(wù)層的功能是根據(jù)元器件標(biāo)記規(guī)格以及相應(yīng)的參數(shù),動態(tài)生成三維模型,并動態(tài)放置于設(shè)計(jì)人員指定的位置。該層利用數(shù)據(jù)訪問層傳遞來的參數(shù)容器對象,實(shí)現(xiàn)在MicroStation的命令屬性框中用組合框ComboBox控件列出該類零件的所有標(biāo)記規(guī)格,并將組合框控件的索引ID與數(shù)據(jù)容器中某一行參數(shù)的ID進(jìn)行動態(tài)綁定。設(shè)計(jì)人員執(zhí)行創(chuàng)建螺栓命令時(shí),軟件自動出現(xiàn)命令屬性框,如圖2左側(cè)所示。其組合框中列出數(shù)據(jù)庫表中存儲的所有螺栓規(guī)格。設(shè)計(jì)人員選擇某一規(guī)格后,插件通過控件的索引ID得到該規(guī)格對應(yīng)的參數(shù)數(shù)據(jù),自動在MicroStation的當(dāng)前激活視圖中動態(tài)生成三維模型(圖2右側(cè)所示),動態(tài)浮顯于鼠標(biāo)光標(biāo)位置,待設(shè)計(jì)人員點(diǎn)擊鼠標(biāo)確認(rèn)位置后進(jìn)行最終放置。

        圖2 螺栓命令屬性框及動態(tài)生成的三維模型

        (1)組合框控件與數(shù)據(jù)容器對象進(jìn)行動態(tài)綁定

        ComboBox控件依靠一個(gè)StringList來保存數(shù)據(jù)。loadParm ItemsStringList函數(shù)負(fù)責(zé)遍歷數(shù)據(jù)容器的每一組數(shù)據(jù),并將他們賦值給組合框條目。

        void HandleComboBoxMsg(DialogItemMessageP dimP){

        Raw ItemHdr*riP=dimP->dialogItemP->raw I-temP;

        dimP->msgUnderstood=true;

        switch(dimP->messageType){

        case DITEM_MESSAGE_CREATE:

        parmList.clear();

        getParmList(sqlliteTableName);

        StringList*strListP=NULL;

        strListP=mdlStringList_create(0,2);

        loadParm ItemsStringList(strListP);

        mdlDialog_comboBoxSetStrListP(riP,strListP,1);

        setGlobalsFrom ID(strListP,curSelected Item Index);

        break;

        case DITEM_MESSAGE_STATECHANGED:

        if(dimP->u.stateChanged.reallyChanged){

        StringList*strListP=mdlDialog_comboBoxGet-StrListP(riP);

        setGlobalsFrom ID(strListP,curSelected Item Index);

        break;

        case DITEM_MESSAGE_DESTROY: {//……}

        default:

        {dimP->msgUnderstood=false;

        break;}

        (2)定義 GB/T5780螺栓類 BoltGB5780 Element,用于生成三維模型實(shí)例對象

        class BoltGB5780Element{

        private:

        double _d,_d1,_s,_k,_r,_l,_b,_chamfer;

        Transform_RotateTransform;

        public:

        BoltGB5780Element(double d, double d1,double s,double k,double r,double l,double b,double chamfer,Transform rotateTransform):\

        _d(d),_d1(d1),_s(s),_k(k),_r(r),_l(l),_b(b),_chamfer(chamfer),_RotateTransform (rotateTransform){}

        bool GenerateFinalBoltSolid(EditElementHandleR finaEEh);

        private:

        //private成員函數(shù)略

        };

        類中接口GenerateFinalBoltSolid負(fù)責(zé)根據(jù)參數(shù)動態(tài)生成螺栓三維模型對象,主要調(diào)用的私有成員函數(shù)負(fù)責(zé)生成螺栓頭元素并進(jìn)行切口操作、生成螺栓長度部分元素、生成螺紋修飾面元素,最后把這幾部分合成一個(gè)單元。受篇幅所限,詳細(xì)代碼不作展開。_RotateTransform為三維空間變換矩陣對象,用于實(shí)現(xiàn)模型對象的平移及旋轉(zhuǎn)等。

        (3)在當(dāng)前激活視圖中動態(tài)生成三維模型、動態(tài)浮顯、按確認(rèn)位置進(jìn)行最終放置

        用螺栓類生成三維對象后,圖形的位置是固定的,能否讓圖形跟著光標(biāo)走,定位后在確認(rèn)點(diǎn)放置圖形呢?答案是肯定的。在MicroStationCE的C++API中,提供了強(qiáng)大的DgnPrimitiveTool類來實(shí)現(xiàn)類似的功能。要實(shí)現(xiàn)這個(gè)交互式功能,需要定義一個(gè)派生于DgnPrimitiveTool的類,然后創(chuàng)建該類的一個(gè)實(shí)例并通過調(diào)用InstallTool()函數(shù)啟動。

        class CreateBoltGB5780Tool:DgnPrimitiveTool{

        protected:

        CreateBoltGB5780Tool(int cmdNumber, int cmdName):DgnPrimitiveTool(cmdNumber,cmd-Name){}

        virtual void_OnRestartTool()override{Install-New Instance(GetToolId(),GetToolPrompt());}

        virtual void_OnDynamicFrame(DgnButtonEventCR ev)override;

        bool CreateBoltGB5780Element(EditElementHandleR eeh,DgnButtonEventCR ev);

        public:

        static void InstallNew Instance(int toolId,int toolPrompt);

        };

        在CreateBoltGB5780Tool類中,當(dāng)在外部事件(如Undo)打斷了當(dāng)前工具時(shí)會調(diào)用_OnRestart-Tool函數(shù);當(dāng)用戶在視圖區(qū)點(diǎn)擊鼠標(biāo)的數(shù)據(jù)鍵 (默認(rèn)為左鍵)時(shí)會調(diào)用_OnDataButton函數(shù);當(dāng)用戶在視圖區(qū)點(diǎn)鼠標(biāo)的拒絕鍵 (默認(rèn)為右鍵)時(shí)會調(diào)用_OnResetButton函數(shù)。

        CreateBoltGB5780Tool類中,接口函數(shù) Create-BoltGB5780Element負(fù)責(zé)根據(jù)設(shè)計(jì)人員在命令屬性框中選擇的某一規(guī)格的參數(shù)數(shù)據(jù)創(chuàng)建螺栓類Bolt-GB5780Element的實(shí)例:

        bool CreateBoltGB5780Tool:: CreateBolt-GB5780Element(EditElementHandleR eeh,DgnButtonEventCR ev)

        //變換矩陣rotateTrans,參數(shù)變量初始化

        //……

        BoltGB5780Element BoltGB5780(m_d,m_d1,m_s,m_k,m_r,m_l,m_b,m_chamfer,rotateTrans);

        if(true ! = Bolt-GB5780.GenerateFinalBoltSolid(eeh)){

        return false;

        return true;

        當(dāng)光標(biāo)在視圖區(qū)移動時(shí),_OnDynamicFrame函數(shù)會被反復(fù)調(diào)用。參數(shù)ev返回了當(dāng)前光標(biāo)位置等信息,我們利用RedrawElems類在視圖區(qū)以臨時(shí)元素方式重繪該元素句柄;當(dāng)用戶在視圖區(qū)點(diǎn)鼠標(biāo)的數(shù)據(jù)鍵 (默認(rèn)為左鍵)后會調(diào)用到_OnDataButton函數(shù),在該函數(shù)中才真正將生成的圖形放置在確認(rèn)點(diǎn)位置。

        void CreateBoltGB5780Tool:: _OnDynamic-Frame(DgnButtonEventCR ev){

        EditElementHandle eeh;

        if(!CreateBoltGB5780Element(eeh,ev))return;

        RedrawElems redrawElems;

        redrawElems.SetDynamicsViews(IViewManager::GetActiveViewSet(),ev.GetViewport());

        redrawElems.SetDrawMode(DRAW_MODE_TempDraw);

        redrawElems.SetDrawPurpose (DrawPurpose::Dynamics);

        redrawElems.DoRedraw(eeh);

        bool CreateBoltGB5780Tool:: _OnDataButton(DgnButtonEventCR ev){

        EditElementHandle eeh;

        if(CreateBoltGB5780Element(eeh, ev))eeh.AddToModel();

        _OnReinitialize();

        return true;

        3 結(jié)語

        本文以螺栓標(biāo)準(zhǔn)件為例,采用三層結(jié)構(gòu)設(shè)計(jì)方案構(gòu)建了一個(gè)標(biāo)準(zhǔn)零件的參數(shù)化模型庫框架,對解決基于Bentley平臺三維協(xié)同設(shè)計(jì)推進(jìn)的過程中某些設(shè)備專業(yè)碰到的最后一公里難題提供參考。

        參數(shù)化模型庫除了標(biāo)準(zhǔn)元器件外,還有非固定參數(shù)的非標(biāo)元器件。其次,BIM數(shù)字化模型還需在傳統(tǒng)的3D模型上掛載兼具幾何特性與功能特性的屬性信息。由于筆者二次開發(fā)方面的工作尚在不斷學(xué)習(xí)中,本文還未解決如何將這些有機(jī)統(tǒng)一起來,形成一個(gè)覆蓋面足夠的專業(yè)三維設(shè)計(jì)模塊。

        [1]李向東,霍莉莉,劉艷娟.三維技術(shù)與BIM在水利設(shè)計(jì)行業(yè)的應(yīng)用現(xiàn)狀與發(fā)展探索[J].水利規(guī)劃與設(shè)計(jì),2017(10):141-143.

        [2]張慧潔,吳鋼.三維協(xié)同技術(shù)在建筑模型創(chuàng)建中的應(yīng)用研究[J].水利技術(shù)監(jiān)督,2014(03):52-54.

        [3]孫斌.BIM技術(shù)的現(xiàn)狀和發(fā)展趨勢[J].水利規(guī)劃與設(shè)計(jì),2017(03):13-14.

        [4]周杰.三維協(xié)同設(shè)計(jì)在設(shè)計(jì)院的應(yīng)用[J].水利規(guī)劃與設(shè)計(jì),2014(04):58-62.

        [5]陳健.追夢——工程數(shù)字化技術(shù)研究及推廣應(yīng)用的實(shí)踐與思考[M].北京:中國水利水電出版社,2016:60.

        [6]GB/T 5780-2016.六角頭螺栓 C級[S].

        [7]Lippman,S.B.&J.Lajoie.&B.E.Moo.C++Primer第5版[M].北京:電子工業(yè)出版社,2013:400-403.

        [8]Allen,G.&M.Owens.SQLite權(quán)威指南第二版 [M].北京:電子工業(yè)出版社,2012:26-31.

        [9]李華鋒.基于Microstation V8i平臺的三維設(shè)計(jì)軟件二次開發(fā)[J].中國建設(shè)信息化,2015(16):74-76.

        [10]Lakos,J.大規(guī)模C++程序設(shè)計(jì) [M].北京:機(jī)械工業(yè)出版社,2014:70-79.

        [11]肖劍平.VC++環(huán)境下運(yùn)用MDL進(jìn)行Microstation二次開發(fā)的剖析 [J].工程勘察,2006(02):57-60.

        猜你喜歡
        元器件視圖螺栓
        M16吊耳螺栓斷裂失效分析
        元器件國產(chǎn)化推進(jìn)工作實(shí)踐探索
        預(yù)緊力衰減對摩擦型高強(qiáng)螺栓群承載力的影響
        四川建筑(2020年1期)2020-07-21 07:26:08
        螺栓緊固雜談
        裝備元器件采購質(zhì)量管理與控制探討
        5.3 視圖與投影
        視圖
        基于DSP+FPGA的元器件焊接垂直度識別方法
        Y—20重型運(yùn)輸機(jī)多視圖
        SA2型76毫米車載高炮多視圖
        丰满少妇又爽又紧又丰满动态视频 | 欧美黑吊大战白妞| 日日碰狠狠躁久久躁96avv| 97日日碰日日摸日日澡| 成人性生交大片免费看7| 日本在线一区二区三区视频观看| 亚洲av无码乱码在线观看富二代| 国产精品无码a∨精品影院| 亚洲制服中文字幕第一区| 麻豆人妻无码性色AV专区| 口爆吞精美臀国产在线| 四虎永久在线精品免费网址| 曰本大码熟中文字幕| 中文字幕天堂网| 人妻少妇精品视频一区二区三区 | 国产中文字幕乱人伦在线观看| 狠狠爱无码一区二区三区| 欧美人与物videos另类| 熟女人妻一区二区三区| 一 级做人爱全视频在线看| 野狼第一精品社区| XXXXBBBB欧美| 日本不卡的一区二区三区| 亚洲国产区中文在线观看| 性猛交ⅹxxx富婆视频| 亚洲 欧美精品suv| 国内精品久久久久影院蜜芽| 国产精品国产自产拍高清| 女人和拘做受全程看视频| 香蕉视频一级片| 国产丝袜在线福利观看| 国产成人精品无码片区在线观看| 欧美成年黄网站色视频| 91极品尤物在线观看播放| 男男亚洲av无一区二区三区久久| 一本一本久久aa综合精品| 波霸影院一区二区| 日韩av一区二区不卡在线| 波多野42部无码喷潮在线| 亚洲成人777| 色婷婷久久综合中文久久一本|