| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #include "lc_layersexporter.h" |
|
|
| #include <unordered_set> |
|
|
| #include "rs_block.h" |
| #include "rs_graphic.h" |
| #include "rs_insert.h" |
| #include "rs_layer.h" |
|
|
| LC_LayersExporter::LC_LayersExporter() { |
| } |
|
|
| bool LC_LayersExporter::exportLayers(LC_LayersExportOptions* options, RS_Graphic* originalGraphic, |
| std::vector<LC_LayerExportData*>& exportResultList) { |
| if (options->m_createSeparateDocumentPerLayer) { |
| return exportLayersToIndividualDocuments(options, originalGraphic, exportResultList); |
| } |
| else { |
| return exportLayersToSingleDocument(options, originalGraphic, exportResultList); |
| } |
| } |
|
|
| bool LC_LayersExporter::exportLayersToIndividualDocuments(LC_LayersExportOptions* options, RS_Graphic* originalGraphic, std::vector<LC_LayerExportData*>& exportResultList) { |
|
|
| struct LayerExportInfo { |
| RS_Layer* exportLayer {nullptr}; |
| RS_Graphic* exportGraphic {nullptr}; |
| std::unordered_set<RS_Block*> originalBlocks; |
| }; |
|
|
| std::unordered_map<RS_Layer*, LayerExportInfo*> exportDataMap; |
|
|
| auto originalGraphicView = originalGraphic->getGraphicView(); |
|
|
| for (auto originalLayer : options->m_layers) { |
| auto* exportGraphics = new RS_Graphic(); |
| exportGraphics->newDoc(); |
| exportGraphics->setVariableDictObject(originalGraphic->getVariableDictObject()); |
| exportGraphics->setGraphicView(originalGraphicView); |
|
|
| auto* exportInfo = new LayerExportInfo(); |
|
|
| exportInfo->exportGraphic = exportGraphics; |
| auto zeroLayer = exportInfo->exportGraphic->findLayer("0"); |
|
|
| if (options->m_putEntitiesToOriginalLayer) { |
| if (originalLayer->getName() == "0") { |
| exportInfo->exportLayer = zeroLayer; |
| copyLayerAttributes(zeroLayer, originalLayer); |
| } |
| else{ |
| auto exportLayer = originalLayer->clone(); |
| exportInfo->exportLayer = exportLayer; |
| exportGraphics->addLayer(exportLayer); |
| } |
| } |
| else { |
| exportInfo->exportLayer = zeroLayer; |
| copyLayerAttributes(zeroLayer, originalLayer); |
| } |
|
|
| exportDataMap.insert({originalLayer,exportInfo}); |
| exportUCSList(options, originalGraphic, exportGraphics); |
| exportViewsList(options, originalGraphic, exportGraphics); |
|
|
| auto* exportData = new LC_LayerExportData(); |
| exportData->m_graphic = exportGraphics; |
| exportData->m_name = originalLayer->getName(); |
| exportResultList.push_back(exportData); |
| } |
|
|
| bool hasBlocks = false; |
| for (RS_Entity* originalEntity : *originalGraphic) { |
| if (originalEntity == nullptr || originalEntity->getLayer() == nullptr || originalEntity->isUndone()) { |
| continue; |
| } |
|
|
| RS_Layer* originalLayer = originalEntity->getLayer(); |
| auto exportInfo = exportDataMap[originalLayer]; |
| if (exportInfo != nullptr) { |
| RS_Layer* exportLayer = exportInfo->exportLayer; |
| auto exportEntity = originalEntity->clone(); |
| auto exportGraphic = exportInfo->exportGraphic; |
| exportEntity->reparent(exportGraphic); |
| exportEntity->setLayer(exportLayer); |
| exportGraphic->addEntity(exportEntity); |
|
|
| if (originalEntity->rtti() == RS2::EntityInsert) { |
| auto* originalInsert = dynamic_cast<RS_Insert*>(originalEntity); |
| RS_Block* originalBlock = originalInsert->getBlockForInsert(); |
| exportInfo->originalBlocks.insert(originalBlock); |
| hasBlocks = true; |
| } |
| } |
| } |
|
|
| if (hasBlocks) { |
| for (auto pair: exportDataMap) { |
| auto exportInfo = pair.second; |
| if (!exportInfo->originalBlocks.empty()) { |
| auto exportGraphic = exportInfo->exportGraphic; |
| for (auto originalBlock : exportInfo->originalBlocks) { |
| auto* exportBlock = dynamic_cast<RS_Block*>(originalBlock->clone()); |
| exportGraphic->addBlock(exportBlock, false); |
| } |
| } |
| } |
| } |
|
|
| for (auto pair: exportDataMap) { |
| auto exportInfo = pair.second; |
| exportInfo->originalBlocks.clear(); |
| delete exportInfo; |
| } |
|
|
| exportDataMap.clear(); |
| return true; |
| } |
|
|
| void LC_LayersExporter::copyLayerAttributes(RS_Layer* zeroLayer, RS_Layer* originalLayer) { |
| zeroLayer->setPen(originalLayer->getPen()); |
| zeroLayer->setConstruction(originalLayer->isConstruction()); |
| zeroLayer->setPrint(originalLayer->isPrint()); |
| } |
|
|
| bool LC_LayersExporter::exportLayersToSingleDocument(LC_LayersExportOptions* options, RS_Graphic* originalGraphic, |
| std::vector<LC_LayerExportData*>& exportResultList) { |
| std::unordered_map<RS_Layer*, RS_Layer*, std::hash<RS_Layer*>> layerMap; |
|
|
| auto* exportGraphic = new RS_Graphic(); |
| exportGraphic->newDoc(); |
| exportGraphic->setVariableDictObject(originalGraphic->getVariableDictObject()); |
| auto zeroLayer = exportGraphic->findLayer("0"); |
|
|
| for (auto originalLayer : options->m_layers) { |
| if (originalLayer->getName() == "0") { |
| layerMap.insert({originalLayer, zeroLayer}); |
| copyLayerAttributes(zeroLayer, originalLayer); |
| } |
| else { |
| RS_Layer* exportLayer = originalLayer->clone(); |
| layerMap.insert({originalLayer, exportLayer}); |
| exportGraphic->addLayer(exportLayer); |
| } |
| } |
|
|
| exportUCSList(options, originalGraphic, exportGraphic); |
| exportViewsList(options, originalGraphic, exportGraphic); |
|
|
| |
| exportGraphic->setGraphicView(originalGraphic->getGraphicView()); |
|
|
| std::unordered_set<RS_Block*> usedBlocksSet; |
|
|
| for (RS_Entity* originalEntity : *originalGraphic) { |
| if (originalEntity == nullptr || originalEntity->getLayer() == nullptr || originalEntity->isUndone()) { |
| continue; |
| } |
|
|
| RS_Layer* originalLayer = originalEntity->getLayer(); |
| if (auto pair = layerMap.find(originalLayer); pair != layerMap.end()) { |
| auto duplicateLayer = pair->second; |
| RS_Entity* exportEntity = originalEntity->clone(); |
| exportEntity->reparent(exportGraphic); |
| exportEntity->setLayer(duplicateLayer); |
| exportGraphic->addEntity(exportEntity); |
|
|
| if (originalEntity->rtti() == RS2::EntityInsert) { |
| auto* originalInsert = dynamic_cast<RS_Insert*>(originalEntity); |
| RS_Block* originalBlock = originalInsert->getBlockForInsert(); |
| usedBlocksSet.insert(originalBlock); |
| } |
| } |
| } |
|
|
| if (!usedBlocksSet.empty()) { |
| for (auto originalBlock : usedBlocksSet) { |
| auto* exportBlock = dynamic_cast<RS_Block*>(originalBlock->clone()); |
| exportGraphic->addBlock(exportBlock, false); |
| } |
| } |
|
|
| usedBlocksSet.clear(); |
|
|
| auto* exportData = new LC_LayerExportData(); |
| exportData->m_graphic = exportGraphic; |
| exportData->m_name = ""; |
|
|
| exportResultList.push_back(exportData); |
| return true; |
| } |
|
|
| void LC_LayersExporter::exportUCSList(LC_LayersExportOptions* options, RS_Graphic* originalGraphic, RS_Graphic* graphicToExport) { |
| if (options->m_exportUCSs) { |
| const auto ucslist = originalGraphic->getUCSList(); |
| const int ucsCount = ucslist->count(); |
| for (int i = 0; i < ucsCount; i++) { |
| const auto ucs = ucslist->at(i); |
| const auto clone = ucs->clone(); |
| graphicToExport->addUCS(clone); |
| } |
| } |
| } |
|
|
| void LC_LayersExporter::exportViewsList(LC_LayersExportOptions* options, RS_Graphic* originalGraphic, RS_Graphic* graphicToExport) { |
| if (options->m_exportNamedViews) { |
| const auto viewsList = originalGraphic->getViewList(); |
| const int viewsCount = viewsList->count(); |
| for (int i =0; i < viewsCount; i++) { |
| const auto view = viewsList->at(i); |
| const auto viewClone = view->clone(); |
| graphicToExport->addNamedView(viewClone); |
| } |
| } |
| } |
|
|