3
* $Id: wmarcadoarea.h 3558 2011-03-20 20:02:22Z 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
15
#include <api/iwidgets.h>
16
#include <api/widgetserializable.h>
18
#include <widgets/observers/iobservadormarcadoarea.h>
21
//----------------------------------------------------------------------------------------------------
22
//region "Forward Declarations"
28
typedef std::list<GNC::GCS::Nodo> VerticesPoligono;
41
//====================================================================================================
42
//= Builder de marcado
43
//====================================================================================================
45
class EXTAPI WMarcadoAreaBuilder : public GNC::GCS::Widgets::IWidgetBuilder, public GNC::GCS::Widgets::Notificadores::INotificadorMarcadoArea {
48
typedef enum ModoMarcado {
49
MP_Lazo, // Poligono volatil. Existencia maxima: 1.
50
MP_Normal // Poligono persistente. Existencia maxima: Inf.
53
WMarcadoAreaBuilder(ModoMarcado modo, vtkImageData* pImageData, GNC::GCS::IWidgetsManager* pManager, long gid, GNC::GCS::Widgets::Observadores::IObservadorMarcadoArea* pObservador = NULL);
55
~WMarcadoAreaBuilder();
57
void EliminarWidget(bool notificar = false);
59
void SetRadioNodo(float radio)
62
m_DistanciaMinimaCuadrado = radio * 2;
63
m_DistanciaMinimaCuadrado *= m_DistanciaMinimaCuadrado;
67
virtual void OnMouseEvents(GNC::GCS::Eventos::EventoRaton&);
69
virtual void OnKeyEvents(GNC::GCS::Eventos::EventoTeclado&);
71
virtual void Render(GNC::GCS::Contexto3D* c);
73
virtual GNC::GCS::Widgets::TipoCursor GetCursor();
77
GNC::GCS::Vector m_PosCursor;
78
VerticesPoligono m_Vertices;
79
GNC::GCS::Widgets::IWidgetBuilder::Estado m_Estado;
84
float m_DistanciaMinimaCuadrado;
85
GNC::GCS::Widgets::WMarcadoArea* m_pPoligonoCreado;
86
vtkImageData* m_pImageData;
91
//====================================================================================================
93
//====================================================================================================
94
class EXTAPI WMarcadoArea : public GNC::GCS::Widgets::IWidget, public GNC::GCS::Widgets::Notificadores::INotificadorMarcadoArea {
96
//----------------------------------------------------------------------------------------------------
97
//region "Constructor y destructor"
99
WMarcadoArea(WMarcadoAreaBuilder::ModoMarcado modo, IWidgetsManager* pManager, unsigned int vid, VerticesPoligono& vertices, long gid, GNC::GCS::Widgets::Observadores::IObservadorMarcadoArea* pObservador = NULL, const char* nombre = "");
105
virtual bool EsMarcador() const
107
return m_Modo == WMarcadoAreaBuilder::MP_Normal;
110
virtual bool DelimitaArea() const
115
virtual bool ContieneFast(const GNC::GCS::Vector& punto) const
117
return punto.DentroDePoligono2(m_Vertices);
120
virtual void GetBoundingBox(GNC::GCS::Vector& bb0, GNC::GCS::Vector& bb1) const
122
if (m_Vertices.size() > 0) {
124
VerticesPoligono::const_iterator it = m_Vertices.begin();
125
(*it).IniciarBoundingBox(bb0, bb1);
126
for (; it != m_Vertices.end(); it++) {
127
(*it).ExtenderBoundingBox(bb0, bb1);
132
virtual void GetPosicion(GNC::GCS::Vector& posicion) const
137
virtual void GetPuntoAnclaje(GNC::GCS::Vector& punto, const GNC::GCS::Vector& escala) const
139
punto = m_PosCursor + (GNC::GCS::Vector(10.0f, -10.0f) * escala);
142
virtual void GetCentro(GNC::GCS::Vector& centro) const
147
virtual float GetAreaMetrica() const
149
return m_AreaMetrica;
152
virtual float GetPerimetro() const
157
virtual bool SoportaAutoBorrado() const {
158
if (m_Modo == WMarcadoAreaBuilder::MP_Normal) {
166
//----------------------------------------------------------------------------------------------------
167
//region "Interfaz especifica"
169
virtual void OnMouseEvents(GNC::GCS::Eventos::EventoRaton&);
171
virtual void OnKeyEvents(GNC::GCS::Eventos::EventoTeclado&);
173
virtual bool HitTest(float x, float y, float umbralCuadrado);
175
virtual bool HitTest(GNC::GCS::Vector* vertices, int numVertices);
177
virtual void Render(GNC::GCS::Contexto3D* c);
179
virtual void Seleccionar(bool seleccionado);
181
virtual void Iluminar(bool iluminado);
183
virtual void Ocultar(bool oculto);
187
//----------------------------------------------------------------------------------------------------
188
//region "Estado interno"
191
GNC::GCS::Vector m_PosCursor;
194
//----------------------------------------------------------------------------------------------------
195
//region "Propiedades geometricas"
198
VerticesPoligono m_Vertices;
201
GNC::GCS::Vector m_Centro;
206
friend std::ostream & operator<<(std::ostream& out, const WMarcadoArea& /*w*/)
212
virtual void GetVertices(std::list<GNC::GCS::Vector>& vertices) const {
213
for (VerticesPoligono::const_iterator it = m_Vertices.begin(); it != m_Vertices.end(); ++it) {
214
vertices.push_back(*it);
218
void GetNodos(std::list<GNC::GCS::Nodo>& vertices) {
219
for (VerticesPoligono::const_iterator it = m_Vertices.begin(); it != m_Vertices.end(); ++it) {
220
vertices.push_back(*it);
224
const VerticesPoligono& Vertices() const
232
WMarcadoAreaBuilder::ModoMarcado m_Modo;
237
//----------------------------------------------------------------------------------------------------
241
virtual void Recalcular();