void Mesh::updateGEntityPositions() { for (int iV = 0; iV < nVert(); iV++) _vert[iV]->setXYZ(_xyz[iV].x(),_xyz[iV].y(),_xyz[iV].z()); for (int iFV = 0; iFV < nFV(); iFV++) _paramFV[iFV]->exportParamCoord(_uvw[iFV]); }
void Mesh::updateGEntityPositions(const std::vector<SPoint3> &xyz, const std::vector<SPoint3> &uvw) { for (int iV = 0; iV < nVert(); iV++) _vert[iV]->setXYZ(xyz[iV].x(),xyz[iV].y(),xyz[iV].z()); for (int iFV = 0; iFV < nFV(); iFV++) _paramFV[iFV]->exportParamCoord(uvw[iFV]); }
void Mesh::getUvw(double *it) { for (int iFV = 0; iFV < nFV(); iFV++) { SPoint3 &uvwV = _uvw[iFV]; *it = uvwV[0]; it++; if (_nPCFV[iFV] >= 2) { *it = uvwV[1]; it++; } if (_nPCFV[iFV] == 3) { *it = uvwV[2]; it++; } } }
void Mesh::updateMesh(const double *it) { for (int iFV = 0; iFV < nFV(); iFV++) { int iV = _fv2V[iFV]; SPoint3 &uvwV = _uvw[iFV]; uvwV[0] = *it; it++; if (_nPCFV[iFV] >= 2) { uvwV[1] = *it; it++; } if (_nPCFV[iFV] == 3) { uvwV[2] = *it; it++; } _xyz[iV] = _paramFV[iFV]->uvw2Xyz(uvwV); } }
void Mesh::getGEntityPositions(std::vector<SPoint3> &xyz, std::vector<SPoint3> &uvw) { xyz.resize(nVert()); uvw.resize(nFV()); for (int iV = 0; iV < nVert(); iV++) xyz[iV] = SPoint3(_vert[iV]->x(),_vert[iV]->y(),_vert[iV]->z()); for (int iFV = 0; iFV < nFV(); iFV++){ MVertex *v = _freeVert[iFV]; if (v->onWhat()->dim() == 1){ double t; v->getParameter(0,t); uvw[iFV] = SPoint3(t,0,0); } if (v->onWhat()->dim() == 2){ double uu,vv; v->getParameter(0,uu); v->getParameter(1,vv); uvw[iFV] = SPoint3(uu,vv,0); } } }
MStatus updateTCCDataFty::remapMeshData(MFnMesh &meshFn) { MIntArray o_nFV, o_F; meshFn.getVertices(o_nFV, o_F); size_t o_nF = o_nFV.length(); size_t o_nHE = o_F.length(); size_t o_nV = meshFn.numVertices(); MIntArray o_F2H(o_nF); // maps face index to halfedge index { size_t kS=0; for (size_t k=0; k<o_nF; k++) { o_F2H[k] = kS; kS+=o_nFV[k]; } } size_t nF = fPolyOrder.length(); size_t nHE = compute_nHE(fPolyOrder, o_nFV, fDelta_nFV); size_t nV = fnV; HalfedgeData he(o_nHE, nHE); VertexData v(o_nV, nV); MFloatPointArray V(nV); MIntArray nFV(nF); MIntArray F(nHE); get_vertex_blindData(meshFn, v); get_halfedge_blindData(meshFn, he); // add old/new faces in the order given by fPolyOrder and remap their halfedge data (if exists) size_t delta_kF = 0, delta_kHE=0; size_t kF = 0, kHE = 0; for (size_t k=0; k<fPolyOrder.length(); k++) { if (fPolyOrder[k]>=0) { size_t cF = fPolyOrder[k], cnFV = o_nFV[cF]; size_t o_cF2H = o_F2H[cF]; size_t cShift = fCShift[cF]; for (size_t kFV=0; kFV<cnFV; kFV++) { size_t o_kHE = o_cF2H + ((kFV + cShift) % cnFV); F[kHE] = fVtxRemap[o_F[o_kHE]]; remap_HalfedgeData(he, o_kHE, kHE); kHE++; } nFV[kF] = cnFV; kF++; } else // this is a new face { size_t cnFV = fDelta_nFV[delta_kF]; delta_kF++; for (size_t kFV=0; kFV<cnFV; kFV++) { F[kHE] = fDelta_F[delta_kHE]; kHE++; delta_kHE++; } nFV[kF] = cnFV; kF++; } } // remap vertex data for (size_t k=0; k<o_nV; k++) { if (fVtxRemap[k]>=0) { remap_VertexData(v, k, fVtxRemap[k]); } } MStatus stat = meshFn.createInPlace(nV, nF, V, nFV, F); if (stat != MS::kSuccess) { std::cerr<<"createInPlace failed"<<endl; std::cerr<<stat.errorString()<<endl; } update_tags(nFV, F, v, he); set_vertex_blindData(meshFn, v); set_halfedge_blindData(meshFn, he); return stat; }
Mesh::Mesh(const std::map<MElement*,GEntity*> &element2entity, const std::set<MElement*> &els, std::set<MVertex*> &toFix, bool fixBndNodes, bool fastJacEval) : _fastJacEval(fastJacEval) { _dim = (*els.begin())->getDim(); // Initialize elements, vertices, free vertices and element->vertices // connectivity const int nElements = els.size(); _nPC = 0; _el.resize(nElements); _el2FV.resize(nElements); _el2V.resize(nElements); _nBezEl.resize(nElements); _nNodEl.resize(nElements); _indPCEl.resize(nElements); int iEl = 0; bool nonGeoMove = false; for(std::set<MElement*>::const_iterator it = els.begin(); it != els.end(); ++it, ++iEl) { _el[iEl] = *it; const JacobianBasis *jac = _el[iEl]->getJacobianFuncSpace(); _nBezEl[iEl] = _fastJacEval ? jac->getNumJacNodesFast() : jac->getNumJacNodes(); _nNodEl[iEl] = jac->getNumMapNodes(); for (int iVEl = 0; iVEl < jac->getNumMapNodes(); iVEl++) { MVertex *vert = _el[iEl]->getVertex(iVEl); GEntity *ge = vert->onWhat(); const int vDim = ge->dim(); const bool hasParam = ge->haveParametrization(); int iV = addVert(vert); _el2V[iEl].push_back(iV); if ((vDim > 0) && (toFix.find(vert) == toFix.end()) && (!fixBndNodes || vDim == _dim)) { // Free vertex? ParamCoord *param; if (vDim == 3) param = new ParamCoordPhys3D(); else if (hasParam) param = new ParamCoordParent(vert); else { if (vDim == 2) param = new ParamCoordLocalSurf(vert); else param = new ParamCoordLocalLine(vert); nonGeoMove = true; } int iFV = addFreeVert(vert,iV,vDim,param,toFix); _el2FV[iEl].push_back(iFV); for (int i=_startPCFV[iFV]; i<_startPCFV[iFV]+vDim; i++) _indPCEl[iEl].push_back(i); } else _el2FV[iEl].push_back(-1); } } if (nonGeoMove) Msg::Info("WARNING: Some vertices will be moved along local lines " "or planes, they may not remain on the exact geometry"); // Initial coordinates _ixyz.resize(nVert()); for (int iV = 0; iV < nVert(); iV++) _ixyz[iV] = _vert[iV]->point(); _iuvw.resize(nFV()); for (int iFV = 0; iFV < nFV(); iFV++) _iuvw[iFV] = _paramFV[iFV]->getUvw(_freeVert[iFV]); // Set current coordinates _xyz = _ixyz; _uvw = _iuvw; // Set normals to 2D elements (with magnitude of inverse Jacobian) or initial // Jacobians of 3D elements if (_dim == 2) { _scaledNormEl.resize(nEl()); for (int iEl = 0; iEl < nEl(); iEl++) calcScaledNormalEl2D(element2entity,iEl); } else { _invStraightJac.resize(nEl(),1.); double dumJac[3][3]; for (int iEl = 0; iEl < nEl(); iEl++) _invStraightJac[iEl] = 1. / fabs(_el[iEl]->getPrimaryJacobian(0.,0.,0.,dumJac)); } }