3
* $Id: herramientamarcado.cpp 3526 2011-03-16 19:56:19Z carlos $
6
* Copyright 2008-10 MetaEmotion S.L. All rights reserved.
7
* http://ginkgo-cadx.com
9
* This file is licensed under LGPL v3 license.
10
* See License.txt for details
14
//#define _GINKGO_TRACE
15
#include <api/globals.h>
17
#include <wx/aui/aui.h>
20
#include <api/iwidgetsmanager.h>
21
#include "herramientamarcado.h"
22
#include <widgets/wflecha.h>
23
#include <widgets/welipse.h>
24
#include <widgets/wpunto.h>
25
#include <widgets/wtrapezoide.h>
26
#include <widgets/wpoligono.h>
27
#include <resources/ginkgoresourcemanager.h>
28
#include <api/internacionalizacion.h>
34
#include <vtk/vtkginkgoimageviewer.h>
35
#include <wx/xml/xml.h>
37
#define USAR_FLECHA 1451
38
#define USAR_ELIPSE 1452
39
#define USAR_TRAPEZOIDE 1453
40
#define USAR_POLIGONO 1454
41
#define USAR_PUNTO 1455
45
class HerramientaOpcionesMarcadoGUI : public AUI_NAMESPACE wxAuiToolBar {
47
HerramientaOpcionesMarcadoGUI(wxWindow* pParent, GNC::HerramientaMarcado* pHerramienta): AUI_NAMESPACE wxAuiToolBar(pParent,wxID_ANY, wxDefaultPosition, wxDefaultSize)
49
m_pHerramienta = pHerramienta;
51
SetToolBitmapSize( wxSize( 16,16 ) );
52
AddTool( USAR_PUNTO, _("Point"), GinkgoResourcesManager::BarraMarcado::GetIcoPunto(), _("Point"), wxITEM_CHECK);
53
ToggleTool(USAR_PUNTO,true);
54
AddTool( USAR_FLECHA, _("Arrow"), GinkgoResourcesManager::BarraMarcado::GetIcoFlecha(), _("Arrow"), wxITEM_CHECK);
55
AddTool( USAR_ELIPSE, _("Ellipse"), GinkgoResourcesManager::BarraMarcado::GetIcoElipse(), _("Ellipse"), wxITEM_CHECK);
56
AddTool( USAR_TRAPEZOIDE, _("Trapezoid"), GinkgoResourcesManager::BarraMarcado::GetIcoTrapezoide(), _("Trapezoid"), wxITEM_CHECK);
57
AddTool( USAR_POLIGONO, _("Poligono"), GinkgoResourcesManager::BarraMarcado::GetIcoPoligono(), _("Polygon"), wxITEM_CHECK);
63
this->Connect( USAR_PUNTO, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( HerramientaOpcionesMarcadoGUI::OnHerramientaPuntoClick ) );
64
this->Connect( USAR_FLECHA, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( HerramientaOpcionesMarcadoGUI::OnHerramientaFlechaClick ) );
65
this->Connect( USAR_ELIPSE, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( HerramientaOpcionesMarcadoGUI::OnHerramientaElipseClick ) );
66
this->Connect( USAR_TRAPEZOIDE, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( HerramientaOpcionesMarcadoGUI::OnHerramientaTrapezoideClick ) );
67
this->Connect( USAR_POLIGONO, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( HerramientaOpcionesMarcadoGUI::OnHerramientaPoligonoClick ) );
70
~HerramientaOpcionesMarcadoGUI(){
72
this->Disconnect( USAR_PUNTO, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( HerramientaOpcionesMarcadoGUI::OnHerramientaPuntoClick ) );
73
this->Disconnect( USAR_FLECHA, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( HerramientaOpcionesMarcadoGUI::OnHerramientaFlechaClick ) );
74
this->Disconnect( USAR_ELIPSE, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( HerramientaOpcionesMarcadoGUI::OnHerramientaElipseClick ) );
75
this->Disconnect( USAR_TRAPEZOIDE, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( HerramientaOpcionesMarcadoGUI::OnHerramientaTrapezoideClick ) );
76
this->Disconnect( USAR_POLIGONO, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler( HerramientaOpcionesMarcadoGUI::OnHerramientaPoligonoClick ) );
80
virtual void OnHerramientaPuntoClick( wxCommandEvent& event ){
81
ToggleTool(USAR_PUNTO, true);
82
ToggleTool(USAR_FLECHA, false);
83
ToggleTool(USAR_ELIPSE, false);
84
ToggleTool(USAR_TRAPEZOIDE, false);
85
ToggleTool(USAR_POLIGONO, false);
86
m_pHerramienta->SetTipoMarcado(GNC::HerramientaMarcado::TW_Punto);
90
virtual void OnHerramientaFlechaClick( wxCommandEvent& event ){
91
ToggleTool(USAR_PUNTO, false);
92
ToggleTool(USAR_FLECHA, true);
93
ToggleTool(USAR_ELIPSE, false);
94
ToggleTool(USAR_TRAPEZOIDE, false);
95
ToggleTool(USAR_POLIGONO, false);
96
m_pHerramienta->SetTipoMarcado(GNC::HerramientaMarcado::TW_Flecha);
100
virtual void OnHerramientaElipseClick( wxCommandEvent& event ){
101
ToggleTool(USAR_PUNTO, false);
102
ToggleTool(USAR_FLECHA, false);
103
ToggleTool(USAR_ELIPSE, true);
104
ToggleTool(USAR_TRAPEZOIDE, false);
105
ToggleTool(USAR_POLIGONO, false);
106
m_pHerramienta->SetTipoMarcado(GNC::HerramientaMarcado::TW_Elipse);
110
virtual void OnHerramientaTrapezoideClick( wxCommandEvent& event ){
111
ToggleTool(USAR_PUNTO, false);
112
ToggleTool(USAR_FLECHA, false);
113
ToggleTool(USAR_ELIPSE, false);
114
ToggleTool(USAR_TRAPEZOIDE, true);
115
ToggleTool(USAR_POLIGONO, false);
116
m_pHerramienta->SetTipoMarcado(GNC::HerramientaMarcado::TW_Trapezoide);
120
virtual void OnHerramientaPoligonoClick( wxCommandEvent& event ){
121
ToggleTool(USAR_PUNTO, false);
122
ToggleTool(USAR_FLECHA, false);
123
ToggleTool(USAR_ELIPSE, false);
124
ToggleTool(USAR_TRAPEZOIDE, false);
125
ToggleTool(USAR_POLIGONO, true);
126
m_pHerramienta->SetTipoMarcado(GNC::HerramientaMarcado::TW_Poligono);
130
GNC::HerramientaMarcado* m_pHerramienta;
136
GNC::HerramientaMarcado::HerramientaMarcado() {
138
m_pContratoActivo = NULL;
140
m_MarcadoActivo = TW_Punto;
141
m_Descripcion = _Std("Marking Tools");
142
m_Icono = GinkgoResourcesManager::IconosHerramientas::GetIcoMarcado();
145
GNC::HerramientaMarcado::~HerramientaMarcado()
149
wxXmlNode* GNC::HerramientaMarcado::Serializar(GNC::GCS::IVista* pVista, long vid, const std::string nombreMedicoSerializa)
151
//se cogen todas los widgets regla de los contratos con ese vid
152
typedef GNC::GCS::IContratable<GNC::GCS::IContratoWidgets> ICConcreto;
153
//se cogen todas los widgets regla de los contratos con ese vid
154
GNC::GCS::ListaWidgets listaWidgets;
155
for (ICConcreto::IteradorMapaContratos it = ICConcreto::m_Contratos.begin(); it != ICConcreto::m_Contratos.end(); it++) {
156
if((*it).first == pVista){
157
for (ICConcreto::IteradorListaContratos it2 = (*it).second->begin(); it2 != (*it).second->end(); it2++) {
158
GNC::GCS::IContratoWidgets* pC = (*it2);
159
GNC::GCS::ListaWidgets listaWidgetsTmp;
160
if(pC->GetManager() != NULL){
161
pC->GetManager()->GetListaWidgetsSubVista(vid,listaWidgetsTmp);
162
listaWidgets.splice(listaWidgets.begin(),listaWidgetsTmp);
168
wxXmlNode* resultado = NULL;
169
if(listaWidgets.size()>0){
170
resultado = new wxXmlNode(NULL,wxXML_ELEMENT_NODE,wxT("marcado"));
171
resultado->AddProperty(wxT("id"),wxString::Format(wxT("%d"),this->ID));
172
for (GNC::GCS::IWidgetsManager::IteradorListaWidgets it = listaWidgets.begin(); it!= listaWidgets.end(); it++){
173
GNC::GCS::Widgets::WPunto* pPunto = dynamic_cast<GNC::GCS::Widgets::WPunto*>((*it));
174
if( pPunto != NULL && pPunto->EsMarcador()){ //semillas
175
//se pillan las del grupo
176
if((*it)->GetGID() == (long)(this)){
177
resultado->AddChild(pPunto->Serializar(nombreMedicoSerializa));
180
GNC::GCS::Widgets::WFlecha* pFlecha = dynamic_cast<GNC::GCS::Widgets::WFlecha*>((*it));
181
if( pFlecha != NULL && pFlecha->EsMarcador()){ //flechas
182
resultado->AddChild(pFlecha->Serializar(nombreMedicoSerializa));
184
GNC::GCS::Widgets::WElipse* pElipse = dynamic_cast<GNC::GCS::Widgets::WElipse*>((*it));
185
if( pElipse != NULL && pElipse->EsMarcador()){ //elipse
186
resultado->AddChild(pElipse->Serializar(nombreMedicoSerializa));
188
GNC::GCS::Widgets::WPoligono* pPoligono = dynamic_cast<GNC::GCS::Widgets::WPoligono*>((*it));
189
if( pPoligono != NULL && pPoligono->EsMarcador()){ //poligono
190
resultado->AddChild(pPoligono->Serializar(nombreMedicoSerializa));
192
GNC::GCS::Widgets::WTrapezoide* pTrapezoide = dynamic_cast<GNC::GCS::Widgets::WTrapezoide*>((*it));
193
if( pTrapezoide != NULL && pTrapezoide->EsMarcador()){ //trapezoide
194
resultado->AddChild(pTrapezoide->Serializar(nombreMedicoSerializa));
205
void GNC::HerramientaMarcado::Deserializar(GNC::GCS::IVista* pVista, long vid, wxXmlNode* nodo)
207
if(nodo->GetPropVal(wxT("id"),wxT("")) != wxString::Format(wxT("%d"),this->ID)){
208
std::cerr<< "Ha ocurrido un error al desserializar la herramienta marcado"<<std::endl;
211
typedef GNC::GCS::IContratable<GNC::GCS::IContratoWidgets> ICConcreto;
213
for (ICConcreto::IteradorMapaContratos it = ICConcreto::m_Contratos.begin(); it != ICConcreto::m_Contratos.end(); it++) {
214
if((*it).first == pVista){
216
for (ICConcreto::IteradorListaContratos it2 = (*it).second->begin(); it2 != (*it).second->end(); it2++) {
217
GNC::GCS::IContratoWidgets* pC = (*it2);
219
GNC::GCS::ListaWidgets listaWidgets;
221
wxXmlNode *child = nodo->GetChildren();
223
if(child->GetName() == wxT("punto_widget")){
224
GNC::GCS::Widgets::WPunto* pWidget = new GNC::GCS::Widgets::WPunto(pC->GetManager(), vid, (long)this, child);
225
listaWidgets.push_back(pWidget);
226
} else if (child->GetName() == wxT("flecha_widget")){
227
GNC::GCS::Widgets::WFlecha* pWidget = new GNC::GCS::Widgets::WFlecha(pC->GetManager(), vid, child);
228
listaWidgets.push_back(pWidget);
229
} else if (child->GetName() == wxT("elipse_widget")){
230
GNC::GCS::Widgets::WElipse* pWidget = new GNC::GCS::Widgets::WElipse(pC->GetManager(), vid, (long)this, child);
231
listaWidgets.push_back(pWidget);
232
} else if (child->GetName() == wxT("poligono_widget")){
233
GNC::GCS::Widgets::WPoligono* pWidget = new GNC::GCS::Widgets::WPoligono(pC->GetManager(), vid, child);
234
listaWidgets.push_back(pWidget);
235
} else if (child->GetName() == wxT("trapezoide_widget")){
236
GNC::GCS::Widgets::WTrapezoide* pWidget = new GNC::GCS::Widgets::WTrapezoide(pC->GetManager(), vid, (long)this, child);
237
listaWidgets.push_back(pWidget);
239
child = child->GetNext();
242
for (GNC::GCS::IWidgetsManager::IteradorListaWidgets itWidgets = listaWidgets.begin(); itWidgets!= listaWidgets.end(); itWidgets++){
243
pC->GetManager()->InsertarWidget((*itWidgets),false);
250
//region "Realizacion de la interfaz IHerramienta"
252
void GNC::HerramientaMarcado::CrearPaneles( wxPanel* panel ) {
253
m_pAbstractPanelHerramientaOpciones = new GNC::GUI::HerramientaOpcionesMarcadoGUI(panel, this);
256
void GNC::HerramientaMarcado::ConectarContratoFalso(bool activar) {
257
typedef GNC::GCS::IContratable<GNC::GCS::IContratoWidgets> ICConcreto;
258
if (ICConcreto::m_pListaActiva == NULL) {
259
//std::cerr << "Error: Se trato de activar el modo deshabilitado de una vista sin haber asignado la vista activa. Error en la logica de activacion. Accion ignorada" << std::endl;
263
for (ICConcreto::IteradorListaContratos it = ICConcreto::m_pListaActiva->begin(); it != ICConcreto::m_pListaActiva->end(); it++) {
264
GNC::GCS::IContratoWidgets* pC = (*it);
265
if (pC->Inicializado()) {
267
GTRACE("HerramientaMarcado: Conectando contrato falso de vista " << ICConcreto::m_pVistaActiva);
268
pC->GetViewer()->SetInteractionStyle(vtkGinkgoImageViewer::ZOOM_INTERACTION);
269
pC->GetManager()->SetCursor(GNC::GCS::Widgets::CUR_FLECHA);
272
GTRACE("HerramientaMarcado: Desconectando contrato falso de vista " << ICConcreto::m_pVistaActiva);
273
pC->GetViewer()->SetInteractionStyle(vtkGinkgoImageViewer::ZOOM_INTERACTION);
274
pC->GetManager()->SetCursor(GNC::GCS::Widgets::CUR_FLECHA);
280
void GNC::HerramientaMarcado::SetVistaActiva(GNC::GCS::IVista* pVista) {
281
GNC::GCS::IContratable<GNC::GCS::IContratoWidgets>::EstablecerVistaActiva(pVista);
282
GTRACE("GNC::HerramientaMarcado::SetVistaActiva(" << pVista << ")");
285
void GNC::HerramientaMarcado::ConectarContratos(bool activar) {
287
if (ICConcreto::m_pListaActiva == NULL) {
289
std::cerr << "Error: Se trataron de conectar contratos sin haber asignado la vista activa. Error en la logica de activacion. Accion ignorada" << std::endl;
291
if (m_pBuilder != NULL) {
299
for (ICConcreto::IteradorListaContratos it = ICConcreto::m_pListaActiva->begin(); it != ICConcreto::m_pListaActiva->end(); it++) {
300
GNC::GCS::IContratoWidgets* pC = (*it);
301
if (pC->Inicializado()) {
303
GTRACE("HerramientaMarcado: Conectando contratos de vista " << ICConcreto::m_pVistaActiva);
304
m_pContratoActivo = pC;
305
SetTipoMarcado(m_MarcadoActivo);
306
pC->GetViewer()->SetInteractionStyle(vtkGinkgoImageViewer::ZOOM_INTERACTION);
307
if (m_pBuilder != NULL) {
308
pC->GetManager()->SetCursor(m_pBuilder->GetCursor());
311
pC->GetManager()->SetCursor(GNC::GCS::Widgets::CUR_FLECHA);
315
m_pContratoActivo = NULL;
316
GTRACE( "HerramientaMarcado: Desconectando contratos de vista " << ICConcreto::m_pVistaActiva );
317
pC->GetViewer()->SetInteractionStyle(vtkGinkgoImageViewer::ZOOM_INTERACTION);
318
pC->GetManager()->SetCursor(GNC::GCS::Widgets::CUR_FLECHA);
319
if (m_pBuilder != NULL) {
330
//region "Eventos refinados desde los paneles"
331
void GNC::HerramientaMarcado::SetTipoMarcado(TipoMarcado tipo)
333
if (m_MarcadoActivo == tipo && m_pBuilder != NULL) {
337
if (m_pBuilder != NULL) {
341
m_MarcadoActivo = tipo;
342
switch (m_MarcadoActivo) {
344
m_pBuilder = new GNC::GCS::Widgets::WFlechaBuilder(m_pContratoActivo->GetManager());
347
m_pBuilder = new GNC::GCS::Widgets::WElipseBuilder(m_pContratoActivo->GetManager(), (unsigned long)this);
350
m_pBuilder = new GNC::GCS::Widgets::WTrapezoideBuilder(m_pContratoActivo->GetManager(), (unsigned long)this);
353
m_pBuilder = new GNC::GCS::Widgets::WPoligonoBuilder(GNC::GCS::Widgets::MP_Normal, m_pContratoActivo->GetManager());
357
GNC::GCS::Widgets::WPuntoBuilder* pPuntoBuilder = new GNC::GCS::Widgets::WPuntoBuilder(m_pContratoActivo->GetManager(), (unsigned long)this);
358
m_pBuilder = pPuntoBuilder;
362
std::cerr << "Error, Elemento de marcado no soportado." << std::endl;
365
if (m_pBuilder != NULL) {
366
m_pContratoActivo->GetManager()->SetCursor(m_pBuilder->GetCursor());
369
m_pContratoActivo->GetManager()->SetCursor(GNC::GCS::Widgets::CUR_FLECHA);