26using namespace std::placeholders;
112 std::shared_ptr<EDIT_POINTS> points = std::make_shared<EDIT_POINTS>( aItem );
118 switch( aItem->
Type() )
128 points->AddPoint( shape->
GetEnd() );
132 points->AddIndicatorLine( points->Point(
ARC_CENTER ), points->Point(
ARC_END ) );
135 case SHAPE_T::CIRCLE:
137 points->AddPoint( shape->
GetEnd() );
140 case SHAPE_T::RECTANGLE:
147 points->AddPoint( topLeft );
148 points->AddPoint(
VECTOR2I( botRight.
x, topLeft.
y ) );
149 points->AddPoint(
VECTOR2I( topLeft.
x, botRight.
y ) );
150 points->AddPoint( botRight );
166 points->AddPoint( pt );
170 case SHAPE_T::BEZIER:
171 points->AddPoint( shape->
GetStart() );
174 points->AddPoint( shape->
GetEnd() );
176 points->AddIndicatorLine( points->Point(
BEZIER_START ),
178 points->AddIndicatorLine( points->Point(
BEZIER_END ),
208 points->AddPoint( topLeft );
209 points->AddPoint(
VECTOR2I( botRight.
x, topLeft.
y ) );
210 points->AddPoint(
VECTOR2I( topLeft.
x, botRight.
y ) );
211 points->AddPoint( botRight );
239 points->AddPoint( topLeft );
240 points->AddPoint(
VECTOR2I( botRight.
x, topLeft.
y ) );
241 points->AddPoint(
VECTOR2I( topLeft.
x, botRight.
y ) );
242 points->AddPoint( botRight );
263 points->AddPoint( topLeft );
264 points->AddPoint(
VECTOR2I( botRight.
x, topLeft.
y ) );
265 points->AddPoint(
VECTOR2I( topLeft.
x, botRight.
y ) );
266 points->AddPoint( botRight );
275 std::pair<EDA_ITEM*, int> connectedStart = {
nullptr,
STARTPOINT };
276 std::pair<EDA_ITEM*, int> connectedEnd = {
nullptr,
STARTPOINT };
294 connectedStart = { testLine,
ENDPOINT };
302 connectedEnd = { testLine,
ENDPOINT };
307 points->AddPoint( line->
GetEndPoint(), connectedEnd );
326 m_editedPoint( nullptr ),
327 m_inPointEditor( false )
403 if( !
editor->IsSymbolEditable() ||
editor->IsSymbolAlias() )
441 grid->SetUseGrid(
getView()->GetGAL()->GetGridSnapping()
442 && !evt->DisableGridSnapping() );
467 if( connected.first )
472 if( connected.first )
486 bool snap = !evt->DisableGridSnapping();
497 else if( inDrag && evt->IsMouseUp(
BUT_LEFT ) )
499 if( !commit.
Empty() )
500 commit.
Push(
_(
"Move Point" ) );
505 else if( evt->IsCancelInteractive() || evt->IsActivate() )
524 else if( evt->IsCancelInteractive() )
529 if( evt->IsActivate() )
575 topLeft.
x = std::min( topLeft.
x, botRight.
x - minWidth );
576 topLeft.
y = std::min( topLeft.
y, botRight.
y - minHeight );
579 topLeft = aGrid->
AlignGrid( topLeft, GRID_HELPER_GRIDS::GRID_GRAPHICS );
582 topRight.
y = topLeft.
y;
583 botLeft.
x = topLeft.
x;
588 topRight.
x = std::max( topRight.
x, botLeft.
x + minWidth );
589 topRight.
y = std::min( topRight.
y, botLeft.
y - minHeight );
592 topRight = aGrid->
AlignGrid( topRight, GRID_HELPER_GRIDS::GRID_GRAPHICS );
595 topLeft.
y = topRight.
y;
596 botRight.
x = topRight.
x;
601 botLeft.
x = std::min( botLeft.
x, topRight.
x - minWidth );
602 botLeft.
y = std::max( botLeft.
y, topRight.
y + minHeight );
605 botLeft = aGrid->
AlignGrid( botLeft, GRID_HELPER_GRIDS::GRID_GRAPHICS );
608 botRight.
y = botLeft.
y;
609 topLeft.
x = botLeft.
x;
614 botRight.
x = std::max( botRight.
x, topLeft.
x + minWidth );
615 botRight.
y = std::max( botRight.
y, topLeft.
y + minHeight );
618 botRight = aGrid->
AlignGrid( botRight, GRID_HELPER_GRIDS::GRID_GRAPHICS );
621 botLeft.
y = botRight.
y;
622 topRight.
x = botRight.
x;
626 topLeft.
y = std::min( topLeft.
y, botRight.
y - minHeight );
629 topLeft = aGrid->
AlignGrid( topLeft, GRID_HELPER_GRIDS::GRID_GRAPHICS );
633 topLeft.
x = std::min( topLeft.
x, botRight.
x - minWidth );
636 topLeft = aGrid->
AlignGrid( topLeft, GRID_HELPER_GRIDS::GRID_GRAPHICS );
640 botRight.
y = std::max( botRight.
y, topLeft.
y + minHeight );
643 botRight = aGrid->
AlignGrid( botRight, GRID_HELPER_GRIDS::GRID_GRAPHICS );
647 botRight.
x = std::max( botRight.
x, topLeft.
x + minWidth );
650 botRight = aGrid->
AlignGrid( botRight, GRID_HELPER_GRIDS::GRID_GRAPHICS );
656 const std::vector<VECTOR2I>& aMoveVecs,
int aEdgeUnit,
659 wxCHECK( aOldEdges.size() == aMoveVecs.size(), );
668 if( !
editor.GetSettings()->m_dragPinsAlongWithEdges )
673 wxCHECK( aEdgeUnit == 0 || aEdgeUnit ==
editor.GetUnit(), );
678 const auto getPinsOnSeg = [](
LIB_SYMBOL& aSymbol,
int aUnit,
const SEG& aSeg,
679 bool aIncludeEnds ) -> std::vector<SCH_PIN*>
684 std::vector<SCH_PIN*> pins;
691 if( aSeg.Contains( pinRootPos ) )
693 if( aIncludeEnds || ( pinRootPos != aSeg.A && pinRootPos != aSeg.B ) )
695 pins.push_back(
pin );
705 for( std::size_t i = 0; i < aOldEdges.size(); ++i )
707 if( aMoveVecs[i] ==
VECTOR2I( 0, 0 ) || !symbol )
710 const std::vector<SCH_PIN*> pins = getPinsOnSeg( *symbol, aEdgeUnit, aOldEdges[i],
false );
716 pin->Move( aMoveVecs[i] );
731 switch( item->
Type() )
758 case SHAPE_T::CIRCLE:
767 for(
unsigned i = 0; i <
m_editPoints->PointsSize(); ++i )
775 case SHAPE_T::RECTANGLE:
783 gridHelper.
SetSnap( aSnapToGrid );
786 botLeft, botRight, &gridHelper );
789 std::vector<SEG> oldSegs;
790 std::vector<VECTOR2I> moveVecs;
802 shape->
SetEnd( botRight );
807 moveVecs.emplace_back( 0, topLeft.
y - oldBox.
GetTop() );
813 moveVecs.emplace_back( topLeft.
x - oldBox.
GetLeft(), 0 );
819 moveVecs.emplace_back( 0, botRight.
y - oldBox.
GetBottom() );
825 moveVecs.emplace_back( botRight.
x - oldBox.
GetRight(), 0 );
831 for(
unsigned i = 0; i <
m_editPoints->LinesSize(); ++i )
843 case SHAPE_T::BEZIER:
868 gridHelper.
SetSnap( aSnapToGrid );
871 botLeft, botRight, &gridHelper );
879 textbox->
SetEnd( botRight );
898 for(
unsigned i = 0; i <
m_editPoints->LinesSize(); ++i )
922 for(
int ii = 0; ii < cell->
GetColSpan() - 1; ++ii )
934 for(
int ii = 0; ii < cell->
GetRowSpan() - 1; ++ii )
958 const VECTOR2I newOffset = xfrmOrigin - ( topLeft + botRight ) / 2;
973 oldCorner -= oldSize / 2;
977 newCorner = topRight;
978 oldCorner -=
VECTOR2I( -oldSize.
x, oldSize.
y ) / 2;
983 oldCorner -=
VECTOR2I( oldSize.
x, -oldSize.
y ) / 2;
987 newCorner = botRight;
988 oldCorner += oldSize / 2;
994 *newCorner -= xfrmOrigin;
995 oldCorner -= oldOrigin;
998 if(
sign( newCorner->x ) !=
sign( oldCorner.
x )
999 ||
sign( newCorner->y ) !=
sign( oldCorner.
y ) )
1004 const double newLength = newCorner->EuclideanNorm();
1007 double ratio = oldLength > 0 ? ( newLength / oldLength ) : 1.0;
1010 VECTOR2I newSize = oldSize * ratio;
1013 ratio = std::min( newWidth / oldSize.
x, newHeight / oldSize.
y );
1032 gridHelper.
SetSnap( aSnapToGrid );
1041 gridHelper.
SetSnap( aSnapToGrid );
1045 topLeft, topRight, botLeft, botRight, &gridHelper );
1052 sheetNewPos = topLeft;
1053 sheetNewSize =
VECTOR2I( botRight.
x - topLeft.
x, botRight.
y - topLeft.
y );
1074 for(
unsigned i = 0; i <
m_editPoints->LinesSize(); ++i )
1086 if( sheet->
GetSize() != sheetNewSize )
1087 sheet->
Resize( sheetNewSize );
1101 if( connected.first )
1105 else if( connected.second ==
ENDPOINT )
1113 if( connected.first )
1117 else if( connected.second ==
ENDPOINT )
1145 switch( item->
Type() )
1160 case SHAPE_T::CIRCLE:
1185 case SHAPE_T::RECTANGLE:
1204 case SHAPE_T::BEZIER:
1321 bool isRuleArea =
false;
1365 if( shape->
GetShape() != SHAPE_T::POLY )
1371 return shape->
HitTest( cursorPos, (
int) threshold );
1389 int currentMinDistance = INT_MAX;
1390 int closestLineStart = 0;
1396 for(
unsigned i = 0; i < numPoints; ++i )
1401 if(
distance < currentMinDistance )
1404 closestLineStart = i;
1413 commit.
Push(
_(
"Add Corner" ) );
1421 || !
m_editPoints->GetParent()->IsType( { SCH_SHAPE_T, SCH_RULE_AREA_T } ) )
1455 commit.
Push(
_(
"Remove Corner" ) );
constexpr EDA_IU_SCALE schIUScale
static TOOL_ACTION activatePointEditor
static constexpr BOX2< VECTOR2I > ByCorners(const VECTOR2I &aCorner1, const VECTOR2I &aCorner2)
constexpr coord_type GetLeft() const
constexpr coord_type GetRight() const
constexpr coord_type GetTop() const
constexpr coord_type GetBottom() const
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
bool Empty() const
Returns status of an item.
EDIT_CONSTRAINT for a EDIT_LINE, that constrains the line to move perpendicular to the line itself.
bool IsType(FRAME_T aType) const
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
void SetCurrentCursor(KICURSOR aCursor)
Set the current cursor shape for this panel.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
A base class for most all the KiCad significant classes used in schematics and boards.
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.
EDA_ITEM * GetParent() const
const VECTOR2I & GetBezierC2() const
void SetBezierC2(const VECTOR2I &aPt)
int GetRectangleWidth() const
SHAPE_POLY_SET & GetPolyShape()
void RebuildBezierToSegmentsPointsList(int aMaxError)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
int GetPointCount() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetEnd(const VECTOR2I &aEnd)
void SetBezierC1(const VECTOR2I &aPt)
wxString SHAPE_T_asString() const
const VECTOR2I & GetBezierC1() const
int GetRectangleHeight() const
virtual int GetWidth() const
virtual void ClearRenderCache()
static std::shared_ptr< EDIT_POINTS > Make(EDA_ITEM *aItem, SCH_BASE_FRAME *frame)
Represent a single point that can be used for modifying items.
static const int POINT_SIZE
virtual void SetPosition(const VECTOR2I &aPosition)
Set new coordinates for an EDIT_POINT.
virtual VECTOR2I GetPosition() const
Return coordinates of an EDIT_POINT.
static TOOL_ACTION pointEditorRemoveCorner
static TOOL_ACTION pointEditorAddCorner
void updatePoints()
Update which point is being edited.
bool m_inPointEditor
Currently available edit points.
void updateParentItem(bool aSnapToGrid, SCH_COMMIT &aCommit) const
< Update item's points with edit points.
int Main(const TOOL_EVENT &aEvent)
void dragPinsOnEdge(const std::vector< SEG > &aOldEdges, const std::vector< VECTOR2I > &aMoveVecs, int aUnit, SCH_COMMIT &aCommit) const
Update edit points with item's points.
void updateEditedPoint(const TOOL_EVENT &aEvent)
Clear references to the points.
void setEditedPoint(EDIT_POINT *aPoint)
Return true if aPoint is the currently modified point.
int modifiedSelection(const TOOL_EVENT &aEvent)
bool Init() override
Init() is called once upon a registration of the tool.
EDIT_POINT * m_editedPoint
< Currently edited point, NULL if there is none.
bool addCornerCondition(const SELECTION &aSelection)
void setTransitions() override
This method is meant to be overridden in order to specify handlers for events.
void pinEditedCorner(int minWidth, int minHeight, VECTOR2I &topLeft, VECTOR2I &topRight, VECTOR2I &botLeft, VECTOR2I &botRight, EE_GRID_HELPER *aGrid) const
Update the coordinates of 4 corners of a rectangle, according to constraints and the moved corner.
bool isModified(const EDIT_POINT &aPoint) const
int addCorner(const TOOL_EVENT &aEvent)
TOOL_ACTION handlers.
std::shared_ptr< EDIT_POINTS > m_editPoints
bool removeCornerCondition(const SELECTION &aSelection)
int removeCorner(const TOOL_EVENT &aEvent)
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
int getEditedPointIndex() const
int clearEditedPoints(const TOOL_EVENT &aEvent)
Set the current point being edited. NULL means none.
EE_TYPE OfType(KICAD_T aType) const
static const TOOL_EVENT ClearedEvent
static const TOOL_EVENT SelectedEvent
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
static const TOOL_EVENT PointSelectedEvent
virtual VECTOR2I AlignGrid(const VECTOR2I &aPoint, GRID_HELPER_GRIDS aGrid) const
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.
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.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
VECTOR2D ToWorld(const VECTOR2D &aCoord, bool aAbsolute=true) const
Converts a screen space point/vector to a point/vector in world space coordinates.
Define a library symbol object.
std::vector< SCH_PIN * > GetPins(int aUnit=0, int aBodyStyle=0) const
Return a list of pin object pointers from the draw item list.
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
void SetTransformOriginOffset(const VECTOR2I &aCenter)
VECTOR2I GetTransformOriginOffset() const
Get the center of scaling, etc, relative to the image center (GetPosition()).
VECTOR2I GetPosition() const
double GetImageScale() const
void SetImageScale(double aScale)
Set the image "zoom" value.
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
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.
Object to handle a bitmap image that can be inserted in a schematic.
REFERENCE_IMAGE & GetReferenceImage()
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
virtual void Revert() override
Base class for any item which can be embedded within the SCHEMATIC container class,...
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
void SetEndPoint(const VECTOR2I &aPosition)
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
void SetPosition(const VECTOR2I &aPos) override
void SetEditState(int aState)
void AddPoint(const VECTOR2I &aPosition)
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
void CalcEdit(const VECTOR2I &aPosition) override
Calculate the attributes of an item at aPosition when it is being edited.
VECTOR2I GetPosition() const override
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void SetPositionIgnoringPins(const VECTOR2I &aPosition)
int GetMinWidth(bool aFromLeft) const
Return the minimum width of the sheet based on the widths of the sheet pin text.
VECTOR2I GetPosition() const override
int GetMinHeight(bool aFromTop) const
Return the minimum height that the sheet can be resized based on the sheet pin positions.
void Resize(const VECTOR2I &aSize)
Resize this sheet to aSize and adjust all of the labels accordingly.
void SetRowHeight(int aRow, int aHeight)
int GetRowHeight(int aRow) const
void SetColWidth(int aCol, int aWidth)
int GetColWidth(int aCol) const
int Distance(const SEG &aSeg) const
Compute minimum Euclidean distance to segment aSeg.
int Size() const
Returns the number of selected parts.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
virtual const VECTOR2I GetPoint(int aIndex) const override
void SetPoint(int aIndex, const VECTOR2I &aPos)
Move a point to a specific location.
virtual size_t GetPointCount() const override
virtual const SEG GetSegment(int aIndex) const override
void Remove(int aStartIndex, int aEndIndex)
Remove the range of points [start_index, end_index] from the line chain.
void Insert(size_t aVertex, const VECTOR2I &aP)
const std::vector< VECTOR2I > & CPoints() const
void RemoveAllContours()
Remove all outlines & holes (clears) the polygon set.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int NewOutline()
Creates a new empty polygon in the set and returns its index.
The symbol library editor main window.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
#define ENDPOINT
ends. (Used to support dragging.)
#define STARTPOINT
When a line is selected, these flags indicate which.
static const std::vector< KICAD_T > pointEditorTypes
@ FRAME_SCH_SYMBOL_EDITOR
#define UNIMPLEMENTED_FOR(type)
constexpr int Mils2IU(const EDA_IU_SCALE &aIuScale, int mils)
std::vector< SEG > GetSegsInDirection(const BOX2I &aBox, DIRECTION_45::Directions aDir)
Get the segments of a box that are in the given direction.
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
std::optional< VECTOR2I > OPT_VECTOR2I
Utility functions for working with shapes.
std::vector< FAB_LAYER_COLOR > dummy
constexpr int MilsToIU(int mils) const
@ SCH_ITEM_LOCATE_GRAPHIC_LINE_T
constexpr int sign(T val)
VECTOR2< int32_t > VECTOR2I