41#include <dialogs/dialog_text_properties.h>
52#include <wx/textdlg.h>
64#include <wx/mstream.h>
65#include <wx/dcmemory.h>
70constexpr int clipboardMaxBitmapSize = 4096;
71constexpr double clipboardBboxInflation = 0.02;
74void appendMimeData( std::vector<CLIPBOARD_MIME_DATA>& aMimeData,
const wxString& aMimeType,
75 const wxMemoryBuffer& aBuffer )
77 if( aBuffer.GetDataLen() == 0 )
83 aMimeData.push_back( entry );
87void appendMimeData( std::vector<CLIPBOARD_MIME_DATA>& aMimeData,
const wxString& aMimeType,
95 entry.
m_image = std::move( aImage );
96 aMimeData.push_back( std::move( entry ) );
100bool loadFileToBuffer(
const wxString& aFileName, wxMemoryBuffer& aBuffer )
102 wxFFile file( aFileName, wxS(
"rb" ) );
104 if( !file.IsOpened() )
107 wxFileOffset size = file.Length();
112 void* data = aBuffer.GetWriteBuf( size );
114 if( file.Read( data, size ) !=
static_cast<size_t>( size ) )
116 aBuffer.UngetWriteBuf( 0 );
120 aBuffer.UngetWriteBuf( size );
126 int aUnit,
int aBodyStyle, wxMemoryBuffer& aBuffer )
135 std::unique_ptr<SVG_PLOTTER> plotter = std::make_unique<SVG_PLOTTER>();
136 plotter->SetRenderSettings( &renderSettings );
142 plotter->SetPageSettings( pageInfo );
143 plotter->SetColorMode(
true );
146 plotter->SetViewport( plot_offset,
schIUScale.IU_PER_MILS / 10, 1.0,
false );
147 plotter->SetCreator( wxT(
"Eeschema-SVG" ) );
149 wxFileName tempFile( wxFileName::CreateTempFileName( wxS(
"kicad_symbol_svg" ) ) );
151 if( !plotter->OpenFile( tempFile.GetFullPath() ) )
153 wxRemoveFile( tempFile.GetFullPath() );
160 plotter->StartPlot( wxT(
"1" ) );
162 constexpr bool background =
true;
163 aSymbol->
Plot( plotter.get(), background, plotOpts, aUnit, aBodyStyle,
VECTOR2I( 0, 0 ),
false );
164 aSymbol->
Plot( plotter.get(), !background, plotOpts, aUnit, aBodyStyle,
VECTOR2I( 0, 0 ),
false );
165 aSymbol->
PlotFields( plotter.get(), !background, plotOpts, aUnit, aBodyStyle,
VECTOR2I( 0, 0 ),
false );
170 bool ok = loadFileToBuffer( tempFile.GetFullPath(), aBuffer );
171 wxRemoveFile( tempFile.GetFullPath() );
177 int aUnit,
int aBodyStyle,
int aWidth,
int aHeight,
178 double aViewScale,
const wxColour& aBgColor )
183 wxBitmap bitmap( aWidth, aHeight, 24 );
185 dc.SelectObject( bitmap );
186 dc.SetBackground( wxBrush( aBgColor ) );
198 std::unique_ptr<KIGFX::SCH_PAINTER> painter = std::make_unique<KIGFX::SCH_PAINTER>( gal );
199 std::unique_ptr<KIGFX::VIEW> view = std::make_unique<KIGFX::VIEW>();
204 view->SetPainter( painter.get() );
206 view->SetScale( 1.0 );
210 std::vector<std::unique_ptr<SCH_ITEM>> clonedItems;
214 if( aUnit && item.GetUnit() && item.GetUnit() != aUnit )
217 if( aBodyStyle && item.GetBodyStyle() && item.GetBodyStyle() != aBodyStyle )
221 clonedItems.emplace_back( clone );
230 COLOR4D bgColor4D( aBgColor.Red() / 255.0, aBgColor.Green() / 255.0,
231 aBgColor.Blue() / 255.0, 1.0 );
236 view->SetLayerVisible( i,
true );
250 double inch2Iu = 1000.0 *
schIUScale.IU_PER_MILS;
251 VECTOR2D pageSizeIn( (
double) aWidth / ppi, (
double) aHeight / ppi );
253 galPrint->SetSheetSize( pageSizeIn );
258 double zoomFactor = 2.0 * aViewScale * inch2Iu / ppi;
261 view->SetCenter( aBBox.
Centre() );
262 view->SetScale( aViewScale * zoomFactor );
269 view->UseDrawPriority(
true );
276 dc.SelectObject( wxNullBitmap );
277 return bitmap.ConvertToImage();
282 const BOX2I& aBBox,
int aUnit,
int aBodyStyle )
289 if( size.
x <= 0 || size.
y <= 0 )
294 int bitmapWidth =
KiROUND( size.
x * viewScale );
295 int bitmapHeight =
KiROUND( size.
y * viewScale );
298 if( bitmapWidth > clipboardMaxBitmapSize || bitmapHeight > clipboardMaxBitmapSize )
300 double scaleDown = (double) clipboardMaxBitmapSize / std::max( bitmapWidth, bitmapHeight );
301 bitmapWidth =
KiROUND( bitmapWidth * scaleDown );
302 bitmapHeight =
KiROUND( bitmapHeight * scaleDown );
303 viewScale *= scaleDown;
306 if( bitmapWidth <= 0 || bitmapHeight <= 0 )
310 wxImage imageOnWhite = renderSymbolToBitmap( aFrame, aSymbol, aBBox, aUnit, aBodyStyle,
311 bitmapWidth, bitmapHeight, viewScale, *wxWHITE );
312 wxImage imageOnBlack = renderSymbolToBitmap( aFrame, aSymbol, aBBox, aUnit, aBodyStyle,
313 bitmapWidth, bitmapHeight, viewScale, *wxBLACK );
315 if( !imageOnWhite.IsOk() || !imageOnBlack.IsOk() )
319 wxImage
result( bitmapWidth, bitmapHeight );
322 unsigned char* rgbWhite = imageOnWhite.GetData();
323 unsigned char* rgbBlack = imageOnBlack.GetData();
324 unsigned char* rgbResult =
result.GetData();
325 unsigned char* alphaResult =
result.GetAlpha();
327 int pixelCount = bitmapWidth * bitmapHeight;
329 for(
int i = 0; i < pixelCount; ++i )
333 int rW = rgbWhite[idx], gW = rgbWhite[idx + 1], bW = rgbWhite[idx + 2];
334 int rB = rgbBlack[idx], gB = rgbBlack[idx + 1], bB = rgbBlack[idx + 2];
340 int avgDiff = ( diffR + diffG + diffB ) / 3;
342 int alpha = 255 - avgDiff;
343 alpha = std::max( 0, std::min( 255, alpha ) );
344 alphaResult[i] =
static_cast<unsigned char>( alpha );
348 rgbResult[idx] =
static_cast<unsigned char>( std::min( 255, rB * 255 / alpha ) );
349 rgbResult[idx + 1] =
static_cast<unsigned char>( std::min( 255, gB * 255 / alpha ) );
350 rgbResult[idx + 2] =
static_cast<unsigned char>( std::min( 255, bB * 255 / alpha ) );
355 rgbResult[idx + 1] = 0;
356 rgbResult[idx + 2] = 0;
389 wxASSERT_MSG( drawingTools,
"eeschema.SymbolDrawing tool is not available" );
391 auto haveSymbolCondition =
400 if( !
m_frame->IsSymbolEditable() )
415 auto swapSelectionCondition =
427 const auto canConvertStackedPins =
431 if( sel.Size() >= 2 )
433 std::vector<SCH_PIN*> pins;
438 pins.push_back(
static_cast<SCH_PIN*
>( item ) );
442 VECTOR2I pos = pins[0]->GetPosition();
443 for(
size_t i = 1; i < pins.size(); ++i )
445 if( pins[i]->GetPosition() != pos )
452 if( sel.Size() == 1 && sel.Front()->Type() ==
SCH_PIN_T )
462 int coLocatedCount = 0;
466 if(
pin->GetPosition() == pos )
470 if( coLocatedCount >= 2 )
479 const auto canExplodeStackedPin =
482 if( sel.Size() != 1 || sel.Front()->Type() !=
SCH_PIN_T )
487 std::vector<wxString> stackedNumbers =
pin->GetStackedPinNumbers( &isValid );
488 return isValid && stackedNumbers.size() > 1;
575 commit = &localCommit;
585 for(
unsigned ii = 0; ii < selection.
GetSize(); ii++ )
588 item->
Rotate( rotPoint, ccw );
589 m_frame->UpdateItem( item,
false,
true );
601 if( !localCommit.
Empty() )
602 localCommit.
Push(
_(
"Rotate" ) );
627 switch( item->
Type() )
651 m_frame->UpdateItem( item,
false,
true );
657 for(
unsigned ii = 0; ii < selection.
GetSize(); ii++ )
666 m_frame->UpdateItem( item,
false,
true );
689 if( selection.
Size() < 2 )
699 for(
size_t i = 0; i < sorted.size() - 1; i++ )
705 std::swap( aPos, bPos );
732 m_frame->UpdateItem( a,
false,
true );
733 m_frame->UpdateItem( b,
false,
true );
737 for(
EDA_ITEM* selected : selection )
769 std::deque<EDA_ITEM*> items =
m_selectionTool->RequestSelection().GetItems();
780 std::set<SCH_ITEM*> toDelete;
781 int fieldsHidden = 0;
782 int fieldsAlreadyHidden = 0;
791 toDelete.insert( curr_pin );
795 if(
m_frame->SynchronizePins() )
797 std::vector<bool> got_unit( symbol->
GetUnitCount() + 1 );
799 got_unit[curr_pin->
GetUnit()] =
true;
803 if( got_unit[
pin->GetUnit()] )
806 if(
pin->GetPosition() != pos )
818 toDelete.insert(
pin );
819 got_unit[
pin->GetUnit()] =
true;
835 fieldsAlreadyHidden++;
840 toDelete.insert( schItem );
847 if( toDelete.size() == 0 )
849 if( fieldsHidden == 1 )
850 commit.
Push(
_(
"Hide Field" ) );
851 else if( fieldsHidden > 1 )
852 commit.
Push(
_(
"Hide Fields" ) );
853 else if( fieldsAlreadyHidden > 0 )
854 m_frame->ShowInfoBarError(
_(
"Use the Symbol Properties dialog to remove fields." ) );
858 commit.
Push(
_(
"Delete" ) );
879 ( !
m_frame->GetCurSymbol() ||
m_frame->GetCurSymbol()->GetLibId() != treeLibId ) )
890 else if( selection.
Size() == 1 )
898 switch( item->
Type() )
908 bool mouseOverNumber =
false;
911 mouseOverNumber = numberBox->Contains( mousePos );
915 pinTool->EditPinProperties( &
pin, mouseOverNumber );
936 wxFAIL_MSG( wxT(
"Unhandled item <" ) + item->
GetClass() + wxT(
">" ) );
956 m_frame->GetCanvas()->Refresh();
963 std::vector<MSG_PANEL_ITEM> items;
980 m_frame->GetCanvas()->Refresh();
996 m_frame->GetCanvas()->Refresh();
1003 if( aField ==
nullptr )
1011 caption.Printf(
_(
"Edit '%s' Field" ), aField->
GetName() );
1025 commit.
Push( caption );
1027 m_frame->GetCanvas()->Refresh();
1028 m_frame->UpdateSymbolMsgPanelInfo();
1041 if( !bufferedSymbol )
1066 wxDataViewItem treeItem = libMgr.
GetAdapter()->FindItem( aLibId );
1067 m_frame->UpdateLibraryTree( treeItem, &tempSymbol );
1088 m_frame->RebuildSymbolUnitAndBodyStyleLists();
1119 wxCHECK( selTool, -1 );
1121 std::vector<SCH_PIN*> selectedPins;
1130 selectedPins.push_back( pinItem );
1143 commit.
Push(
_(
"Edit Pins" ) );
1159 wxCHECK( selTool, -1 );
1164 std::vector<SCH_PIN*> pinsToConvert;
1174 if(
pin->GetPosition() == pos )
1175 pinsToConvert.push_back(
pin );
1184 pinsToConvert.push_back(
static_cast<SCH_PIN*
>( item ) );
1188 if( pinsToConvert.size() < 2 )
1190 m_frame->ShowInfoBarError(
_(
"At least two pins are needed to convert to stacked pins" ) );
1195 VECTOR2I pos = pinsToConvert[0]->GetPosition();
1196 for(
size_t i = 1; i < pinsToConvert.size(); ++i )
1198 if( pinsToConvert[i]->GetPosition() != pos )
1200 m_frame->ShowInfoBarError(
_(
"All pins must be at the same location" ) );
1211 std::sort( pinsToConvert.begin(), pinsToConvert.end(),
1214 wxString numA = a->GetNumber();
1215 wxString numB = b->GetNumber();
1219 bool aIsNumeric = numA.ToLong( &longA );
1220 bool bIsNumeric = numB.ToLong( &longB );
1223 if( aIsNumeric && bIsNumeric )
1224 return longA < longB;
1227 if( aIsNumeric && !bIsNumeric )
1229 if( !aIsNumeric && bIsNumeric )
1237 wxString stackedNotation = wxT(
"[");
1240 auto collapseRanges = [&]() -> wxString
1242 if( pinsToConvert.empty() )
1248 std::map<wxString, std::vector<long>> prefixGroups;
1249 std::vector<wxString> nonNumericPins;
1254 wxString pinNumber =
pin->GetNumber();
1257 if( pinNumber.IsEmpty() )
1259 nonNumericPins.push_back( wxT(
"(empty)") );
1264 wxString numericPart;
1267 size_t numStart = pinNumber.length();
1268 for(
int i = pinNumber.length() - 1; i >= 0; i-- )
1270 if( !wxIsdigit( pinNumber[i] ) )
1279 if( numStart < pinNumber.length() )
1281 prefix = pinNumber.Left( numStart );
1282 numericPart = pinNumber.Mid( numStart );
1285 if( numericPart.ToLong( &numValue ) && numValue >= 0 )
1287 prefixGroups[prefix].push_back( numValue );
1292 nonNumericPins.push_back( pinNumber );
1297 nonNumericPins.push_back( pinNumber );
1302 for(
auto& [prefix, numbers] : prefixGroups )
1308 std::sort( numbers.begin(), numbers.end() );
1312 while( i < numbers.size() )
1317 long start = numbers[i];
1321 while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
1328 if(
end > start + 1 )
1329 result += wxString::Format( wxT(
"%s%ld-%s%ld"), prefix, start, prefix,
end );
1330 else if(
end == start + 1 )
1331 result += wxString::Format( wxT(
"%s%ld,%s%ld"), prefix, start, prefix,
end );
1333 result += wxString::Format( wxT(
"%s%ld"), prefix, start );
1340 for(
const wxString& nonNum : nonNumericPins )
1350 stackedNotation += collapseRanges();
1351 stackedNotation += wxT(
"]");
1354 SCH_PIN* masterPin = pinsToConvert[0];
1355 masterPin->
SetNumber( stackedNotation );
1359 wxString::Format(
"Converting %zu pins to stacked notation '%s'",
1360 pinsToConvert.size(), stackedNotation ) );
1364 std::vector<SCH_PIN*> pinsToRemove;
1365 for(
size_t i = 1; i < pinsToConvert.size(); ++i )
1367 SCH_PIN* pinToRemove = pinsToConvert[i];
1371 wxString::Format(
"Will remove pin '%s' at position (%d, %d)",
1376 pinsToRemove.push_back( pinToRemove );
1385 commit.
Push( wxString::Format(
_(
"Convert %zu Stacked Pins to '%s'" ),
1386 pinsToConvert.size(), stackedNotation ) );
1401 wxCHECK( selTool, -1 );
1407 m_frame->ShowInfoBarError(
_(
"Select a single pin with stacked notation to explode" ) );
1415 std::vector<wxString> stackedNumbers =
pin->GetStackedPinNumbers( &isValid );
1417 if( !isValid || stackedNumbers.size() <= 1 )
1419 m_frame->ShowInfoBarError(
_(
"Selected pin does not have valid stacked notation" ) );
1429 std::sort( stackedNumbers.begin(), stackedNumbers.end(),
1430 [](
const wxString& a,
const wxString& b )
1434 if( a.ToLong( &numA ) && b.ToLong( &numB ) )
1442 pin->SetNumber( stackedNumbers[0] );
1443 pin->SetVisible(
true );
1446 for(
size_t i = 1; i < stackedNumbers.size(); ++i )
1468 commit.
Push(
_(
"Explode Stacked Pin" ) );
1483 m_frame->ShowInfoBarError(
_(
"Symbol is not derived from another symbol." ) );
1505 m_frame->GetSymbolFromUndoList();
1521 m_frame->GetSymbolFromRedoList();
1531 int retVal =
Copy( aEvent );
1545 if( !symbol || !selection.
GetSize() )
1555 if( !item.IsSelected() )
1569 std::string prettyData = formatter.
GetString();
1573 std::vector<CLIPBOARD_MIME_DATA> mimeData;
1590 bbox.
GetHeight() * clipboardBboxInflation );
1604 for(
EDA_ITEM* selItem : selection )
1608 if( selSchItem->
Type() == item.Type()
1609 && selSchItem->
GetPosition() == item.GetPosition() )
1624 int unit =
m_frame->GetUnit();
1625 int bodyStyle =
m_frame->GetBodyStyle();
1627 wxMemoryBuffer svgBuffer;
1629 if( plotSymbolToSvg(
m_frame, cleanSymbol, bbox, unit, bodyStyle, svgBuffer ) )
1630 appendMimeData( mimeData, wxS(
"image/svg+xml" ), svgBuffer );
1632 wxImage pngImage = renderSymbolToImageWithAlpha(
m_frame, cleanSymbol, bbox, unit, bodyStyle );
1634 if( pngImage.IsOk() )
1635 appendMimeData( mimeData, wxS(
"image/png" ), std::move( pngImage ) );
1652 if( selection.Empty() )
1657 if( selection.IsHover() )
1678 if( newParts.empty() || !newParts[0] )
1681 newPart = newParts[0];
1688 wxString pasteText( clipboardData );
1692 if( pasteText.Length() > 5000 )
1693 pasteText = pasteText.Left( 5000 ) + wxT(
"..." );
1729 if( !selection.
Empty() )
1734 commit.
Push(
_(
"Paste" ) );
1749 if( selection.
GetSize() == 0 )
1754 std::vector<EDA_ITEM*> oldItems;
1755 std::vector<EDA_ITEM*> newItems;
1757 std::copy( selection.
begin(), selection.
end(), std::back_inserter( oldItems ) );
1758 std::sort( oldItems.begin(), oldItems.end(), [](
EDA_ITEM* a,
EDA_ITEM* b )
1762 if( a->Type() != b->Type() )
1763 return a->Type() < b->Type();
1766 if( a->Type() == SCH_PIN_T )
1768 const wxString& aNum = static_cast<SCH_PIN*>( a )->GetNumber();
1769 const wxString& bNum = static_cast<SCH_PIN*>( b )->GetNumber();
1771 cmp = StrNumCmp( aNum, bNum );
1775 if( aNum.IsNumber() && bNum.IsNumber() && cmp != 0 )
1797 newPin->
SetNumber( wxString::Format( wxT(
"%i" ), symbol->GetMaxPinNumber() + 1 ) );
1803 newItems.push_back( newItem );
1805 symbol->AddDrawItem( newItem );
1806 getView()->Add( newItem );
1812 selection.SetReferencePoint( getViewControls()->GetCursorPosition(
true ) );
1815 commit.Push(
_(
"Duplicate" ) );
constexpr EDA_IU_SCALE schIUScale
std::optional< BOX2I > OPT_BOX2I
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION decrementPrimary
static TOOL_ACTION cancelInteractive
static TOOL_ACTION unselectAll
static TOOL_ACTION decrementSecondary
static TOOL_ACTION incrementSecondary
static TOOL_ACTION duplicate
static TOOL_ACTION incrementPrimary
static TOOL_ACTION doDelete
static TOOL_ACTION deleteTool
static TOOL_ACTION increment
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION copyAsText
static TOOL_ACTION refreshPreview
static TOOL_ACTION selectAll
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr size_type GetWidth() const
constexpr Vec Centre() const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr size_type GetHeight() const
constexpr const Vec & GetOrigin() const
constexpr const SizeVec & GetSize() const
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
This class is setup in expectation of its children possibly using Kiway player so DIALOG_SHIM::ShowQu...
void UpdateField(SCH_FIELD *aField)
bool GetApplyToAllConversions()
bool GetApplyToAllUnits()
Dialog to update or change schematic library symbols.
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
virtual void SetPosition(const VECTOR2I &aPos)
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
EDA_ITEM_FLAGS GetEditFlags() const
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM * GetParent() const
virtual bool IsVisible() const
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
GR_TEXT_V_ALIGN_T GetVertJustify() const
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
A color representation with 4 components: red, green, blue, alpha.
GAL_ANTIALIASING_MODE antialiasing_mode
The grid style to draw the grid in.
static std::unique_ptr< GAL_PRINT > Create(GAL_DISPLAY_OPTIONS &aOptions, wxDC *aDC)
Abstract interface for drawing on a 2D-surface.
void SetZoomFactor(double aZoomFactor)
void SetLookAtPoint(const VECTOR2D &aPoint)
Get/set the Point in world space to look at.
virtual void ClearScreen()
Clear the screen.
void SetWorldUnitLength(double aWorldUnitLength)
Set the unit length.
void SetClearColor(const COLOR4D &aColor)
virtual double GetNativeDPI() const =0
virtual bool HasNativeLandscapeRotation() const =0
int GetDefaultPenWidth() const
void SetDefaultPenWidth(int aWidth)
void SetIsPrinting(bool isPrinting)
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
static constexpr int VIEW_MAX_LAYERS
Maximum number of layers that may be shown.
A logical library item identifier and consists of various portions much like a URI.
bool IsValid() const
Check if this LID_ID is valid.
const UTF8 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Symbol library management helper that is specific to the symbol library editor frame.
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > & GetAdapter()
Return the adapter object that provides the stored data.
Define a library symbol object.
bool UnitsLocked() const
Check whether symbol units are interchangeable.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
void PlotFields(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed)
Plot symbol fields.
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
void RemoveDrawItem(SCH_ITEM *aItem)
Remove draw aItem from list.
std::vector< SCH_PIN * > GetPins() const override
int GetUnitCount() const override
void AddDrawItem(SCH_ITEM *aItem, bool aSort=true)
Add a new draw aItem to the draw object list and sort according to aSort.
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Describe the page size and margins of a paper page on which to eventually print or plot.
void SetHeightMils(double aHeightInMils)
void SetWidthMils(double aWidthInMils)
A pin layout helper is a class that manages the layout of the parts of a pin on a schematic symbol:
OPT_BOX2I GetPinNumberBBox()
Get the bounding box of the pin number, if there is one.
static TOOL_ACTION rotateCCW
static TOOL_ACTION mirrorV
static TOOL_ACTION convertStackedPins
static TOOL_ACTION pinTable
static TOOL_ACTION properties
static TOOL_ACTION rotateCW
static TOOL_ACTION mirrorH
static TOOL_ACTION symbolProperties
static TOOL_ACTION explodeStackedPin
static TOOL_ACTION updateSymbolFields
SCH_RENDER_SETTINGS * GetRenderSettings()
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
virtual void Revert() override
Revert the commit by restoring the modified items state.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
static void FormatLibSymbol(LIB_SYMBOL *aPart, OUTPUTFORMATTER &aFormatter)
static std::vector< LIB_SYMBOL * > ParseLibSymbols(std::string &aSymbolText, std::string aSource, int aFileVersion=SEXPR_SCHEMATIC_FILE_VERSION)
Base class for any item which can be embedded within the SCHEMATIC container class,...
SCH_ITEM * Duplicate(bool addToParentGroup, SCH_COMMIT *aCommit=nullptr, bool doClone=false) const
Routine to create a new copy of given item.
virtual void SetBodyStyle(int aBodyStyle)
virtual void MirrorHorizontally(int aCenter)
Mirror item horizontally about aCenter.
virtual void Rotate(const VECTOR2I &aCenter, bool aRotateCCW)
Rotate the item around aCenter 90 degrees in the clockwise direction.
virtual void SetUnit(int aUnit)
wxString GetClass() const override
Return the class name.
virtual void MirrorVertically(int aCenter)
Mirror item vertically about aCenter.
void SetNumber(const wxString &aNumber)
void SetVisible(bool aVisible)
void SetOrientation(PIN_ORIENTATION aOrientation)
void SetName(const wxString &aName)
void SetPosition(const VECTOR2I &aPos) override
const wxString & GetName() const
void SetLength(int aLength)
PIN_ORIENTATION GetOrientation() const
void SetNumberTextSize(int aSize)
void SetShape(GRAPHIC_PINSHAPE aShape)
VECTOR2I GetPosition() const override
void SetType(ELECTRICAL_PINTYPE aType)
const wxString & GetNumber() const
ELECTRICAL_PINTYPE GetType() const
void SetNameTextSize(int aSize)
void SetBackgroundColor(const COLOR4D &aColor) override
Set the background color.
void LoadColors(const COLOR_SETTINGS *aSettings) override
const PAGE_INFO & GetPageSettings() const
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
static SELECTION_CONDITION MoreThan(int aNumber)
Create a functor that tests if the number of selected items is greater than the value given as parame...
static bool Idle(const SELECTION &aSelection)
Test if there no items selected or being edited.
static bool IdleSelection(const SELECTION &aSelection)
Test if all selected items are not being edited.
static SELECTION_CONDITION Count(int aNumber)
Create a functor that tests if the number of selected items is equal to the value given as parameter.
static SELECTION_CONDITION OnlyTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if the selected items are only of given types.
virtual KIGFX::VIEW_ITEM * GetItem(unsigned int aIdx) const override
virtual VECTOR2I GetCenter() const
Returns the center point of the selection area bounding box.
virtual unsigned int GetSize() const override
Return the number of stored items.
virtual void Clear() override
Remove all the stored items from the group.
int Size() const
Returns the number of selected parts.
std::vector< EDA_ITEM * > GetItemsSortedBySelectionOrder() const
void SetReferencePoint(const VECTOR2I &aP)
bool Empty() const
Checks if there is anything selected.
The symbol library editor main window.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Returns a pointer to the active color theme settings.
LIB_SYMBOL * GetBufferedSymbol(const wxString &aSymbolName, const wxString &aLibrary)
Return the symbol copy from the buffer.
void SetSymbolModified(const wxString &aSymbolName, const wxString &aLibrary)
bool UpdateSymbol(LIB_SYMBOL *aSymbol, const wxString &aLibrary)
Update the symbol buffer with a new version of the symbol.
bool SaveClipboard(const std::string &aTextUTF8)
Store information to the system clipboard.
std::string GetClipboardUTF8()
Return the information currently stored in the system clipboard.
#define IS_PASTED
Modifier on IS_NEW which indicates it came from clipboard.
#define IS_NEW
New item, just created.
#define SELECTED
Item was manually selected by the user.
#define STRUCT_DELETED
flag indication structures to be erased
const wxChar *const traceStackedPins
Flag to enable debug output for stacked pins handling in symbol/pin code.
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
PIN_ORIENTATION
The symbol library pin object orientations.
Plotting engines similar to ps (PostScript, Gerber, svg)
std::vector< EDA_ITEM * > EDA_ITEMS
constexpr double SCH_WORLD_UNIT(1e-7/0.0254)
wxString TitleCaps(const wxString &aString)
Capitalize the first letter in each word.
std::optional< wxBitmap > m_image
Optional bitmap image to add to clipboard via wxBitmapDataObject.
wxString result
Test unit parsing edge cases and error handling.
constexpr GR_TEXT_H_ALIGN_T GetFlippedAlignment(GR_TEXT_H_ALIGN_T aAlign)
Get the reverse alignment: left-right are swapped, others are unchanged.
wxLogTrace helper definitions.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D
constexpr int LexicographicalCompare(const VECTOR2< T > &aA, const VECTOR2< T > &aB)
#define ZOOM_MIN_LIMIT_EESCHEMA
#define ZOOM_MAX_LIMIT_EESCHEMA