30#include <wx/stringimpl.h>
31#include <wx/translation.h>
103 bus = (
SCH_LINE*) selection.Front();
114 if( !connection || !connection->
IsBus() || connection->
Members().empty() )
129 for(
const std::shared_ptr<SCH_CONNECTION>& member : connection->
Members() )
132 wxString
name = member->FullLocalName();
139 for(
const std::shared_ptr<SCH_CONNECTION>& sub_member : member->Members() )
142 name = sub_member->FullLocalName();
148 Append(
id,
name, wxEmptyString );
159 m_inDrawingTool( false )
175 std::shared_ptr<BUS_UNFOLD_MENU> busUnfoldMenu = std::make_shared<BUS_UNFOLD_MENU>();
176 busUnfoldMenu->SetTool(
this );
179 std::shared_ptr<BUS_UNFOLD_MENU> selBusUnfoldMenu = std::make_shared<BUS_UNFOLD_MENU>();
196 auto belowRootSheetCondition =
222 ctxMenu.AddSeparator( 10 );
236 ctxMenu.AddSeparator( 100 );
245 ctxMenu.AddSeparator( 200 );
322 wxString* netPtr = aEvent.
Parameter<wxString*>();
346 std::optional<int>
id = evt->GetCommandId();
348 if(
id && ( *
id > 0 ) )
349 net = *evt->Parameter<wxString*>();
422 if(
pin->GetPosition() == aPosition )
436 wxCHECK_RET( aSegments.first && aSegments.second,
437 wxT(
"Cannot compute break point of NULL line segment." ) );
440 SCH_LINE* segment = aSegments.first;
441 SCH_LINE* nextSegment = aSegments.second;
444 int xDir =
delta.x > 0 ? 1 : -1;
445 int yDir =
delta.y > 0 ? 1 : -1;
448 bool preferHorizontal;
471 aPosition.
x +=
KiROUND(
getView()->GetGAL()->GetGridSize().x * direction );
474 preferHorizontal =
true;
475 preferVertical =
false;
479 auto breakVertical = [&]()
mutable
487 midPoint.
y = aPosition.
y - yDir *
abs(
delta.x );
491 midPoint.
x = aPosition.
x;
497 midPoint.
y = aPosition.
y;
502 auto breakHorizontal = [&]()
mutable
509 midPoint.
x = aPosition.
x - xDir *
abs(
delta.y );
515 midPoint.
y = aPosition.
y;
519 midPoint.
x = aPosition.
x;
529 else if( preferHorizontal )
543 preferVertical =
false;
544 preferHorizontal =
false;
550 preferVertical =
false;
551 preferHorizontal =
false;
554 if( !preferHorizontal && !preferVertical )
575 static bool posture =
false;
642 && evt->HasPosition() && evt->Matches( aTool );
647 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
658 VECTOR2D eventPosition = evt->HasPosition() ? evt->Position()
665 if( currentMode != lastMode )
691 lastMode = currentMode;
697 if( evt->IsCancelInteractive() )
717 else if( evt->IsActivate() && !isSyntheticClick )
722 evt->SetPassEvent(
false );
726 if( evt->IsMoveTool() )
761 || ( segment && evt->IsDblClick(
BUT_LEFT ) )
762 || isSyntheticClick )
779 else if( !segment->
IsNull()
797 int placedSegments = 1;
807 for(
int i = 0; i < placedSegments; i++ )
820 if( evt->IsDblClick(
BUT_LEFT ) && segment )
822 if( twoSegments &&
m_wires.size() >= 2 )
824 currentMode, posture );
849 bool flipX = ( cursor_delta.
x < 0 );
850 bool flipY = ( cursor_delta.
y < 0 );
856 int ySign = flipY ? -1 : 1;
857 int xSign = flipX ? -1 : 1;
882 if( twoSegments &&
m_wires.size() >= 2 )
885 currentMode, posture );
895 if( !wire->IsNull() )
914 if( twoSegments &&
m_wires.size() >= 2 )
917 currentMode, posture );
926 if( !wire->IsNull() )
957 if( !wire->IsNull() )
978 contextMenuPos = cursorPos;
986 wxASSERT_MSG( !segment,
"Bus unfold event received when already drawing!" );
989 wxString net = *evt->Parameter<wxString*>();
1014 evt->SetPassEvent();
1034 if( aSegment ==
nullptr )
1054 m_wires.push_back( aSegment );
1064 m_wires.push_back( aSegment );
1102 if( next_it ==
m_wires.end() )
1135 std::vector<VECTOR2I> new_ends;
1143 std::vector<VECTOR2I> tmpends = wire->GetConnectionPoints();
1145 new_ends.insert( new_ends.end(), tmpends.begin(), tmpends.end() );
1147 for(
const VECTOR2I& pt : connections )
1150 new_ends.push_back( pt );
1172 for(
size_t ii = 1; ii <
m_wires.size(); ++ii )
1198 std::vector<SCH_ITEM*> symbols;
1201 symbols.push_back( symbol );
1205 std::vector<VECTOR2I> pts = symbol->GetConnectionPoints();
1207 if( pts.size() > 2 )
1210 for(
auto pt = pts.begin(); pt != pts.end(); pt++ )
1212 for(
auto secondPt = pt + 1; secondPt != pts.end(); secondPt++ )
1217 for(
const VECTOR2I& pt : new_ends )
1227 item->ClearEditFlags();
1241 std::set<SCH_LINE*> lines;
1245 lines.insert(
static_cast<SCH_LINE*
>( item ) );
1247 for(
unsigned ii = 0; ii < aSelection->
GetSize(); ii++ )
1260 std::vector<VECTOR2I> conn_pts;
1265 conn_pts.push_back( pt );
1267 if( conn_pts.size() > 2 )
1271 if( conn_pts.size() == 2 )
static TOOL_ACTION doDelete
static TOOL_ACTION refreshPreview
void ShowInfoBarMsg(const wxString &aMsg, bool aShowCloseButton=false)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an info icon on the left of...
WX_INFOBAR * GetInfoBar()
void SetCurrentCursor(KICURSOR aCursor)
Set the current cursor shape for this panel.
A base class for most all the KiCad significant classes used in schematics and boards.
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
virtual void SetParent(EDA_ITEM *aParent)
void SetTextSize(const VECTOR2I &aNewSize)
static TOOL_ACTION finishLine
static TOOL_ACTION clearHighlight
static TOOL_ACTION selectConnection
If current selection is a wire or bus, expand to entire connection.
static TOOL_ACTION clearSelection
Clears the current selection.
static TOOL_ACTION placeClassLabel
static TOOL_ACTION drawWire
static TOOL_ACTION rotateCCW
static TOOL_ACTION drawBus
static TOOL_ACTION finishWire
static TOOL_ACTION selectNode
Select the junction, wire or bus segment under the cursor.
static TOOL_ACTION breakWire
static TOOL_ACTION drawLines
static TOOL_ACTION finishLineWireOrBus
static TOOL_ACTION rotateCW
static TOOL_ACTION leaveSheet
static TOOL_ACTION placeGlobalLabel
static TOOL_ACTION placeHierLabel
static TOOL_ACTION undoLastSegment
static TOOL_ACTION unfoldBus
static TOOL_ACTION placeLabel
static TOOL_ACTION switchSegmentPosture
static TOOL_ACTION placeJunction
static TOOL_ACTION finishBus
EE_TYPE Overlapping(const BOX2I &aRect) const
EE_TYPE OfType(KICAD_T aType) const
BOX2I GetBoundingBox() const override
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual void CaptureCursor(bool aEnabled)
Force the cursor to stay within the drawing panel area.
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Place the cursor immediately at a given point.
virtual void ShowCursor(bool aEnabled)
Enable or disables display of cursor.
virtual void SetCrossHairCursorPosition(const VECTOR2D &aPosition, bool aWarpView=true)=0
Move the graphic crosshair cursor to the requested position expressed in world coordinates.
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
virtual VECTOR2D GetMousePosition(bool aWorldCoordinates=true) const =0
Return the current mouse pointer position.
virtual void SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
void ShowPreview(bool aShow=true)
void AddToPreview(EDA_ITEM *aItem, bool aTakeOwnership=true)
A holder to handle information on schematic or board items.
void PushItem(const ITEM_PICKER &aItem)
Push aItem to the top of the list.
These settings were stored in SCH_BASE_FRAME previously.
Holds all the data relating to one schematic.
SCH_SHEET_PATH & CurrentSheet() const override
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
EESCHEMA_SETTINGS * eeconfig() const
void RemoveFromScreen(EDA_ITEM *aItem, SCH_SCREEN *aScreen)
Remove an item from the screen (and view) aScreen is the screen the item is located on,...
void AddToScreen(EDA_ITEM *aItem, SCH_SCREEN *aScreen)
Add an item to the screen (and view) aScreen is the screen the item is located on,...
void SetSize(const VECTOR2I &aSize)
Class for a wire to bus entry.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
static wxString PrintBusForUI(const wxString &aString)
std::vector< std::shared_ptr< SCH_CONNECTION > > & Members()
Schematic editor (Eeschema) main window.
bool SchematicCleanUp(SCH_SCREEN *aScreen=nullptr)
Perform routine schematic cleaning including breaking wire and buses and deleting identical objects s...
const SCH_CONNECTION * GetHighlightedConnection() const
bool TrimWire(const VECTOR2I &aStart, const VECTOR2I &aEnd)
If any single wire passes through both points, remove the portion between the two points,...
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag and update other data struc...
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
void SaveCopyInUndoList(SCH_SCREEN *aScreen, SCH_ITEM *aItemToCopy, UNDO_REDO aTypeCommand, bool aAppend, bool aDirtyConnectivity=true)
Create a copy of the current schematic item, and put it in the undo list.
SCH_SHEET_PATH & GetCurrentSheet() const
SCHEMATIC & Schematic() const
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
void AddCopyForRepeatItem(const SCH_ITEM *aItem)
SCH_JUNCTION * AddJunction(SCH_SCREEN *aScreen, const VECTOR2I &aPos, bool aAppendToUndo, bool aFinal=true)
void TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
void SaveCopyForRepeatItem(const SCH_ITEM *aItem)
Clone aItem and owns that clone in this container.
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual bool IsConnectable() const
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
virtual std::vector< VECTOR2I > GetConnectionPoints() const
Add all the connection points for this item to aPoints.
SCH_ITEM * Duplicate(bool doClone=false) const
Routine to create a new copy of given item.
void Rotate90(bool aClockwise) override
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Segment description base class to describe items which have 2 end points (track, wire,...
void SetStartPoint(const VECTOR2I &aPosition)
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
SCH_LINE * MergeOverlap(SCH_SCREEN *aScreen, SCH_LINE *aLine, bool aCheckJunctions)
Check line against aLine to see if it overlaps and merge if it does.
void SetEndPoint(const VECTOR2I &aPosition)
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
bool IsTerminalPoint(const VECTOR2I &aPosition, int aLayer) const
Test if aPosition is a connection point on aLayer.
bool IsExplicitJunctionNeeded(const VECTOR2I &aPosition) const
Indicates that a junction dot is necessary at the given location, and does not yet exist.
std::vector< VECTOR2I > GetNeededJunctions(const std::deque< EDA_ITEM * > &aItems) const
Return the unique set of points belonging to aItems where a junction is needed.
std::vector< VECTOR2I > GetConnections() const
Collect a unique list of all possible connection points in the schematic.
SCH_SCREEN * LastScreen()
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
SHEET_SIDE GetSide() const
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
std::vector< SCH_SHEET_PIN * > & GetPins()
VECTOR2I GetPosition() const override
void SetPosition(const VECTOR2I &aPosition) override
virtual void SetTextSpinStyle(TEXT_SPIN_STYLE aSpinStyle)
Set a spin or rotation angle, along with specific horizontal and vertical justification styles with e...
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 ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
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 unsigned int GetSize() const override
Return the number of stored items.
std::deque< EDA_ITEM * > & Items()
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
#define IS_NEW
New item, just created.
#define SKIP_STRUCT
flag indicating that the structure should be ignored
#define IS_MOVING
Item being moved.
@ ID_POPUP_SCH_UNFOLD_BUS_END
@ ID_POPUP_SCH_UNFOLD_BUS
bool signbit(T v)
Integral version of std::signbit that works all compilers.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ BUS
This item represents a bus vector.
SHEET_SIDE
Define the edge of the sheet that the sheet pin is positioned.
bool label_placed
True if user has placed the net label.
wxString net_name
Net label for the unfolding operation.
bool flipY
True if the bus entry should be flipped in the y-axis.
SCH_BUS_WIRE_ENTRY * entry
bool flipX
True if the bus entry should be flipped in the x-axis.
VECTOR2I origin
Origin (on the bus) of the unfold.
bool in_progress
True if bus unfold operation is running.
bool IsPointOnSegment(const VECTOR2I &aSegStart, const VECTOR2I &aSegEnd, const VECTOR2I &aTestPoint)
Test if aTestPoint is on line defined by aSegStart and aSegEnd.
@ SCH_ITEM_LOCATE_GRAPHIC_LINE_T
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
VECTOR2< double > VECTOR2D