コード例 #1
0
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;
}
コード例 #2
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);

}