LibreCAD
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
documentimpl.cpp
Go to the documentation of this file.
1 #include <string>
2 #include <unordered_map>
3 #include <memory>
5 #include "documentimpl.h"
6 #include <cad/primitive/insert.h>
8 
9 using namespace lc;
10 
11 DocumentImpl::DocumentImpl(StorageManager_SPtr storageManager) : Document() , _storageManager(storageManager) {
12  _storageManager->addDocumentMetaType(std::make_shared<Layer>("0", Color(255, 255, 255)));
13 }
14 
16  // LOG4CXX_DEBUG(logger, "DocumentImpl removed");
17 }
18 
19 void DocumentImpl::execute(operation::DocumentOperation_SPtr operation) {
20  {
21  std::lock_guard<std::mutex> lck(_documentMutex);
22  begin(operation);
23  this->operationProcess(operation);
24  commit(operation);
25 
26  _documentMutex.unlock();
27  }
28 
29  auto tmp = _newWaitingCustomEntities;
31  for (auto insert : tmp) {
32  NewWaitingCustomEntityEvent customEntityEvent(insert);
33  newWaitingCustomEntityEvent()(customEntityEvent);
34  }
35 }
36 
37 void DocumentImpl::begin(operation::DocumentOperation_SPtr operation) {
38  this->operationStart(operation);
39  BeginProcessEvent event;
40  beginProcessEvent()(event);
41 }
42 
43 void DocumentImpl::commit(operation::DocumentOperation_SPtr operation) {
44  _storageManager->optimise();
45  CommitProcessEvent event(operation);
46  commitProcessEvent()(event);
47 }
48 
49 void DocumentImpl::insertEntity(entity::CADEntity_CSPtr cadEntity) {
50  if (_storageManager->entityByID(cadEntity->id()) != nullptr) {
51  removeEntity(cadEntity);
52  }
53 
54  _storageManager->insertEntity(cadEntity);
55  AddEntityEvent event(cadEntity);
56  addEntityEvent()(event);
57 
58  auto insert = std::dynamic_pointer_cast<const entity::Insert>(cadEntity);
59  if (insert != nullptr && std::dynamic_pointer_cast<const entity::CustomEntity>(cadEntity) == nullptr) {
60  auto ces = std::dynamic_pointer_cast<const CustomEntityStorage>(insert->displayBlock());
61 
62  if (ces != nullptr) {
63  _waitingCustomEntities[ces->pluginName()].insert(insert);
64  _newWaitingCustomEntities.insert(insert);
65  }
66  }
67 }
68 
69 void DocumentImpl::removeEntity(entity::CADEntity_CSPtr entity) {
70  auto insert = std::dynamic_pointer_cast<const entity::Insert>(entity);
71  if (insert != nullptr && std::dynamic_pointer_cast<const entity::CustomEntity>(entity) == nullptr) {
72  auto ces = std::dynamic_pointer_cast<const CustomEntityStorage>(insert->displayBlock());
73  if (ces != nullptr) {
74  _waitingCustomEntities[ces->pluginName()].erase(insert);
75  }
76  }
77 
78  if (_storageManager->entityByID(entity->id()) != nullptr) {
79  _storageManager->removeEntity(entity);
80  RemoveEntityEvent event(entity);
81  removeEntityEvent()(event);
82  }
83 }
84 
85 
86 
87 void DocumentImpl::addDocumentMetaType(DocumentMetaType_CSPtr dmt) {
88  _storageManager->addDocumentMetaType(dmt);
89 
90  auto layer = std::dynamic_pointer_cast<const Layer>(dmt);
91  if (layer != nullptr) {
92  AddLayerEvent event(layer);
93  addLayerEvent()(event);
94  }
95 
96  auto linePattern = std::dynamic_pointer_cast<const DxfLinePatternByValue>(dmt);
97  if (linePattern != nullptr) {
98  AddLinePatternEvent event(linePattern);
99  addLinePatternEvent()(event);
100  }
101 }
102 void DocumentImpl::removeDocumentMetaType(DocumentMetaType_CSPtr dmt) {
103  _storageManager->removeDocumentMetaType(dmt);
104  auto layer = std::dynamic_pointer_cast<const Layer>(dmt);
105  if (layer != nullptr) {
106  RemoveLayerEvent event(layer);
107  removeLayerEvent()(event);
108  }
109 
110  auto linePattern = std::dynamic_pointer_cast<const DxfLinePatternByValue>(dmt);
111  if (linePattern != nullptr) {
112  RemoveLinePatternEvent event(linePattern);
113  removeLinePatternEvent()(event);
114  }
115 }
116 void DocumentImpl::replaceDocumentMetaType(DocumentMetaType_CSPtr oldDmt, DocumentMetaType_CSPtr newDmt) {
117  _storageManager->replaceDocumentMetaType(oldDmt, newDmt);
118  auto oldLayer = std::dynamic_pointer_cast<const Layer>(oldDmt);
119  if (oldLayer != nullptr) {
120  auto newLayer = std::dynamic_pointer_cast<const Layer>(newDmt);
121  if (newLayer != nullptr) {
122  ReplaceLayerEvent event(oldLayer, newLayer);
123  replaceLayerEvent()(event);
124  } else {
125  throw;
126  }
127  }
128 
129  auto oldLinePattern = std::dynamic_pointer_cast<const DxfLinePatternByValue>(oldDmt);
130  if (oldLinePattern != nullptr) {
131  auto newLinePattern = std::dynamic_pointer_cast<const DxfLinePatternByValue>(newDmt);
132  if (newLinePattern != nullptr) {
133  ReplaceLinePatternEvent event(oldLinePattern, newLinePattern);
134  replaceLinePatternEvent()(event);
135  }
136  }
137 }
138 
139 std::map<std::string, DocumentMetaType_CSPtr, lc::StringHelper::cmpCaseInsensetive> DocumentImpl::allMetaTypes() {
140  return _storageManager->allMetaTypes();
141 }
142 
144  std::lock_guard<std::mutex> lck(_documentMutex);
145  return _storageManager->entitiesByLayer(layer);
146 }
147 
148 StorageManager_SPtr DocumentImpl::storageManager() const {
149  return _storageManager;
150 }
151 
152 
154  // std::lock_guard<std::mutex> lck(_documentMutex);
155  return _storageManager->entityContainer();
156 }
157 
158 std::map<std::string, Layer_CSPtr> DocumentImpl::allLayers() const {
159  return _storageManager->allLayers();
160 }
161 
162 Layer_CSPtr DocumentImpl::layerByName(const std::string& layerName) const {
163  return _storageManager->layerByName(layerName);
164 }
165 
166 DxfLinePatternByValue_CSPtr DocumentImpl::linePatternByName(const std::string& linePatternName) const {
167  return _storageManager->linePatternByName(linePatternName);
168 }
169 
174 std::vector<DxfLinePatternByValue_CSPtr> DocumentImpl::linePatterns() const {
175  return _storageManager->metaTypes<const DxfLinePatternByValue>();
176 }
177 
179  return _storageManager->entitiesByBlock(block);
180 }
181 
182 std::vector<Block_CSPtr> DocumentImpl::blocks() const {
183  return _storageManager->metaTypes<const Block>();
184 }
185 
186 std::unordered_set<entity::Insert_CSPtr> DocumentImpl::waitingCustomEntities(const std::string& pluginName) {
187  return _waitingCustomEntities[pluginName];
188 }
virtual Nano::Signal< void(const lc::ReplaceLayerEvent &)> & replaceLayerEvent()
Event to replace a layer.
Definition: document.cpp:58
std::map< std::string, Layer_CSPtr > allLayers() const override
Returns all layers.
DocumentImpl(StorageManager_SPtr storageManager)
std::map< std::string, DocumentMetaType_CSPtr, lc::StringHelper::cmpCaseInsensetive > allMetaTypes() override
virtual Nano::Signal< void(const lc::RemoveLayerEvent &)> & removeLayerEvent()
Event to remove an layer.
Definition: document.cpp:50
virtual Nano::Signal< void(const lc::AddEntityEvent &)> & addEntityEvent()
Event to add an Entity.
Definition: document.cpp:38
EntityContainer< entity::CADEntity_CSPtr > & entityContainer() override
entityContainer Return a copy of all entities within the document
DxfLinePatternByValue_CSPtr linePatternByName(const std::string &linePatternName) const override
return a line pattern by it's name
void removeDocumentMetaType(DocumentMetaType_CSPtr dmt) override
remove a layer from the document
virtual void operationStart(operation::DocumentOperation_SPtr operation)
operationStart Starts the operation.
Definition: document.cpp:21
virtual void operationProcess(operation::DocumentOperation_SPtr operation)
operationProcess process the operation.
Definition: document.cpp:27
virtual Nano::Signal< void(const lc::AddLinePatternEvent &)> & addLinePatternEvent()
Event to add a line pattern.
Definition: document.cpp:66
void execute(operation::DocumentOperation_SPtr operation) override
execute's a operation
std::mutex _documentMutex
Definition: documentimpl.h:75
std::vector< DxfLinePatternByValue_CSPtr > linePatterns() const override
return all line patterns
std::unordered_set< entity::Insert_CSPtr > _newWaitingCustomEntities
Definition: documentimpl.h:80
StorageManager_SPtr storageManager() const
virtual Nano::Signal< void(const lc::BeginProcessEvent &)> & beginProcessEvent()
begins a Process Event
Definition: document.cpp:30
Definition: cadentity.h:12
EntityContainer< entity::CADEntity_CSPtr > entitiesByLayer(Layer_CSPtr layer) override
entitiesByLayer
Event that gets emitted when a new line pattern was removed from the document.
Layer_CSPtr layerByName(const std::string &layerName) const override
return a layer by it's name
virtual Nano::Signal< void(const lc::RemoveLinePatternEvent &)> & removeLinePatternEvent()
Event to remove a line pattern.
Definition: document.cpp:62
EntityContainer< entity::CADEntity_CSPtr > entitiesByBlock(Block_CSPtr block) override
Search entities in a given block.
virtual ~DocumentImpl()
std::unordered_set< entity::Insert_CSPtr > waitingCustomEntities(const std::string &pluginName) override
void insertEntity(entity::CADEntity_CSPtr cadEntity) override
add an entity to document.
std::vector< Block_CSPtr > blocks() const override
Event that gets emitted when a new line pattern was replaced in the document.
void begin(operation::DocumentOperation_SPtr operation) override
begins operation
virtual Nano::Signal< void(const lc::RemoveEntityEvent &)> & removeEntityEvent()
Event to remove an Entity.
Definition: document.cpp:46
virtual Nano::Signal< void(const lc::ReplaceLinePatternEvent &)> & replaceLinePatternEvent()
Event to replace a line pattern.
Definition: document.cpp:70
void commit(operation::DocumentOperation_SPtr operation) override
commits operation
virtual Nano::Signal< void(const lc::CommitProcessEvent &)> & commitProcessEvent()
commits a Process Event
Definition: document.cpp:34
virtual Nano::Signal< void(const lc::AddLayerEvent &)> & addLayerEvent()
Event to add a layer.
Definition: document.cpp:54
void removeEntity(entity::CADEntity_CSPtr entity) override
removes an entity from the document.
virtual Nano::Signal< void(const NewWaitingCustomEntityEvent &)> & newWaitingCustomEntityEvent()
Event called when an unmanaged entity is added to the document.
Definition: document.cpp:74
std::map< std::string, std::unordered_set< entity::Insert_CSPtr > > _waitingCustomEntities
Definition: documentimpl.h:79
void addDocumentMetaType(DocumentMetaType_CSPtr dmt) override
add a new layer to the document
Event that gets emitted when a new line pattern was added to the document.
StorageManager_SPtr _storageManager
Definition: documentimpl.h:77
void replaceDocumentMetaType(DocumentMetaType_CSPtr oldDmt, DocumentMetaType_CSPtr newDmt) override
remove a layer from the document
Class for storage of components of custom entities Child of Block for compatibility with other CAD so...