999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2018-03-19 06:00:20管華明
關(guān)鍵詞:數(shù)據(jù)庫模型設(shè)計(jì)

管華明

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

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

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

1 設(shè)計(jì)

本文以構(gòu)建 GB/T5780-2016《六角頭螺栓 C級(jí)》螺栓零件庫為例,采用輕型的SQLite數(shù)據(jù)庫平臺(tái)存儲(chǔ)參數(shù),實(shí)現(xiàn)方案的編程語言采用C++NativeCode。SQLite是關(guān)系型數(shù)據(jù)庫管理系統(tǒng),包含在一個(gè)相對(duì)小的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ù)庫表并存儲(chǔ)元器件的所有參數(shù)系列。如圖1所示,一個(gè)螺栓的三維模型由螺栓頭、螺栓長(zhǎng)度部分以及螺紋修飾面組成,主要參數(shù)有大徑d、小徑d1、s、k、倒圓角半徑r、長(zhǎng)度l、螺紋長(zhǎng)度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ù)表中存儲(chǔ)元器件參數(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對(duì)多進(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ù)庫表中查詢?cè)骷?shù)數(shù)據(jù)

getParmList函數(shù)負(fù)責(zé)在內(nèi)存數(shù)據(jù)庫中采用select操作查詢?cè)骷?shù)數(shù)據(jù)。下面代碼中變量sqlliteTableName表示元器件參數(shù)數(shù)據(jù)的表名,parmList容器用于存儲(chǔ)每行參數(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ù),動(dòng)態(tài)生成三維模型,并動(dòng)態(tài)放置于設(shè)計(jì)人員指定的位置。該層利用數(shù)據(jù)訪問層傳遞來的參數(shù)容器對(duì)象,實(shí)現(xiàn)在MicroStation的命令屬性框中用組合框ComboBox控件列出該類零件的所有標(biāo)記規(guī)格,并將組合框控件的索引ID與數(shù)據(jù)容器中某一行參數(shù)的ID進(jìn)行動(dòng)態(tài)綁定。設(shè)計(jì)人員執(zhí)行創(chuàng)建螺栓命令時(shí),軟件自動(dòng)出現(xiàn)命令屬性框,如圖2左側(cè)所示。其組合框中列出數(shù)據(jù)庫表中存儲(chǔ)的所有螺栓規(guī)格。設(shè)計(jì)人員選擇某一規(guī)格后,插件通過控件的索引ID得到該規(guī)格對(duì)應(yīng)的參數(shù)數(shù)據(jù),自動(dòng)在MicroStation的當(dāng)前激活視圖中動(dòng)態(tài)生成三維模型(圖2右側(cè)所示),動(dòng)態(tài)浮顯于鼠標(biāo)光標(biāo)位置,待設(shè)計(jì)人員點(diǎn)擊鼠標(biāo)確認(rèn)位置后進(jìn)行最終放置。

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

(1)組合框控件與數(shù)據(jù)容器對(duì)象進(jìn)行動(dòng)態(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í)例對(duì)象

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

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

用螺栓類生成三維對(duì)象后,圖形的位置是固定的,能否讓圖形跟著光標(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ù)啟動(dòng)。

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í)會(huì)調(diào)用_OnRestart-Tool函數(shù);當(dāng)用戶在視圖區(qū)點(diǎn)擊鼠標(biāo)的數(shù)據(jù)鍵 (默認(rèn)為左鍵)時(shí)會(huì)調(diào)用_OnDataButton函數(shù);當(dāng)用戶在視圖區(qū)點(diǎn)鼠標(biāo)的拒絕鍵 (默認(rèn)為右鍵)時(shí)會(huì)調(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ū)移動(dòng)時(shí),_OnDynamicFrame函數(shù)會(huì)被反復(fù)調(diào)用。參數(shù)ev返回了當(dāng)前光標(biāo)位置等信息,我們利用RedrawElems類在視圖區(qū)以臨時(shí)元素方式重繪該元素句柄;當(dāng)用戶在視圖區(qū)點(diǎn)鼠標(biāo)的數(shù)據(jù)鍵 (默認(rèn)為左鍵)后會(huì)調(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ù)化模型庫框架,對(duì)解決基于Bentley平臺(tái)三維協(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ā)展趨勢(shì)[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]陳健.追夢(mèng)——工程數(shù)字化技術(shù)研究及推廣應(yīng)用的實(shí)踐與思考[M].北京:中國(guó)水利水電出版社,2016:60.

[6]GB/T 5780-2016.六角頭螺栓 C級(jí)[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平臺(tái)的三維設(shè)計(jì)軟件二次開發(fā)[J].中國(guó)建設(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.

猜你喜歡
數(shù)據(jù)庫模型設(shè)計(jì)
一半模型
重要模型『一線三等角』
重尾非線性自回歸模型自加權(quán)M-估計(jì)的漸近分布
瞞天過海——仿生設(shè)計(jì)萌到家
設(shè)計(jì)秀
海峽姐妹(2017年7期)2017-07-31 19:08:17
有種設(shè)計(jì)叫而專
Coco薇(2017年5期)2017-06-05 08:53:16
數(shù)據(jù)庫
3D打印中的模型分割與打包
數(shù)據(jù)庫
數(shù)據(jù)庫
主站蜘蛛池模板: 久久99国产综合精品1| 久久国产精品国产自线拍| 欧美精品亚洲二区| 2019年国产精品自拍不卡| 国产Av无码精品色午夜| 精品伊人久久久大香线蕉欧美| 亚洲综合久久成人AV| 91精品国产一区| 国产精品污污在线观看网站| 一本色道久久88| 国产精品免费电影| 日韩在线影院| 久久黄色免费电影| 国模粉嫩小泬视频在线观看| 在线观看免费黄色网址| 欧美高清国产| 潮喷在线无码白浆| 久久青青草原亚洲av无码| 亚洲女同一区二区| 亚洲欧美日韩成人高清在线一区| AV在线麻免费观看网站| 国产麻豆aⅴ精品无码| 99国产精品免费观看视频| 99久久婷婷国产综合精| 亚洲精品午夜无码电影网| 亚洲美女一区| 成人在线亚洲| 国产在线一区视频| 视频一区视频二区中文精品| 波多野结衣久久高清免费| 亚洲av日韩综合一区尤物| 色网站在线免费观看| 最新国产在线| 国产人在线成免费视频| a毛片基地免费大全| 亚洲中文字幕97久久精品少妇| 国产成人午夜福利免费无码r| 热久久这里是精品6免费观看| 午夜在线不卡| 免费视频在线2021入口| 伊人婷婷色香五月综合缴缴情| аⅴ资源中文在线天堂| 欧美成人在线免费| 久久精品嫩草研究院| 免费国产高清视频| 国产日本欧美亚洲精品视| 日韩不卡高清视频| 亚洲三级成人| 欧美国产菊爆免费观看 | 91色在线视频| 国产在线观看人成激情视频| 99re在线观看视频| 日韩国产亚洲一区二区在线观看| 六月婷婷激情综合| 国产色爱av资源综合区| 一级爱做片免费观看久久| 青青青草国产| 直接黄91麻豆网站| yjizz国产在线视频网| 日本中文字幕久久网站| 中文字幕在线日韩91| 在线视频亚洲色图| 欧美成人h精品网站| 国产尤物在线播放| 国产精品免费露脸视频| 2018日日摸夜夜添狠狠躁| 在线播放国产一区| 国产午夜人做人免费视频| 国产中文一区a级毛片视频| 99精品这里只有精品高清视频| 国产精品夜夜嗨视频免费视频 | 女人18一级毛片免费观看| 国产成人1024精品| 国产黄色爱视频| 人妻无码中文字幕一区二区三区| 欧美成在线视频| 国产欧美在线| 欧美午夜在线播放| 国产对白刺激真实精品91| 日韩欧美国产精品| 午夜影院a级片| 99re在线观看视频|