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/artbase/artglob.h"
00022 #include "wx/artbase/stylebase.h"
00023
00024 WX_DEFINE_LIST( a2dClipRegionList );
00025 WX_DEFINE_LIST( a2dAETList );
00026 WX_DEFINE_LIST( a2dCriticalPointList );
00027
00028 const double wxPI = 3.1415926535897932384626433832795;
00029
00030 A2DARTBASEDLLEXP double wxDegToRad( double deg ) { return ( deg * wxPI ) / 180.0; }
00031 A2DARTBASEDLLEXP double wxRadToDeg( double rad ) { return ( rad * 180 ) / wxPI; }
00032
00033
00034 a2dGlobal* a2dGlobals;
00035
00036
00037 IMPLEMENT_DYNAMIC_CLASS( a2dArtBaseModule, wxModule )
00038
00039 a2dArtBaseModule::a2dArtBaseModule()
00040 {
00041 AddDependency( CLASSINFO( a2dGeneralModule ) );
00042 AddDependency( CLASSINFO( a2dFreetypeModule ) );
00043
00044 a2dGeneralGlobals->GetVariablesHash().SetVariableString( wxT("wxart2dlayers"), wxT("wxart2dlayers.cvg") );
00045 a2dGeneralGlobals->GetVariablesHash().SetVariableString( wxT("layerFileSavePath"), wxGetHomeDir() );
00046
00047 }
00048
00049 bool a2dArtBaseModule::OnInit()
00050 {
00051 a2dGlobals = new a2dGlobal();
00052
00053
00054 a2dCanvasInitializeStockObjects ();
00055
00056 return true;
00057 }
00058
00059 void a2dArtBaseModule::OnExit()
00060 {
00061 delete a2dGlobals;
00062 a2dGlobals = NULL;
00063
00064 a2dCanvasDeleteStockObjects ();
00065 }
00066
00067 void Aberration( double aber, double angle, double radius, double& dphi, unsigned int& segments )
00068 {
00069 if ( aber >= radius )
00070 dphi = wxPI / 4;
00071 else
00072 dphi = 2.0 * acos( ( radius - aber ) / radius );
00073
00074
00075 if ( dphi < wxPI / 180.0 )
00076 dphi = wxPI / 180.0;
00077
00078
00079 if ( dphi > wxPI / 4 )
00080 dphi = wxPI / 4;
00081
00082
00083 segments = ( unsigned int ) ceil( fabs( angle ) / dphi );
00084
00085 if ( segments == 0 )
00086 dphi = 0;
00087 else
00088 dphi = angle / segments;
00089 }
00090
00091
00092
00093
00094
00095 a2dPathList a2dGlobal::m_fontpath = a2dPathList();
00096 a2dPathList a2dGlobal::m_imagepath = a2dPathList();
00097 a2dPathList a2dGlobal::m_iconpath = a2dPathList();
00098 wxUint16 a2dGlobal::m_drawingthreshold = 1;
00099 wxUint16 a2dGlobal::m_polygonFillThreshold = 0;
00100 bool a2dGlobal::m_asrectangle = true;
00101 double a2dGlobal::m_arc2polyaber = 0;
00102 double a2dGlobal::m_poly2arcaber = 0;
00103 double a2dGlobal::m_displayaberration = 0;
00104 double a2dGlobal::m_roundFactor = 1.5;
00105
00106 IMPLEMENT_CLASS( a2dGlobal, a2dGeneralGlobal )
00107
00108 a2dGlobal::a2dGlobal()
00109 {
00110 m_iconpath.Add( wxT( "." ) );
00111 m_iconpath.Add( wxT( "./icon" ) );
00112 m_iconpath.Add( wxT( ".." ) );
00113 m_iconpath.Add( wxT( "../common/icons" ) );
00114 m_iconpath.Add( wxT( "../../common/icons" ) );
00115
00116 m_imagepath.Add( wxT( "." ) );
00117 m_imagepath.Add( wxT( "./images" ) );
00118 m_imagepath.Add( wxT( ".." ) );
00119 m_imagepath.Add( wxT( "../common/images" ) );
00120 m_imagepath.Add( wxT( "../../common/images" ) );
00121
00122 wxString envValue;
00123 wxGetEnv( wxT( "TRUETYPE" ), &envValue );
00124
00125 m_fontpath.Add( envValue );
00126 m_fontpath.Add( wxT( "./fonts" ) );
00127 m_fontpath.Add( wxT( "../common/fonts" ) );
00128 m_fontpath.Add( wxT( "../../common/fonts" ) );
00129 #if defined(__WXMSW__)
00130 m_fontpath.Add( wxGetOSDirectory() + wxT( "\\Fonts\\" ) );
00131 #endif // defined(__WXMSW__)
00132
00133 m_arc2polyaber = 1;
00134 m_poly2arcaber = 1;
00135
00136 m_drawingthreshold = 3;
00137 m_polygonFillThreshold = 0;
00138 m_asrectangle = false;
00139 m_displayaberration = 0.5;
00140 }
00141
00142 a2dGlobal::~a2dGlobal()
00143 {
00144 }
00145
00146 void a2dGlobal::Aberration( double angle, double radius, double& dphi, unsigned int& segments )
00147 {
00148 ::Aberration( m_arc2polyaber, angle, radius, dphi, segments );
00149 }
00150
00151
00152
00153
00154
00155 int a2dDoMu::m_accuracy = 3;
00156
00157 a2dDoMu::a2dDoMu()
00158 {
00159 m_multi = 1.0;
00160 m_number = 0.0;
00161 m_accuracy = 10;
00162 }
00163
00164 a2dDoMu::a2dDoMu( double number, double multi, bool normalize )
00165 {
00166 m_multi = multi;
00167 m_number = number;
00168
00169 if ( normalize )
00170 {
00171 if ( multi >= 1e-12 && multi < 1e-9 )
00172 {
00173 m_multi = 1e-12;
00174 m_number = m_number * multi * 1e12;
00175 }
00176 else if ( multi >= 1e-9 && multi < 1e-6 )
00177 {
00178 m_multi = 1e-9;
00179 m_number = m_number * multi * 1e9;
00180 }
00181 else if ( multi >= 1e-6 && multi < 1e-3 )
00182 {
00183 m_multi = 1e-6;
00184 m_number = m_number * multi * 1e6;
00185 }
00186 else if ( multi >= 1e-3 && multi < 1e-2 )
00187 {
00188 m_multi = 1e-3;
00189 m_number = m_number * multi * 1e3;
00190 }
00191 else if ( multi >= 1e-2 && multi < 1e-1 )
00192 {
00193 m_multi = 1e-2;
00194 m_number = m_number * multi * 1e2;
00195 }
00196 else if ( multi >= 0.1 && multi < 1 )
00197 {
00198 m_multi = 0.1;
00199 m_number = m_number * multi * 0.1;
00200 }
00201 else if ( multi >= 1 && multi < 1000 )
00202 {
00203 m_multi = 1;
00204 m_number = m_number * multi;
00205 }
00206 else if ( multi == 0.00254 )
00207 {
00208 m_multi = 0.00254;
00209 m_number = m_number * multi / 0.00254;
00210 }
00211 else if ( multi == 0.0254 )
00212 {
00213 m_multi = 0.0254;
00214 m_number = m_number * multi / 0.0254;
00215 }
00216 }
00217 }
00218
00219 a2dDoMu::a2dDoMu( double number, const wxString& multi )
00220 {
00221 m_number = number;
00222 GetMultiplierFromString( multi, m_multi );
00223 }
00224
00225 a2dDoMu::a2dDoMu( const wxString& number, const wxString& multi )
00226 {
00227 number.ToDouble( &m_number );
00228 multi.ToDouble( &m_multi );
00229 }
00230
00231 a2dDoMu::a2dDoMu( const wxString& numberMulti )
00232 {
00233 Eval( numberMulti );
00234 }
00235
00236 a2dDoMu::~a2dDoMu()
00237 {}
00238
00239 wxString a2dDoMu::GetValueString() const
00240 {
00241 return GetNumberString() + wxT(" ") + GetMultiplierString();
00242 }
00243
00244 double a2dDoMu::GetNumber() const
00245 {
00246 return m_number;
00247 }
00248
00249 double a2dDoMu::GetValue() const
00250 {
00251 return m_number * m_multi;
00252 }
00253
00254 wxString a2dDoMu::GetMultiplierString( double multi )
00255 {
00256 wxString multistr = wxT("");
00257
00258 if ( multi == 1e-12 )
00259 multistr = wxT("pm");
00260 else if ( multi == 1e-9 )
00261 multistr = wxT("nm");
00262 else if ( multi == 1e-6 )
00263 multistr = wxT("um");
00264 else if ( multi == 1e-3 )
00265 multistr = wxT("mm");
00266 else if ( multi == 1e-2 )
00267 multistr = wxT("cm");
00268 else if ( multi == 1e-1 )
00269 multistr = wxT("dm");
00270 else if ( multi == 1 )
00271 multistr = wxT("m");
00272 else if ( multi == 0.00254 )
00273 multistr = wxT("mil");
00274 else if ( multi == 0.0254 )
00275 multistr = wxT("inch");
00276 else
00277 {
00278
00279 multistr.Printf( wxT("%f"), multi );
00280 multistr = wxT("* ") + multistr;
00281 }
00282 return multistr;
00283 }
00284
00285 bool a2dDoMu::GetMultiplierFromString( const wxString& mul, double& multi )
00286 {
00287 multi = 1;
00288 if ( !mul.IsEmpty() )
00289 {
00290 multi = 0;
00291 if ( mul == wxT("pm") )
00292 {
00293 multi = 1e-12;
00294 }
00295 else if ( mul == wxT("nm") )
00296 {
00297 multi = 1e-9;
00298 }
00299 else if ( mul == wxT("um") )
00300 {
00301 multi = 1e-6;
00302 }
00303 else if ( mul == wxT("mm") )
00304 {
00305 multi = 1e-3;
00306 }
00307 else if ( mul == wxT("cm") )
00308 {
00309 multi = 1e-2;
00310 }
00311 else if ( mul == wxT("dm") )
00312 {
00313 multi = 1e-1;
00314 }
00315 else if ( mul == wxT("m") )
00316 {
00317 multi = 1;
00318 }
00319 else if ( mul == wxT("e") )
00320 {
00321 multi = 0.00254;
00322 }
00323 else if ( mul == wxT("mil") )
00324 {
00325 multi = 0.00254;
00326 }
00327 else if ( mul == wxT("inch") )
00328 {
00329 multi = 0.0254;
00330 }
00331 if ( multi == 0 )
00332 {
00333 multi = 1;
00334 return false;
00335 }
00336 }
00337 return true;
00338 }
00339
00340 double a2dDoMu::GetMultiplier() const
00341 {
00342 return m_multi;
00343 }
00344
00345 wxString a2dDoMu::GetMultiplierString() const
00346 {
00347 return GetMultiplierString( m_multi );
00348 }
00349
00350 wxString a2dDoMu::GetNumberString() const
00351 {
00352 wxString numstr;
00353 if ( m_accuracy == -1 )
00354 numstr.Printf( wxT("%f"), m_number );
00355 else
00356 numstr.Printf( wxT("%.*f"), m_accuracy, m_number );
00357 return numstr;
00358 }
00359
00360
00361 a2dDoMu& a2dDoMu::operator=( const a2dDoMu &other )
00362 {
00363 m_multi = other.m_multi;
00364 m_number = other.m_number;
00365
00366 return *this;
00367 }
00368
00369
00370 int a2dDoMu::operator==( const a2dDoMu &other ) const
00371 {
00372 if ( GetValue() == other.GetValue() )
00373 return 0;
00374 return 1;
00375 }
00376
00377 int a2dDoMu::operator!=( const a2dDoMu &other ) const
00378 {
00379 return ! ( GetValue() != GetValue() );
00380 }
00381
00382 a2dDoMu& a2dDoMu::operator=( const wxChar* str )
00383 {
00384 Eval( str );
00385 return *this;
00386 }
00387
00388 a2dDoMu& a2dDoMu::operator=( double dd )
00389 {
00390 m_number = dd;
00391 m_multi = 1;
00392 return *this;
00393 }
00394
00395 a2dDoMu::operator double() const
00396 {
00397 return GetValue();
00398 }
00399
00400 bool a2dDoMu::Eval( const wxString& param )
00401 {
00402 wxString multi;
00403 wxChar * endptr = 0;
00404
00405 if ( param.Len() == 0 )
00406 {
00407 return false;
00408 }
00409
00410 #if wxUSE_UNICODE
00411 wcstod( param, &endptr );
00412 #else
00413 strtod( param, &endptr );
00414 #endif // wxUSE_UNICODE
00415 if ( endptr == param )
00416 {
00417 m_number = 0;
00418 m_multi = 1;
00419 }
00420 else
00421 {
00422 wxString number = param.Left( endptr - param.c_str() );
00423 number.ToDouble( &m_number );
00424 multi = endptr;
00425 }
00426
00427 multi.Trim( true );
00428 multi.Trim( false );
00429
00430 if ( GetMultiplierFromString( multi, m_multi ) )
00431 return true;
00432 return false;
00433 }
00434
00435 void a2dAET::CalculateLineParameters( const wxRealPoint& p1 , const wxRealPoint& p2 )
00436 {
00437 double A = p2.y - p1.y;
00438 if ( A == 0 )
00439 {
00440 m_horizontal = true;
00441 m_BdivA = 0;
00442 m_CdivA = 0;
00443 }
00444 else
00445 {
00446 m_horizontal = false;
00447 m_BdivA = ( p1.x - p2.x ) / A;
00448
00449 m_CdivA = ( ( p2.x * p1.y ) - ( p1.x * p2.y ) ) / A ;
00450 }
00451 }
00452
00453 void a2dAET::CalculateXs( double y )
00454 {
00455 m_xs = ( int ) ( -m_BdivA * y - m_CdivA );
00456 }