/** * @todo: it would be nice if this algorithm would support * some progress bar interface */ void CTiglFusePlane::Perform() { if (_hasPerformed) { return; } CTiglUIDManager& uidManager = _myconfig.GetUIDManager(); CTiglAbstractPhysicalComponent* rootComponent = uidManager.GetRootComponent(); if (!rootComponent) { LOG(ERROR) << "Root component of plane not found. Cannot create fused plane."; return; } _result = FuseWithChilds(rootComponent); CCPACSFarField& farfield = _myconfig.GetFarField(); if (farfield.GetFieldType() != NONE && (_mymode == FULL_PLANE_TRIMMED_FF || _mymode == HALF_PLANE_TRIMMED_FF)) { PNamedShape ff = farfield.GetLoft(); BOPCol_ListOfShape aLS; aLS.Append(_result->Shape()); aLS.Append(ff->Shape()); BOPAlgo_PaveFiller dsfill; dsfill.SetArguments(aLS); dsfill.Perform(); CTrimShape trim1(_result, ff, dsfill, INCLUDE); PNamedShape resulttrimmed = trim1.NamedShape(); CTrimShape trim2(ff, _result, dsfill, EXCLUDE); _farfield = trim2.NamedShape(); _result = resulttrimmed; // trim intersections with far field ListPNamedShape::iterator intIt = _intersections.begin(); ListPNamedShape newInts; for (; intIt != _intersections.end(); ++intIt) { PNamedShape inters = *intIt; if (!inters) { continue; } TopoDS_Shape sh = inters->Shape(); sh = BRepAlgoAPI_Common(sh, ff->Shape()); if (! sh.IsNull()) { inters->SetShape(sh); newInts.push_back(inters); } } _intersections = newInts; } if (_result) { _result->SetName(_myconfig.GetUID().c_str()); _result->SetShortName("AIRCRAFT"); } _hasPerformed = true; }
/// This is the actual fusing void CFuseShapes::DoFuse() { if (!_parent) { throw tigl::CTiglError("Null pointer for parent shape in CFuseShapes", TIGL_NULL_POINTER); } BRepBuilderAPI_Sewing shellMaker; _trimmedChilds.clear(); ListPNamedShape::const_iterator childIter; TrimOperation childTrim = EXCLUDE; TrimOperation parentTrim = EXCLUDE; // trim the childs with the parent and vice versa _trimmedParent = _parent->DeepCopy(); for (childIter = _childs.begin(); childIter != _childs.end(); ++childIter) { const PNamedShape child = *childIter; if (!child) { continue; } #ifdef DEBUG_BOP clock_t start, stop; start = clock(); #endif BOPCol_ListOfShape aLS; aLS.Append(_trimmedParent->Shape()); aLS.Append(child->Shape()); BOPAlgo_PaveFiller DSFill; DSFill.SetArguments(aLS); DSFill.Perform(); #ifdef DEBUG_BOP stop = clock(); printf("dsfiller [ms]: %f\n", (stop-start)/(double)CLOCKS_PER_SEC * 1000.); start = clock(); #endif // calculate intersection // Todo: make a new BOP out of this TopoDS_Shape intersection = BRepAlgoAPI_Section(_trimmedParent->Shape(), child->Shape(), DSFill); PNamedShape intersectionShape(new CNamedShape(intersection, std::string("INT" + std::string(_parent->Name()) + child->Name()).c_str())); intersectionShape->SetShortName(std::string("INT" + std::string(_parent->ShortName()) + child->ShortName()).c_str()); _intersections.push_back(intersectionShape); #ifdef DEBUG_BOP stop = clock(); printf("intersection [ms]: %f\n", (stop-start)/(double)CLOCKS_PER_SEC * 1000.); start = clock(); #endif _trimmedParent = CTrimShape(_trimmedParent, child, DSFill, parentTrim); #ifdef DEBUG_BOP stop = clock(); printf("parent split [ms]: %f\n", (stop-start)/(double)CLOCKS_PER_SEC * 1000.); start = clock(); #endif PNamedShape trimmedChild = CTrimShape(child, _parent, DSFill, childTrim); _trimmedChilds.push_back(trimmedChild); #ifdef DEBUG_BOP stop = clock(); printf("child split [ms]: %f\n", (stop-start)/(double)CLOCKS_PER_SEC * 1000.); #endif } // trimming // add trimmed child faces to result for (childIter = _trimmedChilds.begin(); childIter != _trimmedChilds.end(); ++childIter) { shellMaker.Add((*childIter)->Shape()); } // add trimmed parent faces to result shellMaker.Add(_trimmedParent->Shape()); shellMaker.Perform(); // make a solid out of the face collection TopoDS_Shape shell = shellMaker.SewedShape(); BRepSewingToBRepBuilderShapeAdapter sewerAdapter(shellMaker); // map names to shell PNamedShape resultShell(new CNamedShape(shell, "BOP_FUSE")); for (childIter = _trimmedChilds.begin(); childIter != _trimmedChilds.end(); ++childIter) { const PNamedShape child = *childIter; PNamedShape tmpshape(new CNamedShape(*child)); tmpshape->SetShape(shellMaker.ModifiedSubShape(child->Shape())); CBooleanOperTools::MapFaceNamesAfterBOP(sewerAdapter, tmpshape, resultShell); } PNamedShape tmpshape(new CNamedShape(*_trimmedParent)); tmpshape->SetShape(shellMaker.ModifiedSubShape(_trimmedParent->Shape())); CBooleanOperTools::MapFaceNamesAfterBOP(sewerAdapter, tmpshape, resultShell); // map names to solid BRepBuilderAPI_MakeSolid solidmaker; TopTools_IndexedMapOfShape shellMap; TopExp::MapShapes(resultShell->Shape(), TopAbs_SHELL, shellMap); for (int ishell = 1; ishell <= shellMap.Extent(); ++ishell) { const TopoDS_Shell& shell = TopoDS::Shell(shellMap(ishell)); solidmaker.Add(shell); } PNamedShape result(new CNamedShape(solidmaker.Solid(), resultShell->Name())); CBooleanOperTools::MapFaceNamesAfterBOP(solidmaker, resultShell, result); _resultshape = result; }