///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2017 Statoil ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #pragma once #include "RimCheckableNamedObject.h" #include "Rim3dPropertiesInterface.h" #include "RimFishbonesPipeProperties.h" #include "RiaEclipseUnitTools.h" #include "cvfBase.h" #include "cvfVector3.h" #include "cvfColor3.h" // Include to make Pdm work for cvf::Color #include "cafPdmFieldCvfColor.h" #include "cafPdmChildField.h" #include "cafPdmProxyValueField.h" #include #include class RigFisbonesGeometry; //================================================================================================== /// /// //================================================================================================== struct SubLateralIndex { size_t subIndex; std::vector lateralIndices; }; //================================================================================================== /// /// //================================================================================================== class RimFishbonesMultipleSubs : public caf::PdmObject, public Rim3dPropertiesInterface { CAF_PDM_HEADER_INIT; public: enum LocationType { FB_SUB_COUNT_END, FB_SUB_SPACING_END, FB_SUB_USER_DEFINED }; enum LateralsOrientationType { FB_LATERAL_ORIENTATION_FIXED, FB_LATERAL_ORIENTATION_RANDOM }; public: RimFishbonesMultipleSubs(); virtual ~RimFishbonesMultipleSubs(); bool isActive() const; QString generatedName() const; void setMeasuredDepthAndCount(double measuredDepth, double spacing, int subCount); double measuredDepth(size_t subIndex) const; double rotationAngle(size_t subIndex) const; double startOfSubMD() const; double endOfSubMD() const; double exitAngle() const; double buildAngle() const; double tubingDiameter(RiaEclipseUnitTools::UnitSystem unitSystem) const; double holeDiameter(RiaEclipseUnitTools::UnitSystem unitSystem) const { return m_pipeProperties()->holeDiameter(unitSystem); } double effectiveDiameter(RiaEclipseUnitTools::UnitSystem unitSystem) const; double skinFactor() const { return m_pipeProperties()->skinFactor(); } double openHoleRoughnessFactor(RiaEclipseUnitTools::UnitSystem unitSystem) const; double icdOrificeDiameter(RiaEclipseUnitTools::UnitSystem unitSystem) const; double icdFlowCoefficient() const { return m_icdFlowCoefficient(); } size_t icdCount() const { return m_icdCount(); } std::vector lateralLengths() const; const std::vector& installedLateralIndices() const { return m_subLateralIndices; }; std::vector coordsForLateral(size_t subIndex, size_t lateralIndex) const; std::vector> coordsAndMDForLateral(size_t subIndex, size_t lateralIndex) const; void recomputeLateralLocations(); void setUnitSystemSpecificDefaults(); // Override from Rim3dPropertiesInterface virtual cvf::BoundingBox boundingBoxInDomainCoords() const override; public: caf::PdmField fishbonesColor; protected: virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; virtual caf::PdmFieldHandle* userDescriptionField() override; virtual caf::PdmFieldHandle* objectToggleField() override; virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override; virtual void initAfterRead() override; private: void computeRangesAndLocations(); void computeRotationAngles(); void computeSubLateralIndices(); static std::vector locationsFromStartSpacingAndCount(double start, double spacing, size_t count); static int randomValueFromRange(int min, int max); private: caf::PdmField m_isActive; caf::PdmProxyValueField m_name; caf::PdmField m_lateralCountPerSub; caf::PdmField m_lateralLength; caf::PdmField m_lateralExitAngle; caf::PdmField m_lateralBuildAngle; caf::PdmField m_lateralTubingDiameter; caf::PdmField m_lateralOpenHoleRoghnessFactor; caf::PdmField m_lateralTubingRoghnessFactor; caf::PdmField m_lateralInstallSuccessFraction; caf::PdmField m_icdCount; caf::PdmField m_icdOrificeDiameter; caf::PdmField m_icdFlowCoefficient; caf::PdmField > m_subsLocationMode; caf::PdmField m_rangeStart; caf::PdmField m_rangeEnd; caf::PdmField m_rangeSubSpacing; caf::PdmField m_rangeSubCount; caf::PdmField > m_subsOrientationMode; caf::PdmField> m_locationOfSubs; // Given in measured depth caf::PdmField> m_installationRotationAngles; caf::PdmField m_fixedInstallationRotationAngle; caf::PdmChildField m_pipeProperties; caf::PdmField m_randomSeed; std::unique_ptr m_rigFishbonesGeometry; std::vector m_subLateralIndices; };