41#include <dialogs/dialog_text_properties.h>
52#include <wx/textdlg.h>
64#include <wx/mstream.h>
65#include <wx/dcmemory.h>
70constexpr double clipboardPpi = 96.0;
71constexpr int clipboardMaxBitmapSize = 4096;
72constexpr double clipboardBboxInflation = 0.02;
75void appendMimeData( std::vector<CLIPBOARD_MIME_DATA>& aMimeData,
const wxString& aMimeType,
76 const wxMemoryBuffer& aBuffer )
78 if( aBuffer.GetDataLen() == 0 )
84 aMimeData.push_back( entry );
88bool loadFileToBuffer(
const wxString& aFileName, wxMemoryBuffer& aBuffer )
90 wxFFile file( aFileName, wxS(
"rb" ) );
92 if( !file.IsOpened() )
95 wxFileOffset size = file.Length();
100 void* data = aBuffer.GetWriteBuf( size );
102 if( file.Read( data, size ) !=
static_cast<size_t>( size ) )
104 aBuffer.UngetWriteBuf( 0 );
108 aBuffer.UngetWriteBuf( size );
114 int aUnit,
int aBodyStyle, wxMemoryBuffer& aBuffer )
123 std::unique_ptr<SVG_PLOTTER> plotter = std::make_unique<SVG_PLOTTER>();
124 plotter->SetRenderSettings( &renderSettings );
130 plotter->SetPageSettings( pageInfo );
131 plotter->SetColorMode(
true );
134 plotter->SetViewport( plot_offset,
schIUScale.IU_PER_MILS / 10, 1.0,
false );
135 plotter->SetCreator( wxT(
"Eeschema-SVG" ) );
137 wxFileName tempFile( wxFileName::CreateTempFileName( wxS(
"kicad_symbol_svg" ) ) );
139 if( !plotter->OpenFile( tempFile.GetFullPath() ) )
141 wxRemoveFile( tempFile.GetFullPath() );
148 plotter->StartPlot( wxT(
"1" ) );
150 constexpr bool background =
true;
151 aSymbol->
Plot( plotter.get(), background, plotOpts, aUnit, aBodyStyle,
VECTOR2I( 0, 0 ),
false );
152 aSymbol->
Plot( plotter.get(), !background, plotOpts, aUnit, aBodyStyle,
VECTOR2I( 0, 0 ),
false );
153 aSymbol->
PlotFields( plotter.get(), !background, plotOpts, aUnit, aBodyStyle,
VECTOR2I( 0, 0 ),
false );
158 bool ok = loadFileToBuffer( tempFile.GetFullPath(), aBuffer );
159 wxRemoveFile( tempFile.GetFullPath() );
165 int aUnit,
int aBodyStyle,
int aWidth,
int aHeight,
166 double aViewScale,
const wxColour& aBgColor )
171 wxBitmap bitmap( aWidth, aHeight, 24 );
173 dc.SelectObject( bitmap );
174 dc.SetBackground( wxBrush( aBgColor ) );
186 std::unique_ptr<KIGFX::SCH_PAINTER> painter = std::make_unique<KIGFX::SCH_PAINTER>( gal );
187 std::unique_ptr<KIGFX::VIEW> view = std::make_unique<KIGFX::VIEW>();
192 view->SetPainter( painter.get() );
194 view->SetScale( 1.0 );
198 std::vector<std::unique_ptr<SCH_ITEM>> clonedItems;
202 if( aUnit && item.GetUnit() && item.GetUnit() != aUnit )
205 if( aBodyStyle && item.GetBodyStyle() && item.GetBodyStyle() != aBodyStyle )
209 clonedItems.emplace_back( clone );
218 COLOR4D bgColor4D( aBgColor.Red() / 255.0, aBgColor.Green() / 255.0,
219 aBgColor.Blue() / 255.0, 1.0 );
224 view->SetLayerVisible( i,
true );
230 double ppi = clipboardPpi;
231 double inch2Iu = 1000.0 *
schIUScale.IU_PER_MILS;
232 VECTOR2D pageSizeIn( (
double) aWidth / ppi, (
double) aHeight / ppi );
234 galPrint->SetSheetSize( pageSizeIn );
237 double zoomFactor = aViewScale * inch2Iu / ppi;
244 view->UseDrawPriority(
true );
251 dc.SelectObject( wxNullBitmap );
252 return bitmap.ConvertToImage();
257 int aUnit,
int aBodyStyle, wxMemoryBuffer& aBuffer )
264 if( size.
x <= 0 || size.
y <= 0 )
269 int bitmapWidth =
KiROUND( size.
x * viewScale );
270 int bitmapHeight =
KiROUND( size.
y * viewScale );
273 if( bitmapWidth > clipboardMaxBitmapSize || bitmapHeight > clipboardMaxBitmapSize )
275 double scaleDown = (double) clipboardMaxBitmapSize / std::max( bitmapWidth, bitmapHeight );
276 bitmapWidth =
KiROUND( bitmapWidth * scaleDown );
277 bitmapHeight =
KiROUND( bitmapHeight * scaleDown );
278 viewScale *= scaleDown;
281 if( bitmapWidth <= 0 || bitmapHeight <= 0 )
285 wxImage imageOnWhite = renderSymbolToBitmap( aFrame, aSymbol, aBBox, aUnit, aBodyStyle,
286 bitmapWidth, bitmapHeight, viewScale, *wxWHITE );
287 wxImage imageOnBlack = renderSymbolToBitmap( aFrame, aSymbol, aBBox, aUnit, aBodyStyle,
288 bitmapWidth, bitmapHeight, viewScale, *wxBLACK );
290 if( !imageOnWhite.IsOk() || !imageOnBlack.IsOk() )
294 wxImage
result( bitmapWidth, bitmapHeight );
297 unsigned char* rgbWhite = imageOnWhite.GetData();
298 unsigned char* rgbBlack = imageOnBlack.GetData();
299 unsigned char* rgbResult =
result.GetData();
300 unsigned char* alphaResult =
result.GetAlpha();
302 int pixelCount = bitmapWidth * bitmapHeight;
304 for(
int i = 0; i < pixelCount; ++i )
308 int rW = rgbWhite[idx], gW = rgbWhite[idx + 1], bW = rgbWhite[idx + 2];
309 int rB = rgbBlack[idx], gB = rgbBlack[idx + 1], bB = rgbBlack[idx + 2];
315 int avgDiff = ( diffR + diffG + diffB ) / 3;
317 int alpha = 255 - avgDiff;
318 alpha = std::max( 0, std::min( 255, alpha ) );
319 alphaResult[i] =
static_cast<unsigned char>( alpha );
323 rgbResult[idx] =
static_cast<unsigned char>( std::min( 255, rB * 255 / alpha ) );
324 rgbResult[idx + 1] =
static_cast<unsigned char>( std::min( 255, gB * 255 / alpha ) );
325 rgbResult[idx + 2] =
static_cast<unsigned char>( std::min( 255, bB * 255 / alpha ) );
330 rgbResult[idx + 1] = 0;
331 rgbResult[idx + 2] = 0;
335 wxMemoryOutputStream stream;
337 if( !
result.SaveFile( stream, wxBITMAP_TYPE_PNG ) )
340 size_t dataSize = stream.GetOutputStreamBuffer()->GetBufferSize();
341 aBuffer.AppendData( stream.GetOutputStreamBuffer()->GetBufferStart(), dataSize );
372 wxASSERT_MSG( drawingTools,
"eeschema.SymbolDrawing tool is not available" );
374 auto haveSymbolCondition =
383 if( !
m_frame->IsSymbolEditable() )
398 auto swapSelectionCondition =
410 const auto canConvertStackedPins =
414 if( sel.Size() >= 2 )
416 std::vector<SCH_PIN*> pins;
421 pins.push_back(
static_cast<SCH_PIN*
>( item ) );
425 VECTOR2I pos = pins[0]->GetPosition();
426 for(
size_t i = 1; i < pins.size(); ++i )
428 if( pins[i]->GetPosition() != pos )
435 if( sel.Size() == 1 && sel.Front()->Type() ==
SCH_PIN_T )
445 int coLocatedCount = 0;
449 if(
pin->GetPosition() == pos )
453 if( coLocatedCount >= 2 )
462 const auto canExplodeStackedPin =
465 if( sel.Size() != 1 || sel.Front()->Type() !=
SCH_PIN_T )
470 std::vector<wxString> stackedNumbers =
pin->GetStackedPinNumbers( &isValid );
471 return isValid && stackedNumbers.size() > 1;
558 commit = &localCommit;
568 for(
unsigned ii = 0; ii < selection.
GetSize(); ii++ )
571 item->
Rotate( rotPoint, ccw );
572 m_frame->UpdateItem( item,
false,
true );
584 if( !localCommit.
Empty() )
585 localCommit.
Push(
_(
"Rotate" ) );
610 switch( item->
Type() )
634 m_frame->UpdateItem( item,
false,
true );
640 for(
unsigned ii = 0; ii < selection.
GetSize(); ii++ )
649 m_frame->UpdateItem( item,
false,
true );
672 if( selection.
Size() < 2 )
682 for(
size_t i = 0; i < sorted.size() - 1; i++ )
688 std::swap( aPos, bPos );
715 m_frame->UpdateItem( a,
false,
true );
716 m_frame->UpdateItem( b,
false,
true );
720 for(
EDA_ITEM* selected : selection )
752 std::deque<EDA_ITEM*> items =
m_selectionTool->RequestSelection().GetItems();
763 std::set<SCH_ITEM*> toDelete;
764 int fieldsHidden = 0;
765 int fieldsAlreadyHidden = 0;
774 toDelete.insert( curr_pin );
778 if(
m_frame->SynchronizePins() )
780 std::vector<bool> got_unit( symbol->
GetUnitCount() + 1 );
782 got_unit[curr_pin->
GetUnit()] =
true;
786 if( got_unit[
pin->GetUnit()] )
789 if(
pin->GetPosition() != pos )
801 toDelete.insert(
pin );
802 got_unit[
pin->GetUnit()] =
true;
818 fieldsAlreadyHidden++;
823 toDelete.insert( schItem );
830 if( toDelete.size() == 0 )
832 if( fieldsHidden == 1 )
833 commit.
Push(
_(
"Hide Field" ) );
834 else if( fieldsHidden > 1 )
835 commit.
Push(
_(
"Hide Fields" ) );
836 else if( fieldsAlreadyHidden > 0 )
837 m_frame->ShowInfoBarError(
_(
"Use the Symbol Properties dialog to remove fields." ) );
841 commit.
Push(
_(
"Delete" ) );
862 ( !
m_frame->GetCurSymbol() ||
m_frame->GetCurSymbol()->GetLibId() != treeLibId ) )
873 else if( selection.
Size() == 1 )
881 switch( item->
Type() )
891 bool mouseOverNumber =
false;
894 mouseOverNumber = numberBox->Contains( mousePos );
898 pinTool->EditPinProperties( &
pin, mouseOverNumber );
919 wxFAIL_MSG( wxT(
"Unhandled item <" ) + item->
GetClass() + wxT(
">" ) );
939 m_frame->GetCanvas()->Refresh();
946 std::vector<MSG_PANEL_ITEM> items;
963 m_frame->GetCanvas()->Refresh();
979 m_frame->GetCanvas()->Refresh();
986 if( aField ==
nullptr )
994 caption.Printf(
_(
"Edit '%s' Field" ), aField->
GetName() );
1008 commit.
Push( caption );
1010 m_frame->GetCanvas()->Refresh();
1011 m_frame->UpdateSymbolMsgPanelInfo();
1024 if( !bufferedSymbol )
1049 wxDataViewItem treeItem = libMgr.
GetAdapter()->FindItem( aLibId );
1050 m_frame->UpdateLibraryTree( treeItem, &tempSymbol );
1071 m_frame->RebuildSymbolUnitAndBodyStyleLists();
1102 wxCHECK( selTool, -1 );
1104 std::vector<SCH_PIN*> selectedPins;
1113 selectedPins.push_back( pinItem );
1126 commit.
Push(
_(
"Edit Pins" ) );
1142 wxCHECK( selTool, -1 );
1147 std::vector<SCH_PIN*> pinsToConvert;
1157 if(
pin->GetPosition() == pos )
1158 pinsToConvert.push_back(
pin );
1167 pinsToConvert.push_back(
static_cast<SCH_PIN*
>( item ) );
1171 if( pinsToConvert.size() < 2 )
1173 m_frame->ShowInfoBarError(
_(
"At least two pins are needed to convert to stacked pins" ) );
1178 VECTOR2I pos = pinsToConvert[0]->GetPosition();
1179 for(
size_t i = 1; i < pinsToConvert.size(); ++i )
1181 if( pinsToConvert[i]->GetPosition() != pos )
1183 m_frame->ShowInfoBarError(
_(
"All pins must be at the same location" ) );
1194 std::sort( pinsToConvert.begin(), pinsToConvert.end(),
1197 wxString numA = a->GetNumber();
1198 wxString numB = b->GetNumber();
1202 bool aIsNumeric = numA.ToLong( &longA );
1203 bool bIsNumeric = numB.ToLong( &longB );
1206 if( aIsNumeric && bIsNumeric )
1207 return longA < longB;
1210 if( aIsNumeric && !bIsNumeric )
1212 if( !aIsNumeric && bIsNumeric )
1220 wxString stackedNotation = wxT(
"[");
1223 auto collapseRanges = [&]() -> wxString
1225 if( pinsToConvert.empty() )
1231 std::map<wxString, std::vector<long>> prefixGroups;
1232 std::vector<wxString> nonNumericPins;
1237 wxString pinNumber =
pin->GetNumber();
1240 if( pinNumber.IsEmpty() )
1242 nonNumericPins.push_back( wxT(
"(empty)") );
1247 wxString numericPart;
1250 size_t numStart = pinNumber.length();
1251 for(
int i = pinNumber.length() - 1; i >= 0; i-- )
1253 if( !wxIsdigit( pinNumber[i] ) )
1262 if( numStart < pinNumber.length() )
1264 prefix = pinNumber.Left( numStart );
1265 numericPart = pinNumber.Mid( numStart );
1268 if( numericPart.ToLong( &numValue ) && numValue >= 0 )
1270 prefixGroups[prefix].push_back( numValue );
1275 nonNumericPins.push_back( pinNumber );
1280 nonNumericPins.push_back( pinNumber );
1285 for(
auto& [prefix, numbers] : prefixGroups )
1291 std::sort( numbers.begin(), numbers.end() );
1295 while( i < numbers.size() )
1300 long start = numbers[i];
1304 while( i + 1 < numbers.size() && numbers[i + 1] == numbers[i] + 1 )
1311 if(
end > start + 1 )
1312 result += wxString::Format( wxT(
"%s%ld-%s%ld"), prefix, start, prefix,
end );
1313 else if(
end == start + 1 )
1314 result += wxString::Format( wxT(
"%s%ld,%s%ld"), prefix, start, prefix,
end );
1316 result += wxString::Format( wxT(
"%s%ld"), prefix, start );
1323 for(
const wxString& nonNum : nonNumericPins )
1333 stackedNotation += collapseRanges();
1334 stackedNotation += wxT(
"]");
1337 SCH_PIN* masterPin = pinsToConvert[0];
1338 masterPin->
SetNumber( stackedNotation );
1342 wxString::Format(
"Converting %zu pins to stacked notation '%s'",
1343 pinsToConvert.size(), stackedNotation ) );
1347 std::vector<SCH_PIN*> pinsToRemove;
1348 for(
size_t i = 1; i < pinsToConvert.size(); ++i )
1350 SCH_PIN* pinToRemove = pinsToConvert[i];
1354 wxString::Format(
"Will remove pin '%s' at position (%d, %d)",
1359 pinsToRemove.push_back( pinToRemove );
1368 commit.
Push( wxString::Format(
_(
"Convert %zu Stacked Pins to '%s'" ),
1369 pinsToConvert.size(), stackedNotation ) );
1384 wxCHECK( selTool, -1 );
1390 m_frame->ShowInfoBarError(
_(
"Select a single pin with stacked notation to explode" ) );
1398 std::vector<wxString> stackedNumbers =
pin->GetStackedPinNumbers( &isValid );
1400 if( !isValid || stackedNumbers.size() <= 1 )
1402 m_frame->ShowInfoBarError(
_(
"Selected pin does not have valid stacked notation" ) );
1412 std::sort( stackedNumbers.begin(), stackedNumbers.end(),
1413 [](
const wxString& a,
const wxString& b )
1417 if( a.ToLong( &numA ) && b.ToLong( &numB ) )
1425 pin->SetNumber( stackedNumbers[0] );
1426 pin->SetVisible(
true );
1429 for(
size_t i = 1; i < stackedNumbers.size(); ++i )
1451 commit.
Push(
_(
"Explode Stacked Pin" ) );
1466 m_frame->ShowInfoBarError(
_(
"Symbol is not derived from another symbol." ) );
1488 m_frame->GetSymbolFromUndoList();
1504 m_frame->GetSymbolFromRedoList();
1514 int retVal =
Copy( aEvent );
1528 if( !symbol || !selection.
GetSize() )
1538 if( !item.IsSelected() )
1552 std::string prettyData = formatter.
GetString();
1556 std::vector<CLIPBOARD_MIME_DATA> mimeData;
1573 bbox.
GetHeight() * clipboardBboxInflation );
1587 for(
EDA_ITEM* selItem : selection )
1591 if( selSchItem->
Type() == item.Type()
1592 && selSchItem->
GetPosition() == item.GetPosition() )
1607 int unit =
m_frame->GetUnit();
1608 int bodyStyle =
m_frame->GetBodyStyle();
1610 wxMemoryBuffer svgBuffer;
1612 if( plotSymbolToSvg(
m_frame, cleanSymbol, bbox, unit, bodyStyle, svgBuffer ) )
1613 appendMimeData( mimeData, wxS(
"image/svg+xml" ), svgBuffer );
1615 wxMemoryBuffer pngBuffer;
1617 if( plotSymbolToPng(
m_frame, cleanSymbol, bbox, unit, bodyStyle, pngBuffer ) )
1618 appendMimeData( mimeData, wxS(
"image/png" ), pngBuffer );
1635 if( selection.Empty() )
1640 if( selection.IsHover() )
1661 if( newParts.empty() || !newParts[0] )
1664 newPart = newParts[0];
1671 wxString pasteText( clipboardData );
1675 if( pasteText.Length() > 5000 )
1676 pasteText = pasteText.Left( 5000 ) + wxT(
"..." );
1712 if( !selection.
Empty() )
1717 commit.
Push(
_(
"Paste" ) );
1732 if( selection.
GetSize() == 0 )
1737 std::vector<EDA_ITEM*> oldItems;
1738 std::vector<EDA_ITEM*> newItems;
1740 std::copy( selection.
begin(), selection.
end(), std::back_inserter( oldItems ) );
1741 std::sort( oldItems.begin(), oldItems.end(), [](
EDA_ITEM* a,
EDA_ITEM* b )
1745 if( a->Type() != b->Type() )
1746 return a->Type() < b->Type();
1749 if( a->Type() == SCH_PIN_T )
1751 const wxString& aNum = static_cast<SCH_PIN*>( a )->GetNumber();
1752 const wxString& bNum = static_cast<SCH_PIN*>( b )->GetNumber();
1754 cmp = StrNumCmp( aNum, bNum );
1758 if( aNum.IsNumber() && bNum.IsNumber() && cmp != 0 )
1780 newPin->
SetNumber( wxString::Format( wxT(
"%i" ), symbol->GetMaxPinNumber() + 1 ) );
1786 newItems.push_back( newItem );
1788 symbol->AddDrawItem( newItem );
1789 getView()->Add( newItem );
1795 selection.SetReferencePoint( getViewControls()->GetCursorPosition(
true ) );
1798 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 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.
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
#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)
constexpr double SCH_WORLD_UNIT(1e-7/0.0254)
wxString TitleCaps(const wxString &aString)
Capitalize the first letter in each word.
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