00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "a2dprec.h"
00012
00013 #ifdef __BORLANDC__
00014 #pragma hdrstop
00015 #endif
00016
00017 #ifndef WX_PRECOMP
00018 #include "wx/wx.h"
00019 #endif
00020
00021 #include "wx/editor/sttoolmes.h"
00022 #include "wx/editor/editmod.h"
00023
00024 #define ID_X 10001
00025 #define ID_Y 10006
00026 #define ID_LISTBOX 10002
00027 #define ID_HIDE 10003
00028 #define ID_CLEAR 10004
00029 #define ID_SUM 10005
00030
00031
00032
00033
00034
00035 IMPLEMENT_DYNAMIC_CLASS( a2dMeasureDlg, wxDialog )
00036
00037
00038
00039
00040
00041 BEGIN_EVENT_TABLE( a2dMeasureDlg, wxDialog )
00042 EVT_CLOSE( a2dMeasureDlg::OnCloseWindow )
00043 EVT_IDLE( a2dMeasureDlg::OnIdle )
00044
00045 EVT_TEXT_ENTER( ID_X, a2dMeasureDlg::OnXEnter )
00046 EVT_UPDATE_UI( ID_X, a2dMeasureDlg::OnXUpdate )
00047
00048 EVT_TEXT_ENTER( ID_Y, a2dMeasureDlg::OnYEnter )
00049 EVT_UPDATE_UI( ID_Y, a2dMeasureDlg::OnYUpdate )
00050
00051 EVT_LISTBOX( ID_LISTBOX, a2dMeasureDlg::OnListboxSelected )
00052 EVT_UPDATE_UI( ID_LISTBOX, a2dMeasureDlg::OnListboxUpdate )
00053
00054 EVT_BUTTON( ID_HIDE, a2dMeasureDlg::OnHideClick )
00055
00056 EVT_BUTTON( ID_CLEAR, a2dMeasureDlg::OnClearClick )
00057
00058 EVT_UPDATE_UI( ID_SUM, a2dMeasureDlg::OnSumUpdate )
00059
00060 EVT_COM_EVENT( a2dMeasureDlg::OnComEvent )
00061 EVT_DO( a2dMeasureDlg::OnDoEvent )
00062 EVT_UNDO( a2dMeasureDlg::OnDoEvent )
00063
00064 END_EVENT_TABLE()
00065
00066
00067
00068
00069
00070 a2dMeasureDlg::a2dMeasureDlg( )
00071 {
00072 a2dDocviewGlobals->GetEventDistributer()->Register( this );
00073 }
00074
00075 a2dMeasureDlg::~a2dMeasureDlg( )
00076 {
00077 a2dDocviewGlobals->GetEventDistributer()->Unregister( this );
00078 }
00079
00080 a2dMeasureDlg::a2dMeasureDlg( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
00081 {
00082 a2dDocviewGlobals->GetEventDistributer()->Register( this );
00083 Create(parent, id, caption, pos, size, style);
00084 }
00085
00086
00087
00088
00089
00090 bool a2dMeasureDlg::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
00091 {
00092 m_x = NULL;
00093 m_y = NULL;
00094 m_lb = NULL;
00095 m_hide = NULL;
00096 m_clear = NULL;
00097 m_sum = NULL;
00098
00099 SetExtraStyle(GetExtraStyle()|wxWS_EX_BLOCK_EVENTS);
00100 wxDialog::Create( parent, id, caption, pos, size, style );
00101
00102 CreateControls();
00103 GetSizer()->Fit(this);
00104 GetSizer()->SetSizeHints(this);
00105 Centre();
00106 return TRUE;
00107 }
00108
00109
00110
00111
00112
00113 void a2dMeasureDlg::CreateControls()
00114 {
00115 a2dMeasureDlg* itemDialog1 = this;
00116
00117 wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
00118 itemDialog1->SetSizer(itemBoxSizer2);
00119
00120 wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
00121 itemBoxSizer2->Add(itemBoxSizer3, 0, wxGROW|wxALL, 1);
00122
00123 m_x = new wxTextCtrl( itemDialog1, ID_X, _("0"), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
00124 m_x->SetHelpText(_("X of vertex"));
00125 if (ShowToolTips())
00126 m_x->SetToolTip(_("X of vertex"));
00127 itemBoxSizer3->Add(m_x, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);
00128
00129 m_y = new wxTextCtrl( itemDialog1, ID_Y, _("0"), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
00130 m_y->SetHelpText(_("Y of vertex"));
00131 if (ShowToolTips())
00132 m_y->SetToolTip(_("Y of vertex"));
00133 itemBoxSizer3->Add(m_y, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);
00134
00135 wxBoxSizer* itemBoxSizer6 = new wxBoxSizer(wxHORIZONTAL);
00136 itemBoxSizer2->Add(itemBoxSizer6, 1, wxGROW|wxALL, 1);
00137
00138 wxString* m_lbStrings = NULL;
00139 m_lb = new wxListBox( itemDialog1, ID_LISTBOX, wxDefaultPosition, wxDefaultSize, 0, m_lbStrings, wxLB_SINGLE|wxLB_NEEDED_SB );
00140 m_lb->SetHelpText(_("list of measured points"));
00141 if (ShowToolTips())
00142 m_lb->SetToolTip(_("list of measured points"));
00143 itemBoxSizer6->Add(m_lb, 1, wxGROW|wxALL, 1);
00144
00145 wxBoxSizer* itemBoxSizer8 = new wxBoxSizer(wxHORIZONTAL);
00146 itemBoxSizer2->Add(itemBoxSizer8, 0, wxGROW|wxALL, 1);
00147
00148 m_hide = new wxButton( itemDialog1, ID_HIDE, _("Hide"), wxDefaultPosition, wxDefaultSize, 0 );
00149 itemBoxSizer8->Add(m_hide, 0, wxALIGN_CENTER_VERTICAL|wxALL, 1);
00150
00151 m_clear = new wxButton( itemDialog1, ID_CLEAR, _("Clear"), wxDefaultPosition, wxDefaultSize, 0 );
00152 m_clear->SetHelpText(_("Clear all measured points"));
00153 if (ShowToolTips())
00154 m_clear->SetToolTip(_("Clear all measured points"));
00155 itemBoxSizer8->Add(m_clear, 0, wxALIGN_CENTER_VERTICAL|wxALL, 1);
00156
00157 m_sum = new wxTextCtrl( itemDialog1, ID_SUM, _("0"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_PROCESS_ENTER );
00158 m_sum->SetHelpText(_("Sum of all measured points to rel start"));
00159 if (ShowToolTips())
00160 m_sum->SetToolTip(_("Sum of all measured points to rel start"));
00161 itemBoxSizer8->Add(m_sum, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);
00162 }
00163
00164
00165
00166
00167
00168 bool a2dMeasureDlg::ShowToolTips()
00169 {
00170 return TRUE;
00171 }
00172
00173
00174
00175
00176
00177 wxBitmap a2dMeasureDlg::GetBitmapResource( const wxString& name )
00178 {
00179 return wxNullBitmap;
00180 }
00181
00182
00183
00184
00185
00186 wxIcon a2dMeasureDlg::GetIconResource( const wxString& name )
00187 {
00188 return wxNullIcon;
00189 }
00190
00191
00192
00193
00194 void a2dMeasureDlg::OnXEnter( wxCommandEvent& event )
00195 {
00196 double x,y;
00197 m_x->GetValue().ToDouble( &x );
00198 m_y->GetValue().ToDouble( &y );
00199
00200 a2dSmrtPtr<a2dCommand_SetRelativeStart> command = new a2dCommand_SetRelativeStart( x, y );
00201 a2dGetCmdh()->Submit( command );
00202
00203 m_lb->Clear();
00204 a2dPoint2D p1;
00205 for( a2dVertexList::iterator iter = m_vertexes.begin(); iter != m_vertexes.end(); ++iter )
00206 {
00207 a2dLineSegment* seg = *iter;
00208 p1 = seg->GetPoint();
00209 AppendMeasure( p1.m_x, p1.m_y );
00210 }
00211 wxString tmp;
00212 tmp.Printf( wxT("%lg"), m_vertexes.Length() );
00213 m_sum->SetValue( tmp );
00214 }
00215
00216
00217
00218
00219
00220 void a2dMeasureDlg::OnXUpdate( wxUpdateUIEvent& event )
00221 {
00222 event.Skip();
00223 }
00224
00225
00226
00227
00228
00229 void a2dMeasureDlg::OnYEnter( wxCommandEvent& event )
00230 {
00231 double x,y;
00232 m_x->GetValue().ToDouble( &x );
00233 m_y->GetValue().ToDouble( &y );
00234
00235 a2dSmrtPtr<a2dCommand_SetRelativeStart> command = new a2dCommand_SetRelativeStart( x, y );
00236 a2dGetCmdh()->Submit( command );
00237
00238 m_lb->Clear();
00239 a2dPoint2D p1;
00240 for( a2dVertexList::iterator iter = m_vertexes.begin(); iter != m_vertexes.end(); ++iter )
00241 {
00242 a2dLineSegment* seg = *iter;
00243 p1 = seg->GetPoint();
00244 AppendMeasure( p1.m_x, p1.m_y );
00245 }
00246 wxString tmp;
00247 tmp.Printf( wxT("%lg"), m_vertexes.Length() );
00248 m_sum->SetValue( tmp );
00249 }
00250
00251
00252
00253
00254
00255 void a2dMeasureDlg::OnYUpdate( wxUpdateUIEvent& event )
00256 {
00257 event.Skip();
00258 }
00259
00260
00261
00262
00263
00264 void a2dMeasureDlg::OnListboxSelected( wxCommandEvent& event )
00265 {
00266 event.Skip();
00267 }
00268
00269
00270
00271
00272
00273 void a2dMeasureDlg::OnListboxUpdate( wxUpdateUIEvent& event )
00274 {
00275 event.Skip();
00276 }
00277
00278
00279
00280
00281
00282 void a2dMeasureDlg::OnHideClick( wxCommandEvent& event )
00283 {
00284 Show( FALSE );
00285 }
00286
00287
00288
00289
00290
00291 void a2dMeasureDlg::OnClearClick( wxCommandEvent& event )
00292 {
00293 m_lb->Clear();
00294 m_vertexes.clear();
00295 event.Skip();
00296 }
00297
00298
00299
00300
00301
00302 void a2dMeasureDlg::OnSumUpdate( wxUpdateUIEvent& event )
00303 {
00304 event.Skip();
00305 }
00306
00307
00308
00309
00310
00311
00312 void a2dMeasureDlg::OnCloseWindow( wxCloseEvent& event )
00313 {
00314 Show( FALSE );
00315 }
00316
00317
00318
00319
00320
00321 void a2dMeasureDlg::OnIdle( wxIdleEvent& event )
00322 {
00323 event.Skip();
00324 }
00325
00326 void a2dMeasureDlg::OnComEvent( a2dComEvent& event )
00327 {
00328 if ( GetEvtHandlerEnabled() )
00329 {
00330 if ( event.GetEventComId() == &a2dCanvasView::sm_changedShowObject )
00331 {
00332 m_lb->Clear();
00333 m_vertexes.clear();
00334 }
00335 }
00336 }
00337
00338 void a2dMeasureDlg::OnDoEvent( a2dCommandProcessorEvent& event )
00339 {
00340 if ( GetEvtHandlerEnabled() )
00341 {
00342 if ( event.GetCommand()->GetCommandId() == &a2dCommand_SetRelativeStart::Id )
00343 {
00344 double x = a2dGetCmdh()->GetRelativeStartX();
00345 double y = a2dGetCmdh()->GetRelativeStartY();
00346 wxString coordstr;
00347 coordstr.Printf( wxT("%lg"), x );
00348 m_x->SetValue( coordstr );
00349 coordstr.Printf( wxT("%lg"), y );
00350 m_y->SetValue( coordstr );
00351 }
00352 else if ( event.GetCommand()->GetCommandId() == &a2dCommand_AddMeasurement::Id )
00353 {
00354 a2dCommand_AddMeasurement* command = wxDynamicCast( event.GetCommand(), a2dCommand_AddMeasurement );
00355
00356 m_vertexes.push_back( new a2dLineSegment( command->m_x, command->m_y ) );
00357 wxString tmp;
00358 tmp.Printf( wxT("%lg"), m_vertexes.Length() );
00359 m_sum->SetValue( tmp );
00360
00361 AppendMeasure( command->m_x, command->m_y );
00362 }
00363 else if ( event.GetCommand()->GetCommandId() == &a2dCommand_ClearMeasurements::Id )
00364 {
00365 m_lb->Clear();
00366 m_vertexes.clear();
00367 }
00368 }
00369 }
00370
00371 void a2dMeasureDlg::AppendMeasure( double x, double y )
00372 {
00373 int exp = 1;
00374 double rel_x, rel_y, length, angle;
00375 double start_x = wxAtoi( m_x->GetValue() );
00376 double start_y = wxAtoi( m_y->GetValue() );
00377
00378 rel_x = x - start_x;
00379 rel_y = y - start_y;
00380 length = sqrt(pow(rel_x,2) + pow(rel_y,2));
00381 if (rel_x != 0 && rel_y != 0)
00382 angle = asin(rel_y/length)*180/M_PI;
00383 else
00384 angle = 0;
00385 if (rel_x < 0)
00386 angle = 180 - angle;
00387 a2dCanvasDocument* doc = a2dGetCmdh()->CheckCanvasDocument();
00388 wxString unitmeasure = wxT("non");
00389 double scaleToMeters = 1;
00390 if ( doc )
00391 {
00392 unitmeasure = doc->GetUnits();
00393 scaleToMeters = doc->GetUnitsScale();
00394 }
00395
00396 double multi = 1;
00397 a2dDoMu::GetMultiplierFromString( unitmeasure, multi );
00398
00399 x *= scaleToMeters/multi;
00400 y *= scaleToMeters/multi;
00401
00402
00403 wxString tmp;
00404
00405
00406 tmp.Printf( wxT("(%lg, %lg) %s dx:%lg dy:%lg l:%lg angle:%lg"), x, y,
00407 unitmeasure.mb_str(), rel_x, rel_y, length, angle);
00408
00409 m_lb->Append(tmp);
00410 m_lb->SetSelection(m_lb->GetCount()-1,true);
00411 }
00412
00413 IMPLEMENT_CLASS(a2dMeasureTool,a2dDrawPolylineLTool)
00414
00415 const a2dCommandId a2dMeasureTool::COMID_PushTool_Measure( wxT("PushTool_Measure") );
00416
00417 A2D_BEGIN_EVENT_TABLE(a2dMeasureTool,a2dDrawPolylineLTool)
00418 A2D_EVT_CHAR(a2dMeasureTool::OnChar)
00419 A2D_EVT_MOUSE_EVENTS(a2dMeasureTool::OnMouseEvent)
00420 A2D_END_EVENT_TABLE()
00421
00422 a2dMeasureTool::a2dMeasureTool(a2dStToolContr* controller):a2dDrawPolylineLTool(controller)
00423 {
00424 m_eventHandler = new a2dStToolFixedToolStyleEvtHandler( controller );
00425
00426 m_anotate = true;
00427 m_editatend = false;
00428 m_toolcursor = a2dCanvasGlobals->GetCursor( a2dCURSOR_CROSS );
00429 m_toolBusyCursor = a2dCanvasGlobals->GetCursor( a2dCURSOR_CROSS );
00430
00431
00432 SetFill( *a2dTRANSPARENT_FILL );
00433 SetStroke( a2dStroke(*wxBLACK, 2, a2dSTROKE_LONG_DASH) );
00434 }
00435
00436 a2dMeasureTool::~a2dMeasureTool()
00437 {
00438 }
00439
00440 void a2dMeasureTool::GenerateAnotation()
00441 {
00442
00443 a2dStTool::AddAnotationToPendingUpdateArea();
00444
00445 a2dPolylineL* poly = wxStaticCast( m_canvasobject.Get(), a2dPolylineL );
00446 double len = poly->GetSegments()->Length();
00447 m_anotation.Printf( _T("x %6.3f y %6.3f l %6.3f"), m_xwprev, m_ywprev, len );
00448 m_xanotation = m_x;
00449 m_yanotation = m_y;
00450
00451 wxCoord w, h, descent, external;
00452 GetTextExtent( m_anotation, &w, &h, &descent, &external );
00453
00454 m_xanotation = m_x + h;
00455 m_yanotation = m_y + h;
00456
00457 a2dStTool::AddAnotationToPendingUpdateArea();
00458 }
00459
00460 void a2dMeasureTool::OnChar(wxKeyEvent& event)
00461 {
00462 if (!GetBusy())
00463 {
00464 switch(event.GetKeyCode())
00465 {
00466 case WXK_RETURN:
00467 {
00468 m_stcontroller->Zoomout();
00469 }
00470 break;
00471 case WXK_SUBTRACT:
00472 {
00473 m_stcontroller->ZoomUndo();
00474 }
00475 break;
00476 default:
00477 event.Skip();
00478 }
00479 }
00480 else
00481 event.Skip();
00482 }
00483
00484 void a2dMeasureTool::OnMouseEvent(wxMouseEvent& event)
00485 {
00486 if (!m_active)
00487 {
00488 event.Skip();
00489 return;
00490 }
00491
00492 if ( GetBusy() )
00493 GetCanvasView()->SetCursor( m_toolBusyCursor );
00494 else
00495 GetCanvasView()->SetCursor( m_toolcursor );
00496
00497 m_x = event.GetX();
00498 m_y = event.GetY();
00499
00500 MouseToToolWorld( m_x, m_y, m_xwprev, m_ywprev );
00501
00502 a2dRestrictionEngine *restrict = a2dCanvasGlobals->GetRestrictionEngine();
00503 if(restrict)
00504 restrict->RestrictPoint(m_xwprev, m_ywprev);
00505
00506 if (event.LeftDClick() && !GetBusy())
00507 {
00508 a2dGetCmdh()->Submit( new a2dCommand_ClearMeasurements() );
00509 a2dGetCmdh()->Submit( new a2dCommand_SetRelativeStart( m_xwprev, m_ywprev ) );
00510 }
00511 if (event.LeftDClick() && GetBusy())
00512 {
00513
00514 m_editatend = false;
00515 a2dGetCmdh()->Submit( new a2dCommand_ClearMeasurements() );
00516 event.Skip();
00517 }
00518 else if (event.LeftDown() && !GetBusy())
00519 {
00520 a2dGetCmdh()->Submit( new a2dCommand_SetRelativeStart( m_xwprev, m_ywprev ) );
00521
00522 a2dGetCmdh()->SetLastXyEntry( m_xwprev, m_ywprev );
00523 m_original = m_templateObject->TClone( clone_childs | clone_members );
00524 m_original->Translate( m_xwprev, m_ywprev );
00525 m_original->EliminateMatrix();
00526 m_original->SetContourWidth( m_contourwidth );
00527 m_original->SetStroke( m_stroke );
00528 m_original->SetFill( m_fill );
00529 m_original->SetLayer( m_layer );
00530 a2dPolylineL* line = wxStaticCast( m_original.Get(), a2dPolylineL );
00531 if ( line->GetBegin() && line->GetBegin()->GetFlag( a2dCanvasOFlags::normalized ) )
00532 {
00533 line->GetBegin()->SetSpecificFlags( false, a2dCanvasOFlags::normalized );
00534 double norm = GetCanvasDocument()->GetNormalizeScale();
00535 line->GetBegin()->Scale( norm, norm );
00536 }
00537 if ( line->GetEnd() && line->GetEnd()->GetFlag( a2dCanvasOFlags::normalized ) )
00538 {
00539 line->GetEnd()->SetSpecificFlags( false, a2dCanvasOFlags::normalized );
00540 double norm = GetCanvasDocument()->GetNormalizeScale();
00541 line->GetEnd()->Scale( norm, norm );
00542 }
00543
00544 EnterBusyMode();
00545 AddDecorationObject( m_original );
00546
00547 m_points = wxStaticCast( m_canvasobject.Get(), a2dPolylineL )->GetSegments();
00548
00549 a2dDocviewGlobals->RecordF( this, _T("polyline") );
00550
00551 m_canvasobject->SetCanvasDocument( GetCanvasDocument() );
00552
00553
00554 if ( m_reverse )
00555 GetCanvasCommandProcessor()->Submit(
00556 new a2dCommand_AddPoint( m_original, m_xwprev, m_ywprev, 0 )
00557 );
00558 else
00559 GetCanvasCommandProcessor()->Submit(
00560 new a2dCommand_AddPoint( m_original, m_xwprev, m_ywprev, -1 )
00561 );
00562
00563 m_point = new a2dLineSegment( m_xwprev,m_ywprev);
00564 AddPoint( m_point );
00565
00566 a2dDocviewGlobals->RecordF( this, _T("addpoint %f %f "), m_xwprev, m_ywprev );
00567
00568
00569 m_point = new a2dLineSegment(m_xwprev,m_ywprev);
00570 AddPoint( m_point );
00571
00572 m_prev_x = m_xwprev;
00573 m_prev_y = m_ywprev;
00574
00575 if(restrict)
00576 restrict->SetRestrictPoint( m_xwprev, m_ywprev );
00577
00578 m_pending = true;
00579 }
00580 else if (event.LeftDown() && GetBusy())
00581 {
00582 a2dGetCmdh()->Submit( new a2dCommand_AddMeasurement( m_xwprev, m_ywprev ) );
00583 event.Skip();
00584 }
00585 else
00586 event.Skip();
00587 }