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/canvas/canglob.h"
00022 #include "wx/canvas/algos.h"
00023 #include "wx/canvas/layerinf.h"
00024 #include "wx/canvas/canobj.h"
00025 #include "wx/canvas/candoc.h"
00026 #include "wx/artbase/liner.h"
00027 #include "wx/canvas/drawer.h"
00028
00029 #include <algorithm>
00030 #include <functional>
00031
00032 struct SortLayerOrder : public std::binary_function< const a2dLayerInfoPtr&, const a2dLayerInfoPtr&, bool>
00033 {
00034 bool operator()( const a2dLayerInfoPtr& x, const a2dLayerInfoPtr& y)
00035 {
00036 if ( x == wxNullLayerInfo && y == wxNullLayerInfo )
00037 return false;
00038 if ( x != wxNullLayerInfo && y == wxNullLayerInfo )
00039 return true;
00040 if ( x == wxNullLayerInfo && y != wxNullLayerInfo )
00041 return false;
00042
00043 if ( x->GetOrder() < y->GetOrder() )
00044 return true;
00045 return false;
00046 }
00047 };
00048
00049 struct SortLayerReverseOrder : public std::binary_function< const a2dLayerInfoPtr&, const a2dLayerInfoPtr&, bool>
00050 {
00051 bool operator()( const a2dLayerInfoPtr& x, const a2dLayerInfoPtr& y)
00052 {
00053 if ( x == wxNullLayerInfo && y == wxNullLayerInfo )
00054 return false;
00055 if ( x != wxNullLayerInfo && y == wxNullLayerInfo )
00056 return true;
00057 if ( x == wxNullLayerInfo && y != wxNullLayerInfo )
00058 return false;
00059
00060 if ( x->GetOrder() > y->GetOrder() )
00061 return true;
00062 return false;
00063 }
00064 };
00065
00066 struct SortLayerNr : public std::binary_function< const a2dLayerInfoPtr&, const a2dLayerInfoPtr&, bool>
00067 {
00068 bool operator()( const a2dLayerInfoPtr& x, const a2dLayerInfoPtr& y)
00069 {
00070 if ( x == wxNullLayerInfo && y == wxNullLayerInfo )
00071 return false;
00072 if ( x != wxNullLayerInfo && y == wxNullLayerInfo )
00073 return true;
00074 if ( x == wxNullLayerInfo && y != wxNullLayerInfo )
00075 return false;
00076
00077 if ( x->GetLayer() < y->GetLayer() )
00078 return true;
00079 return false;
00080 }
00081 };
00082
00083
00084 bool LayerSorter(const a2dCanvasObjectPtr& x, const a2dCanvasObjectPtr& y)
00085 {
00086 a2dLayerInfo* firstc = wxStaticCast( x.Get(), a2dLayerInfo );
00087 a2dLayerInfo* secondc = wxStaticCast( y.Get(), a2dLayerInfo );
00088
00089 if ( firstc->GetLayer() > secondc->GetLayer() )
00090 return true;
00091 return false;
00092 }
00093
00094 bool OrderSorter(const a2dCanvasObjectPtr& x, const a2dCanvasObjectPtr& y)
00095 {
00096 a2dLayerInfo* firstc = wxStaticCast( x.Get(), a2dLayerInfo );
00097 a2dLayerInfo* secondc = wxStaticCast( y.Get(), a2dLayerInfo );
00098
00099 if ( firstc->GetOrder() < secondc->GetOrder() )
00100 return true;
00101 return false;
00102 }
00103
00104 bool ReverseOrderSorter(const a2dCanvasObjectPtr& x, const a2dCanvasObjectPtr& y)
00105 {
00106 a2dLayerInfo* firstc = wxStaticCast( x.Get(), a2dLayerInfo );
00107 a2dLayerInfo* secondc = wxStaticCast( y.Get(), a2dLayerInfo );
00108
00109 if ( firstc->GetOrder() > secondc->GetOrder() )
00110 return true;
00111 return false;
00112 }
00113
00114
00115
00116
00117 IMPLEMENT_DYNAMIC_CLASS( a2dLayerInfo, a2dCanvasObject )
00118 IMPLEMENT_DYNAMIC_CLASS( a2dLayers, a2dCanvasObject )
00119
00120 a2dPropertyIdString* a2dLayerInfo::PROPID_layerName = NULL;
00121 a2dPropertyIdBool* a2dLayerInfo::PROPID_layerSelectable = NULL;
00122 a2dPropertyIdBool* a2dLayerInfo::PROPID_layerVisible = NULL;
00123 a2dPropertyIdBool* a2dLayerInfo::PROPID_readlayer = NULL;
00124 a2dPropertyIdUint16* a2dLayerInfo::PROPID_order = NULL;
00125 a2dPropertyIdUint16* a2dLayerInfo::PROPID_inmap = NULL;
00126 a2dPropertyIdUint16* a2dLayerInfo::PROPID_outmap = NULL;
00127
00128 INITIALIZE_PROPERTIES( a2dLayerInfo, a2dCanvasObject )
00129 {
00130 A2D_PROPID_M( a2dPropertyIdString, a2dLayerInfo, layerName, wxT(""), m_layername );
00131 A2D_PROPID_M( a2dPropertyIdBool, a2dLayerInfo, layerSelectable, false, m_layerselectable );
00132 A2D_PROPID_M( a2dPropertyIdBool, a2dLayerInfo, layerVisible, false, m_layervisible );
00133 A2D_PROPID_M( a2dPropertyIdBool, a2dLayerInfo, readlayer, false, m_readlayer );
00134 A2D_PROPID_M( a2dPropertyIdUint16, a2dLayerInfo, order, false, m_order );
00135 A2D_PROPID_M( a2dPropertyIdUint16, a2dLayerInfo, inmap, false, m_inmap );
00136 A2D_PROPID_M( a2dPropertyIdUint16, a2dLayerInfo, outmap, false, m_outmap );
00137 return true;
00138 }
00139
00140 DEFINE_EVENT_TYPE( a2dLayerInfo::sm_changedLayer );
00141
00142 a2dSmrtPtr<a2dLayerInfo> wxNullLayerInfo = new a2dLayerInfo();
00143
00144 a2dLayerInfo::a2dLayerInfo()
00145 {
00146 m_layer = 0;
00147
00148 m_layeravailable = false;
00149 m_layervisible = true;
00150 m_layerselectable = true;
00151 m_readlayer = true;
00152 m_order = 0;
00153 m_polarity = true;
00154 m_plated = false;
00155 m_area = 0;
00156
00157 m_inmap = 0;
00158 m_outmap = 0;
00159
00160 m_width = LAYERINFO_WIDTH;
00161 m_height = LAYERINFO_HEIGHT;
00162
00163 m_pinclass = a2dPinClass::Standard;
00164
00165 m_type = wxT("SIGNAL");
00166 m_side = wxT("TOP");
00167 }
00168
00169 a2dLayerInfo::a2dLayerInfo( wxUint16 index, wxString name )
00170 {
00171 wxASSERT_MSG( wxMAXLAYER > index, wxT(" wxLAYER_ALL layer is reserved do not use") );
00172
00173 m_layer = index;
00174
00175 m_layeravailable = false;
00176 m_layervisible = true;
00177 m_layerselectable = true;
00178 m_readlayer = true;
00179 m_order = index;
00180 m_polarity = true;
00181 m_plated = false;
00182 m_area = 0;
00183
00184 m_inmap = index;
00185 m_outmap = index;
00186
00187 m_layername = name;
00188
00189 SetFill( a2dFill( wxColour(0,0,0), a2dFILL_SOLID ) );
00190 SetStroke( a2dStroke( wxColour(255,0,0), 0, a2dSTROKE_SOLID) );
00191
00192 m_width = LAYERINFO_WIDTH;
00193 m_height = LAYERINFO_HEIGHT;
00194
00195 m_pinclass = a2dPinClass::Standard;
00196 m_type = wxT("SIGNAL");
00197 m_side = wxT("TOP");
00198 }
00199
00200 a2dLayerInfo::a2dLayerInfo( const a2dLayerInfo& other, CloneOptions options )
00201 :a2dCanvasObject( other, options )
00202 {
00203 m_layervisible = other.m_layervisible;
00204 m_layerselectable = other.m_layerselectable;
00205 m_layeravailable = other.m_layeravailable;
00206
00207 m_order = other.m_order;
00208 m_polarity = other.m_polarity;
00209 m_plated = other.m_plated;
00210 m_area = other.m_area;
00211 m_readlayer = other.m_readlayer;
00212 m_inmap = other.m_inmap;
00213 m_outmap = other.m_outmap;
00214
00215 m_type = other.m_type;
00216 m_side = other.m_side;
00217 m_span = other.m_span;
00218 m_feature = other.m_feature;
00219 m_subFeature = other.m_subFeature;
00220 m_description = other.m_description;
00221
00222 m_width = other.m_width;
00223 m_height = other.m_height;
00224
00225 m_layername = other.m_layername;
00226
00227 m_pinclass = other.m_pinclass;
00228 }
00229
00230 a2dLayerInfo::~a2dLayerInfo()
00231 {
00232 }
00233
00234 wxString a2dLayerInfo::GetName() const
00235 {
00236 return m_layername;
00237 }
00238
00239 void a2dLayerInfo::SetName(const wxString& name)
00240 {
00241 m_layername = name;
00242 }
00243
00244 a2dObject* a2dLayerInfo::Clone( CloneOptions options ) const
00245 {
00246 return new a2dLayerInfo( *this, options );
00247 }
00248
00249 void a2dLayerInfo::OnPropertyChanged( const a2dPropertyId* id )
00250 {
00251 a2dCanvasObject::OnPropertyChanged( id );
00252 if (m_root)
00253 {
00254
00255
00256
00257 a2dComEvent changedlayer( this, id, &sm_changedLayer );
00258 a2dDocviewGlobals->GetEventDistributer()->ProcessEvent( changedlayer );
00259 }
00260 }
00261
00262 #if wxART2D_USE_CVGIO
00263 void a2dLayerInfo::DoSave( wxObject* parent, a2dIOHandlerXmlSerOut &out, a2dXmlSer_flag xmlparts , a2dObjectList* towrite )
00264 {
00265 a2dCanvasObject::DoSave( parent, out, xmlparts, towrite );
00266 if ( xmlparts == a2dXmlSer_attrib )
00267 {
00268
00269 out.WriteAttribute( wxT("layervisible"), m_layervisible );
00270 out.WriteAttribute( wxT("layerselectable"), m_layerselectable );
00271 out.WriteAttribute( wxT("readlayer"), m_readlayer );
00272 out.WriteAttribute( wxT("inmap"), m_inmap );
00273 out.WriteAttribute( wxT("outmap"), m_outmap );
00274 out.WriteAttribute( wxT("order"), m_order );
00275 if ( m_width != LAYERINFO_WIDTH )
00276 {
00277 out.WriteNewLine();
00278 out.WriteAttribute( wxT("width"), m_width );
00279 }
00280 if ( m_height != LAYERINFO_HEIGHT )
00281 {
00282 out.WriteNewLine();
00283 out.WriteAttribute( wxT("height"), m_height );
00284 }
00285
00286 out.WriteAttribute( wxT("description"), m_description );
00287 out.WriteAttribute( wxT("feature"), m_feature );
00288 out.WriteAttribute( wxT("subfeature"), m_subFeature );
00289 out.WriteAttribute( wxT("type"), m_type );
00290 out.WriteAttribute( wxT("polarity"), m_polarity );
00291 out.WriteAttribute( wxT("span"), m_span );
00292 out.WriteAttribute( wxT("area"), m_area );
00293 }
00294 else
00295 {
00296 }
00297 }
00298
00299 void a2dLayerInfo::DoLoad( wxObject* parent, a2dIOHandlerXmlSerIn& parser, a2dXmlSer_flag xmlparts )
00300 {
00301 a2dCanvasObject::DoLoad( parent, parser, xmlparts );
00302 if ( xmlparts == a2dXmlSer_attrib )
00303 {
00304 m_width = parser.GetAttributeValueDouble( wxT("width"), LAYERINFO_WIDTH );
00305 m_height = parser.GetAttributeValueDouble( wxT("height"), LAYERINFO_HEIGHT );
00306
00307 m_layername = parser.GetAttributeValue( wxT("name"), m_layername );
00308 m_inmap = parser.GetAttributeValueUint16( wxT("inmap"), m_layer );
00309 m_outmap = parser.GetAttributeValueUint16( wxT("outmap"), m_layer );
00310 m_order = parser.GetAttributeValueUint16( wxT("order"), m_layer );
00311 m_readlayer = parser.GetAttributeValueBool( wxT("readlayer"), m_readlayer );
00312
00313 m_description = parser.GetAttributeValue( wxT("description"), m_description );
00314 m_feature = parser.GetAttributeValue( wxT("feature"), m_feature );
00315 m_subFeature = parser.GetAttributeValue( wxT("subfeature"), m_subFeature );
00316 m_type = parser.GetAttributeValue( wxT("type"), m_type );
00317 m_polarity = parser.GetAttributeValueBool( wxT("polarity"), m_polarity );
00318 m_span = parser.GetAttributeValue( wxT("span"), m_span );
00319 m_area = parser.GetAttributeValueDouble( wxT("area"), m_area );
00320 }
00321 else
00322 {
00323 }
00324 }
00325 #endif //wxART2D_USE_CVGIO
00326
00327 bool a2dLayerInfo::GetVisible()
00328 {
00329 return m_layervisible;
00330 }
00331
00332 bool a2dLayerInfo::GetSelectable()
00333 {
00334 return m_layerselectable;
00335 }
00336
00337 int a2dLayerInfo::GetOrder() const
00338 {
00339 return m_order;
00340 }
00341
00342 bool a2dLayerInfo::GetRead()
00343 {
00344 return m_readlayer;
00345 }
00346
00347 void a2dLayerInfo::SetVisible( bool status )
00348 {
00349 m_layervisible = status;
00350 }
00351
00352 void a2dLayerInfo::SetSelectable( bool status )
00353 {
00354 m_layerselectable = status;
00355 }
00356
00357 void a2dLayerInfo::SetOrder( wxUint16 order )
00358 {
00359 m_order = order;
00360 }
00361
00362 void a2dLayerInfo::SetRead( bool status )
00363 {
00364 m_readlayer = status;
00365 }
00366
00367 int a2dLayerInfo::GetInMapping()
00368 {
00369 return m_inmap;
00370 }
00371
00372 int a2dLayerInfo::GetOutMapping()
00373 {
00374 return m_outmap;
00375 }
00376
00377 void a2dLayerInfo::SetInMapping( wxUint16 layer )
00378 {
00379 m_inmap = layer;
00380 }
00381 void a2dLayerInfo::SetOutMapping( wxUint16 layer )
00382 {
00383 m_outmap = layer;
00384 }
00385
00386 bool a2dLayerInfo::GetPixelStroke()
00387 {
00388 return GetStroke().GetPixelStroke();
00389 }
00390
00391 void a2dLayerInfo::SetPixelStroke( bool pixel )
00392 {
00393 GetStroke().SetPixelStroke( pixel );
00394 }
00395
00396 a2dBoundingBox a2dLayerInfo::DoGetUnTransformedBbox( a2dBboxFlags WXUNUSED(flags) ) const
00397 {
00398 a2dBoundingBox bbox;
00399 bbox.Expand( 0, 0);
00400 bbox.Expand( m_width , m_height );
00401 return bbox;
00402 }
00403
00404 void a2dLayerInfo::DoRender( a2dIterC& ic, OVERLAP WXUNUSED(clipparent) )
00405 {
00406 ic.GetDrawer2D()->DrawRoundedRectangle( 0, 0, m_width, m_height,0);
00407 }
00408
00409 bool a2dLayerInfo::DoIsHitWorld( a2dIterC& ic, a2dHitEvent& hitEvent )
00410 {
00411 double margin = ic.GetTransformedHitMargin();
00412
00413 double xmin = wxMin( 0 , m_width);
00414 double ymin = wxMin( 0 , m_height);
00415 double xmax = wxMax( 0 , m_width);
00416 double ymax = wxMax( 0 , m_height);
00417
00418 hitEvent.m_how = HitTestRectangle( hitEvent.m_relx, hitEvent.m_rely, xmin, ymin, xmax, ymax, ic.GetTransformedHitMargin()+margin );
00419
00420 return hitEvent.m_how.IsHit();
00421 }
00422
00423
00424
00425
00426
00427
00428 a2dPropertyIdBool* a2dLayers::PROPID_visibleAll = NULL;
00429 a2dPropertyIdBool* a2dLayers::PROPID_readAll = NULL;
00430 a2dPropertyIdBool* a2dLayers::PROPID_selectableAll = NULL;
00431
00432 INITIALIZE_PROPERTIES( a2dLayers, a2dCanvasObject )
00433 {
00434 A2D_PROPID_D( a2dPropertyIdBool, visibleAll, false );
00435 A2D_PROPID_D( a2dPropertyIdBool, readAll, false );
00436 A2D_PROPID_D( a2dPropertyIdBool, selectableAll, false );
00437 return true;
00438 }
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489 a2dLayers::a2dLayers(): a2dCanvasObject()
00490 {
00491 m_indexed = false;
00492 m_layerArrayOnOrder.resize(wxMAXLAYER);
00493 m_layerArrayOnReverseOrder.resize(wxMAXLAYER);
00494 m_layerArrayOnLayer.resize(wxMAXLAYER);
00495 UpdateIndexes();
00496 }
00497
00498 a2dLayers::a2dLayers(const a2dLayers &other, CloneOptions options )
00499 :a2dCanvasObject( other, options )
00500 {
00501 wxASSERT( ( options & clone_deep ) == clone_deep );
00502 m_flags.m_pending = true;
00503 m_indexed = false;
00504 m_filename = other.m_filename;
00505
00506 m_layerArrayOnOrder.resize(wxMAXLAYER);
00507 m_layerArrayOnReverseOrder.resize(wxMAXLAYER);
00508 m_layerArrayOnLayer.resize(wxMAXLAYER);
00509
00510 UpdateIndexes();
00511 }
00512
00513 a2dLayers::~a2dLayers()
00514 {
00515 }
00516
00517 a2dObject* a2dLayers::Clone( CloneOptions options ) const
00518 {
00519 return new a2dLayers( *this, options );
00520 }
00521
00522 void a2dLayers::SetPending(bool pending)
00523 {
00524 a2dCanvasObject::SetPending( true );
00525
00526 if (m_root)
00527 {
00528 m_indexed = false;
00529 }
00530 }
00531
00532 a2dLayerIndex& a2dLayers::GetLayerIndex()
00533 {
00534 if ( !m_indexed )
00535 UpdateIndexes();
00536 return m_layerArrayOnLayer;
00537 }
00538
00539 a2dLayerIndex& a2dLayers::GetOrderIndex()
00540 {
00541 if ( !m_indexed )
00542 UpdateIndexes();
00543 return m_layerArrayOnOrder;
00544 }
00545
00546 a2dLayerIndex& a2dLayers::GetReverseOrderIndex()
00547 {
00548 if ( !m_indexed )
00549 UpdateIndexes();
00550 return m_layerArrayOnReverseOrder;
00551 }
00552
00553 bool a2dLayers::LoadLayers( const wxString& filename )
00554 {
00555 wxString foundfile = filename;
00556 #if wxART2D_USE_CVGIO
00557
00558 ReleaseChildObjects();
00559
00560 #if wxUSE_STD_IOSTREAM
00561 a2dDocumentFileInputStream stream( foundfile.mb_str() );
00562 if (stream.fail() || stream.bad())
00563 #else
00564 wxFileInputStream stream( foundfile );
00565 if ( !stream.Ok() )
00566 #endif
00567 {
00568 a2dDocviewGlobals->ReportErrorF( a2dError_FileCouldNotOpen, _("Could not open layers settings file %s"), foundfile.c_str() );
00569 return false;
00570 }
00571
00572 a2dIOHandlerCVGIn cvgparser;
00573 if ( cvgparser.CanLoad( stream, this ) )
00574 {
00575 bool result = cvgparser.LoadLayers( stream, this );
00576 SetPending(true);
00577 if ( !result )
00578 a2dDocviewGlobals->ReportErrorF( a2dError_LoadLayers, _("Cannot load layers from this file %s"), foundfile.c_str() );
00579 return result;
00580 }
00581 else
00582 a2dDocviewGlobals->ReportErrorF( a2dError_LoadLayers, _("Cannot load layers from this file %s"), foundfile.c_str() );
00583 return false;
00584 #else
00585 wxFAIL_MSG( wxT("wxART2D_USE_CVGIO is needed to load layers from a CVG file") );
00586 return false;
00587 #endif //wxART2D_USE_CVGIO
00588 }
00589
00590
00591 bool a2dLayers::SaveLayers( const wxString& filename )
00592 {
00593 #if wxUSE_STD_IOSTREAM
00594 a2dDocumentFileOutputStream store( filename.mb_str() );
00595 if (store.fail() || store.bad())
00596 #else
00597 wxFileOutputStream storeUnbuf( filename );
00598 wxBufferedOutputStream store( storeUnbuf );
00599 if ( store.GetLastError() != wxSTREAM_NO_ERROR )
00600 #endif
00601 {
00602 a2dDocviewGlobals->ReportErrorF( a2dError_FileCouldNotOpen, _("Sorry, could not open file %s for saving"), filename.c_str() );
00603 return false;
00604 }
00605 if ( m_childobjects != wxNullCanvasObjectList )
00606 m_childobjects->MakeUnique();
00607
00608 #if wxART2D_USE_CVGIO
00609
00610 a2dIOHandlerCVGOut* handler = new a2dIOHandlerCVGOut();
00611 bool res = handler->SaveLayers( store, this );
00612 delete handler;
00613 #else
00614 wxFAIL_MSG( wxT("wxART2D_USE_CVGIO is needed to save object to a CVG file") );
00615 return false;
00616 #endif //wxART2D_USE_CVGIO
00617 return res;
00618 }
00619
00620 void a2dLayers::InitWith( int highlayer, bool blackWhite )
00621 {
00622 CreateChildObjectList()->clear();
00623
00624 if ( highlayer > wxMAXLAYER )
00625 highlayer = wxMAXLAYER;
00626
00627 int j;
00628 for ( j=0; j < highlayer; j++ )
00629 {
00630 wxString namelay;
00631 namelay.Printf( wxT("Layer %d"), j );
00632 a2dLayerInfo* defLayer = new a2dLayerInfo( j, namelay );
00633 if ( !blackWhite )
00634 {
00635 a2dFill fill = a2dFill( wxColour(wxColour(rand()%254,rand()%254,rand()%254) ) );
00636 a2dStroke stroke = a2dStroke( wxColour(wxColour(rand()%254,rand()%254,rand()%254) ) );
00637 defLayer->SetFill( fill );
00638 defLayer->SetStroke( stroke );
00639 }
00640 else
00641 {
00642 int graycol = rand()%254;
00643 wxColour gray( graycol, graycol, graycol );
00644 a2dFill fill = a2dFill( gray );
00645 graycol = rand()%254;
00646 wxColour grays( graycol, graycol, graycol );
00647 a2dStroke stroke = a2dStroke( grays );
00648 defLayer->SetFill( fill );
00649 defLayer->SetStroke( stroke );
00650 }
00651 Append( defLayer );
00652 m_indexed = false;
00653 }
00654 UpdateIndexes();
00655 }
00656
00657 void a2dLayers::UpdateIndexes()
00658 {
00659 if ( !m_indexed )
00660 {
00661 m_indexed = true;
00662 unsigned int j;
00663
00664
00665 for ( j=0; j < wxMAXLAYER; j++ )
00666 {
00667 m_layerArrayOnOrder[j] = wxNullLayerInfo;
00668 m_layerArrayOnReverseOrder[j] = wxNullLayerInfo;
00669 m_layerArrayOnLayer[j] = wxNullLayerInfo;
00670 }
00671
00672 if ( m_childobjects != wxNullCanvasObjectList )
00673 {
00674 wxUint16 maxorder = 0;
00675 forEachIn( a2dCanvasObjectList, m_childobjects )
00676 {
00677 a2dLayerInfo* lobj = (a2dLayerInfo*) (*iter).Get();
00678 wxUint16 layer = lobj->m_layer;
00679
00680 maxorder = wxMax( lobj->m_order, maxorder );
00681
00682 wxASSERT_MSG( layer < wxMAXLAYER, wxT("layer index must be > 0 and < wxMAXLAYER") );
00683
00684 if ( m_layerArrayOnLayer[ layer ] != wxNullLayerInfo )
00685 {
00686 wxString warn;
00687 warn.Printf( wxT("layer index %d defined twice"), layer );
00688 wxLogWarning( warn );
00689 }
00690
00691 m_layerArrayOnLayer[ layer ] = lobj;
00692 m_layerArrayOnOrder[ layer ] = lobj;
00693 m_layerArrayOnReverseOrder[ layer ] = lobj;
00694
00695 }
00696
00697
00698 int j;
00699 for ( j=0; j < wxMAXLAYER; j++ )
00700 {
00701 if ( m_layerArrayOnLayer[j] == wxNullLayerInfo )
00702 {
00703 wxString namelay;
00704 namelay.Printf( wxT("Layer %d"), j );
00705 a2dLayerInfo* defLayer = new a2dLayerInfo( j, namelay );
00706 maxorder += 10;
00707 defLayer->SetOrder( maxorder );
00708 PROPID_TemporaryObject->SetPropertyToObject( defLayer, true );
00709
00710 Append( defLayer );
00711 m_layerArrayOnLayer[j] = defLayer;
00712 m_layerArrayOnOrder[j] = defLayer;
00713 m_layerArrayOnReverseOrder[j] = defLayer;
00714 }
00715 }
00716
00717 std::sort( m_layerArrayOnLayer.begin(), m_layerArrayOnLayer.end(), SortLayerNr() );
00718 std::sort( m_layerArrayOnOrder.begin(), m_layerArrayOnOrder.end(), SortLayerOrder() );
00719 std::sort( m_layerArrayOnReverseOrder.begin(), m_layerArrayOnReverseOrder.end(), SortLayerReverseOrder() );
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751 }
00752 }
00753 }
00754
00755 void a2dLayers::SetAvailable( a2dCanvasDocument* doc )
00756 {
00757 SetAllLayersAvailable( false );
00758
00759 m_layerArrayOnLayer[wxLAYER_DEFAULT]->SetAvailable( true );
00760
00761 a2dWalker_SetAvailable set( this );
00762 set.Start( doc->GetRootObject() );
00763 }
00764
00765 void a2dLayers::SetAvailable( a2dLayers* other )
00766 {
00767 unsigned int j;
00768 for ( j=0; j < wxMAXLAYER; j++ )
00769 {
00770 m_layerArrayOnLayer[j]->SetAvailable( other->m_layerArrayOnLayer[j]->GetAvailable() );
00771 }
00772
00773
00774 m_layerArrayOnLayer[wxLAYER_DEFAULT]->SetAvailable( true );
00775 }
00776
00777 bool a2dLayers::DoUpdate( UpdateMode mode, const a2dBoundingBox& childbox, const a2dBoundingBox& clipbox, const a2dBoundingBox& propbox )
00778 {
00779 if ( !m_indexed )
00780 {
00781 UpdateIndexes();
00782
00783 return true;
00784 }
00785 return false;
00786 }
00787
00788 #if wxART2D_USE_CVGIO
00789 void a2dLayers::DoSave( wxObject* parent, a2dIOHandlerXmlSerOut &out, a2dXmlSer_flag xmlparts , a2dObjectList* towrite )
00790 {
00791
00792
00793 if ( m_childobjects != wxNullCanvasObjectList )
00794 {
00795 forEachIn( a2dCanvasObjectList, m_childobjects )
00796 {
00797 a2dLayerInfo* lobj = (a2dLayerInfo*) (*iter).Get();
00798 if ( lobj->GetAvailable() )
00799 PROPID_TemporaryObject->SetPropertyToObject( lobj, false );
00800 }
00801 }
00802
00803 a2dCanvasObject::DoSave( parent, out, xmlparts, towrite );
00804 if ( xmlparts == a2dXmlSer_attrib )
00805 {
00806 }
00807 else
00808 {
00809 }
00810 }
00811
00812 void a2dLayers::DoLoad( wxObject* parent, a2dIOHandlerXmlSerIn& parser, a2dXmlSer_flag xmlparts )
00813 {
00814 a2dCanvasObject::DoLoad( parent, parser, xmlparts );
00815 if ( xmlparts == a2dXmlSer_attrib )
00816 {
00817 }
00818 else
00819 {
00820 }
00821 m_indexed = false;
00822 }
00823 #endif //wxART2D_USE_CVGIO
00824
00825 wxString a2dLayers::GetName( int layernumber)
00826 {
00827 return m_layerArrayOnLayer[layernumber]->GetName();
00828 }
00829
00830 int a2dLayers::GetNumber( wxString name )
00831 {
00832 unsigned int j;
00833
00834 for ( j=0; j< wxMAXLAYER; j++ )
00835 {
00836 if ( m_layerArrayOnLayer[j]->GetName() == name )
00837 return j;
00838 }
00839 wxFAIL_MSG( wxT("layer not defined in layerlist") );
00840 return -1;
00841 }
00842
00843 a2dStroke a2dLayers::GetStroke( int layernumber )
00844 {
00845 return m_layerArrayOnLayer[layernumber]->GetStroke();
00846 }
00847
00848 bool a2dLayers::GetVisible( int layernumber )
00849 {
00850 return m_layerArrayOnLayer[layernumber]->GetVisible();
00851 }
00852
00853 bool a2dLayers::GetSelectable( int layernumber )
00854 {
00855 return m_layerArrayOnLayer[layernumber]->GetSelectable();
00856 }
00857
00858 a2dFill a2dLayers::GetFill( int layernumber )
00859 {
00860 return m_layerArrayOnLayer[layernumber]->GetFill();
00861 }
00862
00863 int a2dLayers::GetOrder( int layernumber )
00864 {
00865 return m_layerArrayOnLayer[layernumber]->GetOrder();
00866 }
00867
00868 bool a2dLayers::GetRead( int layernumber )
00869 {
00870 return m_layerArrayOnLayer[layernumber]->GetRead();
00871 }
00872
00873 bool a2dLayers::GetPixelStroke( int layernumber )
00874 {
00875 return m_layerArrayOnLayer[layernumber]->GetPixelStroke();
00876 }
00877
00878
00879 void a2dLayers::SetName( int layernumber, wxString name )
00880 {
00881 m_layerArrayOnLayer[layernumber]->SetName( name );
00882 }
00883
00884 void a2dLayers::SetVisible( int layernumber, bool status )
00885 {
00886 m_layerArrayOnLayer[layernumber]->SetVisible( status );
00887 }
00888
00889 void a2dLayers::SetAvailable( int layernumber, bool status )
00890 {
00891 m_layerArrayOnLayer[layernumber]->SetAvailable( status );
00892 }
00893
00894 void a2dLayers::SetSelectable( int layernumber, bool status )
00895 {
00896 m_layerArrayOnLayer[layernumber]->SetSelectable( status );
00897 }
00898
00899 void a2dLayers::SetFill( int layernumber, const a2dFill& fill )
00900 {
00901 m_layerArrayOnLayer[layernumber]->SetFill( fill );
00902 }
00903
00904 void a2dLayers::SetStroke( int layernumber, const a2dStroke& stroke )
00905 {
00906 m_layerArrayOnLayer[layernumber]->SetStroke( stroke );
00907 }
00908
00909 void a2dLayers::SetPattern( int layernumber, const wxBitmap& stipple )
00910 {
00911 a2dFill fill = m_layerArrayOnLayer[layernumber]->GetFill();
00912 a2dFill pfill = a2dFill( stipple );
00913 pfill.SetColour( fill.GetColour() );
00914 pfill.SetColour2( fill.GetColour2() );
00915 m_layerArrayOnLayer[layernumber]->SetFill( pfill );
00916 }
00917
00918 void a2dLayers::SetOrder( int layernumber, int status )
00919 {
00920 m_layerArrayOnLayer[layernumber]->SetOrder( status );
00921 }
00922
00923 void a2dLayers::SetRead( int layernumber, bool status )
00924 {
00925 m_layerArrayOnLayer[layernumber]->SetRead( status );
00926 }
00927
00928 void a2dLayers::SetAll_Layers_Visible( bool onoff )
00929 {
00930 unsigned int j;
00931
00932 for ( j=0; j < wxMAXLAYER; j++ )
00933 {
00934 m_layerArrayOnLayer[j]->SetVisible( onoff );
00935 }
00936 }
00937
00938 void a2dLayers::SetAll_Layers_Read( bool onoff )
00939 {
00940 unsigned int j;
00941
00942 for ( j=0; j < wxMAXLAYER; j++ )
00943 {
00944 m_layerArrayOnLayer[j]->SetRead( onoff );
00945 }
00946 }
00947
00948 void a2dLayers::SetAll_Layers_Selectable( bool onoff )
00949 {
00950 unsigned int j;
00951
00952 for ( j=0; j < wxMAXLAYER; j++ )
00953 {
00954 m_layerArrayOnLayer[j]->SetSelectable( onoff );
00955 }
00956 }
00957
00958 void a2dLayers::SetAll_Layers_Outline( bool onoff )
00959 {
00960 unsigned int j;
00961
00962 for ( j=0; j < wxMAXLAYER; j++ )
00963 {
00964 a2dFill fill = m_layerArrayOnLayer[j]->GetFill();
00965 fill.SetFilling( onoff );
00966 m_layerArrayOnLayer[j]->SetFill( fill );
00967 }
00968 }
00969
00970 void a2dLayers::SetAllLayersAvailable( bool onoff )
00971 {
00972 unsigned int j;
00973
00974 for ( j=0; j < wxMAXLAYER; j++ )
00975 {
00976 m_layerArrayOnLayer[j]->SetAvailable( onoff );
00977 }
00978 }
00979
00980 int a2dLayers::GetInMapping( int layernumber )
00981 {
00982 return m_layerArrayOnLayer[layernumber]->GetInMapping();
00983 }
00984
00985 int a2dLayers::GetOutMapping( int layernumber )
00986 {
00987 return m_layerArrayOnLayer[layernumber]->GetOutMapping();
00988 }
00989
00990 void a2dLayers::SetInMapping( int layernumber, wxUint16 layer )
00991 {
00992 m_layerArrayOnLayer[layernumber]->SetInMapping( layer );
00993 }
00994
00995 void a2dLayers::SetOutMapping( int layernumber, wxUint16 layer )
00996 {
00997 m_layerArrayOnLayer[layernumber]->SetOutMapping( layer );
00998 }
00999
01000 void a2dLayers::SetPixelStroke(int layernumber, bool status)
01001 {
01002 m_layerArrayOnLayer[layernumber]->SetPixelStroke(status);
01003 }
01004