double distanceToGeometry(GModel *gm, int dim, int tag, int distType, double tol, int meshDiscr, int geomDiscr) { double maxDist = 0.; if (dim == 2) { GEdge *ge = gm->getEdgeByTag(tag); if (ge->geomType() == GEntity::Line) return 0.; for (unsigned int i = 0; i < ge->lines.size(); i++) { double dist; switch (distType) { case CADDIST_TAYLOR: dist = taylorDistanceEdge(ge->lines[i], ge); break; case CADDIST_FRECHET: dist = discreteFrechetDistanceEdge(ge->lines[i], ge, tol, meshDiscr, geomDiscr); break; case CADDIST_HAUSFAST: dist = discreteHausdorffDistanceFastEdge(ge->lines[i], ge, tol, meshDiscr, geomDiscr); break; case CADDIST_HAUSBRUTE: dist = discreteHausdorffDistanceBruteEdge(ge->lines[i], ge, tol, meshDiscr, geomDiscr); break; default: Msg::Error("Wrong CAD distance type in distanceToGeometry"); return -1.; break; } maxDist = std::max(dist, maxDist); } } else if (dim == 3) { if (distType == CADDIST_TAYLOR) { GFace *gf = gm->getFaceByTag(tag); if (gf->geomType() == GEntity::Plane) return 0.; for (unsigned int i = 0; i < gf->triangles.size(); i++) maxDist = std::max(taylorDistanceFace(gf->triangles[i], gf), maxDist); for (unsigned int i = 0; i < gf->quadrangles.size(); i++) maxDist = std::max(taylorDistanceFace(gf->quadrangles[i], gf), maxDist); } else { Msg::Error("CAD distance type %i not implemented for surfaces", distType); return -1.; } } else { Msg::Error("CAD distance cannot be computed for dimension %i", dim); return -1.; } return maxDist; }
void Centerline::importFile(std::string fileName) { current = GModel::current(); std::vector<GFace*> currentFaces(current->firstFace(), current->lastFace()); for (unsigned int i = 0; i < currentFaces.size(); i++){ GFace *gf = currentFaces[i]; if (gf->geomType() == GEntity::DiscreteSurface){ for(unsigned int j = 0; j < gf->triangles.size(); j++) triangles.push_back(gf->triangles[j]); if (is_cut){ gf->triangles.clear(); gf->deleteVertexArrays(); current->remove(gf); } } } if(triangles.empty()){ Msg::Error("Current GModel has no triangles ..."); return; } mod = new GModel(); mod->load(fileName); mod->removeDuplicateMeshVertices(1.e-8); current->setAsCurrent(); current->setVisibility(1); int maxN = 0.0; std::vector<GEdge*> modEdges(mod->firstEdge(), mod->lastEdge()); MVertex *vin = modEdges[0]->lines[0]->getVertex(0); ptin = SPoint3(vin->x(), vin->y(), vin->z()); for (unsigned int i = 0; i < modEdges.size(); i++){ GEdge *ge = modEdges[i]; for(unsigned int j = 0; j < ge->lines.size(); j++){ MLine *l = ge->lines[j]; MVertex *v0 = l->getVertex(0); MVertex *v1 = l->getVertex(1); std::map<MVertex*, int>::iterator it0 = colorp.find(v0); std::map<MVertex*, int>::iterator it1 = colorp.find(v1); if (it0 == colorp.end() || it1 == colorp.end()){ lines.push_back(l); colorl.insert(std::make_pair(l, ge->tag())); maxN = std::max(maxN, ge->tag()); } if (it0 == colorp.end()) colorp.insert(std::make_pair(v0, ge->tag())); if (it1 == colorp.end()) colorp.insert(std::make_pair(v1, ge->tag())); } } createBranches(maxN); }