7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-21 17:23:44 +00:00

Ensure constraints when changing pad hole properties

Also expose hole shape to properties system

Fixes https://gitlab.com/kicad/code/kicad/-/issues/17575
This commit is contained in:
Jon Evans 2024-08-11 18:10:03 -04:00
parent 014a2a49e1
commit c9af2f318f
2 changed files with 43 additions and 7 deletions

View File

@ -377,6 +377,28 @@ bool PAD::FlashLayer( int aLayer, bool aOnlyCheckIfPermitted ) const
}
void PAD::SetDrillSizeX( const int aX )
{
m_padStack.Drill().size.x = aX;
if( GetDrillShape() == PAD_DRILL_SHAPE::CIRCLE )
SetDrillSizeY( aX );
SetDirty();
}
void PAD::SetDrillShape( PAD_DRILL_SHAPE aShape )
{
m_padStack.Drill().shape = aShape;
if( aShape == PAD_DRILL_SHAPE::CIRCLE )
SetDrillSizeY( GetDrillSizeX() );
m_shapesDirty = true;
}
int PAD::GetRoundRectCornerRadius() const
{
return m_padStack.RoundRectRadius();
@ -2473,6 +2495,10 @@ static struct PAD_DESC
.Map( PAD_PROP::CASTELLATED, _HKI( "Castellated pad" ) )
.Map( PAD_PROP::MECHANICAL, _HKI( "Mechanical pad" ) );
ENUM_MAP<PAD_DRILL_SHAPE>::Instance()
.Map( PAD_DRILL_SHAPE::CIRCLE, _HKI( "Round" ) )
.Map( PAD_DRILL_SHAPE::OBLONG, _HKI( "Oblong" ) );
ENUM_MAP<ZONE_CONNECTION>& zcMap = ENUM_MAP<ZONE_CONNECTION>::Instance();
if( zcMap.Choices().GetCount() == 0 )
@ -2577,6 +2603,10 @@ static struct PAD_DESC
} );
propMgr.AddProperty( roundRadiusRatio, groupPad );
propMgr.AddProperty( new PROPERTY_ENUM<PAD, PAD_DRILL_SHAPE>( _HKI( "Hole Shape" ),
&PAD::SetDrillShape, &PAD::GetDrillShape ), groupPad )
.SetWriteableFunc( padCanHaveHole );
propMgr.AddProperty( new PROPERTY<PAD, int>( _HKI( "Hole Size X" ),
&PAD::SetDrillSizeX, &PAD::GetDrillSizeX,
PROPERTY_DISPLAY::PT_SIZE ), groupPad )
@ -2587,7 +2617,16 @@ static struct PAD_DESC
&PAD::SetDrillSizeY, &PAD::GetDrillSizeY,
PROPERTY_DISPLAY::PT_SIZE ), groupPad )
.SetWriteableFunc( padCanHaveHole )
.SetValidator( PROPERTY_VALIDATORS::PositiveIntValidator );
.SetValidator( PROPERTY_VALIDATORS::PositiveIntValidator )
.SetAvailableFunc(
[=]( INSPECTABLE* aItem ) -> bool
{
// Circle holes have no usable y-size
if( PAD* pad = dynamic_cast<PAD*>( aItem ) )
return pad->GetDrillShape() != PAD_DRILL_SHAPE::CIRCLE;
return true;
} );
propMgr.AddProperty( new PROPERTY_ENUM<PAD, PAD_PROP>( _HKI( "Fabrication Property" ),
&PAD::SetProperty, &PAD::GetProperty ), groupPad );
@ -2653,3 +2692,4 @@ static struct PAD_DESC
ENUM_TO_WXANY( PAD_ATTRIB );
ENUM_TO_WXANY( PAD_SHAPE );
ENUM_TO_WXANY( PAD_PROP );
ENUM_TO_WXANY( PAD_DRILL_SHAPE );

View File

@ -265,7 +265,7 @@ public:
void SetDrillSize( const VECTOR2I& aSize ) { m_padStack.Drill().size = aSize; SetDirty(); }
const VECTOR2I& GetDrillSize() const { return m_padStack.Drill().size; }
void SetDrillSizeX( const int aX ) { m_padStack.Drill().size.x = aX; SetDirty(); }
void SetDrillSizeX( const int aX );
int GetDrillSizeX() const { return m_padStack.Drill().size.x; }
void SetDrillSizeY( const int aY ) { m_padStack.Drill().size.y = aY; SetDirty(); }
int GetDrillSizeY() const { return m_padStack.Drill().size.y; }
@ -369,11 +369,7 @@ public:
return m_padStack.GetOrientation().AsDegrees();
}
void SetDrillShape( PAD_DRILL_SHAPE aShape )
{
m_padStack.Drill().shape = aShape;
m_shapesDirty = true;
}
void SetDrillShape( PAD_DRILL_SHAPE aShape );
PAD_DRILL_SHAPE GetDrillShape() const { return m_padStack.Drill().shape; }
bool IsDirty() const