Handle lineweight in dxf import more properly
lineweights can be set to inherit from the layer or block.
This commit is contained in:
parent
01b6cd08b5
commit
f130970469
|
@ -64,6 +64,11 @@ DXF_IMPORT_PLUGIN::DXF_IMPORT_PLUGIN() : DL_CreationAdapter()
|
||||||
m_importAsFPShapes = true;
|
m_importAsFPShapes = true;
|
||||||
m_minX = m_minY = std::numeric_limits<double>::max();
|
m_minX = m_minY = std::numeric_limits<double>::max();
|
||||||
m_maxX = m_maxY = std::numeric_limits<double>::min();
|
m_maxX = m_maxY = std::numeric_limits<double>::min();
|
||||||
|
|
||||||
|
// placeholder layer so we can fallback to something later
|
||||||
|
std::unique_ptr<DXF_IMPORT_LAYER> layer0 =
|
||||||
|
std::make_unique<DXF_IMPORT_LAYER>( "", DXF_IMPORT_LINEWEIGHT_BY_LW_DEFAULT );
|
||||||
|
m_layers.push_back( std::move( layer0 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -126,18 +131,6 @@ double DXF_IMPORT_PLUGIN::mapDim( double aDxfValue )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double DXF_IMPORT_PLUGIN::mapWidth( double aDxfWidth )
|
|
||||||
{
|
|
||||||
// Always return the default line width
|
|
||||||
#if 0
|
|
||||||
// mapWidth returns the aDxfValue if aDxfWidth > 0 m_defaultThickness
|
|
||||||
if( aDxfWidth > 0.0 )
|
|
||||||
return SCALE_FACTOR( aDxfWidth * m_DXF2mm );
|
|
||||||
#endif
|
|
||||||
return SCALE_FACTOR( m_defaultThickness );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool DXF_IMPORT_PLUGIN::ImportDxfFile( const wxString& aFile )
|
bool DXF_IMPORT_PLUGIN::ImportDxfFile( const wxString& aFile )
|
||||||
{
|
{
|
||||||
DL_Dxf dxf_reader;
|
DL_Dxf dxf_reader;
|
||||||
|
@ -219,22 +212,76 @@ void DXF_IMPORT_PLUGIN::addKnot( const DL_KnotData& aData)
|
||||||
|
|
||||||
void DXF_IMPORT_PLUGIN::addLayer( const DL_LayerData& aData )
|
void DXF_IMPORT_PLUGIN::addLayer( const DL_LayerData& aData )
|
||||||
{
|
{
|
||||||
// Not yet useful in Pcbnew.
|
|
||||||
#if 0
|
|
||||||
wxString name = wxString::FromUTF8( aData.name.c_str() );
|
wxString name = wxString::FromUTF8( aData.name.c_str() );
|
||||||
wxLogMessage( name );
|
|
||||||
|
int lw = attributes.getWidth();
|
||||||
|
|
||||||
|
if( lw == DXF_IMPORT_LINEWEIGHT_BY_LAYER )
|
||||||
|
{
|
||||||
|
lw = DXF_IMPORT_LINEWEIGHT_BY_LW_DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<DXF_IMPORT_LAYER> layer = std::make_unique<DXF_IMPORT_LAYER>( name, lw );
|
||||||
|
|
||||||
|
m_layers.push_back( std::move( layer ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DXF_IMPORT_PLUGIN::addLinetype( const DL_LinetypeData& data )
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
wxString name = FROM_UTF8( data.name.c_str() );
|
||||||
|
wxString description = FROM_UTF8( data.description.c_str() );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double DXF_IMPORT_PLUGIN::lineWeightToWidth( int lw, DXF_IMPORT_LAYER* aLayer )
|
||||||
|
{
|
||||||
|
if( lw == DXF_IMPORT_LINEWEIGHT_BY_LAYER && aLayer != nullptr )
|
||||||
|
{
|
||||||
|
lw = aLayer->m_lineWeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
// All lineweights >= 0 are always in 100ths of mm
|
||||||
|
double mm = m_defaultThickness;
|
||||||
|
if( lw >= 0 )
|
||||||
|
{
|
||||||
|
mm = lw / 100.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SCALE_FACTOR( mm );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DXF_IMPORT_LAYER* DXF_IMPORT_PLUGIN::getImportLayer( const std::string& aLayerName )
|
||||||
|
{
|
||||||
|
DXF_IMPORT_LAYER* layer = m_layers.front().get();
|
||||||
|
wxString layerName = wxString::FromUTF8( aLayerName.c_str() );
|
||||||
|
|
||||||
|
if( !layerName.IsEmpty() )
|
||||||
|
{
|
||||||
|
auto resultIt = std::find_if( m_layers.begin(), m_layers.end(),
|
||||||
|
[layerName]( const auto& it ) { return it->m_layerName == layerName; } );
|
||||||
|
|
||||||
|
if( resultIt != m_layers.end() )
|
||||||
|
layer = resultIt->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
return layer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DXF_IMPORT_PLUGIN::addLine( const DL_LineData& aData )
|
void DXF_IMPORT_PLUGIN::addLine( const DL_LineData& aData )
|
||||||
{
|
{
|
||||||
if( m_inBlock )
|
if( m_inBlock )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
DXF_IMPORT_LAYER* layer = getImportLayer( attributes.getLayer() );
|
||||||
|
double lineWidth = lineWeightToWidth( attributes.getWidth(), layer );
|
||||||
|
|
||||||
VECTOR2D start( mapX( aData.x1 ), mapY( aData.y1 ) );
|
VECTOR2D start( mapX( aData.x1 ), mapY( aData.y1 ) );
|
||||||
VECTOR2D end( mapX( aData.x2 ), mapY( aData.y2 ) );
|
VECTOR2D end( mapX( aData.x2 ), mapY( aData.y2 ) );
|
||||||
double lineWidth = mapWidth( attributes.getWidth() );
|
|
||||||
|
|
||||||
m_internalImporter.AddLine( start, end, lineWidth );
|
m_internalImporter.AddLine( start, end, lineWidth );
|
||||||
|
|
||||||
|
@ -269,7 +316,8 @@ void DXF_IMPORT_PLUGIN::addVertex( const DL_VertexData& aData )
|
||||||
if( m_curr_entity.m_EntityParseStatus == 0 )
|
if( m_curr_entity.m_EntityParseStatus == 0 )
|
||||||
return; // Error
|
return; // Error
|
||||||
|
|
||||||
double lineWidth = mapWidth( attributes.getWidth() );
|
DXF_IMPORT_LAYER* layer = getImportLayer( attributes.getLayer() );
|
||||||
|
double lineWidth = lineWeightToWidth( attributes.getWidth(), layer );
|
||||||
|
|
||||||
const DL_VertexData* vertex = &aData;
|
const DL_VertexData* vertex = &aData;
|
||||||
|
|
||||||
|
@ -299,14 +347,15 @@ void DXF_IMPORT_PLUGIN::addVertex( const DL_VertexData& aData )
|
||||||
|
|
||||||
void DXF_IMPORT_PLUGIN::endEntity()
|
void DXF_IMPORT_PLUGIN::endEntity()
|
||||||
{
|
{
|
||||||
|
DXF_IMPORT_LAYER* layer = getImportLayer( attributes.getLayer() );
|
||||||
|
double lineWidth = lineWeightToWidth( attributes.getWidth(), layer );
|
||||||
|
|
||||||
if( m_curr_entity.m_EntityType == DL_ENTITY_POLYLINE ||
|
if( m_curr_entity.m_EntityType == DL_ENTITY_POLYLINE ||
|
||||||
m_curr_entity.m_EntityType == DL_ENTITY_LWPOLYLINE )
|
m_curr_entity.m_EntityType == DL_ENTITY_LWPOLYLINE )
|
||||||
{
|
{
|
||||||
// Polyline flags bit 0 indicates closed (1) or open (0) polyline
|
// Polyline flags bit 0 indicates closed (1) or open (0) polyline
|
||||||
if( m_curr_entity.m_EntityFlag & 1 )
|
if( m_curr_entity.m_EntityFlag & 1 )
|
||||||
{
|
{
|
||||||
double lineWidth = mapWidth( attributes.getWidth() );
|
|
||||||
|
|
||||||
if( std::abs( m_curr_entity.m_BulgeVertex ) < MIN_BULGE )
|
if( std::abs( m_curr_entity.m_BulgeVertex ) < MIN_BULGE )
|
||||||
insertLine( m_curr_entity.m_LastCoordinate, m_curr_entity.m_PolylineStart,
|
insertLine( m_curr_entity.m_LastCoordinate, m_curr_entity.m_PolylineStart,
|
||||||
lineWidth );
|
lineWidth );
|
||||||
|
@ -318,7 +367,6 @@ void DXF_IMPORT_PLUGIN::endEntity()
|
||||||
|
|
||||||
if( m_curr_entity.m_EntityType == DL_ENTITY_SPLINE )
|
if( m_curr_entity.m_EntityType == DL_ENTITY_SPLINE )
|
||||||
{
|
{
|
||||||
double lineWidth = mapWidth( attributes.getWidth() );
|
|
||||||
insertSpline( lineWidth );
|
insertSpline( lineWidth );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -345,8 +393,10 @@ void DXF_IMPORT_PLUGIN::addCircle( const DL_CircleData& aData )
|
||||||
if( m_inBlock )
|
if( m_inBlock )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
VECTOR2D center( mapX( aData.cx ), mapY( aData.cy ) );
|
VECTOR2D center( mapX( aData.cx ), mapY( aData.cy ) );
|
||||||
double lineWidth = mapWidth( attributes.getWidth() );
|
DXF_IMPORT_LAYER* layer = getImportLayer( attributes.getLayer() );
|
||||||
|
double lineWidth = lineWeightToWidth( attributes.getWidth(), layer );
|
||||||
|
|
||||||
m_internalImporter.AddCircle( center, mapDim( aData.radius ), lineWidth, false );
|
m_internalImporter.AddCircle( center, mapDim( aData.radius ), lineWidth, false );
|
||||||
|
|
||||||
VECTOR2D radiusDelta( mapDim( aData.radius ), mapDim( aData.radius ) );
|
VECTOR2D radiusDelta( mapDim( aData.radius ), mapDim( aData.radius ) );
|
||||||
|
@ -379,7 +429,8 @@ void DXF_IMPORT_PLUGIN::addArc( const DL_ArcData& aData )
|
||||||
if( angle > 0.0 )
|
if( angle > 0.0 )
|
||||||
angle -= 360.0;
|
angle -= 360.0;
|
||||||
|
|
||||||
double lineWidth = mapWidth( attributes.getWidth() );
|
DXF_IMPORT_LAYER* layer = getImportLayer( attributes.getLayer() );
|
||||||
|
double lineWidth = lineWeightToWidth( attributes.getWidth(), layer );
|
||||||
m_internalImporter.AddArc( center, arcStart, angle, lineWidth );
|
m_internalImporter.AddArc( center, arcStart, angle, lineWidth );
|
||||||
|
|
||||||
VECTOR2D radiusDelta( mapDim( aData.radius ), mapDim( aData.radius ) );
|
VECTOR2D radiusDelta( mapDim( aData.radius ), mapDim( aData.radius ) );
|
||||||
|
|
|
@ -110,6 +110,26 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Magic constants as defined by dxf specification for line weight
|
||||||
|
#define DXF_IMPORT_LINEWEIGHT_BY_LAYER -1
|
||||||
|
#define DXF_IMPORT_LINEWEIGHT_BY_BLOCK -2
|
||||||
|
#define DXF_IMPORT_LINEWEIGHT_BY_LW_DEFAULT -3
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper class to hold layer settings temporarily during import
|
||||||
|
*/
|
||||||
|
class DXF_IMPORT_LAYER
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxString m_layerName;
|
||||||
|
int m_lineWeight;
|
||||||
|
|
||||||
|
DXF_IMPORT_LAYER( wxString aName, int aLineWeight )
|
||||||
|
{
|
||||||
|
m_layerName = aName;
|
||||||
|
m_lineWeight = aLineWeight;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class import DXF ASCII files and convert basic entities to board entities.
|
* This class import DXF ASCII files and convert basic entities to board entities.
|
||||||
|
@ -144,6 +164,8 @@ private:
|
||||||
|
|
||||||
GRAPHICS_IMPORTER_BUFFER m_internalImporter;
|
GRAPHICS_IMPORTER_BUFFER m_internalImporter;
|
||||||
|
|
||||||
|
std::vector<std::unique_ptr<DXF_IMPORT_LAYER>> m_layers; // List of layers as we import, used just to grab props for objects
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DXF_IMPORT_PLUGIN();
|
DXF_IMPORT_PLUGIN();
|
||||||
~DXF_IMPORT_PLUGIN();
|
~DXF_IMPORT_PLUGIN();
|
||||||
|
@ -236,9 +258,15 @@ private:
|
||||||
double mapX( double aDxfCoordX );
|
double mapX( double aDxfCoordX );
|
||||||
double mapY( double aDxfCoordY );
|
double mapY( double aDxfCoordY );
|
||||||
double mapDim( double aDxfValue );
|
double mapDim( double aDxfValue );
|
||||||
// mapWidth returns ( in mm) the aDxfValue if aDxfWidth > 0
|
double lineWeightToWidth( int lw, DXF_IMPORT_LAYER* aLayer );
|
||||||
// or m_defaultThickness
|
|
||||||
double mapWidth( double aDxfWidth );
|
/**
|
||||||
|
* Returns the import layer data
|
||||||
|
*
|
||||||
|
* @param aLayerName is the raw string from dxflib getLayer()
|
||||||
|
* @returns The given layer by name or the placeholder layer inserted in the constructor
|
||||||
|
*/
|
||||||
|
DXF_IMPORT_LAYER* getImportLayer( const std::string& aLayerName );
|
||||||
|
|
||||||
// Functions to aid in the creation of a Polyline
|
// Functions to aid in the creation of a Polyline
|
||||||
void insertLine( const VECTOR2D& aSegStart, const VECTOR2D& aSegEnd, int aWidth );
|
void insertLine( const VECTOR2D& aSegStart, const VECTOR2D& aSegEnd, int aWidth );
|
||||||
|
@ -268,7 +296,8 @@ private:
|
||||||
virtual void setVariableDouble( const std::string& key, double value, int code ) override {}
|
virtual void setVariableDouble( const std::string& key, double value, int code ) override {}
|
||||||
|
|
||||||
virtual void addLayer( const DL_LayerData& aData ) override;
|
virtual void addLayer( const DL_LayerData& aData ) override;
|
||||||
virtual void addLine( const DL_LineData& aData) override;
|
virtual void addLine( const DL_LineData& aData ) override;
|
||||||
|
virtual void addLinetype( const DL_LinetypeData& data ) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called for each BLOCK in the DXF file
|
* Called for each BLOCK in the DXF file
|
||||||
|
|
Loading…
Reference in New Issue