//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RimWellCollection::hasVisibleWellCells() { if (!this->isActive()) return false; if (this->wellCellsToRangeFilterMode() == RANGE_ADD_NONE) return false; if (this->wells().size() == 0 ) return false; bool hasCells = false; for (size_t i = 0 ; !hasCells && i < this->wells().size(); ++i) { RimWell* well = this->wells()[i]; if ( well && well->wellResults() && (well->showWellCells() || this->wellCellsToRangeFilterMode() == RANGE_ADD_ALL) ) { for (size_t tIdx = 0; !hasCells && tIdx < well->wellResults()->m_wellCellsTimeSteps.size(); ++tIdx ) { const RigWellResultFrame& wellResultFrame = well->wellResults()->m_wellCellsTimeSteps[tIdx]; for (size_t wsIdx = 0; !hasCells && wsIdx < wellResultFrame.m_wellResultBranches.size(); ++wsIdx) { if (wellResultFrame.m_wellResultBranches[wsIdx].m_wellCells.size() > 0 ) hasCells = true; } } } } if (!hasCells) return false; if (this->wellCellsToRangeFilterMode() == RANGE_ADD_INDIVIDUAL || this->wellCellsToRangeFilterMode() == RANGE_ADD_ALL) return true; // Todo: Handle range filter intersection return true; }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RivWellHeadPartMgr::buildWellHeadParts(size_t frameIndex) { m_wellHeadParts.clear(); if (m_rimReservoirView.isNull()) return; RigReservoir* rigReservoir = m_rimReservoirView->eclipseCase()->reservoirData(); RimWell* well = m_rimWell; RigWellResults* wellResults = well->wellResults(); if (wellResults->m_staticWellCells.m_wellResultBranches.size() == 0) { wellResults->computeStaticWellCellPath(); } if (wellResults->m_staticWellCells.m_wellResultBranches.size() == 0) return; if (!wellResults->hasWellResult(frameIndex)) return; const RigWellResultFrame& wellResultFrame = wellResults->wellResultFrame(frameIndex); const RigCell& whCell = rigReservoir->cellFromWellResultCell(wellResultFrame.m_wellHead); double characteristicCellSize = rigReservoir->mainGrid()->characteristicCellSize(); // Match this position with pipe start position in RivWellPipesPartMgr::calculateWellPipeCenterline() cvf::Vec3d whStartPos = whCell.faceCenter(cvf::StructGridInterface::NEG_K); whStartPos -= rigReservoir->mainGrid()->displayModelOffset(); whStartPos.transformPoint(m_scaleTransform->worldTransform()); cvf::Vec3d whEndPos = whStartPos; whEndPos.z() += characteristicCellSize * m_rimReservoirView->wellCollection()->wellHeadScaleFactor(); cvf::Vec3d arrowPosition = whEndPos; arrowPosition.z() += 2.0; // Well head pipe geometry { cvf::ref<cvf::Vec3dArray> wellHeadPipeCoords = new cvf::Vec3dArray; wellHeadPipeCoords->resize(2); wellHeadPipeCoords->set(0, whStartPos); wellHeadPipeCoords->set(1, whEndPos); cvf::ref<RivPipeGeometryGenerator> pipeGeomGenerator = new RivPipeGeometryGenerator; pipeGeomGenerator->setPipeCenterCoords(wellHeadPipeCoords.p()); pipeGeomGenerator->setPipeColor(well->wellPipeColor()); pipeGeomGenerator->setCrossSectionVertexCount(m_rimReservoirView->wellCollection()->pipeCrossSectionVertexCount()); double pipeRadius = m_rimReservoirView->wellCollection()->pipeRadiusScaleFactor() * m_rimWell->pipeRadiusScaleFactor() * characteristicCellSize; pipeGeomGenerator->setRadius(pipeRadius); cvf::ref<cvf::DrawableGeo> pipeSurface = pipeGeomGenerator->createPipeSurface(); cvf::ref<cvf::DrawableGeo> centerLineDrawable = pipeGeomGenerator->createCenterLine(); if (pipeSurface.notNull()) { cvf::ref<cvf::Part> part = new cvf::Part; part->setName("RivWellHeadPartMgr: surface " + cvfqt::Utils::fromQString(well->name())); part->setDrawable(pipeSurface.p()); caf::SurfaceEffectGenerator surfaceGen(cvf::Color4f(well->wellPipeColor()), true); cvf::ref<cvf::Effect> eff = surfaceGen.generateEffect(); part->setEffect(eff.p()); m_wellHeadParts.push_back(part.p()); } if (centerLineDrawable.notNull()) { cvf::ref<cvf::Part> part = new cvf::Part; part->setName("RivWellHeadPartMgr: centerline " + cvfqt::Utils::fromQString(well->name())); part->setDrawable(centerLineDrawable.p()); caf::MeshEffectGenerator meshGen(well->wellPipeColor()); cvf::ref<cvf::Effect> eff = meshGen.generateEffect(); part->setEffect(eff.p()); m_wellHeadParts.push_back(part.p()); } } double arrowLength = characteristicCellSize * m_rimReservoirView->wellCollection()->wellHeadScaleFactor(); cvf::Vec3d textPosition = arrowPosition; textPosition.z() += 1.2 * arrowLength; cvf::Mat4f matr; if (wellResultFrame.m_productionType != RigWellResultFrame::PRODUCER) { matr = cvf::Mat4f::fromRotation(cvf::Vec3f(1.0f, 0.0f, 0.0f), cvf::Math::toRadians(180.0f)); } double ijScaleFactor = arrowLength / 6; matr(0, 0) *= ijScaleFactor; matr(1, 1) *= ijScaleFactor; matr(2, 2) *= arrowLength; if (wellResultFrame.m_productionType != RigWellResultFrame::PRODUCER) { arrowPosition.z() += arrowLength; } matr.setTranslation(cvf::Vec3f(arrowPosition)); cvf::GeometryBuilderFaceList builder; cvf::ArrowGenerator gen; gen.setShaftRelativeRadius(0.5f); gen.setHeadRelativeRadius(1.0f); gen.setHeadRelativeLength(0.4f); gen.setNumSlices(m_rimReservoirView->wellCollection()->pipeCrossSectionVertexCount()); gen.generate(&builder); cvf::ref<cvf::Vec3fArray> vertices = builder.vertices(); cvf::ref<cvf::UIntArray> faceList = builder.faceList(); size_t i; for (i = 0; i < vertices->size(); i++) { cvf::Vec3f v = vertices->get(i); v.transformPoint(matr); vertices->set(i, v); } cvf::ref<cvf::DrawableGeo> geo1 = new cvf::DrawableGeo; geo1->setVertexArray(vertices.p()); geo1->setFromFaceList(*faceList); geo1->computeNormals(); { cvf::ref<cvf::Part> part = new cvf::Part; part->setName("RivWellHeadPartMgr: arrow " + cvfqt::Utils::fromQString(well->name())); part->setDrawable(geo1.p()); cvf::Color4f headColor(cvf::Color3::GRAY); if (wellResultFrame.m_isOpen) { if (wellResultFrame.m_productionType == RigWellResultFrame::PRODUCER) { headColor = cvf::Color4f(cvf::Color3::GREEN); } else if (wellResultFrame.m_productionType == RigWellResultFrame::OIL_INJECTOR) { headColor = cvf::Color4f(cvf::Color3::ORANGE); } else if (wellResultFrame.m_productionType == RigWellResultFrame::GAS_INJECTOR) { headColor = cvf::Color4f(cvf::Color3::RED); } else if (wellResultFrame.m_productionType == RigWellResultFrame::WATER_INJECTOR) { headColor = cvf::Color4f(cvf::Color3::BLUE); } } caf::SurfaceEffectGenerator surfaceGen(headColor, true); cvf::ref<cvf::Effect> eff = surfaceGen.generateEffect(); part->setEffect(eff.p()); m_wellHeadParts.push_back(part.p()); } if (m_rimReservoirView->wellCollection()->showWellLabel() && well->showWellLabel()) { cvf::ref<cvf::DrawableText> drawableText = new cvf::DrawableText; drawableText->setFont(m_font.p()); drawableText->setCheckPosVisible(false); drawableText->setDrawBorder(false); drawableText->setDrawBackground(false); drawableText->setVerticalAlignment(cvf::TextDrawer::CENTER); drawableText->setTextColor(cvf::Color3::WHITE); cvf::String cvfString = cvfqt::Utils::fromQString(well->name()); cvf::Vec3f textCoord(textPosition); drawableText->addText(cvfString, textCoord); cvf::ref<cvf::Part> part = new cvf::Part; part->setName("RivWellHeadPartMgr: text " + cvfString); part->setDrawable(drawableText.p()); cvf::ref<cvf::Effect> eff = new cvf::Effect; part->setEffect(eff.p()); part->setPriority(1); m_wellHeadParts.push_back(part.p()); } }