mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-04-02 18:46:54 +00:00
Shapes for schematic.
ADDED arc, circle and rectangle shapes for schematic. Shapes support line styles and fill colors. CHANGED sheet background color in Edit Text & Graphics Properties to fill color (and it now affects shapes). Pushed STROKE_PARAMS down into common and moved all shapes to using it for stroke descriptions.
This commit is contained in:
parent
4b6bf3095a
commit
2bc86fa0a8
bitmaps_png/png
common
CMakeLists.txtbase_units.cppeda_shape.cpplayer_id.cpp
plotters
render_settings.cppsettings
stroke_params.cppstroke_params.keywordseeschema
CMakeLists.txtbus-wire-junction.cppsch_shape.cppsch_shape.hsch_symbol.cppsch_symbol.hsch_text.cppsch_view.hschematic.keywords
dialogs
dialog_global_edit_text_and_graphics.cppdialog_global_edit_text_and_graphics_base.cppdialog_global_edit_text_and_graphics_base.fbpdialog_global_edit_text_and_graphics_base.hdialog_lib_shape_properties.cppdialog_line_wire_bus_properties.cppdialog_shape_properties.cppdialog_shape_properties.hdialog_shape_properties_base.cppdialog_shape_properties_base.fbpdialog_shape_properties_base.hpanel_eeschema_color_settings.cpp
ee_collectors.cpplib_shape.cpplib_shape.hlib_symbol.cppmenubar.cppsch_bus_entry.cppsch_bus_entry.hsch_file_versions.hsch_item.hsch_line.cppsch_line.hsch_painter.cppsch_painter.hsch_plugins
altium
cadstar
eagle
kicad
legacy
symbol_editor
tools
include
libs/kimath/include/geometry
pcbnew
board_item.cppconvert_shape_list_to_polygon.cpp
dialogs
dialog_global_edit_text_and_graphics.cppdialog_graphic_item_properties.cppdialog_pad_basicshapes_properties.cppdialog_pad_properties.cpp
drc
exporters
fp_shape.cppgraphics_cleaner.cppimport_gfx
microwave
pad_custom_shape_functions.cpppcb_shape.cpppcb_shape.hpcbnew.cppplot_brditems_plotter.cppplugins
altium
cadstar
eagle
fabmaster
geda
kicad
legacy
pcad
tools
qa/pcbnew_utils
Binary file not shown.
Before ![]() (image error) Size: 1.1 KiB After ![]() (image error) Size: 657 B ![]() ![]() |
Binary file not shown.
Before ![]() (image error) Size: 1.1 KiB After ![]() (image error) Size: 666 B ![]() ![]() |
@ -385,6 +385,7 @@ set( COMMON_SRCS
|
|||||||
search_stack.cpp
|
search_stack.cpp
|
||||||
searchhelpfilefullpath.cpp
|
searchhelpfilefullpath.cpp
|
||||||
status_popup.cpp
|
status_popup.cpp
|
||||||
|
stroke_params.cpp
|
||||||
systemdirsappend.cpp
|
systemdirsappend.cpp
|
||||||
template_fieldnames.cpp
|
template_fieldnames.cpp
|
||||||
textentry_tricks.cpp
|
textentry_tricks.cpp
|
||||||
@ -613,6 +614,14 @@ generate_lemon_grammar(
|
|||||||
libeval_compiler/grammar.lemon
|
libeval_compiler/grammar.lemon
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# auto-generate stroke_params_lexer.h and stroke_params_keywords.cpp
|
||||||
|
make_lexer(
|
||||||
|
common
|
||||||
|
stroke_params.keywords
|
||||||
|
stroke_params_lexer.h
|
||||||
|
stroke_params_keywords.cpp
|
||||||
|
STROKEPARAMS_T
|
||||||
|
)
|
||||||
|
|
||||||
# auto-generate netlist_lexer.h and netlist_keywords.cpp
|
# auto-generate netlist_lexer.h and netlist_keywords.cpp
|
||||||
make_lexer(
|
make_lexer(
|
||||||
|
@ -35,11 +35,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <base_units.h>
|
#include <base_units.h>
|
||||||
#include <common.h>
|
|
||||||
#include <string_utils.h>
|
#include <string_utils.h>
|
||||||
#include <math/util.h> // for KiROUND
|
#include <math/util.h> // for KiROUND
|
||||||
#include <macros.h>
|
#include <macros.h>
|
||||||
#include <title_block.h>
|
|
||||||
|
|
||||||
#if defined( PCBNEW ) || defined( CVPCB ) || defined( EESCHEMA ) || defined( GERBVIEW ) || defined( PL_EDITOR )
|
#if defined( PCBNEW ) || defined( CVPCB ) || defined( EESCHEMA ) || defined( GERBVIEW ) || defined( PL_EDITOR )
|
||||||
#define IU_TO_MM( x ) ( x / IU_PER_MM )
|
#define IU_TO_MM( x ) ( x / IU_PER_MM )
|
||||||
|
@ -40,8 +40,9 @@
|
|||||||
EDA_SHAPE::EDA_SHAPE( SHAPE_T aType, int aLineWidth, FILL_T aFill, bool eeWinding ) :
|
EDA_SHAPE::EDA_SHAPE( SHAPE_T aType, int aLineWidth, FILL_T aFill, bool eeWinding ) :
|
||||||
m_endsSwapped( false ),
|
m_endsSwapped( false ),
|
||||||
m_shape( aType ),
|
m_shape( aType ),
|
||||||
m_width( aLineWidth ),
|
m_stroke( aLineWidth, PLOT_DASH_TYPE::DEFAULT, COLOR4D::UNSPECIFIED ),
|
||||||
m_fill( aFill ),
|
m_fill( aFill ),
|
||||||
|
m_fillColor( COLOR4D::UNSPECIFIED ),
|
||||||
m_editState( 0 ),
|
m_editState( 0 ),
|
||||||
m_eeWinding( eeWinding )
|
m_eeWinding( eeWinding )
|
||||||
{
|
{
|
||||||
@ -352,7 +353,7 @@ void EDA_SHAPE::flip( const wxPoint& aCentre, bool aFlipLeftRight )
|
|||||||
{
|
{
|
||||||
std::vector<wxPoint> ctrlPoints = { m_start, m_bezierC1, m_bezierC2, m_end };
|
std::vector<wxPoint> ctrlPoints = { m_start, m_bezierC1, m_bezierC2, m_end };
|
||||||
BEZIER_POLY converter( ctrlPoints );
|
BEZIER_POLY converter( ctrlPoints );
|
||||||
converter.GetPoly( m_bezierPoints, m_width );
|
converter.GetPoly( m_bezierPoints, m_stroke.GetWidth() );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -605,7 +606,7 @@ void EDA_SHAPE::ShapeGetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PA
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
aList.emplace_back( _( "Line width" ), MessageTextFromValue( units, m_width ) );
|
aList.emplace_back( _( "Line width" ), MessageTextFromValue( units, GetWidth() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -663,7 +664,7 @@ const EDA_RECT EDA_SHAPE::getBoundingBox() const
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bbox.Inflate( std::max( 0, m_width / 2 ) );
|
bbox.Inflate( std::max( 0, GetWidth() ) / 2 );
|
||||||
bbox.Normalize();
|
bbox.Normalize();
|
||||||
|
|
||||||
return bbox;
|
return bbox;
|
||||||
@ -674,8 +675,8 @@ bool EDA_SHAPE::hitTest( const wxPoint& aPosition, int aAccuracy ) const
|
|||||||
{
|
{
|
||||||
int maxdist = aAccuracy;
|
int maxdist = aAccuracy;
|
||||||
|
|
||||||
if( m_width > 0 )
|
if( GetWidth() > 0 )
|
||||||
maxdist += m_width / 2;
|
maxdist += GetWidth() / 2;
|
||||||
|
|
||||||
switch( m_shape )
|
switch( m_shape )
|
||||||
{
|
{
|
||||||
@ -727,7 +728,7 @@ bool EDA_SHAPE::hitTest( const wxPoint& aPosition, int aAccuracy ) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
case SHAPE_T::BEZIER:
|
case SHAPE_T::BEZIER:
|
||||||
const_cast<EDA_SHAPE*>( this )->RebuildBezierToSegmentsPointsList( m_width );
|
const_cast<EDA_SHAPE*>( this )->RebuildBezierToSegmentsPointsList( GetWidth() );
|
||||||
|
|
||||||
for( unsigned int i= 1; i < m_bezierPoints.size(); i++)
|
for( unsigned int i= 1; i < m_bezierPoints.size(); i++)
|
||||||
{
|
{
|
||||||
@ -1070,7 +1071,7 @@ void EDA_SHAPE::SetPolyPoints( const std::vector<wxPoint>& aPoints )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<SHAPE*> EDA_SHAPE::MakeEffectiveShapes() const
|
std::vector<SHAPE*> EDA_SHAPE::MakeEffectiveShapes( bool aEdgeOnly ) const
|
||||||
{
|
{
|
||||||
std::vector<SHAPE*> effectiveShapes;
|
std::vector<SHAPE*> effectiveShapes;
|
||||||
|
|
||||||
@ -1078,60 +1079,50 @@ std::vector<SHAPE*> EDA_SHAPE::MakeEffectiveShapes() const
|
|||||||
{
|
{
|
||||||
case SHAPE_T::ARC:
|
case SHAPE_T::ARC:
|
||||||
effectiveShapes.emplace_back( new SHAPE_ARC( m_arcCenter, m_start, GetArcAngle() / 10.0,
|
effectiveShapes.emplace_back( new SHAPE_ARC( m_arcCenter, m_start, GetArcAngle() / 10.0,
|
||||||
m_width ) );
|
GetWidth() ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SHAPE_T::SEGMENT:
|
case SHAPE_T::SEGMENT:
|
||||||
effectiveShapes.emplace_back( new SHAPE_SEGMENT( m_start, m_end, m_width ) );
|
effectiveShapes.emplace_back( new SHAPE_SEGMENT( m_start, m_end, GetWidth() ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SHAPE_T::RECT:
|
case SHAPE_T::RECT:
|
||||||
{
|
{
|
||||||
std::vector<wxPoint> pts = GetRectCorners();
|
std::vector<wxPoint> pts = GetRectCorners();
|
||||||
|
|
||||||
if( IsFilled() )
|
if( IsFilled() && !aEdgeOnly )
|
||||||
effectiveShapes.emplace_back( new SHAPE_SIMPLE( pts ) );
|
effectiveShapes.emplace_back( new SHAPE_SIMPLE( pts ) );
|
||||||
|
|
||||||
if( m_width > 0 || !IsFilled() )
|
if( GetWidth() > 0 || !IsFilled() || aEdgeOnly )
|
||||||
{
|
{
|
||||||
effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[0], pts[1], m_width ) );
|
effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[0], pts[1], GetWidth() ) );
|
||||||
effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[1], pts[2], m_width ) );
|
effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[1], pts[2], GetWidth() ) );
|
||||||
effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[2], pts[3], m_width ) );
|
effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[2], pts[3], GetWidth() ) );
|
||||||
effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[3], pts[0], m_width ) );
|
effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[3], pts[0], GetWidth() ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SHAPE_T::CIRCLE:
|
case SHAPE_T::CIRCLE:
|
||||||
{
|
{
|
||||||
if( IsFilled() )
|
if( IsFilled() && !aEdgeOnly )
|
||||||
effectiveShapes.emplace_back( new SHAPE_CIRCLE( getCenter(), GetRadius() ) );
|
effectiveShapes.emplace_back( new SHAPE_CIRCLE( getCenter(), GetRadius() ) );
|
||||||
|
|
||||||
if( m_width > 0 || !IsFilled() )
|
if( GetWidth() > 0 || !IsFilled() || aEdgeOnly )
|
||||||
{
|
effectiveShapes.emplace_back( new SHAPE_ARC( getCenter(), GetEnd(), 360.0 ) );
|
||||||
// SHAPE_CIRCLE has no ConvertToPolyline() method, so use a 360.0 SHAPE_ARC
|
|
||||||
SHAPE_ARC circle( getCenter(), GetEnd(), 360.0 );
|
|
||||||
SHAPE_LINE_CHAIN l = circle.ConvertToPolyline();
|
|
||||||
|
|
||||||
for( int i = 0; i < l.SegmentCount(); i++ )
|
|
||||||
{
|
|
||||||
effectiveShapes.emplace_back( new SHAPE_SEGMENT( l.Segment( i ).A, l.Segment( i ).B,
|
|
||||||
m_width ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SHAPE_T::BEZIER:
|
case SHAPE_T::BEZIER:
|
||||||
{
|
{
|
||||||
auto bezierPoints = buildBezierToSegmentsPointsList( GetWidth() );
|
std::vector<wxPoint> bezierPoints = buildBezierToSegmentsPointsList( GetWidth() );
|
||||||
wxPoint start_pt = bezierPoints[0];
|
wxPoint start_pt = bezierPoints[0];
|
||||||
|
|
||||||
for( unsigned int jj = 1; jj < bezierPoints.size(); jj++ )
|
for( unsigned int jj = 1; jj < bezierPoints.size(); jj++ )
|
||||||
{
|
{
|
||||||
wxPoint end_pt = bezierPoints[jj];
|
wxPoint end_pt = bezierPoints[jj];
|
||||||
effectiveShapes.emplace_back( new SHAPE_SEGMENT( start_pt, end_pt, m_width ) );
|
effectiveShapes.emplace_back( new SHAPE_SEGMENT( start_pt, end_pt, GetWidth() ) );
|
||||||
start_pt = end_pt;
|
start_pt = end_pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1145,13 +1136,13 @@ std::vector<SHAPE*> EDA_SHAPE::MakeEffectiveShapes() const
|
|||||||
l.Rotate( -DECIDEG2RAD( getParentOrientation() ) );
|
l.Rotate( -DECIDEG2RAD( getParentOrientation() ) );
|
||||||
l.Move( getParentPosition() );
|
l.Move( getParentPosition() );
|
||||||
|
|
||||||
if( IsFilled() )
|
if( IsFilled() && !aEdgeOnly )
|
||||||
effectiveShapes.emplace_back( new SHAPE_SIMPLE( l ) );
|
effectiveShapes.emplace_back( new SHAPE_SIMPLE( l ) );
|
||||||
|
|
||||||
if( m_width > 0 || !IsFilled() )
|
if( GetWidth() > 0 || !IsFilled() || aEdgeOnly )
|
||||||
{
|
{
|
||||||
for( int i = 0; i < l.SegmentCount(); i++ )
|
for( int i = 0; i < l.SegmentCount(); i++ )
|
||||||
effectiveShapes.emplace_back( new SHAPE_SEGMENT( l.Segment( i ), m_width ) );
|
effectiveShapes.emplace_back( new SHAPE_SEGMENT( l.Segment( i ), GetWidth() ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1322,9 +1313,9 @@ void EDA_SHAPE::calcEdit( const wxPoint& aPosition )
|
|||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
double chordA = GetLineLength( m_start, aPosition );
|
double radialA = GetLineLength( m_start, aPosition );
|
||||||
double chordB = GetLineLength( m_end, aPosition );
|
double radialB = GetLineLength( m_end, aPosition );
|
||||||
radius = int( ( chordA + chordB ) / 2.0 ) + 1;
|
radius = int( ( radialA + radialB ) / 2.0 ) + 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1373,6 +1364,10 @@ void EDA_SHAPE::calcEdit( const wxPoint& aPosition )
|
|||||||
case 4:
|
case 4:
|
||||||
// Pick the one closer to the mouse position
|
// Pick the one closer to the mouse position
|
||||||
m_arcCenter = GetLineLength( c1, aPosition ) < GetLineLength( c2, aPosition ) ? c1 : c2;
|
m_arcCenter = GetLineLength( c1, aPosition ) < GetLineLength( c2, aPosition ) ? c1 : c2;
|
||||||
|
|
||||||
|
if( GetArcAngle() > 1800 )
|
||||||
|
std::swap( m_start, m_end );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1425,7 +1420,7 @@ void EDA_SHAPE::SwapShape( EDA_SHAPE* aImage )
|
|||||||
EDA_SHAPE* image = dynamic_cast<EDA_SHAPE*>( aImage );
|
EDA_SHAPE* image = dynamic_cast<EDA_SHAPE*>( aImage );
|
||||||
assert( image );
|
assert( image );
|
||||||
|
|
||||||
std::swap( m_width, image->m_width );
|
std::swap( m_stroke, image->m_stroke );
|
||||||
std::swap( m_start, image->m_start );
|
std::swap( m_start, image->m_start );
|
||||||
std::swap( m_end, image->m_end );
|
std::swap( m_end, image->m_end );
|
||||||
std::swap( m_arcCenter, image->m_arcCenter );
|
std::swap( m_arcCenter, image->m_arcCenter );
|
||||||
@ -1462,12 +1457,16 @@ int EDA_SHAPE::Compare( const EDA_SHAPE* aOther ) const
|
|||||||
else if( m_shape == SHAPE_T::POLY )
|
else if( m_shape == SHAPE_T::POLY )
|
||||||
{
|
{
|
||||||
TEST( m_poly.TotalVertices(), aOther->m_poly.TotalVertices() );
|
TEST( m_poly.TotalVertices(), aOther->m_poly.TotalVertices() );
|
||||||
|
|
||||||
for( int ii = 0; ii < m_poly.TotalVertices(); ++ii )
|
|
||||||
TEST_PT( m_poly.CVertex( ii ), aOther->m_poly.CVertex( ii ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_E( m_width, aOther->m_width );
|
for( size_t ii = 0; ii < m_bezierPoints.size(); ++ii )
|
||||||
|
TEST_PT( m_bezierPoints[ii], aOther->m_bezierPoints[ii] );
|
||||||
|
|
||||||
|
for( int ii = 0; ii < m_poly.TotalVertices(); ++ii )
|
||||||
|
TEST_PT( m_poly.CVertex( ii ), aOther->m_poly.CVertex( ii ) );
|
||||||
|
|
||||||
|
TEST_E( m_stroke.GetWidth(), aOther->m_stroke.GetWidth() );
|
||||||
|
TEST( (int) m_stroke.GetPlotStyle(), (int) aOther->m_stroke.GetPlotStyle() );
|
||||||
TEST( (int) m_fill, (int) aOther->m_fill );
|
TEST( (int) m_fill, (int) aOther->m_fill );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1479,7 +1478,7 @@ void EDA_SHAPE::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuf
|
|||||||
int aError, ERROR_LOC aErrorLoc,
|
int aError, ERROR_LOC aErrorLoc,
|
||||||
bool ignoreLineWidth ) const
|
bool ignoreLineWidth ) const
|
||||||
{
|
{
|
||||||
int width = ignoreLineWidth ? 0 : m_width;
|
int width = ignoreLineWidth ? 0 : GetWidth();
|
||||||
|
|
||||||
width += 2 * aClearanceValue;
|
width += 2 * aClearanceValue;
|
||||||
|
|
||||||
@ -1580,7 +1579,7 @@ void EDA_SHAPE::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuf
|
|||||||
std::vector<wxPoint> ctrlPts = { GetStart(), GetBezierC1(), GetBezierC2(), GetEnd() };
|
std::vector<wxPoint> ctrlPts = { GetStart(), GetBezierC1(), GetBezierC2(), GetEnd() };
|
||||||
BEZIER_POLY converter( ctrlPts );
|
BEZIER_POLY converter( ctrlPts );
|
||||||
std::vector< wxPoint> poly;
|
std::vector< wxPoint> poly;
|
||||||
converter.GetPoly( poly, m_width );
|
converter.GetPoly( poly, GetWidth() );
|
||||||
|
|
||||||
for( unsigned ii = 1; ii < poly.size(); ii++ )
|
for( unsigned ii = 1; ii < poly.size(); ii++ )
|
||||||
{
|
{
|
||||||
|
@ -117,6 +117,7 @@ wxString LayerName( int aLayer )
|
|||||||
case LAYER_DEVICE: return _( "Symbol body outlines" );
|
case LAYER_DEVICE: return _( "Symbol body outlines" );
|
||||||
case LAYER_DEVICE_BACKGROUND: return _( "Symbol body fills" );
|
case LAYER_DEVICE_BACKGROUND: return _( "Symbol body fills" );
|
||||||
case LAYER_NOTES: return _( "Schematic text && graphics" );
|
case LAYER_NOTES: return _( "Schematic text && graphics" );
|
||||||
|
case LAYER_NOTES_BACKGROUND: return _( "Schematic text && graphics backgrounds" );
|
||||||
case LAYER_PIN: return _( "Pins" );
|
case LAYER_PIN: return _( "Pins" );
|
||||||
case LAYER_SHEET: return _( "Sheet borders" );
|
case LAYER_SHEET: return _( "Sheet borders" );
|
||||||
case LAYER_SHEET_BACKGROUND: return _( "Sheet backgrounds" );
|
case LAYER_SHEET_BACKGROUND: return _( "Sheet backgrounds" );
|
||||||
|
@ -41,7 +41,6 @@
|
|||||||
#include <eda_item.h>
|
#include <eda_item.h>
|
||||||
#include <plotters/plotter.h>
|
#include <plotters/plotter.h>
|
||||||
#include <geometry/shape_line_chain.h>
|
#include <geometry/shape_line_chain.h>
|
||||||
#include <geometry/geometry_utils.h>
|
|
||||||
#include <bezier_curves.h>
|
#include <bezier_curves.h>
|
||||||
#include <math/util.h> // for KiROUND
|
#include <math/util.h> // for KiROUND
|
||||||
|
|
||||||
@ -138,19 +137,19 @@ double PLOTTER::userToDeviceSize( double size ) const
|
|||||||
|
|
||||||
double PLOTTER::GetDotMarkLenIU() const
|
double PLOTTER::GetDotMarkLenIU() const
|
||||||
{
|
{
|
||||||
return userToDeviceSize( dot_mark_len( GetCurrentLineWidth() ) );
|
return userToDeviceSize( m_renderSettings->GetDotLength( GetCurrentLineWidth() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double PLOTTER::GetDashMarkLenIU() const
|
double PLOTTER::GetDashMarkLenIU() const
|
||||||
{
|
{
|
||||||
return userToDeviceSize( dash_mark_len( GetCurrentLineWidth() ) );
|
return userToDeviceSize( m_renderSettings->GetDashLength( GetCurrentLineWidth() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double PLOTTER::GetDashGapLenIU() const
|
double PLOTTER::GetDashGapLenIU() const
|
||||||
{
|
{
|
||||||
return userToDeviceSize( dash_gap_len( GetCurrentLineWidth() ) );
|
return userToDeviceSize( m_renderSettings->GetGapLength( GetCurrentLineWidth() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,6 +51,27 @@ RENDER_SETTINGS::~RENDER_SETTINGS()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
constexpr double visualCorrection = 0.8;
|
||||||
|
|
||||||
|
|
||||||
|
double RENDER_SETTINGS::GetDashLength( int aLineWidth ) const
|
||||||
|
{
|
||||||
|
return std::max( m_dashLengthRatio - visualCorrection, 1.0 ) * aLineWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double RENDER_SETTINGS::GetDotLength( int aLineWidth ) const
|
||||||
|
{
|
||||||
|
return ( 1.0 - visualCorrection ) * aLineWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double RENDER_SETTINGS::GetGapLength( int aLineWidth ) const
|
||||||
|
{
|
||||||
|
return std::max( m_gapLengthRatio + visualCorrection, 1.0 ) * aLineWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void RENDER_SETTINGS::update()
|
void RENDER_SETTINGS::update()
|
||||||
{
|
{
|
||||||
// Calculate darkened/highlighted variants of layer colors
|
// Calculate darkened/highlighted variants of layer colors
|
||||||
|
@ -48,6 +48,7 @@ static const std::map<int, COLOR4D> s_defaultTheme =
|
|||||||
{ LAYER_LOCLABEL, CSS_COLOR( 15, 15, 15, 1 ) },
|
{ LAYER_LOCLABEL, CSS_COLOR( 15, 15, 15, 1 ) },
|
||||||
{ LAYER_NOCONNECT, CSS_COLOR( 0, 0, 132, 1 ) },
|
{ LAYER_NOCONNECT, CSS_COLOR( 0, 0, 132, 1 ) },
|
||||||
{ LAYER_NOTES, CSS_COLOR( 0, 0, 194, 1 ) },
|
{ LAYER_NOTES, CSS_COLOR( 0, 0, 194, 1 ) },
|
||||||
|
{ LAYER_NOTES_BACKGROUND, CSS_COLOR( 0, 0, 0, 0 ) },
|
||||||
{ LAYER_PIN, CSS_COLOR( 132, 0, 0, 1 ) },
|
{ LAYER_PIN, CSS_COLOR( 132, 0, 0, 1 ) },
|
||||||
{ LAYER_PINNAM, CSS_COLOR( 0, 100, 100, 1 ) },
|
{ LAYER_PINNAM, CSS_COLOR( 0, 100, 100, 1 ) },
|
||||||
{ LAYER_PINNUM, CSS_COLOR( 169, 0, 0, 1 ) },
|
{ LAYER_PINNUM, CSS_COLOR( 169, 0, 0, 1 ) },
|
||||||
@ -193,6 +194,7 @@ static const std::map<int, COLOR4D> s_classicTheme =
|
|||||||
{ LAYER_LOCLABEL, COLOR4D( BLACK ) },
|
{ LAYER_LOCLABEL, COLOR4D( BLACK ) },
|
||||||
{ LAYER_NOCONNECT, COLOR4D( BLUE ) },
|
{ LAYER_NOCONNECT, COLOR4D( BLUE ) },
|
||||||
{ LAYER_NOTES, COLOR4D( LIGHTBLUE ) },
|
{ LAYER_NOTES, COLOR4D( LIGHTBLUE ) },
|
||||||
|
{ LAYER_NOTES_BACKGROUND, COLOR4D( UNSPECIFIED_COLOR ) },
|
||||||
{ LAYER_PIN, COLOR4D( RED ) },
|
{ LAYER_PIN, COLOR4D( RED ) },
|
||||||
{ LAYER_PINNAM, COLOR4D( CYAN ) },
|
{ LAYER_PINNAM, COLOR4D( CYAN ) },
|
||||||
{ LAYER_PINNUM, COLOR4D( RED ) },
|
{ LAYER_PINNUM, COLOR4D( RED ) },
|
||||||
|
@ -94,6 +94,7 @@ COLOR_SETTINGS::COLOR_SETTINGS( const wxString& aFilename, bool aAbsolutePath )
|
|||||||
CLR( "schematic.label_local", LAYER_LOCLABEL );
|
CLR( "schematic.label_local", LAYER_LOCLABEL );
|
||||||
CLR( "schematic.no_connect", LAYER_NOCONNECT );
|
CLR( "schematic.no_connect", LAYER_NOCONNECT );
|
||||||
CLR( "schematic.note", LAYER_NOTES );
|
CLR( "schematic.note", LAYER_NOTES );
|
||||||
|
CLR( "schematic.note_background", LAYER_NOTES_BACKGROUND );
|
||||||
CLR( "schematic.pin", LAYER_PIN );
|
CLR( "schematic.pin", LAYER_PIN );
|
||||||
CLR( "schematic.pin_name", LAYER_PINNAM );
|
CLR( "schematic.pin_name", LAYER_PINNAM );
|
||||||
CLR( "schematic.pin_number", LAYER_PINNUM );
|
CLR( "schematic.pin_number", LAYER_PINNUM );
|
||||||
|
276
common/stroke_params.cpp
Normal file
276
common/stroke_params.cpp
Normal file
@ -0,0 +1,276 @@
|
|||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <macros.h>
|
||||||
|
#include <base_units.h>
|
||||||
|
#include <string_utils.h>
|
||||||
|
#include <eda_rect.h>
|
||||||
|
#include <render_settings.h>
|
||||||
|
#include <geometry/shape.h>
|
||||||
|
#include <geometry/shape_segment.h>
|
||||||
|
#include <geometry/shape_simple.h>
|
||||||
|
#include <geometry/geometry_utils.h>
|
||||||
|
#include <stroke_params.h>
|
||||||
|
#include <trigo.h>
|
||||||
|
|
||||||
|
using namespace STROKEPARAMS_T;
|
||||||
|
|
||||||
|
|
||||||
|
void STROKE_PARAMS::Stroke( const SHAPE* aShape, PLOT_DASH_TYPE aLineStyle, int aWidth,
|
||||||
|
const KIGFX::RENDER_SETTINGS* aRenderSettings,
|
||||||
|
std::function<void( const wxPoint& a, const wxPoint& b )> aStroker )
|
||||||
|
{
|
||||||
|
double strokes[6];
|
||||||
|
int wrapAround;
|
||||||
|
|
||||||
|
switch( aLineStyle )
|
||||||
|
{
|
||||||
|
case PLOT_DASH_TYPE::DASH:
|
||||||
|
strokes[0] = aRenderSettings->GetDashLength( aWidth );
|
||||||
|
strokes[1] = aRenderSettings->GetGapLength( aWidth );
|
||||||
|
wrapAround = 2;
|
||||||
|
break;
|
||||||
|
case PLOT_DASH_TYPE::DOT:
|
||||||
|
strokes[0] = aRenderSettings->GetDotLength( aWidth );
|
||||||
|
strokes[1] = aRenderSettings->GetGapLength( aWidth );
|
||||||
|
wrapAround = 2;
|
||||||
|
break;
|
||||||
|
case PLOT_DASH_TYPE::DASHDOT:
|
||||||
|
strokes[0] = aRenderSettings->GetDashLength( aWidth );
|
||||||
|
strokes[1] = aRenderSettings->GetGapLength( aWidth );
|
||||||
|
strokes[2] = aRenderSettings->GetDotLength( aWidth );
|
||||||
|
strokes[3] = aRenderSettings->GetGapLength( aWidth );
|
||||||
|
wrapAround = 4;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
UNIMPLEMENTED_FOR( lineTypeNames.at( aLineStyle ).name );
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( aShape->Type() )
|
||||||
|
{
|
||||||
|
case SH_SIMPLE:
|
||||||
|
{
|
||||||
|
const SHAPE_SIMPLE* poly = static_cast<const SHAPE_SIMPLE*>( aShape );
|
||||||
|
|
||||||
|
for( size_t ii = 0; ii < poly->GetSegmentCount(); ++ii )
|
||||||
|
{
|
||||||
|
SEG seg = poly->GetSegment( ii );
|
||||||
|
SHAPE_SEGMENT line( seg.A, seg.B );
|
||||||
|
STROKE_PARAMS::Stroke( &line, aLineStyle, aWidth, aRenderSettings, aStroker );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SH_SEGMENT:
|
||||||
|
{
|
||||||
|
const SHAPE_SEGMENT* line = static_cast<const SHAPE_SEGMENT*>( aShape );
|
||||||
|
|
||||||
|
VECTOR2D start = line->GetSeg().A;
|
||||||
|
VECTOR2D end = line->GetSeg().B;
|
||||||
|
|
||||||
|
EDA_RECT clip( (wxPoint)start, wxSize( end.x - start.x, end.y - start.y ) );
|
||||||
|
clip.Normalize();
|
||||||
|
|
||||||
|
double theta = atan2( end.y - start.y, end.x - start.x );
|
||||||
|
|
||||||
|
for( size_t i = 0; i < 10000; ++i )
|
||||||
|
{
|
||||||
|
// Calculations MUST be done in doubles to keep from accumulating rounding
|
||||||
|
// errors as we go.
|
||||||
|
VECTOR2D next( start.x + strokes[ i % wrapAround ] * cos( theta ),
|
||||||
|
start.y + strokes[ i % wrapAround ] * sin( theta ) );
|
||||||
|
|
||||||
|
// Drawing each segment can be done rounded to ints.
|
||||||
|
wxPoint a( KiROUND( start.x ), KiROUND( start.y ) );
|
||||||
|
wxPoint b( KiROUND( next.x ), KiROUND( next.y ) );
|
||||||
|
|
||||||
|
if( ClipLine( &clip, a.x, a.y, b.x, b.y ) )
|
||||||
|
break;
|
||||||
|
else if( i % 2 == 0 )
|
||||||
|
aStroker( a, b );
|
||||||
|
|
||||||
|
start = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SH_ARC:
|
||||||
|
{
|
||||||
|
const SHAPE_ARC* arc = static_cast<const SHAPE_ARC*>( aShape );
|
||||||
|
|
||||||
|
double r = arc->GetRadius();
|
||||||
|
double C = 2.0 * M_PI * r;
|
||||||
|
VECTOR2I center = arc->GetCenter();
|
||||||
|
VECTOR2D startRadial( arc->GetP0() - center );
|
||||||
|
double startAngle = 180.0 / M_PI * atan2( startRadial.y, startRadial.x );
|
||||||
|
VECTOR2D endRadial( arc->GetP1() - center );
|
||||||
|
double arcEndAngle = 180.0 / M_PI * atan2( endRadial.y, endRadial.x );
|
||||||
|
|
||||||
|
if( arcEndAngle == startAngle )
|
||||||
|
arcEndAngle = startAngle + 360.0; // ring, not null
|
||||||
|
|
||||||
|
if( startAngle > arcEndAngle )
|
||||||
|
{
|
||||||
|
if( arcEndAngle < 0 )
|
||||||
|
arcEndAngle = NormalizeAngleDegrees( arcEndAngle, 0.0, 360.0 );
|
||||||
|
else
|
||||||
|
startAngle = NormalizeAngleDegrees( startAngle, -360.0, 0.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxASSERT( startAngle < arcEndAngle );
|
||||||
|
|
||||||
|
for( size_t i = 0; i < 10000 && startAngle < arcEndAngle; ++i )
|
||||||
|
{
|
||||||
|
double theta = 360.0 * strokes[ i % wrapAround ] / C;
|
||||||
|
double endAngle = std::min( startAngle + theta, arcEndAngle );
|
||||||
|
|
||||||
|
if( i % 2 == 0 )
|
||||||
|
{
|
||||||
|
wxPoint a( center.x + r * cos( startAngle * M_PI / 180.0 ),
|
||||||
|
center.y + r * sin( startAngle * M_PI / 180.0 ) );
|
||||||
|
wxPoint b( center.x + r * cos( endAngle * M_PI / 180.0 ),
|
||||||
|
center.y + r * sin( endAngle * M_PI / 180.0 ) );
|
||||||
|
|
||||||
|
aStroker( a, b );
|
||||||
|
}
|
||||||
|
|
||||||
|
startAngle = endAngle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SH_CIRCLE:
|
||||||
|
// A circle is always filled; a ring is represented by a 360° arc.
|
||||||
|
KI_FALLTHROUGH;
|
||||||
|
|
||||||
|
default:
|
||||||
|
UNIMPLEMENTED_FOR( SHAPE_TYPE_asString( aShape->Type() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static wxString getLineStyleToken( PLOT_DASH_TYPE aStyle )
|
||||||
|
{
|
||||||
|
wxString token;
|
||||||
|
|
||||||
|
switch( aStyle )
|
||||||
|
{
|
||||||
|
case PLOT_DASH_TYPE::DASH: token = "dash"; break;
|
||||||
|
case PLOT_DASH_TYPE::DOT: token = "dot"; break;
|
||||||
|
case PLOT_DASH_TYPE::DASHDOT: token = "dash_dot"; break;
|
||||||
|
case PLOT_DASH_TYPE::SOLID: token = "solid"; break;
|
||||||
|
case PLOT_DASH_TYPE::DEFAULT: token = "default"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void STROKE_PARAMS::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel ) const
|
||||||
|
{
|
||||||
|
wxASSERT( aFormatter != nullptr );
|
||||||
|
|
||||||
|
aFormatter->Print( aNestLevel, "(stroke (width %s) (type %s) (color %d %d %d %s))",
|
||||||
|
FormatInternalUnits(GetWidth() ).c_str(),
|
||||||
|
TO_UTF8( getLineStyleToken( GetPlotStyle() ) ),
|
||||||
|
KiROUND( GetColor().r * 255.0 ),
|
||||||
|
KiROUND( GetColor().g * 255.0 ),
|
||||||
|
KiROUND( GetColor().b * 255.0 ),
|
||||||
|
Double2Str( GetColor().a ).c_str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void STROKE_PARAMS_PARSER::ParseStroke( STROKE_PARAMS& aStroke )
|
||||||
|
{
|
||||||
|
for( T token = NextTok(); token != T_RIGHT; token = NextTok() )
|
||||||
|
{
|
||||||
|
if( token != T_LEFT )
|
||||||
|
Expecting( T_LEFT );
|
||||||
|
|
||||||
|
token = NextTok();
|
||||||
|
|
||||||
|
switch( token )
|
||||||
|
{
|
||||||
|
case T_width:
|
||||||
|
aStroke.SetWidth( parseDouble( "stroke width" ) * m_iuPerMM );
|
||||||
|
NeedRIGHT();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_type:
|
||||||
|
{
|
||||||
|
token = NextTok();
|
||||||
|
|
||||||
|
switch( token )
|
||||||
|
{
|
||||||
|
case T_dash: aStroke.SetPlotStyle( PLOT_DASH_TYPE::DASH ); break;
|
||||||
|
case T_dot: aStroke.SetPlotStyle( PLOT_DASH_TYPE::DOT ); break;
|
||||||
|
case T_dash_dot: aStroke.SetPlotStyle( PLOT_DASH_TYPE::DASHDOT ); break;
|
||||||
|
case T_solid: aStroke.SetPlotStyle( PLOT_DASH_TYPE::SOLID ); break;
|
||||||
|
case T_default: aStroke.SetPlotStyle( PLOT_DASH_TYPE::DEFAULT ); break;
|
||||||
|
default:
|
||||||
|
Expecting( "solid, dash, dash_dot, dot or default" );
|
||||||
|
}
|
||||||
|
|
||||||
|
NeedRIGHT();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case T_color:
|
||||||
|
{
|
||||||
|
KIGFX::COLOR4D color;
|
||||||
|
|
||||||
|
color.r = parseInt( "red" ) / 255.0;
|
||||||
|
color.g = parseInt( "green" ) / 255.0;
|
||||||
|
color.b = parseInt( "blue" ) / 255.0;
|
||||||
|
color.a = Clamp( parseDouble( "alpha" ), 0.0, 1.0 );
|
||||||
|
|
||||||
|
aStroke.SetColor( color );
|
||||||
|
NeedRIGHT();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
Expecting( "width, type, or color" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int STROKE_PARAMS_PARSER::parseInt( const char* aText )
|
||||||
|
{
|
||||||
|
T token = NextTok();
|
||||||
|
|
||||||
|
if( token != T_NUMBER )
|
||||||
|
Expecting( aText );
|
||||||
|
|
||||||
|
return atoi( CurText() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double STROKE_PARAMS_PARSER::parseDouble( const char* aText )
|
||||||
|
{
|
||||||
|
T token = NextTok();
|
||||||
|
|
||||||
|
if( token != T_NUMBER )
|
||||||
|
Expecting( aText );
|
||||||
|
|
||||||
|
double val = strtod( CurText(), NULL );
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
10
common/stroke_params.keywords
Normal file
10
common/stroke_params.keywords
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
color
|
||||||
|
dash
|
||||||
|
dash_dot
|
||||||
|
dash_dot_dot
|
||||||
|
default
|
||||||
|
dot
|
||||||
|
solid
|
||||||
|
stroke
|
||||||
|
type
|
||||||
|
width
|
@ -91,6 +91,8 @@ set( EESCHEMA_DLGS
|
|||||||
dialogs/dialog_rescue_each_base.cpp
|
dialogs/dialog_rescue_each_base.cpp
|
||||||
dialogs/dialog_sch_import_settings.cpp
|
dialogs/dialog_sch_import_settings.cpp
|
||||||
dialogs/dialog_sch_import_settings_base.cpp
|
dialogs/dialog_sch_import_settings_base.cpp
|
||||||
|
dialogs/dialog_shape_properties.cpp
|
||||||
|
dialogs/dialog_shape_properties_base.cpp
|
||||||
dialogs/dialog_sheet_pin_properties.cpp
|
dialogs/dialog_sheet_pin_properties.cpp
|
||||||
dialogs/dialog_sheet_pin_properties_base.cpp
|
dialogs/dialog_sheet_pin_properties_base.cpp
|
||||||
dialogs/dialog_sheet_properties.cpp
|
dialogs/dialog_sheet_properties.cpp
|
||||||
@ -183,7 +185,6 @@ set( EESCHEMA_SRCS
|
|||||||
lib_pin.cpp
|
lib_pin.cpp
|
||||||
lib_symbol.cpp
|
lib_symbol.cpp
|
||||||
lib_text.cpp
|
lib_text.cpp
|
||||||
symbol_viewer_frame.cpp
|
|
||||||
libarch.cpp
|
libarch.cpp
|
||||||
menubar.cpp
|
menubar.cpp
|
||||||
pin_numbers.cpp
|
pin_numbers.cpp
|
||||||
@ -210,6 +211,7 @@ set( EESCHEMA_SRCS
|
|||||||
sch_screen.cpp
|
sch_screen.cpp
|
||||||
sch_plugins/kicad/sch_sexpr_parser.cpp
|
sch_plugins/kicad/sch_sexpr_parser.cpp
|
||||||
sch_plugins/kicad/sch_sexpr_plugin.cpp
|
sch_plugins/kicad/sch_sexpr_plugin.cpp
|
||||||
|
sch_shape.cpp
|
||||||
sch_sheet.cpp
|
sch_sheet.cpp
|
||||||
sch_sheet_path.cpp
|
sch_sheet_path.cpp
|
||||||
sch_sheet_pin.cpp
|
sch_sheet_pin.cpp
|
||||||
@ -226,6 +228,7 @@ set( EESCHEMA_SRCS
|
|||||||
symbol_library.cpp
|
symbol_library.cpp
|
||||||
symbol_tree_model_adapter.cpp
|
symbol_tree_model_adapter.cpp
|
||||||
symbol_tree_synchronizing_adapter.cpp
|
symbol_tree_synchronizing_adapter.cpp
|
||||||
|
symbol_viewer_frame.cpp
|
||||||
toolbars_symbol_viewer.cpp
|
toolbars_symbol_viewer.cpp
|
||||||
toolbars_sch_editor.cpp
|
toolbars_sch_editor.cpp
|
||||||
transform.cpp
|
transform.cpp
|
||||||
|
@ -319,7 +319,7 @@ bool SCH_EDIT_FRAME::BreakSegment( SCH_LINE* aSegment, const wxPoint& aPoint,
|
|||||||
|
|
||||||
bool SCH_EDIT_FRAME::BreakSegments( const wxPoint& aPoint, SCH_SCREEN* aScreen )
|
bool SCH_EDIT_FRAME::BreakSegments( const wxPoint& aPoint, SCH_SCREEN* aScreen )
|
||||||
{
|
{
|
||||||
static const KICAD_T wiresAndBuses[] = { SCH_LINE_LOCATE_WIRE_T, SCH_LINE_LOCATE_BUS_T, EOT };
|
static const KICAD_T wiresAndBuses[] = { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T, EOT };
|
||||||
|
|
||||||
if( aScreen == nullptr )
|
if( aScreen == nullptr )
|
||||||
aScreen = GetScreen();
|
aScreen = GetScreen();
|
||||||
@ -380,7 +380,7 @@ void SCH_EDIT_FRAME::DeleteJunction( SCH_ITEM* aJunction, bool aAppend )
|
|||||||
SCH_SCREEN* screen = GetScreen();
|
SCH_SCREEN* screen = GetScreen();
|
||||||
PICKED_ITEMS_LIST undoList;
|
PICKED_ITEMS_LIST undoList;
|
||||||
EE_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<EE_SELECTION_TOOL>();
|
EE_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<EE_SELECTION_TOOL>();
|
||||||
KICAD_T wiresAndBuses[] = { SCH_LINE_LOCATE_WIRE_T, SCH_LINE_LOCATE_BUS_T, EOT };
|
KICAD_T wiresAndBuses[] = { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T, EOT };
|
||||||
|
|
||||||
auto remove_item = [ & ]( SCH_ITEM* aItem ) -> void
|
auto remove_item = [ & ]( SCH_ITEM* aItem ) -> void
|
||||||
{
|
{
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include <sch_symbol.h>
|
#include <sch_symbol.h>
|
||||||
#include <sch_connection.h>
|
#include <sch_connection.h>
|
||||||
#include <sch_edit_frame.h>
|
#include <sch_edit_frame.h>
|
||||||
|
#include <sch_shape.h>
|
||||||
#include <sch_line.h>
|
#include <sch_line.h>
|
||||||
#include <sch_junction.h>
|
#include <sch_junction.h>
|
||||||
#include <sch_sheet.h>
|
#include <sch_sheet.h>
|
||||||
@ -117,8 +118,8 @@ DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS( SCH_
|
|||||||
|
|
||||||
m_colorSwatch->SetSwatchColor( COLOR4D::UNSPECIFIED, false );
|
m_colorSwatch->SetSwatchColor( COLOR4D::UNSPECIFIED, false );
|
||||||
m_colorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
|
m_colorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
|
||||||
m_bgColorSwatch->SetSwatchColor( COLOR4D::UNSPECIFIED, false );
|
m_fillColorSwatch->SetSwatchColor( COLOR4D::UNSPECIFIED, false );
|
||||||
m_bgColorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
|
m_fillColorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
|
||||||
m_dotColorSwatch->SetSwatchColor( COLOR4D::UNSPECIFIED, false );
|
m_dotColorSwatch->SetSwatchColor( COLOR4D::UNSPECIFIED, false );
|
||||||
m_dotColorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
|
m_dotColorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
|
||||||
|
|
||||||
@ -217,7 +218,7 @@ bool DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::TransferDataToWindow()
|
|||||||
m_lineStyle->SetStringSelection( INDETERMINATE_ACTION );
|
m_lineStyle->SetStringSelection( INDETERMINATE_ACTION );
|
||||||
m_junctionSize.SetValue( INDETERMINATE_ACTION );
|
m_junctionSize.SetValue( INDETERMINATE_ACTION );
|
||||||
m_setColor->SetValue( false );
|
m_setColor->SetValue( false );
|
||||||
m_setBgColor->SetValue( false );
|
m_setFillColor->SetValue( false );
|
||||||
m_setDotColor->SetValue( false );
|
m_setDotColor->SetValue( false );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -240,7 +241,6 @@ void DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::processItem( const SCH_SHEET_PATH& aS
|
|||||||
|
|
||||||
EDA_TEXT* eda_text = dynamic_cast<EDA_TEXT*>( aItem );
|
EDA_TEXT* eda_text = dynamic_cast<EDA_TEXT*>( aItem );
|
||||||
SCH_TEXT* sch_text = dynamic_cast<SCH_TEXT*>( aItem );
|
SCH_TEXT* sch_text = dynamic_cast<SCH_TEXT*>( aItem );
|
||||||
SCH_LINE* lineItem = dynamic_cast<SCH_LINE*>( aItem );
|
|
||||||
SCH_JUNCTION* junction = dynamic_cast<SCH_JUNCTION*>( aItem );
|
SCH_JUNCTION* junction = dynamic_cast<SCH_JUNCTION*>( aItem );
|
||||||
|
|
||||||
m_parent->SaveCopyInUndoList( aSheetPath.LastScreen(), aItem, UNDO_REDO::CHANGED, m_appendUndo );
|
m_parent->SaveCopyInUndoList( aSheetPath.LastScreen(), aItem, UNDO_REDO::CHANGED, m_appendUndo );
|
||||||
@ -274,21 +274,40 @@ void DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::processItem( const SCH_SHEET_PATH& aS
|
|||||||
sch_text->SetLabelSpinStyle( (LABEL_SPIN_STYLE::SPIN) m_orientation->GetSelection() );
|
sch_text->SetLabelSpinStyle( (LABEL_SPIN_STYLE::SPIN) m_orientation->GetSelection() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( lineItem )
|
if( aItem->HasLineStroke() )
|
||||||
{
|
{
|
||||||
|
STROKE_PARAMS stroke = aItem->GetStroke();
|
||||||
|
|
||||||
if( !m_lineWidth.IsIndeterminate() )
|
if( !m_lineWidth.IsIndeterminate() )
|
||||||
lineItem->SetLineWidth( m_lineWidth.GetValue() );
|
stroke.SetWidth( m_lineWidth.GetValue() );
|
||||||
|
|
||||||
if( m_lineStyle->GetStringSelection() != INDETERMINATE_ACTION )
|
if( m_lineStyle->GetStringSelection() != INDETERMINATE_ACTION )
|
||||||
{
|
{
|
||||||
if( m_lineStyle->GetStringSelection() == DEFAULT_STYLE )
|
if( m_lineStyle->GetStringSelection() == DEFAULT_STYLE )
|
||||||
lineItem->SetLineStyle( PLOT_DASH_TYPE::DEFAULT );
|
stroke.SetPlotStyle( PLOT_DASH_TYPE::DEFAULT );
|
||||||
else
|
else
|
||||||
lineItem->SetLineStyle( m_lineStyle->GetSelection() );
|
stroke.SetPlotStyle( (PLOT_DASH_TYPE) m_lineStyle->GetSelection() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_setColor->GetValue() )
|
if( m_setColor->GetValue() )
|
||||||
lineItem->SetLineColor( m_colorSwatch->GetSwatchColor() );
|
stroke.SetColor( m_colorSwatch->GetSwatchColor() );
|
||||||
|
|
||||||
|
aItem->SetStroke( stroke );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( aItem->Type() == SCH_SHAPE_T )
|
||||||
|
{
|
||||||
|
SCH_SHAPE* shape = static_cast<SCH_SHAPE*>( aItem );
|
||||||
|
|
||||||
|
if( m_setFillColor->GetValue() )
|
||||||
|
{
|
||||||
|
shape->SetFillColor( m_fillColorSwatch->GetSwatchColor() );
|
||||||
|
|
||||||
|
if( m_fillColorSwatch->GetSwatchColor() == COLOR4D::UNSPECIFIED )
|
||||||
|
shape->SetFillMode( FILL_T::NO_FILL );
|
||||||
|
else
|
||||||
|
shape->SetFillMode( FILL_T::FILLED_WITH_COLOR );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( junction )
|
if( junction )
|
||||||
@ -348,9 +367,9 @@ void DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::visitItem( const SCH_SHEET_PATH& aShe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static KICAD_T wireTypes[] = { SCH_LINE_LOCATE_WIRE_T, SCH_LABEL_LOCATE_WIRE_T, EOT };
|
static KICAD_T wireTypes[] = { SCH_ITEM_LOCATE_WIRE_T, SCH_LABEL_LOCATE_WIRE_T, EOT };
|
||||||
static KICAD_T busTypes[] = { SCH_LINE_LOCATE_BUS_T, SCH_LABEL_LOCATE_BUS_T, EOT };
|
static KICAD_T busTypes[] = { SCH_ITEM_LOCATE_BUS_T, SCH_LABEL_LOCATE_BUS_T, EOT };
|
||||||
static KICAD_T schTextAndGraphics[] = { SCH_TEXT_T, SCH_LINE_LOCATE_GRAPHIC_LINE_T, EOT };
|
static KICAD_T schTextAndGraphics[] = { SCH_TEXT_T, SCH_ITEM_LOCATE_GRAPHIC_LINE_T, EOT };
|
||||||
|
|
||||||
if( aItem->Type() == SCH_SYMBOL_T )
|
if( aItem->Type() == SCH_SYMBOL_T )
|
||||||
{
|
{
|
||||||
@ -409,8 +428,8 @@ void DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::visitItem( const SCH_SHEET_PATH& aShe
|
|||||||
if( m_setColor->GetValue() )
|
if( m_setColor->GetValue() )
|
||||||
sheet->SetBorderColor( m_colorSwatch->GetSwatchColor() );
|
sheet->SetBorderColor( m_colorSwatch->GetSwatchColor() );
|
||||||
|
|
||||||
if( m_setBgColor->GetValue() )
|
if( m_setFillColor->GetValue() )
|
||||||
sheet->SetBackgroundColor( m_bgColorSwatch->GetSwatchColor() );
|
sheet->SetBackgroundColor( m_fillColorSwatch->GetSwatchColor() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( aItem->Type() == SCH_JUNCTION_T )
|
else if( aItem->Type() == SCH_JUNCTION_T )
|
||||||
|
@ -327,14 +327,14 @@ DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS_BASE::DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS_
|
|||||||
|
|
||||||
fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 );
|
fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
m_setBgColor = new wxCheckBox( m_specifiedValues, wxID_ANY, _("Sheet background color:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_setFillColor = new wxCheckBox( m_specifiedValues, wxID_ANY, _("Fill color:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
fgSizer1->Add( m_setBgColor, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
fgSizer1->Add( m_setFillColor, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_bgColorSwatch = new COLOR_SWATCH( m_specifiedValues, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
m_fillColorSwatch = new COLOR_SWATCH( m_specifiedValues, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_bgColorSwatch->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
|
m_fillColorSwatch->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
|
||||||
m_bgColorSwatch->SetMinSize( wxSize( 48,24 ) );
|
m_fillColorSwatch->SetMinSize( wxSize( 48,24 ) );
|
||||||
|
|
||||||
fgSizer1->Add( m_bgColorSwatch, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
fgSizer1->Add( m_fillColorSwatch, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
m_dotSizeLabel = new wxStaticText( m_specifiedValues, wxID_ANY, _("Junction size:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_dotSizeLabel = new wxStaticText( m_specifiedValues, wxID_ANY, _("Junction size:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_dotSizeLabel->Wrap( -1 );
|
m_dotSizeLabel->Wrap( -1 );
|
||||||
|
@ -3570,7 +3570,7 @@
|
|||||||
<property name="gripper">0</property>
|
<property name="gripper">0</property>
|
||||||
<property name="hidden">0</property>
|
<property name="hidden">0</property>
|
||||||
<property name="id">wxID_ANY</property>
|
<property name="id">wxID_ANY</property>
|
||||||
<property name="label">Sheet background color:</property>
|
<property name="label">Fill color:</property>
|
||||||
<property name="max_size"></property>
|
<property name="max_size"></property>
|
||||||
<property name="maximize_button">0</property>
|
<property name="maximize_button">0</property>
|
||||||
<property name="maximum_size"></property>
|
<property name="maximum_size"></property>
|
||||||
@ -3578,7 +3578,7 @@
|
|||||||
<property name="minimize_button">0</property>
|
<property name="minimize_button">0</property>
|
||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
<property name="moveable">1</property>
|
<property name="moveable">1</property>
|
||||||
<property name="name">m_setBgColor</property>
|
<property name="name">m_setFillColor</property>
|
||||||
<property name="pane_border">1</property>
|
<property name="pane_border">1</property>
|
||||||
<property name="pane_position"></property>
|
<property name="pane_position"></property>
|
||||||
<property name="pane_size"></property>
|
<property name="pane_size"></property>
|
||||||
@ -3644,7 +3644,7 @@
|
|||||||
<property name="minimize_button">0</property>
|
<property name="minimize_button">0</property>
|
||||||
<property name="minimum_size">48,24</property>
|
<property name="minimum_size">48,24</property>
|
||||||
<property name="moveable">1</property>
|
<property name="moveable">1</property>
|
||||||
<property name="name">m_bgColorSwatch</property>
|
<property name="name">m_fillColorSwatch</property>
|
||||||
<property name="pane_border">1</property>
|
<property name="pane_border">1</property>
|
||||||
<property name="pane_position"></property>
|
<property name="pane_position"></property>
|
||||||
<property name="pane_size"></property>
|
<property name="pane_size"></property>
|
||||||
|
@ -88,8 +88,8 @@ class DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS_BASE : public DIALOG_SHIM
|
|||||||
COLOR_SWATCH* m_colorSwatch;
|
COLOR_SWATCH* m_colorSwatch;
|
||||||
wxStaticText* lineStyleLabel;
|
wxStaticText* lineStyleLabel;
|
||||||
wxChoice* m_lineStyle;
|
wxChoice* m_lineStyle;
|
||||||
wxCheckBox* m_setBgColor;
|
wxCheckBox* m_setFillColor;
|
||||||
COLOR_SWATCH* m_bgColorSwatch;
|
COLOR_SWATCH* m_fillColorSwatch;
|
||||||
wxStaticText* m_dotSizeLabel;
|
wxStaticText* m_dotSizeLabel;
|
||||||
wxTextCtrl* m_dotSizeCtrl;
|
wxTextCtrl* m_dotSizeCtrl;
|
||||||
wxStaticText* m_dotSizeUnits;
|
wxStaticText* m_dotSizeUnits;
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include <dialog_lib_shape_properties.h>
|
#include <dialog_lib_shape_properties.h>
|
||||||
#include <symbol_edit_frame.h>
|
#include <symbol_edit_frame.h>
|
||||||
#include <confirm.h>
|
#include <confirm.h>
|
||||||
|
#include <lib_shape.h>
|
||||||
|
|
||||||
DIALOG_LIB_SHAPE_PROPERTIES::DIALOG_LIB_SHAPE_PROPERTIES( SYMBOL_EDIT_FRAME* aParent,
|
DIALOG_LIB_SHAPE_PROPERTIES::DIALOG_LIB_SHAPE_PROPERTIES( SYMBOL_EDIT_FRAME* aParent,
|
||||||
LIB_ITEM* aItem ) :
|
LIB_ITEM* aItem ) :
|
||||||
@ -85,7 +85,7 @@ bool DIALOG_LIB_SHAPE_PROPERTIES::TransferDataToWindow()
|
|||||||
m_checkApplyToAllConversions->Enable( enblConvOptStyle );
|
m_checkApplyToAllConversions->Enable( enblConvOptStyle );
|
||||||
|
|
||||||
if( shape )
|
if( shape )
|
||||||
m_fillCtrl->SetSelection( static_cast<int>( shape->GetFillType() ) - 1 );
|
m_fillCtrl->SetSelection( static_cast<int>( shape->GetFillMode() ) - 1 );
|
||||||
|
|
||||||
m_fillCtrl->Enable( shape != nullptr );
|
m_fillCtrl->Enable( shape != nullptr );
|
||||||
|
|
||||||
@ -98,13 +98,16 @@ bool DIALOG_LIB_SHAPE_PROPERTIES::TransferDataFromWindow()
|
|||||||
if( !wxDialog::TransferDataFromWindow() )
|
if( !wxDialog::TransferDataFromWindow() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
EDA_SHAPE* shape = dynamic_cast<EDA_SHAPE*>( m_item );
|
LIB_SHAPE* shape = dynamic_cast<LIB_SHAPE*>( m_item );
|
||||||
|
|
||||||
if( shape )
|
if( shape )
|
||||||
|
{
|
||||||
shape->SetFillMode( static_cast<FILL_T>( std::max( m_fillCtrl->GetSelection() + 1, 1 ) ) );
|
shape->SetFillMode( static_cast<FILL_T>( std::max( m_fillCtrl->GetSelection() + 1, 1 ) ) );
|
||||||
|
|
||||||
if( shape )
|
STROKE_PARAMS stroke = shape->GetStroke();
|
||||||
shape->SetWidth( m_lineWidth.GetValue() );
|
stroke.SetWidth( m_lineWidth.GetValue() );
|
||||||
|
shape->SetStroke( stroke );
|
||||||
|
}
|
||||||
|
|
||||||
if( GetApplyToAllConversions() )
|
if( GetApplyToAllConversions() )
|
||||||
m_item->SetConvert( 0 );
|
m_item->SetConvert( 0 );
|
||||||
|
@ -22,37 +22,15 @@
|
|||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <bitmaps.h>
|
|
||||||
#include <sch_line.h>
|
#include <sch_line.h>
|
||||||
#include <dialog_line_wire_bus_properties.h>
|
#include <dialog_line_wire_bus_properties.h>
|
||||||
#include <dialogs/dialog_color_picker.h>
|
#include <dialogs/dialog_color_picker.h>
|
||||||
#include <settings/settings_manager.h>
|
#include <settings/settings_manager.h>
|
||||||
#include <sch_edit_frame.h>
|
#include <sch_edit_frame.h>
|
||||||
|
#include <stroke_params.h>
|
||||||
#include <widgets/color_swatch.h>
|
#include <widgets/color_swatch.h>
|
||||||
|
|
||||||
|
|
||||||
struct lineTypeStruct
|
|
||||||
{
|
|
||||||
wxString name;
|
|
||||||
const BITMAPS bitmap;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Conversion map between PLOT_DASH_TYPE values and style names displayed
|
|
||||||
*/
|
|
||||||
const std::map<PLOT_DASH_TYPE, struct lineTypeStruct> lineTypeNames = {
|
|
||||||
{ PLOT_DASH_TYPE::SOLID, { _( "Solid" ), BITMAPS::stroke_solid } },
|
|
||||||
{ PLOT_DASH_TYPE::DASH, { _( "Dashed" ), BITMAPS::stroke_dash } },
|
|
||||||
{ PLOT_DASH_TYPE::DOT, { _( "Dotted" ), BITMAPS::stroke_dot } },
|
|
||||||
{ PLOT_DASH_TYPE::DASHDOT, { _( "Dash-Dot" ), BITMAPS::stroke_dashdot } },
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define DEFAULT_STYLE _( "Default" )
|
|
||||||
#define INDETERMINATE_STYLE _( "Leave unchanged" )
|
|
||||||
|
|
||||||
|
|
||||||
DIALOG_LINE_WIRE_BUS_PROPERTIES::DIALOG_LINE_WIRE_BUS_PROPERTIES( SCH_EDIT_FRAME* aParent,
|
DIALOG_LINE_WIRE_BUS_PROPERTIES::DIALOG_LINE_WIRE_BUS_PROPERTIES( SCH_EDIT_FRAME* aParent,
|
||||||
std::deque<SCH_ITEM*>& aItems ) :
|
std::deque<SCH_ITEM*>& aItems ) :
|
||||||
DIALOG_LINE_WIRE_BUS_PROPERTIES_BASE( aParent ),
|
DIALOG_LINE_WIRE_BUS_PROPERTIES_BASE( aParent ),
|
||||||
|
113
eeschema/dialogs/dialog_shape_properties.cpp
Normal file
113
eeschema/dialogs/dialog_shape_properties.cpp
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, you may find one here:
|
||||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||||
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||||
|
* or you may write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <widgets/color_swatch.h>
|
||||||
|
#include <stroke_params.h>
|
||||||
|
#include <sch_edit_frame.h>
|
||||||
|
#include <sch_shape.h>
|
||||||
|
#include <dialog_shape_properties.h>
|
||||||
|
|
||||||
|
|
||||||
|
DIALOG_SHAPE_PROPERTIES::DIALOG_SHAPE_PROPERTIES( SCH_EDIT_FRAME* aParent, SCH_SHAPE* aShape ) :
|
||||||
|
DIALOG_SHAPE_PROPERTIES_BASE( aParent ),
|
||||||
|
m_shape( aShape ),
|
||||||
|
m_lineWidth( aParent, m_lineWidthLabel, m_lineWidthCtrl, m_lineWidthUnits, true )
|
||||||
|
{
|
||||||
|
SetTitle( wxString::Format( GetTitle(), aShape->ShowShape() ) );
|
||||||
|
|
||||||
|
m_helpLabel1->SetFont( KIUI::GetInfoFont( this ) );
|
||||||
|
m_helpLabel2->SetFont( KIUI::GetInfoFont( this ) );
|
||||||
|
|
||||||
|
SetInitialFocus( m_lineWidthCtrl );
|
||||||
|
|
||||||
|
m_lineColorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
|
||||||
|
|
||||||
|
for( const std::pair<const PLOT_DASH_TYPE, lineTypeStruct>& typeEntry : lineTypeNames )
|
||||||
|
m_lineStyleCombo->Append( typeEntry.second.name, KiBitmap( typeEntry.second.bitmap ) );
|
||||||
|
|
||||||
|
m_lineStyleCombo->Append( DEFAULT_STYLE );
|
||||||
|
|
||||||
|
m_fillColorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
|
||||||
|
|
||||||
|
// Required under wxGTK if we want to dismiss the dialog with the ESC key
|
||||||
|
SetFocus();
|
||||||
|
m_sdbSizerOK->SetDefault();
|
||||||
|
|
||||||
|
// Now all widgets have the size fixed, call FinishDialogSettings
|
||||||
|
finishDialogSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool DIALOG_SHAPE_PROPERTIES::TransferDataToWindow()
|
||||||
|
{
|
||||||
|
if( !wxDialog::TransferDataToWindow() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_lineWidth.SetValue( m_shape->GetWidth() );
|
||||||
|
m_lineColorSwatch->SetSwatchColor( m_shape->GetStroke().GetColor(), false );
|
||||||
|
|
||||||
|
int style = static_cast<int>( m_shape->GetStroke().GetPlotStyle() );
|
||||||
|
|
||||||
|
if( style == -1 )
|
||||||
|
m_lineStyleCombo->SetStringSelection( DEFAULT_STYLE );
|
||||||
|
else if( style < (int) lineTypeNames.size() )
|
||||||
|
m_lineStyleCombo->SetSelection( style );
|
||||||
|
else
|
||||||
|
wxFAIL_MSG( "Line type not found in the type lookup map" );
|
||||||
|
|
||||||
|
m_filledCtrl->SetValue( m_shape->IsFilled() );
|
||||||
|
m_fillColorSwatch->SetSwatchColor( m_shape->GetFillColor(), false );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool DIALOG_SHAPE_PROPERTIES::TransferDataFromWindow()
|
||||||
|
{
|
||||||
|
if( !wxDialog::TransferDataFromWindow() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
STROKE_PARAMS stroke = m_shape->GetStroke();
|
||||||
|
|
||||||
|
if( !m_lineWidth.IsIndeterminate() )
|
||||||
|
stroke.SetWidth( m_lineWidth.GetValue() );
|
||||||
|
|
||||||
|
auto it = lineTypeNames.begin();
|
||||||
|
std::advance( it, m_lineStyleCombo->GetSelection() );
|
||||||
|
|
||||||
|
if( it == lineTypeNames.end() )
|
||||||
|
stroke.SetPlotStyle( PLOT_DASH_TYPE::DEFAULT );
|
||||||
|
else
|
||||||
|
stroke.SetPlotStyle( it->first );
|
||||||
|
|
||||||
|
stroke.SetColor( m_lineColorSwatch->GetSwatchColor() );
|
||||||
|
|
||||||
|
m_shape->SetStroke( stroke );
|
||||||
|
|
||||||
|
m_shape->SetFillMode( m_filledCtrl->GetValue() ? FILL_T::FILLED_WITH_COLOR : FILL_T::NO_FILL );
|
||||||
|
m_shape->SetFillColor( m_fillColorSwatch->GetSwatchColor() );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
49
eeschema/dialogs/dialog_shape_properties.h
Normal file
49
eeschema/dialogs/dialog_shape_properties.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 KiCad Developers, see CHANGELOG.TXT for contributors.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, you may find one here:
|
||||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||||
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||||
|
* or you may write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DIALOG_SHAPE_PROPERTIES_H
|
||||||
|
#define DIALOG_SHAPE_PROPERTIES_H
|
||||||
|
|
||||||
|
|
||||||
|
class SCH_SHAPE;
|
||||||
|
class SCH_EDIT_FRAME;
|
||||||
|
|
||||||
|
|
||||||
|
#include <dialog_shape_properties_base.h>
|
||||||
|
#include <widgets/unit_binder.h>
|
||||||
|
|
||||||
|
|
||||||
|
class DIALOG_SHAPE_PROPERTIES : public DIALOG_SHAPE_PROPERTIES_BASE
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DIALOG_SHAPE_PROPERTIES( SCH_EDIT_FRAME* aParent, SCH_SHAPE* aShape );
|
||||||
|
|
||||||
|
bool TransferDataToWindow() override;
|
||||||
|
bool TransferDataFromWindow() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
SCH_SHAPE* m_shape;
|
||||||
|
UNIT_BINDER m_lineWidth;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DIALOG_SHAPE_PROPERTIES_H
|
146
eeschema/dialogs/dialog_shape_properties_base.cpp
Normal file
146
eeschema/dialogs/dialog_shape_properties_base.cpp
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// C++ code generated with wxFormBuilder (version Oct 26 2018)
|
||||||
|
// http://www.wxformbuilder.org/
|
||||||
|
//
|
||||||
|
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "widgets/color_swatch.h"
|
||||||
|
|
||||||
|
#include "dialog_shape_properties_base.h"
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE( DIALOG_SHAPE_PROPERTIES_BASE, DIALOG_SHIM )
|
||||||
|
EVT_BUTTON( wxID_APPLY, DIALOG_SHAPE_PROPERTIES_BASE::_wxFB_resetDefaults )
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
DIALOG_SHAPE_PROPERTIES_BASE::DIALOG_SHAPE_PROPERTIES_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
|
||||||
|
{
|
||||||
|
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||||
|
|
||||||
|
wxBoxSizer* mainSizer;
|
||||||
|
mainSizer = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
wxFlexGridSizer* fgSizerGeneral;
|
||||||
|
fgSizerGeneral = new wxFlexGridSizer( 0, 3, 7, 0 );
|
||||||
|
fgSizerGeneral->AddGrowableCol( 1 );
|
||||||
|
fgSizerGeneral->SetFlexibleDirection( wxBOTH );
|
||||||
|
fgSizerGeneral->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||||
|
|
||||||
|
m_lineWidthLabel = new wxStaticText( this, wxID_ANY, _("Line width:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_lineWidthLabel->Wrap( -1 );
|
||||||
|
fgSizerGeneral->Add( m_lineWidthLabel, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3 );
|
||||||
|
|
||||||
|
m_lineWidthCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), 0 );
|
||||||
|
fgSizerGeneral->Add( m_lineWidthCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT, 3 );
|
||||||
|
|
||||||
|
m_lineWidthUnits = new wxStaticText( this, wxID_ANY, _("unit"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_lineWidthUnits->Wrap( -1 );
|
||||||
|
m_lineWidthUnits->SetMinSize( wxSize( 40,-1 ) );
|
||||||
|
|
||||||
|
fgSizerGeneral->Add( m_lineWidthUnits, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3 );
|
||||||
|
|
||||||
|
m_lineColorLabel = new wxStaticText( this, wxID_ANY, _("Line color:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_lineColorLabel->Wrap( -1 );
|
||||||
|
fgSizerGeneral->Add( m_lineColorLabel, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
||||||
|
|
||||||
|
m_panel1 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE|wxTAB_TRAVERSAL );
|
||||||
|
wxBoxSizer* bSizer2;
|
||||||
|
bSizer2 = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
m_lineColorSwatch = new COLOR_SWATCH( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
bSizer2->Add( m_lineColorSwatch, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
m_panel1->SetSizer( bSizer2 );
|
||||||
|
m_panel1->Layout();
|
||||||
|
bSizer2->Fit( m_panel1 );
|
||||||
|
fgSizerGeneral->Add( m_panel1, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 );
|
||||||
|
|
||||||
|
|
||||||
|
fgSizerGeneral->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
m_lineStyleLabel = new wxStaticText( this, wxID_ANY, _("Line style:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_lineStyleLabel->Wrap( -1 );
|
||||||
|
fgSizerGeneral->Add( m_lineStyleLabel, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
||||||
|
|
||||||
|
m_lineStyleCombo = new wxBitmapComboBox( this, wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
|
||||||
|
m_lineStyleCombo->SetMinSize( wxSize( 240,-1 ) );
|
||||||
|
|
||||||
|
fgSizerGeneral->Add( m_lineStyleCombo, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT, 3 );
|
||||||
|
|
||||||
|
|
||||||
|
fgSizerGeneral->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
fgSizerGeneral->Add( 0, 0, 1, wxEXPAND|wxTOP|wxBOTTOM, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
fgSizerGeneral->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
fgSizerGeneral->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
m_filledCtrl = new wxCheckBox( this, wxID_ANY, _("Filled shape"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
fgSizerGeneral->Add( m_filledCtrl, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
fgSizerGeneral->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
fgSizerGeneral->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
m_fillColorLabel = new wxStaticText( this, wxID_ANY, _("Fill color:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_fillColorLabel->Wrap( -1 );
|
||||||
|
fgSizerGeneral->Add( m_fillColorLabel, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
|
||||||
|
|
||||||
|
m_panel11 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE|wxTAB_TRAVERSAL );
|
||||||
|
wxBoxSizer* bSizer21;
|
||||||
|
bSizer21 = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
m_fillColorSwatch = new COLOR_SWATCH( m_panel11, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
bSizer21->Add( m_fillColorSwatch, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
m_panel11->SetSizer( bSizer21 );
|
||||||
|
m_panel11->Layout();
|
||||||
|
bSizer21->Fit( m_panel11 );
|
||||||
|
fgSizerGeneral->Add( m_panel11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
mainSizer->Add( fgSizerGeneral, 1, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 10 );
|
||||||
|
|
||||||
|
m_helpLabel1 = new wxStaticText( this, wxID_ANY, _("Set line width to 0 to use Schematic Editor line widths."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_helpLabel1->Wrap( 333 );
|
||||||
|
mainSizer->Add( m_helpLabel1, 0, wxTOP|wxRIGHT|wxLEFT, 10 );
|
||||||
|
|
||||||
|
m_helpLabel2 = new wxStaticText( this, wxID_ANY, _("Set line color to transparent to use Schematic Editor colors."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_helpLabel2->Wrap( -1 );
|
||||||
|
mainSizer->Add( m_helpLabel2, 0, wxBOTTOM|wxRIGHT|wxLEFT, 10 );
|
||||||
|
|
||||||
|
m_staticline = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
|
mainSizer->Add( m_staticline, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||||
|
|
||||||
|
m_sdbSizer = new wxStdDialogButtonSizer();
|
||||||
|
m_sdbSizerOK = new wxButton( this, wxID_OK );
|
||||||
|
m_sdbSizer->AddButton( m_sdbSizerOK );
|
||||||
|
m_sdbSizerApply = new wxButton( this, wxID_APPLY );
|
||||||
|
m_sdbSizer->AddButton( m_sdbSizerApply );
|
||||||
|
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
|
||||||
|
m_sdbSizer->AddButton( m_sdbSizerCancel );
|
||||||
|
m_sdbSizer->Realize();
|
||||||
|
|
||||||
|
mainSizer->Add( m_sdbSizer, 0, wxALL|wxALIGN_RIGHT, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
this->SetSizer( mainSizer );
|
||||||
|
this->Layout();
|
||||||
|
mainSizer->Fit( this );
|
||||||
|
|
||||||
|
this->Centre( wxBOTH );
|
||||||
|
}
|
||||||
|
|
||||||
|
DIALOG_SHAPE_PROPERTIES_BASE::~DIALOG_SHAPE_PROPERTIES_BASE()
|
||||||
|
{
|
||||||
|
}
|
1099
eeschema/dialogs/dialog_shape_properties_base.fbp
Normal file
1099
eeschema/dialogs/dialog_shape_properties_base.fbp
Normal file
File diff suppressed because it is too large
Load Diff
76
eeschema/dialogs/dialog_shape_properties_base.h
Normal file
76
eeschema/dialogs/dialog_shape_properties_base.h
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// C++ code generated with wxFormBuilder (version Oct 26 2018)
|
||||||
|
// http://www.wxformbuilder.org/
|
||||||
|
//
|
||||||
|
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <wx/artprov.h>
|
||||||
|
#include <wx/xrc/xmlres.h>
|
||||||
|
#include <wx/intl.h>
|
||||||
|
class COLOR_SWATCH;
|
||||||
|
|
||||||
|
#include "dialog_shim.h"
|
||||||
|
#include <wx/string.h>
|
||||||
|
#include <wx/stattext.h>
|
||||||
|
#include <wx/gdicmn.h>
|
||||||
|
#include <wx/font.h>
|
||||||
|
#include <wx/colour.h>
|
||||||
|
#include <wx/settings.h>
|
||||||
|
#include <wx/textctrl.h>
|
||||||
|
#include <wx/sizer.h>
|
||||||
|
#include <wx/panel.h>
|
||||||
|
#include <wx/bmpcbox.h>
|
||||||
|
#include <wx/checkbox.h>
|
||||||
|
#include <wx/statline.h>
|
||||||
|
#include <wx/button.h>
|
||||||
|
#include <wx/dialog.h>
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// Class DIALOG_SHAPE_PROPERTIES_BASE
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class DIALOG_SHAPE_PROPERTIES_BASE : public DIALOG_SHIM
|
||||||
|
{
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
private:
|
||||||
|
|
||||||
|
// Private event handlers
|
||||||
|
void _wxFB_resetDefaults( wxCommandEvent& event ){ resetDefaults( event ); }
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
wxStaticText* m_lineWidthLabel;
|
||||||
|
wxTextCtrl* m_lineWidthCtrl;
|
||||||
|
wxStaticText* m_lineWidthUnits;
|
||||||
|
wxStaticText* m_lineColorLabel;
|
||||||
|
wxPanel* m_panel1;
|
||||||
|
COLOR_SWATCH* m_lineColorSwatch;
|
||||||
|
wxStaticText* m_lineStyleLabel;
|
||||||
|
wxBitmapComboBox* m_lineStyleCombo;
|
||||||
|
wxCheckBox* m_filledCtrl;
|
||||||
|
wxStaticText* m_fillColorLabel;
|
||||||
|
wxPanel* m_panel11;
|
||||||
|
COLOR_SWATCH* m_fillColorSwatch;
|
||||||
|
wxStaticText* m_helpLabel1;
|
||||||
|
wxStaticText* m_helpLabel2;
|
||||||
|
wxStaticLine* m_staticline;
|
||||||
|
wxStdDialogButtonSizer* m_sdbSizer;
|
||||||
|
wxButton* m_sdbSizerOK;
|
||||||
|
wxButton* m_sdbSizerApply;
|
||||||
|
wxButton* m_sdbSizerCancel;
|
||||||
|
|
||||||
|
// Virtual event handlers, overide them in your derived class
|
||||||
|
virtual void resetDefaults( wxCommandEvent& event ) { event.Skip(); }
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
DIALOG_SHAPE_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("%s Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||||
|
~DIALOG_SHAPE_PROPERTIES_BASE();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user