Browse Source

performance efficiencies

newinvert
Jeff Young 2 years ago
parent
commit
cfa55d958a
  1. 4
      eeschema/tools/backannotate.cpp
  2. 75
      libs/kimath/src/geometry/shape_poly_set.cpp
  3. 2
      pcbnew/convert_shape_list_to_polygon.cpp

4
eeschema/tools/backannotate.cpp

@ -185,8 +185,8 @@ void BACK_ANNOTATE::getPcbModulesFromString( const std::string& aPayload )
continue;
// Fields are of the format "(field (name "name") "12345")
const auto fieldName = field.second.get_child_optional( "name" );
const auto fieldValue = field.second.back().first;
const auto& fieldName = field.second.get_child_optional( "name" );
const auto& fieldValue = field.second.back().first;
if( !fieldName )
continue;

75
libs/kimath/src/geometry/shape_poly_set.cpp

@ -671,53 +671,54 @@ void SHAPE_POLY_SET::RebuildHolesFromContours()
std::function<void( int, int, std::vector<int> )> process;
process = [&]( int myId, int parentOutlineId, std::vector<int> path )
{
std::set<int> relParents = childToParents[myId];
process =
[&]( int myId, int parentOutlineId, const std::vector<int>& path )
{
std::set<int> relParents = childToParents[myId];
for( int pathId : path )
{
int erased = relParents.erase( pathId );
wxASSERT( erased > 0 );
}
for( int pathId : path )
{
int erased = relParents.erase( pathId );
wxASSERT( erased > 0 );
}
wxASSERT( relParents.size() == 0 );
wxASSERT( relParents.size() == 0 );
int myOutline = -1;
int myOutline = -1;
bool isOutline = path.size() % 2 == 0;
bool isOutline = path.size() % 2 == 0;
if( isOutline )
{
int outlineId = result.AddOutline( contours[myId] );
myOutline = outlineId;
}
else
{
wxASSERT( parentOutlineId != -1 );
result.AddHole( contours[myId], parentOutlineId );
}
if( isOutline )
{
int outlineId = result.AddOutline( contours[myId] );
myOutline = outlineId;
}
else
{
wxASSERT( parentOutlineId != -1 );
result.AddHole( contours[myId], parentOutlineId );
}
auto it = parentToChildren.find( myId );
if( it != parentToChildren.end() )
{
std::vector<int> thisPath = path;
thisPath.emplace_back( myId );
auto it = parentToChildren.find( myId );
if( it != parentToChildren.end() )
{
std::vector<int> thisPath = path;
thisPath.emplace_back( myId );
std::set<int> thisPathSet;
thisPathSet.insert( thisPath.begin(), thisPath.end() );
std::set<int> thisPathSet;
thisPathSet.insert( thisPath.begin(), thisPath.end() );
for( int childId : it->second )
{
const std::set<int>& childPathSet = childToParents[childId];
for( int childId : it->second )
{
const std::set<int>& childPathSet = childToParents[childId];
if( thisPathSet != childPathSet )
continue; // Only interested in immediate children
if( thisPathSet != childPathSet )
continue; // Only interested in immediate children
process( childId, myOutline, thisPath );
}
}
};
process( childId, myOutline, thisPath );
}
}
};
for( int topParentId : topLevelParents )
{

2
pcbnew/convert_shape_list_to_polygon.cpp

@ -493,7 +493,7 @@ bool doConvertOutlineToPolygon( std::vector<PCB_SHAPE*>& aShapeList, SHAPE_POLY_
parents.push_back( jj );
}
contourToParentIndexesMap[ii] = parents;
contourToParentIndexesMap[ii] = std::move( parents );
}
// Next add those that are top-level outlines to the SHAPE_POLY_SET

Loading…
Cancel
Save