schematic: draw groups

This commit is contained in:
Mike Williams 2025-04-03 14:12:51 -04:00
parent 0c0dbc6271
commit fa02c70604
2 changed files with 76 additions and 1 deletions

View File

@ -43,6 +43,7 @@
#include <sch_symbol.h> #include <sch_symbol.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <sch_field.h> #include <sch_field.h>
#include <sch_group.h>
#include <sch_junction.h> #include <sch_junction.h>
#include <sch_line.h> #include <sch_line.h>
#include <sch_shape.h> #include <sch_shape.h>
@ -211,6 +212,9 @@ void SCH_PAINTER::draw( const EDA_ITEM* aItem, int aLayer, bool aDimmed )
case SCH_MARKER_T: case SCH_MARKER_T:
draw( static_cast<const SCH_MARKER*>( aItem ), aLayer ); draw( static_cast<const SCH_MARKER*>( aItem ), aLayer );
break; break;
case SCH_GROUP_T:
draw( static_cast<const SCH_GROUP*>( aItem ), aLayer );
break;
default: return; default: return;
} }
@ -3039,4 +3043,73 @@ void SCH_PAINTER::draw( const SCH_MARKER* aMarker, int aLayer )
} }
void SCH_PAINTER::draw( const SCH_GROUP* aGroup, int aLayer )
{
const bool drawingShadows = false;
if( aLayer == LAYER_SCHEMATIC_ANCHOR )
{
if( aGroup->IsSelected() && !( aGroup->GetParent() && aGroup->GetParent()->IsSelected() ) )
{
// Selected on our own; draw enclosing box
}
else if( aGroup->IsEntered() )
{
// Entered group; draw enclosing box
}
else
{
// Neither selected nor entered; draw nothing at the group level (ie: only draw
// its members)
return;
}
const COLOR4D color = getRenderColor( aGroup, LAYER_SCHEMATIC_ANCHOR, drawingShadows );
m_gal->SetStrokeColor( color );
m_gal->SetLineWidth( m_schSettings.GetOutlineWidth() * 2.0f );
BOX2I bbox = aGroup->GetBoundingBox();
VECTOR2I topLeft = bbox.GetPosition();
VECTOR2I width = VECTOR2I( bbox.GetWidth(), 0 );
VECTOR2I height = VECTOR2I( 0, bbox.GetHeight() );
m_gal->DrawLine( topLeft, topLeft + width );
m_gal->DrawLine( topLeft + width, topLeft + width + height );
m_gal->DrawLine( topLeft + width + height, topLeft + height );
m_gal->DrawLine( topLeft + height, topLeft );
wxString name = aGroup->GetName();
if( name.IsEmpty() )
return;
int ptSize = 12;
int scaledSize = abs( KiROUND( m_gal->GetScreenWorldMatrix().GetScale().x * ptSize ) );
int unscaledSize = schIUScale.MilsToIU( ptSize );
// Scale by zoom a bit, but not too much
int textSize = ( scaledSize + ( unscaledSize * 2 ) ) / 3;
VECTOR2I textOffset = VECTOR2I( width.x / 2, -KiROUND( textSize * 0.5 ) );
VECTOR2I titleHeight = VECTOR2I( 0, KiROUND( textSize * 2.0 ) );
if( PrintableCharCount( name ) * textSize < bbox.GetWidth() )
{
m_gal->DrawLine( topLeft, topLeft - titleHeight );
m_gal->DrawLine( topLeft - titleHeight, topLeft + width - titleHeight );
m_gal->DrawLine( topLeft + width - titleHeight, topLeft + width );
TEXT_ATTRIBUTES attrs;
attrs.m_Italic = true;
attrs.m_Halign = GR_TEXT_H_ALIGN_CENTER;
attrs.m_Valign = GR_TEXT_V_ALIGN_BOTTOM;
attrs.m_Size = VECTOR2I( textSize, textSize );
attrs.m_StrokeWidth = GetPenSizeForNormal( textSize );
KIFONT::FONT::GetFont()->Draw( m_gal, aGroup->GetName(), topLeft + textOffset, attrs,
aGroup->GetFontMetrics() );
}
}
}
}; // namespace KIGFX }; // namespace KIGFX

View File

@ -37,6 +37,7 @@ class SCH_PIN;
class LIB_SYMBOL; class LIB_SYMBOL;
class SCH_SYMBOL; class SCH_SYMBOL;
class SCH_FIELD; class SCH_FIELD;
class SCH_GROUP;
class SCH_JUNCTION; class SCH_JUNCTION;
class SCH_LABEL; class SCH_LABEL;
class SCH_TEXT; class SCH_TEXT;
@ -100,6 +101,7 @@ private:
void draw( const SCH_BITMAP* aBitmap, int aLayer ); void draw( const SCH_BITMAP* aBitmap, int aLayer );
void draw( const SCH_LINE* aLine, int aLayer ); void draw( const SCH_LINE* aLine, int aLayer );
void draw( const SCH_BUS_ENTRY_BASE* aEntry, int aLayer ); void draw( const SCH_BUS_ENTRY_BASE* aEntry, int aLayer );
void draw( const SCH_GROUP* aGroup, int aLayer );
void drawPinDanglingIndicator( const SCH_PIN& aPin, const COLOR4D& aColor, bool aDrawingShadows, void drawPinDanglingIndicator( const SCH_PIN& aPin, const COLOR4D& aColor, bool aDrawingShadows,
bool aBrightened ); bool aBrightened );