// Set the face traits void SetFaceTraits (PNamedShape loft) { // designated names of the faces std::vector<std::string> names(5); names[0]="Bottom"; names[1]="Top"; names[2]="TrailingEdge"; names[3]="Inside"; names[4]="Outside"; // map of faces TopTools_IndexedMapOfShape map; TopExp::MapShapes(loft->Shape(), TopAbs_FACE, map); // check if number of faces is correct (only valid for ruled surfaces lofts) if (map.Extent() != 5 && map.Extent() != 4) { LOG(ERROR) << "CCPACSWingSegment: Unable to determine face names in ruled surface loft"; return; } // remove trailing edge name if there is no trailing edge if (map.Extent() == 4) { names.erase(names.begin()+2); } // set face trait names for (int i = 0; i < map.Extent(); i++) { CFaceTraits traits = loft->GetFaceTraits(i); traits.SetName(names[i].c_str()); loft->SetFaceTraits(i, traits); } }
PNamedShape CCPACSControlSurfaceDevice::getTransformedFlapShape() { PNamedShape deviceShape = getFlapShape()->DeepCopy(); gp_Trsf T = GetFlapTransform(); BRepBuilderAPI_Transform form(deviceShape->Shape(), T); deviceShape->SetShape(form.Shape()); // store the transformation property. Required e.g. for VTK metadata gp_GTrsf gT(T); CTiglTransformation tiglTrafo(gT); unsigned int nFaces = deviceShape->GetFaceCount(); for (unsigned int iFace = 0; iFace < nFaces; ++iFace) { CFaceTraits ft = deviceShape->GetFaceTraits(iFace); ft.SetTransformation(tiglTrafo); deviceShape->SetFaceTraits(iFace, ft); } return deviceShape; }
ListPNamedShape GroupFaces(const PNamedShape shape, tigl::ShapeGroupMode groupType) { ListPNamedShape shapeList; if (!shape) { return shapeList; } if (groupType == tigl::NAMED_COMPOUNDS) { BRep_Builder b; TopTools_IndexedMapOfShape faceMap; std::map<PNamedShape, TopoDS_Shape> map; TopExp::MapShapes(shape->Shape(), TopAbs_FACE, faceMap); if (faceMap.Extent() == 0) { // return the shape as is shapeList.push_back(shape); return shapeList; } for (int iface = 1; iface <= faceMap.Extent(); ++iface) { TopoDS_Face face = TopoDS::Face(faceMap(iface)); PNamedShape origin = shape->GetFaceTraits(iface-1).Origin(); std::map<PNamedShape, TopoDS_Shape>::iterator it = map.find(origin); if (it == map.end()) { TopoDS_Compound c; b.MakeCompound(c); b.Add(c, face); map[origin] = c; } else { TopoDS_Shape& c = it->second; b.Add(c, face); } } // create Named Shapes std::map<PNamedShape, TopoDS_Shape>::iterator it; for (it = map.begin(); it != map.end(); ++it) { PNamedShape origin = it->first; TopoDS_Shape toposhape = it->second; PNamedShape curshape; if (origin) { curshape = PNamedShape(new CNamedShape(toposhape, origin->Name())); curshape->SetShortName(origin->ShortName()); } else { curshape = PNamedShape(new CNamedShape(toposhape, shape->Name())); curshape->SetShortName(shape->ShortName()); } // set the original face traits CBooleanOperTools::AppendNamesToShape(shape, curshape); // make shells curshape = CBooleanOperTools::Shellify(curshape); shapeList.push_back(curshape); } } else if (groupType == tigl::WHOLE_SHAPE) { shapeList.push_back(shape); } else if (groupType == tigl::FACES) { // store each face as an own shape TopTools_IndexedMapOfShape faceMap; TopExp::MapShapes(shape->Shape(), TopAbs_FACE, faceMap); if (faceMap.Extent() == 0) { // return the shape as is shapeList.push_back(shape); return shapeList; } for (int iface = 1; iface <= faceMap.Extent(); ++iface) { TopoDS_Face face = TopoDS::Face(faceMap(iface)); const CFaceTraits& traits = shape->GetFaceTraits(iface-1); PNamedShape faceShape; if (traits.Origin()) { faceShape = PNamedShape(new CNamedShape(face, traits.Origin()->Name())); faceShape->SetShortName(traits.Origin()->ShortName()); } else { faceShape = PNamedShape(new CNamedShape(face, shape->Name())); faceShape->SetShortName(shape->ShortName()); } faceShape->SetFaceTraits(0, shape->GetFaceTraits(iface-1)); shapeList.push_back(faceShape); } } return shapeList; }