void Map::Draw() { // Sets the texture to draw the streets. Texture tex=Texture::GetInstance(); glMatrixMode(GL_MODELVIEW); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, tex.roadTex); Point first,second; for (std::map<int, Node>::iterator it = this->nodes.begin(); it != this->nodes.end(); ++it) { Node currentNode = (*it).second; //Draw current intersection currentNode.Draw(); std::vector<int> destinations=currentNode.getDestinations(); for (int i = 0; i < destinations.size(); i++) { //Take the coordinates of a street and draw a quad between that points glBegin(GL_QUADS); Street street = currentNode.GetStreet(i); glColor3f(116 / 255., 125 / 255., 135 / 255.); glTexCoord2d(0, 0); glVertex3d(street.corners[0].x, street.corners[0].y, street.corners[0].z); glTexCoord2d(0, 10); glVertex3d(street.corners[1].x, street.corners[1].y, street.corners[1].z); glTexCoord2d(10, 10); glVertex3d(street.corners[2].x, street.corners[2].y, street.corners[2].z); glTexCoord2d(10, 0); glVertex3d(street.corners[3].x, street.corners[3].y, street.corners[3].z); glEnd(); } } glDisable(GL_TEXTURE_2D); }
//读入一个模型 BOOL CDiagRunView::read_one_model(CString model_name) { m_sqlserver_db.dbname=CString(model_name); CClientDC dc(this); OnPrepareDC(&dc); CString Datasource; Datasource.Format("Provider=SQLOLEDB.1; Data Source=%s; Initial Catalog=%s; User ID=%s; PWD=%s", m_sqlserver_db.dbsrc,m_sqlserver_db.dbname,m_sqlserver_db.user,m_sqlserver_db.pass); HRESULT hr = m_pConnection->Open(_bstr_t(LPCTSTR(Datasource)),"","",-1);///连接数据库 //上面一句中连接字串中的Provider是针对SQL Server环境的 /*读入数据*/ /* //读被测对象属性表 try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("OBJECT_Table",_variant_t((IDispatch*)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdTable); while(!m_pRecordset->adoEOF) { m_pRecordset->GetCollect("对象序号"); m_pRecordset->GetCollect("对象号"); m_pRecordset->GetCollect("任务号"); m_pRecordset->GetCollect("对象名称"); m_pRecordset->GetCollect("对象描述"); //?=vartostr(); m_pRecordset->MoveNext(); } m_pRecordset.Release(); } catch(_com_error e)///捕捉异常 { AfxMessageBox("读取被测对象属性表失败!");///显示错误信息 } */ //读结点表 try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("NODES_Table",_variant_t((IDispatch*)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdTable); while(!m_pRecordset->EndOfFile) { long value; IBaseCom * pCom = NULL; int com_no=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("图形形状")))); CLSID clsid=*CLSIDArray[com_no]; IID iid=*IIDArray[com_no]; HRESULT hr=::CoCreateInstance(clsid, NULL, CLSCTX_ALL, iid, (void **)&pCom); if ( !SUCCEEDED(hr) ) { MessageBox("init node_com fail"); return false; } Node * node = new Node(pCom); node->SetActive(FALSE); value=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("结点号")))); node_id_count=value+1; node->SetID(value); //m_pRecordset->GetCollect("任务号"); //m_pRecordset->GetCollect("对象序号"); value=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("层号")))); node->layer=value; //m_pRecordset->GetCollect("层中序号"); //m_pRecordset->GetCollect("父结点号"); node->inLine=NULL; node->SetName(vartostr(m_pRecordset->GetCollect("结点名称"))); //m_pRecordset->GetCollect("结点中文名称"); node->comment=vartostr(m_pRecordset->GetCollect("结点描述")); CPoint pos1, pos2; /* pos1.x=0; pos1.y=0; pos2.x=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("X坐标")))); pos2.y=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("Y坐标")))); node->SetScrPos(pos1); node->SetTopLeft(pos2); */ pos1.x=scrollpos.x; pos1.y=scrollpos.y; pos2.x=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("X坐标"))))-scrollpos.x; pos2.y=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("Y坐标"))))-scrollpos.y; node->SetScrPos(pos1); node->SetTopLeft(pos2); //m_pRecordset->GetCollect("图形线型"); //m_pRecordset->GetCollect("图形线宽"); m_model_scale=atof(vartostr(m_pRecordset->GetCollect("比例"))); GraphInfo * gi = node->GetGraphInfo(); //m_pRecordset->GetCollect("图形颜色")))); //m_pRecordset->GetCollect("字体"); //m_pRecordset->GetCollect("字号"); //m_pRecordset->GetCollect("字体颜色"); //m_pRecordset->GetCollect("填充类型"); gi->normal_regioncolor=atoi(LPCTSTR(vartostr(m_pRecordset->GetCollect("填充颜色")))); node->SetGraphInfo(gi); //m_pRecordset->GetCollect("正在运行"); //m_pRecordset->GetCollect("分析标志"); int flag=atoi(LPCTSTR(vartostr(m_pRecordset->GetCollect("删除标志")))); if (flag==1) node->SetDeleted(true); else node->SetDeleted(false); //node->SetActive(TRUE); NodeArray.Add(node); if (!node->IsDeleted()) node->Draw(&dc, pos2, pos1, m_model_scale, &m_GraphInfo, 1, node->GetActive()); m_pRecordset->MoveNext(); } m_pRecordset.Release(); } catch(_com_error e)///捕捉异常 { AfxMessageBox("读取结点表失败!");///显示错误信息 } //读连线表 try { CPoint startPoint, endPoint; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("LINE_Table",_variant_t((IDispatch*)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdTable); while(!m_pRecordset->EndOfFile) { long value; Node *parentnode,*sonnode; IMyLineCom * pLineCom = NULL; HRESULT hr = ::CoCreateInstance(CLSID_MyLineCom, NULL, CLSCTX_ALL, IID_IMyLineCom, (void **)&pLineCom); if ( !SUCCEEDED(hr) ) { MessageBox("创建Line_COM错误"); return false; } Line * line = new Line((IBaseCom*)pLineCom); line->SetActive(FALSE); value=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("连线号")))); line->SetID(value); line_id_count=value+1; //m_pRecordset->GetCollect("任务号"); //m_pRecordset->GetCollect("对象序号"); value=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("父结点号")))); parentnode=Get_Node_In_NodeArray(value); //m_pRecordset->GetCollect("父结点类型"); //m_pRecordset->GetCollect("父结点层号"); //m_pRecordset->GetCollect("父结点层中号"); value=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("子结点号")))); sonnode=Get_Node_In_NodeArray(value); //m_pRecordset->GetCollect("子结点类型"); //m_pRecordset->GetCollect("子结点层号"); //m_pRecordset->GetCollect("子结点层中号"); line->SetName(vartostr(m_pRecordset->GetCollect("连线名称"))); //m_pRecordset->GetCollect("连线中文名称"); line->comment=vartostr(m_pRecordset->GetCollect("连线描述")); CPoint pos1,pos2; pos1.x=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("连线起点X"))))-scrollpos.x; pos1.y=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("连线起点Y"))))-scrollpos.y; pos2.x=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("连线终点X"))))-scrollpos.x; pos2.y=atol(LPCTSTR(vartostr(m_pRecordset->GetCollect("连线终点Y"))))-scrollpos.y; GraphInfo * gi = line->GetGraphInfo(); gi->normal_penStyle=atoi(LPCTSTR(vartostr(m_pRecordset->GetCollect("连线类型")))); gi->normal_linewidth=atoi(LPCTSTR(vartostr(m_pRecordset->GetCollect("连线宽度")))); gi->normal_linecolor=atoi(LPCTSTR(vartostr(m_pRecordset->GetCollect("连线颜色")))); line->SetGraphInfo(gi); //m_pRecordset->GetCollect("箭头类型"); //m_pRecordset->GetCollect("分析标志"); int flag=atoi(LPCTSTR(vartostr(m_pRecordset->GetCollect("删除标志")))); if (flag==1) line->SetDeleted(true); else { line->SetDeleted(false); line->parentNode = parentnode; line->sonNode = sonnode; sonnode->inLine=line; parentnode->outLine.Add(line); line->GetCom()->SetStartPoint((unsigned long)&pos1); line->GetCom()->SetEndPoint((unsigned long)&pos2); line->Draw(&dc, pos1, scrollpos, m_model_scale, 0, 1, line->GetActive()); } LineArray.Add(line); m_pRecordset->MoveNext(); } m_pRecordset.Release(); } catch(_com_error e)///捕捉异常 { AfxMessageBox("读取连线表失败!");///显示错误信息 } if(m_pConnection->State) m_pConnection->Close(); ///如果已经打开了连接则关闭它 return true; }