assemblyGraph AssemblyGraphBuilder::GetAssemblyGraph(std::vector<Part*> *parts){ assemblyGraph aGraph; std::map<PartUri, graph_traits<assemblyGraph>::vertex_descriptor> partUri_VertexDescMap; for (auto &part : *parts){ auto vertex_desc = getBodyDescriptor(part); auto desc = add_vertex(*asmGraph); vertex_desc.Vertex_Index = (_int) desc; (*asmGraph)[desc] = vertex_desc; partUri_VertexDescMap.emplace(part->uri, desc); } //auto map2 = get(graph_traits<assemblyGraph>::vertex_descriptor(), *asmGraph); ContactDesc desc; for (auto p1 = parts->begin(); p1 != parts->end(); p1++){ Part * part = *p1; auto V1 = partUri_VertexDescMap.find(part->GetUri()); auto p2 = p1; for (++p2; p2 != parts->end(); ++p2){ Part * coPart = *p2; if (getContactDesc(part, coPart, desc)){ auto V2 = partUri_VertexDescMap.find(coPart->GetUri()); auto edge_Desc = add_edge(V1->second, V2->second, desc, *asmGraph); //put(AsmGraph_EdgeMap, edge_Desc, desc); } } } return 0; }
void AspMainTest::TestContactSpotProcess(MainFrame * frame, AspMainTool *tool){ auto unitMap = tool->product->GetUnitMap(); auto view = frame->myViewer; Standard_Real Gap = 0.5; Handle_AIS_InteractiveContext context = view->getIC(); if (context->HasOpenedContext()) context->CloseAllContexts(); context->EraseAll(true); Standard_Integer curLC = context->OpenLocalContext(); for (auto iter = unitMap->begin(); iter != unitMap->end(); iter++){ Part *part = dynamic_cast<Part *>(iter->second); auto subItr = iter; for (++subItr; subItr != unitMap->end(); subItr++){ Part *obstacle = dynamic_cast<Part *>(subItr->second); //========================================== // Visualise current Parts context->ClearLocalContext(AIS_ClearMode::AIS_CM_Interactive); Handle_AIS_Shape shape = tool->mapOfShapes.find(part->GetUri())->second; context->LocalContext()->Display(shape, AIS_Shaded); context->SetTransparency(shape, 0.2, false); shape = tool->mapOfShapes.find(obstacle->GetUri())->second;; context->LocalContext()->Display(shape, AIS_WireFrame); view->getView()->Redraw(); //========================================== if (obstacle->BndBox()->Distance(*part->BndBox()) < Gap) for (auto &sp : *part){ if (sp.myBox.Distance(*obstacle->BndBox())<Gap) for (auto &obstSp : *obstacle){ if (sp.myBox.Distance(obstSp.myBox)>Gap) continue; //========================================== // Visualise current surface context->ClearLocalContext(AIS_ClearMode::AIS_CM_Interactive); tool->ShowSurface(context, sp); tool->ShowSurface(context, obstSp); view->getView()->Redraw(); //========================================== //========================================== // Launch function Contact Spot if (asp::DBGBuilder::NotInContact(sp, obstSp, 1, Gap)) continue; ContactSpot spot(sp, obstSp, part, obstacle); if (spot.IsDone()){ //========================================== auto vecArray1 = spot.getF1ContactAxis(); auto vecArray2 = spot.getF2ContactAxis(); if (vecArray1.size() && vecArray2.size()){ for (auto &dir : vecArray1){ Handle_ISession_Direction axis = new ISession_Direction(dir.Location(), dir.Direction(), 10); context->LocalContext()->Display(axis, AIS_WireFrame); } for (auto &dir : vecArray2){ Handle_ISession_Direction axis = new ISession_Direction(dir.Location(), dir.Direction(), 10); context->LocalContext()->Display(axis, AIS_WireFrame); } view->getView()->Redraw(); } //} } } } } } context->CloseLocalContext(curLC); }