Add zone area to message panel
ADDED: Area of zone fill is displayed in the message panel Fixes https://gitlab.com/kicad/code/kicad/issues/2412
This commit is contained in:
parent
7d64527eeb
commit
6b8d81e95d
|
@ -124,25 +124,40 @@ double To_User_Unit( EDA_UNITS aUnit, double aValue, bool aUseMils )
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// A lower-precision (for readability) version of StringFromValue()
|
// A lower-precision (for readability) version of StringFromValue()
|
||||||
wxString MessageTextFromValue( EDA_UNITS aUnits, int aValue, bool aUseMils )
|
wxString MessageTextFromValue( EDA_UNITS aUnits, int aValue, bool aUseMils, EDA_DATA_TYPE aType )
|
||||||
{
|
{
|
||||||
return MessageTextFromValue( aUnits, double( aValue ), aUseMils );
|
return MessageTextFromValue( aUnits, double( aValue ), aUseMils );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// A lower-precision (for readability) version of StringFromValue()
|
// A lower-precision (for readability) version of StringFromValue()
|
||||||
wxString MessageTextFromValue( EDA_UNITS aUnits, long long int aValue, bool aUseMils )
|
wxString MessageTextFromValue( EDA_UNITS aUnits, long long int aValue,
|
||||||
|
bool aUseMils, EDA_DATA_TYPE aType )
|
||||||
{
|
{
|
||||||
return MessageTextFromValue( aUnits, double( aValue ), aUseMils );
|
return MessageTextFromValue( aUnits, double( aValue ), aUseMils );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// A lower-precision (for readability) version of StringFromValue()
|
// A lower-precision (for readability) version of StringFromValue()
|
||||||
wxString MessageTextFromValue( EDA_UNITS aUnits, double aValue, bool aUseMils )
|
wxString MessageTextFromValue( EDA_UNITS aUnits, double aValue, bool aUseMils, EDA_DATA_TYPE aType )
|
||||||
{
|
{
|
||||||
wxString text;
|
wxString text;
|
||||||
const wxChar* format;
|
const wxChar* format;
|
||||||
double value = To_User_Unit( aUnits, aValue, aUseMils );
|
double value = aValue;
|
||||||
|
|
||||||
|
switch( aType )
|
||||||
|
{
|
||||||
|
case EDA_DATA_TYPE::VOLUME:
|
||||||
|
value = To_User_Unit( aUnits, value, aUseMils );
|
||||||
|
// Fall through to continue computation
|
||||||
|
|
||||||
|
case EDA_DATA_TYPE::AREA:
|
||||||
|
value = To_User_Unit( aUnits, value, aUseMils );
|
||||||
|
// Fall through to continue computation
|
||||||
|
|
||||||
|
case EDA_DATA_TYPE::DISTANCE:
|
||||||
|
value = To_User_Unit( aUnits, value, aUseMils );
|
||||||
|
}
|
||||||
|
|
||||||
if( aUnits == EDA_UNITS::INCHES )
|
if( aUnits == EDA_UNITS::INCHES )
|
||||||
{
|
{
|
||||||
|
@ -175,7 +190,7 @@ wxString MessageTextFromValue( EDA_UNITS aUnits, double aValue, bool aUseMils )
|
||||||
text.Printf( format, value );
|
text.Printf( format, value );
|
||||||
text += " ";
|
text += " ";
|
||||||
|
|
||||||
text += GetAbbreviatedUnitsLabel( aUnits, aUseMils );
|
text += GetAbbreviatedUnitsLabel( aUnits, aUseMils, aType );
|
||||||
|
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
@ -449,18 +464,46 @@ wxString AngleToStringDegrees( double aAngle )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
wxString GetAbbreviatedUnitsLabel( EDA_UNITS aUnit, bool aUseMils )
|
wxString GetAbbreviatedUnitsLabel( EDA_UNITS aUnit, bool aUseMils, EDA_DATA_TYPE aType )
|
||||||
{
|
{
|
||||||
switch( aUnit )
|
switch( aUnit )
|
||||||
{
|
{
|
||||||
case EDA_UNITS::INCHES:
|
case EDA_UNITS::INCHES:
|
||||||
if( aUseMils )
|
if( aUseMils )
|
||||||
return _( "mils" );
|
{
|
||||||
|
switch( aType )
|
||||||
|
{
|
||||||
|
case EDA_DATA_TYPE::DISTANCE:
|
||||||
|
return _( "mils" );
|
||||||
|
case EDA_DATA_TYPE::AREA:
|
||||||
|
return _( "sq. mils" );
|
||||||
|
case EDA_DATA_TYPE::VOLUME:
|
||||||
|
return _( "cu. mils" );
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return _( "in" );
|
{
|
||||||
|
switch( aType )
|
||||||
|
{
|
||||||
|
case EDA_DATA_TYPE::DISTANCE:
|
||||||
|
return _( "in" );
|
||||||
|
case EDA_DATA_TYPE::AREA:
|
||||||
|
return _( "sq. in" );
|
||||||
|
case EDA_DATA_TYPE::VOLUME:
|
||||||
|
return _( "cu. in" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case EDA_UNITS::MILLIMETRES:
|
case EDA_UNITS::MILLIMETRES:
|
||||||
return _( "mm" );
|
switch( aType )
|
||||||
|
{
|
||||||
|
case EDA_DATA_TYPE::DISTANCE:
|
||||||
|
return _( "mm" );
|
||||||
|
case EDA_DATA_TYPE::AREA:
|
||||||
|
return _( "sq. mm" );
|
||||||
|
case EDA_DATA_TYPE::VOLUME:
|
||||||
|
return _( "cu. mm" );
|
||||||
|
}
|
||||||
|
|
||||||
case EDA_UNITS::PERCENT:
|
case EDA_UNITS::PERCENT:
|
||||||
return _( "%" );
|
return _( "%" );
|
||||||
|
|
|
@ -107,13 +107,17 @@ wxString AngleToStringDegrees( double aAngle );
|
||||||
* message text.
|
* message text.
|
||||||
* @param aValue The double value to convert.
|
* @param aValue The double value to convert.
|
||||||
* @param aUseMils Convert inch values to mils if true.
|
* @param aUseMils Convert inch values to mils if true.
|
||||||
|
* @param aType Type of the unit being used (e.g. distance, area, etc.)
|
||||||
* @return The converted string for display in user interface elements.
|
* @return The converted string for display in user interface elements.
|
||||||
*/
|
*/
|
||||||
wxString MessageTextFromValue( EDA_UNITS aUnits, double aValue, bool aUseMils = false );
|
wxString MessageTextFromValue( EDA_UNITS aUnits, double aValue, bool aUseMils = false,
|
||||||
|
EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE );
|
||||||
|
|
||||||
wxString MessageTextFromValue( EDA_UNITS aUnits, int aValue, bool aUseMils = false );
|
wxString MessageTextFromValue( EDA_UNITS aUnits, int aValue, bool aUseMils = false,
|
||||||
|
EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE );
|
||||||
|
|
||||||
wxString MessageTextFromValue( EDA_UNITS aUnits, long long int aValue, bool aUseMils = false );
|
wxString MessageTextFromValue( EDA_UNITS aUnits, long long int aValue, bool aUseMils = false,
|
||||||
|
EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function StringFromValue
|
* Function StringFromValue
|
||||||
|
@ -177,9 +181,12 @@ void FetchUnitsFromString( const wxString& aTextValue, EDA_UNITS& aUnits, bool&
|
||||||
* Get the units string for a given units type.
|
* Get the units string for a given units type.
|
||||||
*
|
*
|
||||||
* @param aUnits - The units requested.
|
* @param aUnits - The units requested.
|
||||||
|
* @param aUseMils - Use mils for the unit
|
||||||
|
* @param aType - The data type of the unit (e.g. distance, area, etc.)
|
||||||
* @return The human readable units string.
|
* @return The human readable units string.
|
||||||
*/
|
*/
|
||||||
wxString GetAbbreviatedUnitsLabel( EDA_UNITS aUnit, bool aUseMils = false );
|
wxString GetAbbreviatedUnitsLabel( EDA_UNITS aUnit, bool aUseMils = false,
|
||||||
|
EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function FormatInternalUnits
|
* Function FormatInternalUnits
|
||||||
|
|
|
@ -69,6 +69,16 @@ typedef uint32_t timestamp_t;
|
||||||
#define TEXT_ANGLE_HORIZ 0
|
#define TEXT_ANGLE_HORIZ 0
|
||||||
#define TEXT_ANGLE_VERT 900
|
#define TEXT_ANGLE_VERT 900
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of unit.
|
||||||
|
*/
|
||||||
|
enum class EDA_DATA_TYPE
|
||||||
|
{
|
||||||
|
DISTANCE = 0,
|
||||||
|
AREA = 1,
|
||||||
|
VOLUME = 2
|
||||||
|
};
|
||||||
|
|
||||||
enum class EDA_UNITS
|
enum class EDA_UNITS
|
||||||
{
|
{
|
||||||
INCHES = 0,
|
INCHES = 0,
|
||||||
|
|
|
@ -44,7 +44,8 @@
|
||||||
|
|
||||||
|
|
||||||
ZONE_CONTAINER::ZONE_CONTAINER( BOARD_ITEM_CONTAINER* aParent, bool aInModule )
|
ZONE_CONTAINER::ZONE_CONTAINER( BOARD_ITEM_CONTAINER* aParent, bool aInModule )
|
||||||
: BOARD_CONNECTED_ITEM( aParent, aInModule ? PCB_MODULE_ZONE_AREA_T : PCB_ZONE_AREA_T )
|
: BOARD_CONNECTED_ITEM( aParent, aInModule ? PCB_MODULE_ZONE_AREA_T : PCB_ZONE_AREA_T ),
|
||||||
|
m_area( 0.0 )
|
||||||
{
|
{
|
||||||
m_CornerSelection = nullptr; // no corner is selected
|
m_CornerSelection = nullptr; // no corner is selected
|
||||||
m_IsFilled = false; // fill status : true when the zone is filled
|
m_IsFilled = false; // fill status : true when the zone is filled
|
||||||
|
@ -753,6 +754,9 @@ void ZONE_CONTAINER::GetMsgPanelInfo( EDA_UNITS aUnits, std::vector<MSG_PANEL_IT
|
||||||
|
|
||||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Fill Mode" ), msg, BROWN ) );
|
aList.emplace_back( MSG_PANEL_ITEM( _( "Fill Mode" ), msg, BROWN ) );
|
||||||
|
|
||||||
|
msg = MessageTextFromValue( aUnits, m_area, false, EDA_DATA_TYPE::AREA );
|
||||||
|
aList.emplace_back( MSG_PANEL_ITEM( _( "Filled Area" ), msg, BLUE ) );
|
||||||
|
|
||||||
// Useful for statistics :
|
// Useful for statistics :
|
||||||
msg.Printf( wxT( "%d" ), (int) m_HatchLines.size() );
|
msg.Printf( wxT( "%d" ), (int) m_HatchLines.size() );
|
||||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Hatch Lines" ), msg, BLUE ) );
|
aList.emplace_back( MSG_PANEL_ITEM( _( "Hatch Lines" ), msg, BLUE ) );
|
||||||
|
@ -1259,6 +1263,27 @@ bool ZONE_CONTAINER::BuildSmoothedPoly( SHAPE_POLY_SET& aSmoothedPoly,
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
double ZONE_CONTAINER::CalculateFilledArea()
|
||||||
|
{
|
||||||
|
m_area = 0.0;
|
||||||
|
|
||||||
|
// Iterate over each outline polygon in the zone and then iterate over
|
||||||
|
// each hole it has to compute the total area.
|
||||||
|
for( int i = 0; i < m_FilledPolysList.OutlineCount(); i++ )
|
||||||
|
{
|
||||||
|
m_area += m_FilledPolysList.Outline( i ).Area();
|
||||||
|
|
||||||
|
for( int j = 0; m_FilledPolysList.HoleCount( i ); j++ )
|
||||||
|
{
|
||||||
|
m_area -= m_FilledPolysList.Hole( i, j ).Area();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_area;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Function TransformOutlinesShapeWithClearanceToPolygon
|
/* Function TransformOutlinesShapeWithClearanceToPolygon
|
||||||
* Convert the zone filled areas polygons to polygons
|
* Convert the zone filled areas polygons to polygons
|
||||||
* inflated (optional) by max( aClearanceValue, the zone clearance)
|
* inflated (optional) by max( aClearanceValue, the zone clearance)
|
||||||
|
|
|
@ -167,6 +167,24 @@ public:
|
||||||
}
|
}
|
||||||
int GetThermalReliefCopperBridge( D_PAD* aPad = NULL ) const;
|
int GetThermalReliefCopperBridge( D_PAD* aPad = NULL ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the area currently occupied by the zone fill.
|
||||||
|
*
|
||||||
|
* @return the currently filled area
|
||||||
|
*/
|
||||||
|
double CalculateFilledArea();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the area currently occupied by the zone fill.
|
||||||
|
* This area is cached from the most recent call to CalculateFilledArea().
|
||||||
|
*
|
||||||
|
* @return the filled area
|
||||||
|
*/
|
||||||
|
double GetFilledArea()
|
||||||
|
{
|
||||||
|
return m_area;
|
||||||
|
}
|
||||||
|
|
||||||
bool IsFilled() const { return m_IsFilled; }
|
bool IsFilled() const { return m_IsFilled; }
|
||||||
void SetIsFilled( bool isFilled ) { m_IsFilled = isFilled; }
|
void SetIsFilled( bool isFilled ) { m_IsFilled = isFilled; }
|
||||||
|
|
||||||
|
@ -814,6 +832,8 @@ protected:
|
||||||
std::vector<int> m_insulatedIslands;
|
std::vector<int> m_insulatedIslands;
|
||||||
|
|
||||||
bool m_hv45; // constrain edges to horizontal, vertical or 45º
|
bool m_hv45; // constrain edges to horizontal, vertical or 45º
|
||||||
|
|
||||||
|
double m_area; // The filled zone area
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3889,7 +3889,10 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER( BOARD_ITEM_CONTAINER* aParent )
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !pts.IsEmpty() )
|
if( !pts.IsEmpty() )
|
||||||
|
{
|
||||||
zone->SetFilledPolysList( pts );
|
zone->SetFilledPolysList( pts );
|
||||||
|
zone->CalculateFilledArea();
|
||||||
|
}
|
||||||
|
|
||||||
// Ensure keepout and non copper zones do not have a net
|
// Ensure keepout and non copper zones do not have a net
|
||||||
// (which have no sense for these zones)
|
// (which have no sense for these zones)
|
||||||
|
|
|
@ -241,6 +241,7 @@ bool ZONE_FILLER::Fill( const std::vector<ZONE_CONTAINER*>& aZones, bool aCheck
|
||||||
}
|
}
|
||||||
|
|
||||||
zone.m_zone->SetFilledPolysList( poly );
|
zone.m_zone->SetFilledPolysList( poly );
|
||||||
|
zone.m_zone->CalculateFilledArea();
|
||||||
|
|
||||||
if( aCheck && zone.m_zone->GetHashValue() != poly.GetHash() )
|
if( aCheck && zone.m_zone->GetHashValue() != poly.GetHash() )
|
||||||
outOfDate = true;
|
outOfDate = true;
|
||||||
|
|
Loading…
Reference in New Issue