diff --git a/src/Implementation/CMediaRessourceVectorImpl.cpp b/src/Implementation/CMediaRessourceVectorImpl.cpp index 39f0a5f4..4503ca51 100644 --- a/src/Implementation/CMediaRessourceVectorImpl.cpp +++ b/src/Implementation/CMediaRessourceVectorImpl.cpp @@ -1080,9 +1080,12 @@ VectorworksMVR::VCOMError VectorworksMVR::CMediaRessourceVectorImpl::GetDataProv VectorworksMVR::VCOMError VectorworksMVR::CMediaRessourceVectorImpl::GetPositionObjectCount(size_t& outCount) { outCount = 0; - for (SceneData::SceneDataAuxObjPtr auxObj : fExchangeObj.GetAuxDataObjects()) + for ( SceneData::SceneDataAuxObjPtr auxObj : fExchangeObj.GetAuxDataObjects() ) { - if (auxObj->GetObjectType() == SceneData::ESceneDataObjectType::ePosition) { outCount++; } + if ( auxObj->GetObjectType() == SceneData::ESceneDataObjectType::ePosition ) + { + outCount++; + } } return kVCOMError_NoError; @@ -1092,32 +1095,35 @@ VectorworksMVR::VCOMError VectorworksMVR::CMediaRessourceVectorImpl::GetPosition { // Prepare a var for local counting size_t positionCount = 0; - + // Now cycle thru aux data - for (SceneData::SceneDataAuxObjPtr auxObj : fExchangeObj.GetAuxDataObjects()) + for ( SceneData::SceneDataAuxObjPtr auxObj : fExchangeObj.GetAuxDataObjects() ) { - if (auxObj->GetObjectType() == SceneData::ESceneDataObjectType::ePosition) + if ( auxObj->GetObjectType() == SceneData::ESceneDataObjectType::ePosition ) { - if (at == positionCount) + if ( at == positionCount ) { // Do the cast - SceneData::SceneDataPositionObjPtr scPosition = static_cast(auxObj); - ASSERTN(kEveryone, scPosition != nullptr); - if (!scPosition) { return kVCOMError_Failed; } - - + SceneData::SceneDataPositionObjPtr scPosition = static_cast( auxObj ); + ASSERTN( kEveryone, scPosition != nullptr ); + if ( !scPosition ) + { + return kVCOMError_Failed; + } + + //--------------------------------------------------------------------------- // Initialize Object CPositionImpl* pPosition = nullptr; - + // Query Interface - if (VCOM_SUCCEEDED(VWQueryInterface(IID_PositionObj, (IVWUnknown**) & pPosition))) + if ( VCOM_SUCCEEDED( VWQueryInterface( IID_PositionObj, (IVWUnknown**) &pPosition ) ) ) { // Check Casting - CPositionImpl* pResultInterface = static_cast(pPosition); - if (pResultInterface) + CPositionImpl* pResultInterface = static_cast( pPosition ); + if ( pResultInterface ) { - pResultInterface->SetPointer(scPosition); + pResultInterface->SetPointer( scPosition ); } else { @@ -1126,23 +1132,20 @@ VectorworksMVR::VCOMError VectorworksMVR::CMediaRessourceVectorImpl::GetPosition return kVCOMError_NoInterface; } } - + //--------------------------------------------------------------------------- // Check Incomming Object - if (*outPosition) + if ( *outPosition ) { - (*outPosition)->Release(); + ( *outPosition )->Release(); *outPosition = NULL; } - + //--------------------------------------------------------------------------- // Set Out Value *outPosition = pPosition; return kVCOMError_NoError; } - - // Increase position count - positionCount++; } } @@ -1152,71 +1155,59 @@ VectorworksMVR::VCOMError VectorworksMVR::CMediaRessourceVectorImpl::GetPosition VectorworksMVR::VCOMError VectorworksMVR::CMediaRessourceVectorImpl::GetSymDefCount(size_t& outCount) { - outCount = 0; - for (SceneData::SceneDataAuxObjPtr auxObj : fExchangeObj.GetAuxDataObjects()) - { - if (auxObj->GetObjectType() == SceneData::ESceneDataObjectType::eSymDef) { outCount++; } - } + outCount = fExchangeObj.GetSymDefObjects().size(); return kVCOMError_NoError; } VectorworksMVR::VCOMError VectorworksMVR::CMediaRessourceVectorImpl::GetSymDefAt(size_t at, ISymDef** outSymDef) { - // Prepare a var for local counting - size_t symDefCount = 0; - - // Now cycle thru aux data - for (SceneData::SceneDataAuxObjPtr auxObj : fExchangeObj.GetAuxDataObjects()) + const auto auxObj = fExchangeObj.GetSymDefObjects().at(at); + + if ( auxObj->GetObjectType() == SceneData::ESceneDataObjectType::eSymDef ) { - if (auxObj->GetObjectType() == SceneData::ESceneDataObjectType::eSymDef) + // Do the cast + SceneData::SceneDataSymDefObjPtr scSymDef = static_cast( auxObj ); + ASSERTN( kEveryone, scSymDef != nullptr ); + if ( !scSymDef ) { - if (at == symDefCount) + return kVCOMError_Failed; + } + + + //--------------------------------------------------------------------------- + // Initialize Object + CSymDefImpl* pSymDef = nullptr; + + // Query Interface + if ( VCOM_SUCCEEDED( VWQueryInterface( IID_ISymDef, (IVWUnknown**) &pSymDef ) ) ) + { + // Check Casting + CSymDefImpl* pResultInterface = static_cast( pSymDef ); + if ( pResultInterface ) { - // Do the cast - SceneData::SceneDataSymDefObjPtr scSymDef = static_cast(auxObj); - ASSERTN(kEveryone, scSymDef != nullptr); - if (!scSymDef) { return kVCOMError_Failed; } - - - //--------------------------------------------------------------------------- - // Initialize Object - CSymDefImpl* pSymDef = nullptr; - - // Query Interface - if (VCOM_SUCCEEDED(VWQueryInterface(IID_ISymDef, (IVWUnknown**) & pSymDef))) - { - // Check Casting - CSymDefImpl* pResultInterface = static_cast(pSymDef); - if (pResultInterface) - { - pResultInterface->SetPointer(scSymDef, GetExchangeObj()); - } - else - { - pResultInterface->Release(); - pResultInterface = nullptr; - return kVCOMError_NoInterface; - } - } - - //--------------------------------------------------------------------------- - // Check Incomming Object - if (*outSymDef) - { - (*outSymDef)->Release(); - *outSymDef = NULL; - } - - //--------------------------------------------------------------------------- - // Set Out Value - *outSymDef = pSymDef; - return kVCOMError_NoError; + pResultInterface->SetPointer( scSymDef, GetExchangeObj() ); + } + else + { + pResultInterface->Release(); + pResultInterface = nullptr; + return kVCOMError_NoInterface; } - - // Increase position count - symDefCount++; } + + //--------------------------------------------------------------------------- + // Check Incomming Object + if ( *outSymDef ) + { + ( *outSymDef )->Release(); + *outSymDef = NULL; + } + + //--------------------------------------------------------------------------- + // Set Out Value + *outSymDef = pSymDef; + return kVCOMError_NoError; } DSTOP((kEveryone,"Get Position is out of bounds!")); diff --git a/src/Implementation/CSymDefImpl.cpp b/src/Implementation/CSymDefImpl.cpp index 5e7bff67..4d385db9 100644 --- a/src/Implementation/CSymDefImpl.cpp +++ b/src/Implementation/CSymDefImpl.cpp @@ -113,6 +113,23 @@ VectorworksMVR::VCOMError VectorworksMVR::CSymDefImpl::GetGeometryAt(size_t at, return kVCOMError_NoError; } + +VectorworksMVR::VCOMError VectorworksMVR::CSymDefImpl::GetIsContaingSymbolGeomtery( bool& isContaining ) +{ + //------------------------------------------------------------------------------------------ + // Check if this is initialized + ASSERTN(kEveryone,fPtr); + if( ! fPtr) return kVCOMError_NotInitialized; + + ASSERTN(kEveryone,fContext); + if( ! fContext) return kVCOMError_NotInitialized; + + + isContaining = fPtr->IsContaingSymbolGeometry(); + + return kVCOMError_NoError; +} + VectorworksMVR::VCOMError VectorworksMVR::CSymDefImpl::AddGeometry(const STransformMatrix& scMatrix, MvrString fileName) { //--------------------------------------------------------------------------- diff --git a/src/Implementation/CSymDefImpl.h b/src/Implementation/CSymDefImpl.h index f48586c4..1207cf7d 100644 --- a/src/Implementation/CSymDefImpl.h +++ b/src/Implementation/CSymDefImpl.h @@ -19,6 +19,7 @@ namespace VectorworksMVR virtual MvrString VCOM_CALLTYPE GetName(); virtual VCOMError VCOM_CALLTYPE GetGeometryCount(size_t& outCount) ; virtual VCOMError VCOM_CALLTYPE GetGeometryAt(size_t at, IGeometryReference** outGeometryRef) ; + virtual VCOMError VCOM_CALLTYPE GetIsContaingSymbolGeomtery( bool& isContaining ); virtual VCOMError VCOM_CALLTYPE AddGeometry(const STransformMatrix& geometry, MvrString fileName); virtual VCOMError VCOM_CALLTYPE AddSymbol(const MvrUUID& guid, const STransformMatrix& geometry, ISymDef* symDef); diff --git a/src/Include/IMediaRessourceVectorInterface.h b/src/Include/IMediaRessourceVectorInterface.h index 263400cc..fab9a38d 100644 --- a/src/Include/IMediaRessourceVectorInterface.h +++ b/src/Include/IMediaRessourceVectorInterface.h @@ -191,6 +191,7 @@ namespace VectorworksMVR virtual MvrString VCOM_CALLTYPE GetName() = 0; virtual VCOMError VCOM_CALLTYPE GetGeometryCount(size_t& outCount) = 0; virtual VCOMError VCOM_CALLTYPE GetGeometryAt(size_t at, IGeometryReference** outGeometryRef) = 0; + virtual VCOMError VCOM_CALLTYPE GetIsContaingSymbolGeomtery( bool& isContaining ) = 0; virtual VCOMError VCOM_CALLTYPE AddGeometry(const STransformMatrix& geometry, MvrString fileName) = 0; virtual VCOMError VCOM_CALLTYPE AddSymbol(const MvrUUID& guid, const STransformMatrix& geometry, ISymDef* symDef) = 0; diff --git a/src/SceneDataExchange.cpp b/src/SceneDataExchange.cpp index 62c4c895..6e66fb38 100644 --- a/src/SceneDataExchange.cpp +++ b/src/SceneDataExchange.cpp @@ -514,6 +514,7 @@ void SceneDataSymDefObj::OnReadFromNode(const IXMLFileNodePtr& pNode, SceneDataE SceneDataSymbolObjPtr symbol = new SceneDataSymbolObj(uuidSymbol); symbol->ReadFromNode(objNode, exchange); fGeometries.push_back(symbol); + fContainsSymbolGeometry = true; } else { @@ -552,6 +553,11 @@ void SceneDataSymDefObj::Add(SceneDataGeoInstanceObjPtr object) } +bool SceneDataSymDefObj::IsContaingSymbolGeometry() const +{ + return fContainsSymbolGeometry; +} + // ---------------------------------------------------------------------------------------------------------------------------------- // SceneDataSymDefObj SceneDataPositionObj::SceneDataPositionObj(const SceneDataGUID& guid) : SceneDataAuxObj(guid) @@ -2880,7 +2886,8 @@ SceneDataExchange::~SceneDataExchange() { fFilesInZip[i]->DeleteOnDisk(); } - + + fSymDefObjs.clear(); for (SceneDataObjWithMatrixPtr childObj : fChildObjs ) { delete childObj; } for (SceneDataAuxObjPtr childAux : fAuxDataObjs ) { delete childAux; } for (SceneDataProviderObjPtr childPro : fProviderObjs ) { delete childPro; } @@ -2921,6 +2928,11 @@ SceneDataObjWithMatrixArray& SceneDataExchange::GetSceneDataObjects() return fSceneObjects; } +SceneDataAuxObjArray& SceneDataExchange::GetSymDefObjects() +{ + return fSymDefObjs; +} + SceneDataSymDefObjPtr SceneDataExchange::GetSymDefByUUID(const SceneDataGUID& guid) { for (SceneDataAuxObjPtr auxObj: fAuxDataObjs) @@ -2990,6 +3002,7 @@ SceneDataSymDefObjPtr SceneDataExchange::ReadSymDefObject(const IXMLFileNodePtr& newSymDef->ReadFromNode(node, this); fAuxDataObjs.push_back(newSymDef); + fSymDefObjs.push_back( newSymDef ); fSymDefMap[uuid] = newSymDef; return newSymDef; diff --git a/src/SceneDataExchange.h b/src/SceneDataExchange.h index 933b96eb..7fc48e2e 100644 --- a/src/SceneDataExchange.h +++ b/src/SceneDataExchange.h @@ -205,10 +205,12 @@ namespace SceneData private: SceneDataGeometryObjArray fGeometries; + bool fContainsSymbolGeometry = false; public: const SceneDataGeometryObjArray& getGeometryArray() const; void Add(SceneDataGeoInstanceObjPtr object); + bool IsContaingSymbolGeometry() const; protected: virtual TXString GetNodeName(); @@ -976,7 +978,7 @@ namespace SceneData SceneDataProviderObjArray fProviderObjs; SceneDataAuxObjArray fAuxDataObjs; SceneDataObjWithMatrixArray fChildObjs; - + SceneDataAuxObjArray fSymDefObjs; // Arrays for eachobject typ e SceneDataObjWithMatrixArray fSceneObjects; @@ -1028,7 +1030,8 @@ namespace SceneData SceneDataProviderObjArray& GetProviderObjects(); SceneDataAuxObjArray& GetAuxDataObjects(); SceneDataObjWithMatrixArray& GetChildObjects(); - + SceneDataAuxObjArray& GetSymDefObjects(); + SceneDataObjWithMatrixArray& GetSceneDataObjects(); private: