/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2025, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Open Design Alliance software pursuant to a license // agreement with Open Design Alliance. // Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// #include "OdaCommon.h" #include "daiUtils/daiUtils.h" // getStepLine #include "IfcFile.h" #include "ExBcfTutorials.h" #include "BCF_2_1/Bcf_2_1Module.h" #include "BCF_2_1/Bcf_2_1GUIDAttribute.h" #include "BCF_2_1/Bcf_2_1Session.h" #include "BCF_2_1/Bcf_2_1DataAccessor.h" #include "BCF_2_1/Bcf_2_1DataAccessorXml.h" #include "BCF_2_1/Bcf_2_1Archive.h" #include "BCFCommon/BcfArchiveFolder.h" #include "BCF_2_1/Bcf_2_1TopicFolder.h" #include "BCF_2_1/Bcf_2_1File.h" #include "BCF_2_1/Bcf_2_1Markup.h" #include "BCF_2_1/Bcf_2_1Header.h" #include "BCF_2_1/Bcf_2_1Comment.h" #include "BcfTimeStamp.h" #include "BCF_2_1/Bcf_2_1Viewpoint.h" #include "BCFCommon/BcfCommonModule.h" #include "BCF_2_1/Bcf_2_1Project.h" #include "BCF_2_1/Bcf_2_1ProjectExtension.h" #include "BCF_2_1/Bcf_2_1Version.h" #include "BCF_2_1/Bcf_2_1Topic.h" #include "BCF_2_1/Bcf_2_1VisualizationInfo.h" #include "BCF_2_1/Bcf_2_1OrthogonalCamera.h" #include "BCF_2_1/Bcf_2_1PerspectiveCamera.h" #include "BCF_2_1/Bcf_2_1Point.h" #include "BCF_2_1/Bcf_2_1Direction.h" #include "BCF_3_0/Bcf_3_0DataAccessor.h" #include "BCF_3_0/Bcf_3_0DataAccessorXml.h" #include "BCF_3_0/Bcf_3_0Session.h" #include "BCF_3_0/Bcf_3_0Archive.h" #include "BCF_3_0/Bcf_3_0TopicFolder.h" #include "BCF_3_0/Bcf_3_0Elements.h" #include "BCFTools/BcfToolsModule.h" #include "BCFTools/BcfLoader.h" using namespace OdIfc; int bcfTutorial_Dump(const MyServices &svcs, const OdString& bcfFileName, const OdString& bcfOutFileName, OdString workFolder) { if (workFolder.isEmpty()) { workFolder = svcs.getTemporaryPath(); } /**********************************************************************/ /* Initialize BCF */ /**********************************************************************/ odBcfToolsInitialize(kVersionBcfAll); try { OdBcf::OdBcfDataAccessorPtr pDataAccessor = OdBcfTools::OdBcfLoader::openProject(bcfFileName, workFolder); if (pDataAccessor->getBcfFileVersion() == BcfVersionNumbers[kVersionBcf_2_1]) { OdBcf_2_1::OdBcfDataAccessorPtr pAccessor = OdBcf_2_1::OdBcfDataAccessorXml::cast(pDataAccessor); const OdBcf_2_1::OdBcfArchivePtr pArchive = pAccessor->getArchive(bcfFileName); OdString rootDir = pArchive->getRootDir()->getFolder(); // // Dump topics // const OdBcf_2_1::OdBcfTopicFolderMap& topicFolders = pArchive->getTopics(); for (const auto& node : topicFolders) { OdString strGUID = node.first.toString(); odPrintConsoleString(OD_T("\nTopicFolder GUID: %s\n"), strGUID.c_str()); OdBcf_2_1::OdBcfTopicFolderPtr topicFolder = node.second; OdBcf_2_1::OdBcfMarkupPtr markup = topicFolder->getMarkup(); const OdBcf_2_1::OdBcfTopicPtr topic = markup->getTopic(); odPrintConsoleString(OD_T(" GUID: %s\n"), topic->getGuid().toString().c_str()); odPrintConsoleString(OD_T(" Title: %s\n"), topic->getTitle().c_str()); odPrintConsoleString(OD_T(" CreationAuthor: %s\n"), topic->getCreationAuthor().c_str()); odPrintConsoleString(OD_T(" Priority: %s\n"), topic->getPriority().c_str()); odPrintConsoleString(OD_T(" Index: %d\n"), topic->getIndex()); odPrintConsoleString(OD_T(" CreationDate: %s\n"), topic->getCreationDate()->toString().c_str()); if (!topic->getModifiedDate().isNull()) odPrintConsoleString(OD_T(" ModifiedDate: %s\n"), topic->getModifiedDate()->toString().c_str()); if (!topic->getDueDate().isNull()) odPrintConsoleString(OD_T(" DueDate: %s\n"), topic->getDueDate()->toString().c_str()); odPrintConsoleString(OD_T(" AssignedTo: %s\n"), topic->getAssignedTo().c_str()); odPrintConsoleString(OD_T(" Description: %s\n"), topic->getDescription().c_str()); const OdBcf_2_1::OdBcfCommentArray& comments = markup->getComment(); if (comments.size() > 0) { odPrintConsoleString(OD_T(" Comments (%d):\n"), comments.size()); for (const OdBcf_2_1::OdBcfCommentPtr& comment : comments) { odPrintConsoleString(OD_T(" Date: %s\n"), comment->getDate()->toString().c_str()); odPrintConsoleString(OD_T(" Author: %s\n"), comment->getAuthor().c_str()); odPrintConsoleString(OD_T(" Comment: %s\n"), comment->getComment().c_str()); const OdBcf_2_1::OdBcfGUIDAttributePtr viewpointGuidAttribute = comment->getViewpoint(); if (!viewpointGuidAttribute.isNull() && viewpointGuidAttribute->validate()) { odPrintConsoleString(OD_T(" Viewpoint GUID: %s (let's find into Markup.Viewpoints)\n"), viewpointGuidAttribute->getGuid().toString().c_str()); const OdBcf_2_1::OdBcfViewPointArray& viewPoints = markup->getViewpoints(); for (const auto& viewPoint : viewPoints) { if (viewPoint->getGuid() == viewpointGuidAttribute->getGuid()) { odPrintConsoleString(OD_T(" Index: %d\n"), viewPoint->getIndex()); odPrintConsoleString(OD_T(" Viewpoint: %s\n"), viewPoint->getViewpoint().c_str()); odPrintConsoleString(OD_T(" Snapshot: %s\n"), viewPoint->getSnapshot().c_str()); } } } // ... odPrintConsoleString(OD_T("\n")); } } odPrintConsoleString(OD_T("==================================\n")); } if (!bcfOutFileName.isEmpty()) { odPrintConsoleString(OD_T("Writing BCF Project to: %s..."), bcfOutFileName.c_str()); if (eOk == pAccessor->putArchive(bcfOutFileName, pArchive)) { odPrintConsoleString(OD_T(" ok\n")); } else { odPrintConsoleString(OD_T(" failed\n")); } } } else if (pDataAccessor->getBcfFileVersion() == BcfVersionNumbers[kVersionBcf_3_0]) { OdBcf_3_0::OdBcfDataAccessorPtr pAccessor = OdBcf_3_0::OdBcfDataAccessorXml::cast(pDataAccessor); const OdBcf_3_0::OdBcfArchivePtr pArchive = pAccessor->getArchive(bcfFileName); OdString rootDir = pArchive->getRootDir()->getFolder(); // // Dump topics // const OdBcf_3_0::OdBcfTopicFolderMap& topicFolders = pArchive->getTopics(); for (const auto& node : topicFolders) { OdString strGUID = node.first.toString(); odPrintConsoleString(OD_T("\nTopicFolder GUID: %s\n"), strGUID.c_str()); OdBcf_3_0::OdBcfTopicFolderPtr topicFolder = node.second; OdBcf_3_0::OdBcfMarkupPtr markup = topicFolder->getMarkup(); const OdBcf_3_0::OdBcfTopicPtr topic = markup->getTopic(); odPrintConsoleString(OD_T(" GUID: %s\n"), topic->getGuid().toString().c_str()); odPrintConsoleString(OD_T(" Title: %s\n"), topic->getTitle().c_str()); odPrintConsoleString(OD_T(" CreationAuthor: %s\n"), topic->getCreationAuthor().c_str()); odPrintConsoleString(OD_T(" Priority: %s\n"), topic->getPriority().c_str()); odPrintConsoleString(OD_T(" Index: %d\n"), topic->getIndex()); odPrintConsoleString(OD_T(" CreationDate: %s\n"), topic->getCreationDate()->toString().c_str()); if (!topic->getModifiedDate().isNull()) odPrintConsoleString(OD_T(" ModifiedDate: %s\n"), topic->getModifiedDate()->toString().c_str()); if (!topic->getDueDate().isNull()) odPrintConsoleString(OD_T(" DueDate: %s\n"), topic->getDueDate()->toString().c_str()); odPrintConsoleString(OD_T(" AssignedTo: %s\n"), topic->getAssignedTo().c_str()); odPrintConsoleString(OD_T(" Description: %s\n"), topic->getDescription().c_str()); const OdBcf_3_0::OdBcfCommentsPtr comments = topic->getComments(); if (!comments.isNull()) { const OdBcf_3_0::OdBcfCommentArray& comment = comments->getComment(); if (comment.size() > 0) { odPrintConsoleString(OD_T(" Comments (%d):\n"), comment.size()); for (const OdBcf_3_0::OdBcfCommentPtr& commentVal : comment) { odPrintConsoleString(OD_T(" Date: %s\n"), commentVal->getDate()->toString().c_str()); odPrintConsoleString(OD_T(" Author: %s\n"), commentVal->getAuthor().c_str()); odPrintConsoleString(OD_T(" Comment: %s\n"), commentVal->getComment().c_str()); const OdBcf_3_0::OdBcfGUIDAttributePtr viewpointGuidAttribute = commentVal->getViewpoint(); if (!viewpointGuidAttribute.isNull() && viewpointGuidAttribute->validate()) { odPrintConsoleString(OD_T(" Viewpoint GUID: %s (let's find into Markup.Viewpoints)\n"), viewpointGuidAttribute->getGuid().toString().c_str()); const OdBcf_3_0::OdBcfViewpointsPtr pViewpoints = topic->getViewpoints(); if (!pViewpoints.isNull()) { const OdBcf_3_0::OdBcfViewPointArray& viewPoints = pViewpoints->getViewPoint(); for (const auto& viewPoint : viewPoints) { if (viewPoint->getGuid() == viewpointGuidAttribute->getGuid()) { odPrintConsoleString(OD_T(" Index: %d\n"), viewPoint->getIndex()); odPrintConsoleString(OD_T(" Viewpoint: %s\n"), viewPoint->getViewpoint().c_str()); odPrintConsoleString(OD_T(" Snapshot: %s\n"), viewPoint->getSnapshot().c_str()); } } } } // ... odPrintConsoleString(OD_T("\n")); } } } odPrintConsoleString(OD_T("==================================\n")); } if (!bcfOutFileName.isEmpty()) { odPrintConsoleString(OD_T("Writing BCF Project to: %s..."), bcfOutFileName.c_str()); if (eOk == pAccessor->putArchive(bcfOutFileName, pArchive)) { odPrintConsoleString(OD_T(" ok\n")); } else { odPrintConsoleString(OD_T(" failed\n")); } } } else { throw("Unsupported file version"); } } catch (OdError& e) { odPrintConsoleString(OD_T("\nError: %ls\n"), e.description().c_str()); } catch (...) { odPrintConsoleString(OD_T("\nUnknown Error.\n")); } /**********************************************************************/ /* Uninitialize BCF */ /**********************************************************************/ odBcfToolsUninitialize(); return 0; } BcfTutorial_Dump::BcfTutorial_Dump(const OdString& tutorialCommand) : BaseIfcTutorial(tutorialCommand) { m_tutorialArgsParser .add_param( std::make_shared>(m_bcfFileName, "bcfFileName", "input bcf file", false)); m_tutorialArgsParser .add_param( std::make_shared>(m_bcfOutFileName, "outFileName", "output file name")); m_tutorialArgsParser .add_param( std::make_shared>(m_workFolder, "workFolder", "work folder")); m_noWait = false; m_tutorialArgsParser .add_param( std::make_shared(m_noWait, "-NoWait", "disable \"press any key\" on finish.")); } int BcfTutorial_Dump::run(const MyServices& svcs, const std::vector& argv, std::ostream& resultStream) { if (BaseIfcTutorial::run(svcs, argv, resultStream)) { return 1; } return bcfTutorial_Dump(svcs, m_bcfFileName, m_bcfOutFileName, m_workFolder); } namespace { OdString createUniqueName() { return ::odrxSystemServices()->createOdGUID().toString(); } OdString addUnqiuePath(const OdString& dir) { return dir + createUniqueName(); } } int bcfTutorial_CreateProject(const MyServices &svcs, const OdString& bcfOutFileName, const OdString& bcfOutFileVersion, OdString workFolder) { if (workFolder.isEmpty()) { workFolder = svcs.getTemporaryPath(); } /**********************************************************************/ /* Initialize BCF */ /**********************************************************************/ odBcfToolsInitialize(kVersionBcfAll); try { if (bcfOutFileVersion == BcfVersionNumbers[kVersionBcf_2_1]) { OdBcf_2_1::OdBcfDataAccessorPtr pAccessor = OdBcf_2_1::OdBcfDataAccessorXml::createObject(workFolder); OdBcf_2_1::OdBcfSessionPtr pSession = OdBcf_2_1::OdBcfSession::createObject(OD_T("BcfTutorial_CreateProject"), OD_T("ExIfcTutorials"), pAccessor); // New BCF Version instance (bcf.version) OdBcf_2_1::OdBcfVersionPtr pVersion = pSession->createVersion(); // Version 2.1 // Create new BCF project (project.bcfp) OdBcf_2_1::OdBcfProjectData projectData; projectData.m_name = OD_T("Sample BCF 2.1 Project from tutorial"); OdBcf_2_1::OdBcfProjectPtr pProject = pSession->createProject(&projectData); // Append Project Extension to BCF Project OdBcf_2_1::OdBcfProjectExtensionData projectExtensionData; projectExtensionData.m_pProject = pProject; OdBcf_2_1::OdBcfProjectExtensionPtr pProjectExtension = pSession->createProjectExtension(&projectExtensionData); // Temporary folder prefix, a physical folder that will keep all files of BCF Archive OdBcf::OdBcfArchiveFolderPtr pArchiveFolder = OdBcf::OdBcfArchiveFolder::createObject(addUnqiuePath(workFolder + OD_T("ExIfcTutorials_"))); OdBcf_2_1::OdBcfArchivePtr pArchive = OdBcf_2_1::OdBcfArchive::createObject(pArchiveFolder, pVersion, pProjectExtension); OdString projectId = pSession->addArchive(pArchive); // Returns is an identifier of the project for session instance // Now Session can work with newly created BCF Project // // Create new topic // OdBcf_2_1::OdBcfTopicData topicData; topicData.m_assignedTo = OD_T("Assigned to User_1"); topicData.m_description = OD_T("Topic Description"); topicData.m_index = 0; topicData.m_labels.append(OD_T("Label_1")); topicData.m_labels.append(OD_T("Label_2")); //topicData.m_pBimSnippet OdString sDateTime = OD_T("2022-06-21T10:31:42"); OdBcf::OdBcfTimeStampPtr pBcfTimeStamp = OdBcf::OdBcfTimeStamp::createObject(sDateTime); topicData.m_pDueDate = pBcfTimeStamp; topicData.m_priority = OD_T("High Priority"); topicData.m_referenceLink.append("http://www.opendesign.com"); topicData.m_stage = OD_T("Topic Stage"); topicData.m_title = OD_T("Topic Title"); topicData.m_topicStatus = OD_T("Topic Status"); topicData.m_topicType = OD_T("Topic Type"); OdBcf_2_1::OdBcfTopicPtr pTopic = pSession->createTopic(&topicData); OdBcf_2_1::OdBcfFileData fileData; fileData.m_fileAttributes.m_ifcProject = OdDAI::CompressedGUID::generate(); fileData.m_fileAttributes.m_ifcSpatialStructureElement = OdDAI::CompressedGUID::generate(); OdBcf_2_1::OdBcfFilePtr pFile = OdBcf_2_1::OdBcfFile::createObject(); *pFile = fileData; OdBcf_2_1::OdBcfHeaderPtr pHeader = OdBcf_2_1::OdBcfHeader::createObject(OdBcf_2_1::OdBcfFileArray().insertAt(0, pFile)); OdBcf_2_1::OdBcfMarkupPtr pMarkup = OdBcf_2_1::OdBcfMarkup::createObject(pTopic, pHeader); // Create orthogonal camera OdBcf_2_1::OdBcfOrthogonalCameraPtr pOrthogonalCamera = OdBcf_2_1::OdBcfOrthogonalCamera::createObject( OdBcf_2_1::OdBcfPoint::createObject(0., -1., 0.), OdBcf_2_1::OdBcfDirection::createObject(0., 1., 0.), OdBcf_2_1::OdBcfDirection::createObject(0., 0., 1.), 1. ); // Create perspective camera OdBcf_2_1::OdBcfPerspectiveCameraPtr pPerspectiveCamera = OdBcf_2_1::OdBcfPerspectiveCamera::createObject( OdBcf_2_1::OdBcfPoint::createObject(0., -1., 0.), OdBcf_2_1::OdBcfDirection::createObject(0., 1., 0.), OdBcf_2_1::OdBcfDirection::createObject(0., 0., 1.), 60. ); // Visualization Info creation OdBcf_2_1::OdBcfVisualizationInfoData visualizationInfoData; visualizationInfoData.m_pOrthogonalCamera = pOrthogonalCamera; visualizationInfoData.m_pPerspectiveCamera = pPerspectiveCamera; OdBcf_2_1::OdBcfVisualizationInfoPtr pVisualizationInfo = pSession->createVisualizationInfo(&visualizationInfoData, OD_T(DEFAULT_VIEWPOINT_FILE_NAME), OD_T("ScreenShot.bmp"), pMarkup); OdBcf_2_1::OdBcfVisualizationInfoArray visualizationInfoArray; visualizationInfoArray.append(pVisualizationInfo); OdBcf_2_1::OdBcfTopicFolderPtr pTopicFolder = OdBcf_2_1::OdBcfTopicFolder::createObject(pMarkup, visualizationInfoArray); // Add new Topic Folder within projectId's archive Folder, Topic is ready for updates now pSession->addTopicFolder(projectId, pTopicFolder); // Add Topic comments pSession->addComment(projectId, ((const OdBcf_2_1::OdBcfTopic*)pTopic)->getGuid(), OD_T("Comment_1 content text.")); //Add comments with reference to the viewpoint pSession->addComment(projectId, ((const OdBcf_2_1::OdBcfTopic*)pTopic)->getGuid(), OD_T("Comment_2 content text."), pVisualizationInfo->getGuid()); char buf[15] = { 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; // Imitation of picture binary data pSession->addScreenshot(projectId, ((const OdBcf_2_1::OdBcfTopic*)pTopic)->getGuid(), OD_T("Screenshot.likebmp"), buf, sizeof(buf)); // // Write whole BCF project into the output .bcfzip file, // if (!bcfOutFileName.isEmpty()) { odPrintConsoleString(OD_T("Writing BCF Project to: %s..."), bcfOutFileName.c_str()); if (eOk == pAccessor->putArchive(bcfOutFileName, pArchive)) { odPrintConsoleString(OD_T(" ok\n")); } else { odPrintConsoleString(OD_T(" failed\n")); } } } else if (bcfOutFileVersion == BcfVersionNumbers[kVersionBcf_3_0]) { OdBcf_3_0::OdBcfDataAccessorPtr pAccessor = OdBcf_3_0::OdBcfDataAccessorXml::createObject(workFolder); OdBcf_3_0::OdBcfSessionPtr pSession = OdBcf_3_0::OdBcfSession::createObject(OD_T("BcfTutorial_CreateProject"), OD_T("ExIfcTutorials"), pAccessor); // New BCF Version instance (bcf.version) OdBcf_3_0::OdBcfVersionPtr pVersion = pSession->createVersion(); // Version 3.0 // Create new BCF project (project.bcfp) OdBcf_3_0::OdBcfProjectData projectData; projectData.m_name = OD_T("Sample BCF 3.0 Project from tutorial"); OdBcf_3_0::OdBcfProjectInfoPtr pProjectInfo = pSession->createProjectInfo(&projectData); // Append Project Extension to BCF Project OdBcf_3_0::OdBcfExtensionsPtr pExtensions = OdBcf_3_0::OdBcfExtensions::createObject(); // Temporary folder prefix, a physical folder that will keep all files of BCF Archive OdBcf::OdBcfArchiveFolderPtr pArchiveFolder = OdBcf::OdBcfArchiveFolder::createObject(addUnqiuePath(workFolder + OD_T("ExIfcTutorials_"))); OdBcf_3_0::OdBcfArchivePtr pArchive = OdBcf_3_0::OdBcfArchive::createObject(pArchiveFolder, pExtensions, pVersion); OdString projectId = pSession->addArchive(pArchive); // Returns is an identifier of the project for session instance // Now Session can work with newly created BCF Project // // Create new topic // OdBcf_3_0::OdBcfTopicData topicData; topicData.m_assignedTo = OD_T("Assigned to User_1"); topicData.m_description = OD_T("Topic Description"); topicData.m_index = 0; OdStringArray labels; labels.push_back(OD_T("Label_1")); labels.push_back(OD_T("Label_2")); topicData.m_pLabels = OdBcf_3_0::OdBcfLabels::createObject(labels); //topicData.m_pBimSnippet OdString sDateTime = OD_T("2022-06-21T10:31:42"); OdBcf::OdBcfTimeStampPtr pBcfTimeStamp = OdBcf::OdBcfTimeStamp::createObject(sDateTime); topicData.m_pDueDate = pBcfTimeStamp; topicData.m_priority = OD_T("High Priority"); OdStringArray referenceLinks; referenceLinks.push_back("http://www.opendesign.com"); topicData.m_pReferenceLinks = OdBcf_3_0::OdBcfReferenceLinks::createObject(referenceLinks); topicData.m_stage = OD_T("Topic Stage"); topicData.m_title = OD_T("Topic Title"); topicData.m_topicStatus = OD_T("Topic Status"); topicData.m_topicType = OD_T("Topic Type"); OdBcf_3_0::OdBcfTopicPtr pTopic = pSession->createTopic(projectId, &topicData); OdBcf_3_0::OdBcfFileData fileData; fileData.m_fileAttributes.m_ifcProject = OdDAI::CompressedGUID::generate(); fileData.m_fileAttributes.m_ifcSpatialStructureElement = OdDAI::CompressedGUID::generate(); OdBcf_3_0::OdBcfFilePtr pFile = OdBcf_3_0::OdBcfFile::createObject(); *pFile = fileData; OdBcf_3_0::OdBcfFilesPtr pFiles = OdBcf_3_0::OdBcfFiles::createObject(OdBcf_3_0::OdBcfFileArray().insertAt(0, pFile)); OdBcf_3_0::OdBcfHeaderPtr pHeader = OdBcf_3_0::OdBcfHeader::createObject(pFiles); OdBcf_3_0::OdBcfMarkupPtr pMarkup = OdBcf_3_0::OdBcfMarkup::createObject(pTopic, pHeader); // Create orthogonal camera OdBcf_3_0::OdBcfOrthogonalCameraPtr pOrthogonalCamera = OdBcf_3_0::OdBcfOrthogonalCamera::createObject( OdBcf_3_0::OdBcfPoint::createObject(0., -1., 0.), OdBcf_3_0::OdBcfDirection::createObject(0., 1., 0.), OdBcf_3_0::OdBcfDirection::createObject(0., 0., 1.), 1., 1. ); // Visualization Info creation OdBcf_3_0::OdBcfVisualizationInfoData visualizationInfoData; visualizationInfoData.m_pOrthogonalCamera = pOrthogonalCamera; OdBcf_3_0::OdBcfVisualizationInfoPtr pVisualizationInfo = pSession->createVisualizationInfo(&visualizationInfoData, OD_T(DEFAULT_VIEWPOINT_FILE_NAME), OD_T("ScreenShot.bmp"), pMarkup); OdBcf_3_0::OdBcfVisualizationInfoArray visualizationInfoArray; visualizationInfoArray.append(pVisualizationInfo); OdBcf_3_0::OdBcfTopicFolderPtr pTopicFolder = OdBcf_3_0::OdBcfTopicFolder::createObject(pMarkup, visualizationInfoArray); // Add new Topic Folder within projectId's archive Folder, Topic is ready for updates now pSession->addTopicFolder(projectId, pTopicFolder); // Add Topic comments pSession->addComment(projectId, ((const OdBcf_3_0::OdBcfTopic*)pTopic)->getGuid(), OD_T("Comment_1 content text.")); //Add comments with reference to the viewpoint pSession->addComment(projectId, ((const OdBcf_3_0::OdBcfTopic*)pTopic)->getGuid(), OD_T("Comment_2 content text."), pVisualizationInfo->getGuid()); char buf[15] = { 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; // Imitation of picture binary data pSession->addScreenshot(projectId, ((const OdBcf_3_0::OdBcfTopic*)pTopic)->getGuid(), OD_T("Screenshot.likebmp"), buf, sizeof(buf)); // // Write whole BCF project into the output .bcfzip file, // if (!bcfOutFileName.isEmpty()) { odPrintConsoleString(OD_T("Writing BCF Project to: %s..."), bcfOutFileName.c_str()); if (eOk == pAccessor->putArchive(bcfOutFileName, pArchive)) { odPrintConsoleString(OD_T(" ok\n")); } else { odPrintConsoleString(OD_T(" failed\n")); } } } else { throw("Unsupported file version"); } } catch (OdError& e) { odPrintConsoleString(OD_T("\nError: %ls\n"), e.description().c_str()); } catch (...) { odPrintConsoleString(OD_T("\nUnknown Error.\n")); } /**********************************************************************/ /* Uninitialize BCF */ /**********************************************************************/ odBcfToolsUninitialize(); return 0; } BcfTutorial_CreateProject::BcfTutorial_CreateProject(const OdString& tutorialCommand) : BaseIfcTutorial(tutorialCommand) { m_tutorialArgsParser .add_param( std::make_shared>(m_bcfFileName, "bcfFileName", "output bcf file", false)); m_tutorialArgsParser .add_param( std::make_shared>(m_bcfFileVersion, "bcfFileVersion", "output bcf file version")); m_bcfFileVersion = BcfVersionNumbers[kVersionBcf_3_0]; m_tutorialArgsParser .add_param( std::make_shared>(m_workFolder, "workFolder", "work folder")); m_noWait = false; m_tutorialArgsParser .add_param( std::make_shared(m_noWait, "-NoWait", "disable \"press any key\" on finish.")); } int BcfTutorial_CreateProject::run(const MyServices& svcs, const std::vector& argv, std::ostream& resultStream) { if (BaseIfcTutorial::run(svcs, argv, resultStream)) { return 1; } return bcfTutorial_CreateProject(svcs, m_bcfFileName, m_bcfFileVersion, m_workFolder); } int bcfTutorial_Load(const MyServices& svcs, const OdString& bcfFileName) { /**********************************************************************/ /* Initialize BCF to work with all file versions */ /**********************************************************************/ odBcfToolsInitialize(kVersionBcfAll); try { OdBcf::OdBcfDataAccessorPtr pDataAccessor = OdBcfTools::OdBcfLoader::openProject(bcfFileName); if (!pDataAccessor.isNull()) { if (pDataAccessor->getBcfFileVersion() == BcfVersionNumbers[kVersionBcf_2_1]) { OdBcf_2_1::OdBcfDataAccessorPtr pAccessor = OdBcf_2_1::OdBcfDataAccessorXml::cast(pDataAccessor); const OdBcf_2_1::OdBcfArchivePtr pArchive = pAccessor->getArchive(bcfFileName); odPrintConsoleString(OD_T("BCF version: %s\n"), pArchive->getVersion()->getVersionId().c_str()); } else if (pDataAccessor->getBcfFileVersion() == BcfVersionNumbers[kVersionBcf_3_0]) { OdBcf_3_0::OdBcfDataAccessorPtr pAccessor = OdBcf_3_0::OdBcfDataAccessorXml::cast(pDataAccessor); const OdBcf_3_0::OdBcfArchivePtr pArchive = pAccessor->getArchive(bcfFileName); odPrintConsoleString(OD_T("BCF version: %s\n"), pArchive->getVersion()->getVersionId().c_str()); } } else { //Attempt to manually set version to BCF 2.1 pDataAccessor = OdBcfTools::OdBcfLoader::openProject(bcfFileName, "", kVersionBcf_2_1); if (pDataAccessor->getBcfFileVersion() == BcfVersionNumbers[kVersionBcf_2_1]) { OdBcf_2_1::OdBcfDataAccessorXmlPtr pAccessor = OdBcf_2_1::OdBcfDataAccessorXml::cast(pDataAccessor); const OdBcf_2_1::OdBcfTopicArray pTopics = pAccessor->getTopics(bcfFileName); odPrintConsoleString(OD_T("BCF version: %s\n"), pDataAccessor->getBcfFileVersion().c_str()); } else { throw("Unsupported file version"); } } } catch (OdError& e) { odPrintConsoleString(OD_T("\nError: %ls\n"), e.description().c_str()); } catch (...) { odPrintConsoleString(OD_T("\nUnknown Error.\n")); } /**********************************************************************/ /* Uninitialize BCF */ /**********************************************************************/ odBcfToolsUninitialize(); return 0; } BcfTutorial_Load::BcfTutorial_Load(const OdString& tutorialCommand) : BaseIfcTutorial(tutorialCommand) { m_tutorialArgsParser .add_param( std::make_shared>(m_bcfFileName, "bcfFileName", "input bcf file", false)); m_noWait = false; m_tutorialArgsParser .add_param( std::make_shared(m_noWait, "-NoWait", "disable \"press any key\" on finish.")); } int BcfTutorial_Load::run(const MyServices& svcs, const std::vector& argv, std::ostream& resultStream) { if (BaseIfcTutorial::run(svcs, argv, resultStream)) { return 1; } return bcfTutorial_Load(svcs, m_bcfFileName); }