void getShapeF1D(Interface1D& inter, set<ViewShape*>& oShapes){ ViewEdge* ve = dynamic_cast<ViewEdge*>(&inter); if (ve){ oShapes.insert(ve->viewShape()); }else{ Interface0DIterator it=inter.verticesBegin(), itend=inter.verticesEnd(); for(;it!=itend;++it) oShapes.insert(Functions0D::getShapeF0D(it)); } }
vector<ViewShape*> GetShapeF1D::operator()(Interface1D& inter) { vector<ViewShape*> shapesVector; set<ViewShape*> shapesSet; ViewEdge* ve = dynamic_cast<ViewEdge*>(&inter); if (ve){ shapesVector.push_back(ve->viewShape()); }else{ Interface0DIterator it=inter.verticesBegin(), itend=inter.verticesEnd(); for(;it!=itend;++it) shapesSet.insert(Functions0D::getShapeF0D(it)); shapesVector.insert<set<ViewShape*>::iterator>(shapesVector.begin(), shapesSet.begin(), shapesSet.end()); } return shapesVector; }
ViewVertex *ViewMap::InsertViewVertex(SVertex *iVertex, vector<ViewEdge*>& newViewEdges) { NonTVertex *vva = dynamic_cast<NonTVertex*>(iVertex->viewvertex()); if (vva) return vva; // because it is not already a ViewVertex, this SVertex must have only 2 FEdges. The incoming one still belongs // to ioEdge, the outgoing one now belongs to newVEdge const vector<FEdge *>& fedges = iVertex->fedges(); if (fedges.size() != 2) { cerr << "ViewMap warning: Can't split the ViewEdge" << endl; return NULL; } FEdge *fend(NULL), *fbegin(NULL); for (vector<FEdge *>::const_iterator fe = fedges.begin(), feend = fedges.end(); fe != feend; ++fe) { if ((*fe)->vertexB() == iVertex) { fend = (*fe); } if ((*fe)->vertexA() == iVertex) { fbegin = (*fe); } if ((fbegin != NULL) && (fend != NULL)) break; } ViewEdge *ioEdge = fbegin->viewedge(); ViewShape *vshape = ioEdge->viewShape(); vva = new NonTVertex(iVertex); // if the ViewEdge is a closed loop, we don't create a new VEdge if (ioEdge->A() == 0) { // closed loop ioEdge->setA(vva); ioEdge->setB(vva); // update sshape vshape->sshape()->RemoveEdgeFromChain(ioEdge->fedgeA()); vshape->sshape()->RemoveEdgeFromChain(ioEdge->fedgeB()); ioEdge->setFEdgeA(fbegin); ioEdge->setFEdgeB(fend); // Update FEdges fend->setNextEdge(NULL); fbegin->setPreviousEdge(NULL); // update new View Vertex: vva->AddOutgoingViewEdge(ioEdge); vva->AddIncomingViewEdge(ioEdge); vshape->sshape()->AddChain(ioEdge->fedgeA()); vshape->sshape()->AddChain(ioEdge->fedgeB()); } else { // Create new ViewEdge ViewEdge *newVEdge = new ViewEdge(vva, ioEdge->B(), fbegin, ioEdge->fedgeB(), vshape); newVEdge->setId(Id(ioEdge->getId().getFirst(), ioEdge->getId().getSecond() + 1)); newVEdge->setNature(ioEdge->getNature()); //newVEdge->UpdateFEdges(); // done in the ViewEdge constructor // Update old ViewEdge ioEdge->setB(vva); ioEdge->setFEdgeB(fend); // Update FEdges fend->setNextEdge(NULL); fbegin->setPreviousEdge(NULL); // update new View Vertex: vva->AddOutgoingViewEdge(newVEdge); vva->AddIncomingViewEdge(ioEdge); NonTVertex *vvb = dynamic_cast<NonTVertex*>(newVEdge->B()); if (vvb) vvb->Replace(ioEdge, newVEdge); // update ViewShape //vshape->AddEdge(newVEdge); // update SShape vshape->sshape()->AddChain(fbegin); // update ViewMap //_VEdges.push_back(newVEdge); newViewEdges.push_back(newVEdge); } // update ViewShape vshape->AddVertex(vva); // update ViewMap _VVertices.push_back(vva); return vva; }