GerbView: Implement in-place GAL layer reordering (for X2 sorting)
This commit is contained in:
parent
eb94d2fcd0
commit
37beb726e3
|
@ -189,6 +189,31 @@ private:
|
||||||
return m_groupsSize > 0;
|
return m_groupsSize > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reorders the stored groups (to facilitate reordering of layers)
|
||||||
|
* @see VIEW::ReorderLayerData
|
||||||
|
*
|
||||||
|
* @param aReorderMap is the mapping of old to new layer ids
|
||||||
|
*/
|
||||||
|
void reorderGroups( std::unordered_map<int, int> aReorderMap )
|
||||||
|
{
|
||||||
|
for( int i = 0; i < m_groupsSize; ++i )
|
||||||
|
{
|
||||||
|
int orig_layer = m_groups[i].first;
|
||||||
|
int new_layer = orig_layer;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
new_layer = aReorderMap.at( orig_layer );
|
||||||
|
}
|
||||||
|
catch( std::out_of_range ) {}
|
||||||
|
|
||||||
|
m_groups[i].first = new_layer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Stores layer numbers used by the item.
|
/// Stores layer numbers used by the item.
|
||||||
std::vector<int> m_layers;
|
std::vector<int> m_layers;
|
||||||
|
|
||||||
|
@ -626,6 +651,52 @@ void VIEW::SortLayers( int aLayers[], int& aCount ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VIEW::ReorderLayerData( std::unordered_map<int, int> aReorderMap )
|
||||||
|
{
|
||||||
|
LAYER_MAP new_map;
|
||||||
|
|
||||||
|
for( auto it : m_layers )
|
||||||
|
{
|
||||||
|
int orig_idx = it.first;
|
||||||
|
VIEW_LAYER layer = it.second;
|
||||||
|
int new_idx;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
new_idx = aReorderMap.at( orig_idx );
|
||||||
|
}
|
||||||
|
catch( std::out_of_range )
|
||||||
|
{
|
||||||
|
new_idx = orig_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
layer.id = new_idx;
|
||||||
|
new_map[new_idx] = layer;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_layers = new_map;
|
||||||
|
|
||||||
|
for( VIEW_ITEM* item : m_allItems )
|
||||||
|
{
|
||||||
|
auto viewData = item->viewPrivData();
|
||||||
|
|
||||||
|
if( !viewData )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int layers[VIEW::VIEW_MAX_LAYERS], layers_count;
|
||||||
|
|
||||||
|
item->ViewGetLayers( layers, layers_count );
|
||||||
|
viewData->saveLayers( layers, layers_count );
|
||||||
|
|
||||||
|
viewData->reorderGroups( aReorderMap );
|
||||||
|
|
||||||
|
viewData->m_requiredUpdate |= COLOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct VIEW::updateItemsColor
|
struct VIEW::updateItemsColor
|
||||||
{
|
{
|
||||||
updateItemsColor( int aLayer, PAINTER* aPainter, GAL* aGal ) :
|
updateItemsColor( int aLayer, PAINTER* aPainter, GAL* aGal ) :
|
||||||
|
|
|
@ -492,7 +492,7 @@ void GERBVIEW_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
|
||||||
|
|
||||||
case ID_TB_OPTIONS_SHOW_NEGATIVE_ITEMS:
|
case ID_TB_OPTIONS_SHOW_NEGATIVE_ITEMS:
|
||||||
SetElementVisibility( LAYER_NEGATIVE_OBJECTS, state );
|
SetElementVisibility( LAYER_NEGATIVE_OBJECTS, state );
|
||||||
m_canvas->Refresh( true );
|
needs_refresh = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_TB_OPTIONS_DIFF_MODE:
|
case ID_TB_OPTIONS_DIFF_MODE:
|
||||||
|
|
|
@ -224,7 +224,8 @@ static bool sortZorder( const GERBER_FILE_IMAGE* const& ref, const GERBER_FILE_I
|
||||||
return ref->m_FileFunction->GetZSubOrder() > test->m_FileFunction->GetZSubOrder();
|
return ref->m_FileFunction->GetZSubOrder() > test->m_FileFunction->GetZSubOrder();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GERBER_FILE_IMAGE_LIST::SortImagesByZOrder()
|
|
||||||
|
std::unordered_map<int, int> GERBER_FILE_IMAGE_LIST::SortImagesByZOrder()
|
||||||
{
|
{
|
||||||
std::sort( m_GERBER_List.begin(), m_GERBER_List.end(), sortZorder );
|
std::sort( m_GERBER_List.begin(), m_GERBER_List.end(), sortZorder );
|
||||||
|
|
||||||
|
@ -232,7 +233,7 @@ void GERBER_FILE_IMAGE_LIST::SortImagesByZOrder()
|
||||||
// Graphic layer numbering must be updated to match the widgets layer order
|
// Graphic layer numbering must be updated to match the widgets layer order
|
||||||
|
|
||||||
// Store the old/new graphic layer info:
|
// Store the old/new graphic layer info:
|
||||||
std::map <int, int> tab_lyr;
|
std::unordered_map<int, int> tab_lyr;
|
||||||
|
|
||||||
for( unsigned layer = 0; layer < m_GERBER_List.size(); ++layer )
|
for( unsigned layer = 0; layer < m_GERBER_List.size(); ++layer )
|
||||||
{
|
{
|
||||||
|
@ -244,4 +245,6 @@ void GERBER_FILE_IMAGE_LIST::SortImagesByZOrder()
|
||||||
tab_lyr[gerber->m_GraphicLayer] = layer;
|
tab_lyr[gerber->m_GraphicLayer] = layer;
|
||||||
gerber->m_GraphicLayer = layer ;
|
gerber->m_GraphicLayer = layer ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return tab_lyr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
#include <gerber_draw_item.h>
|
#include <gerber_draw_item.h>
|
||||||
#include <am_primitive.h>
|
#include <am_primitive.h>
|
||||||
|
@ -118,8 +119,10 @@ public:
|
||||||
/**
|
/**
|
||||||
* Sort loaded images by Z order priority, if they have the X2 FileFormat info
|
* Sort loaded images by Z order priority, if they have the X2 FileFormat info
|
||||||
* (SortImagesByZOrder updates the graphic layer of these items)
|
* (SortImagesByZOrder updates the graphic layer of these items)
|
||||||
|
*
|
||||||
|
* @return a mapping of old to new layer index
|
||||||
*/
|
*/
|
||||||
void SortImagesByZOrder();
|
std::unordered_map<int, int> SortImagesByZOrder();
|
||||||
|
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
|
|
||||||
|
|
|
@ -209,19 +209,19 @@ void GERBER_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_SORT_GBR_LAYERS:
|
case ID_SORT_GBR_LAYERS:
|
||||||
GetImagesList()->SortImagesByZOrder();
|
auto remapping = GetImagesList()->SortImagesByZOrder();
|
||||||
myframe->ReFillLayerWidget();
|
myframe->ReFillLayerWidget();
|
||||||
myframe->syncLayerBox( true );
|
myframe->syncLayerBox( true );
|
||||||
|
|
||||||
if( myframe->IsGalCanvasActive() )
|
std::unordered_map<int, int> view_remapping;
|
||||||
|
|
||||||
|
for( auto it : remapping )
|
||||||
{
|
{
|
||||||
for( int layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer )
|
view_remapping[ GERBER_DRAW_LAYER( it.first) ] = GERBER_DRAW_LAYER( it.second );
|
||||||
{
|
|
||||||
myframe->SetLayerColor( GERBER_DRAW_LAYER( layer ),
|
|
||||||
GetLayerColor( GERBER_DRAW_LAYER( layer ) ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
myframe->GetGalCanvas()->GetView()->ReorderLayerData( view_remapping );
|
||||||
|
|
||||||
myframe->GetCanvas()->Refresh();
|
myframe->GetCanvas()->Refresh();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include <reporter.h>
|
#include <reporter.h>
|
||||||
#include <plot_auxiliary_data.h>
|
#include <plot_auxiliary_data.h>
|
||||||
#include <html_messagebox.h>
|
#include <html_messagebox.h>
|
||||||
|
#include <view/view.h>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -196,6 +197,20 @@ bool GERBVIEW_FRAME::LoadGerberJobFile( const wxString& aFullFileName )
|
||||||
|
|
||||||
Zoom_Automatique( false );
|
Zoom_Automatique( false );
|
||||||
|
|
||||||
|
auto remapping = GetImagesList()->SortImagesByZOrder();
|
||||||
|
|
||||||
|
ReFillLayerWidget();
|
||||||
|
syncLayerBox( true );
|
||||||
|
|
||||||
|
std::unordered_map<int, int> view_remapping;
|
||||||
|
|
||||||
|
for( auto it : remapping )
|
||||||
|
{
|
||||||
|
view_remapping[ GERBER_DRAW_LAYER( it.first) ] = GERBER_DRAW_LAYER( it.second );
|
||||||
|
}
|
||||||
|
|
||||||
|
GetGalCanvas()->GetView()->ReorderLayerData( view_remapping );
|
||||||
|
|
||||||
if( !msg.IsEmpty() )
|
if( !msg.IsEmpty() )
|
||||||
{
|
{
|
||||||
wxSafeYield(); // Allows slice of time to redraw the screen
|
wxSafeYield(); // Allows slice of time to redraw the screen
|
||||||
|
|
|
@ -454,6 +454,15 @@ public:
|
||||||
*/
|
*/
|
||||||
void SortLayers( int aLayers[], int& aCount ) const;
|
void SortLayers( int aLayers[], int& aCount ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remaps the data between layer ids without invalidating that data
|
||||||
|
*
|
||||||
|
* Used by GerbView for the "Sort by X2" functionality
|
||||||
|
*
|
||||||
|
* @param aReorderMap is a mapping of old to new layer ids
|
||||||
|
*/
|
||||||
|
void ReorderLayerData( std::unordered_map<int, int> aReorderMap );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function UpdateLayerColor()
|
* Function UpdateLayerColor()
|
||||||
* Applies the new coloring scheme held by RENDER_SETTINGS in case that it has changed.
|
* Applies the new coloring scheme held by RENDER_SETTINGS in case that it has changed.
|
||||||
|
|
Loading…
Reference in New Issue