Skip to content
Merged

Devel #2146

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
ac9a589
WIP: two convenience methods for plugin API
Aug 24, 2025
acfc2aa
WIP: preparing integration of editor options pages and config pages i…
Aug 24, 2025
9e0d1d7
WIP: new GSI declarations
Aug 25, 2025
88178fa
[consider merging] Bugfix on Plugin registration
Aug 23, 2025
c5d5557
WIP: debugging config page setup in plugins
Aug 26, 2025
90e25a7
WIP: debugging and polishing editor options pages interface for plugins
Aug 26, 2025
c77a732
WIP: more features exposed for plugins (snapping)
Aug 28, 2025
3eff754
WIP
Aug 29, 2025
7d2113f
Some debugging, tests added
Aug 29, 2025
b133bde
WIP: doc updates
Aug 30, 2025
e396b6e
WIP: bug fixes and more tests
Aug 30, 2025
f1c16a0
Adding samples for new plugin features, doc update.
Aug 30, 2025
340c1ef
Some refactoring, editor options are shown more consistently now
Aug 30, 2025
7f7a5bd
Bugfix: properly integrating newborn plugins
Aug 30, 2025
0187abf
[consider merging] Bugfix: internal error when trying to replace a sh…
Aug 30, 2025
6a9269a
[consider merging] Bugfix: internal error when copying while move/cop…
Aug 30, 2025
53c173d
[consider merging] avoid a warning on writing cells/files in 'under_c…
Aug 30, 2025
4345496
Improving ruler snapping (after move_transform, snap to objects, visu…
Aug 30, 2025
57a4984
WIP: refactoring of heavy Plugin GSI binding functions
Aug 31, 2025
4d9f924
Refactoring: providing GSI binding to plugin base class, so the super…
Aug 31, 2025
e21eb6a
Typo fixed
Aug 31, 2025
1e57035
Refactoring (GSI base class for EditorOptionsPage), preparations for …
Aug 31, 2025
53a7414
Merge branch 'master' into devel
Aug 31, 2025
2b04ecb
WIP: experimental - modal editor options pages
Sep 1, 2025
a24e243
WIP: automatically calling ungrab_mouse on deactivation of plugin
Sep 2, 2025
0447080
WIP: polishing geometry of modal editor options widget
Sep 2, 2025
b9115fc
WIP: Enhancements to EditorOptionsPages API
Sep 2, 2025
b3123d3
Updating samples to include focus pages
Sep 4, 2025
7f29cf9
Removing GSI methods which are no longer required as they are include…
Sep 4, 2025
128f92c
Doc update
Sep 4, 2025
e6692a2
Added LayoutView#layer_list_name as read access for LayoutView#rename…
Sep 4, 2025
3d8eaf8
Changed via key binding to 'O'
Sep 4, 2025
50cad40
Doc updates (vias, paths)
Sep 4, 2025
8901359
Merge branch 'master' into devel
Sep 6, 2025
6ada4cb
[consider merging] fixed build without Qt bindings
Sep 6, 2025
ff6ab42
WIP: exclude area for fill functions
Sep 6, 2025
feda868
WIP: exclude area implemented. Needs optimization.
Sep 6, 2025
810f5fb
Added basic fill tool tests for exclude_area
Sep 6, 2025
cd34125
Bugfixing new implementation of fill tool, added tests for DRC implem…
Sep 6, 2025
7997d13
Fixing tests for non-Qt builds
Sep 6, 2025
eb6369f
Updated doc
Sep 6, 2025
3d5833d
Updated doc
Sep 7, 2025
128b1e5
[consider merging] MainWindow should be managed (derived from gsi::Ob…
Sep 7, 2025
aa9d951
Fixing build for old Qt versions
Sep 7, 2025
aba1f87
Enhancement to layer binding for images: now saving as img::ObjectV2 …
Sep 7, 2025
7fd01a6
WIP: adding tab key to move tool (calls 'move by' menu), enhancing 'm…
Sep 7, 2025
e9584c2
Tab order of some dialogs
Sep 7, 2025
20a3dbe
Some refactoring (generalizing edt:: functions, basing move tool on l…
Sep 8, 2025
e2b5c29
Some refactoring, bug fix
Sep 8, 2025
0ddc073
[consider merging] suppress normalization of orientation on GSI DPoly…
Sep 8, 2025
820ab77
Fixed sizing test
Sep 8, 2025
879df5a
[consider merging] LayoutView#clear_layer_list preserves layer list n…
Sep 9, 2025
e4789f7
Enhanced object snapping for box edit mode - other corners snap too s…
Sep 9, 2025
788dd2b
Fixing non-Qt builds
Sep 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 78 additions & 54 deletions src/ant/ant/antService.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1431,7 +1431,7 @@ Service::begin_move (lay::Editable::MoveMode mode, const db::DPoint &p, lay::ang
const ant::Object *robj = dynamic_cast <const ant::Object *> ((*ri).ptr ());
if (robj && (! robj_min || robj == robj_min)) {

if (dragging_what (robj, search_dbox, m_move_mode, m_p1, m_seg_index) && m_move_mode != MoveRuler) {
if (dragging_what (robj, search_dbox, m_move_mode, m_p1, m_seg_index)) {

// found anything: make the moved ruler the selection
clear_selection ();
Expand Down Expand Up @@ -1516,28 +1516,70 @@ Service::begin_move (lay::Editable::MoveMode mode, const db::DPoint &p, lay::ang
}

void
Service::move_transform (const db::DPoint &p, db::DFTrans tr, lay::angle_constraint_type /*ac*/)
Service::snap_rulers (lay::angle_constraint_type ac)
{
if (m_rulers.empty () || m_selected.empty ()) {
if (m_rulers.empty ()) {
return;
}

if (m_move_mode == MoveRuler) {
lay::PointSnapToObjectResult min_snp;
double min_dist = -1.0;
db::DVector min_delta;

db::DVector dp = p - db::DPoint ();
for (auto r = m_rulers.begin (); r != m_rulers.end (); ++r) {

m_original.transform (db::DTrans (m_p1 - db::DPoint ()) * db::DTrans (tr) * db::DTrans (db::DPoint () - m_p1));
m_current.transform (db::DTrans (dp) * db::DTrans (tr) * db::DTrans (-dp));
const ant::Object *ruler = (*r)->ruler ();

// display current rulers' parameters
show_message ();
db::DPoint p1 = m_trans * ruler->p1 ();
db::DPoint p2 = m_trans * ruler->p2 ();

m_rulers [0]->redraw ();
auto tr = db::DTrans ((m_p1 - db::DPoint ()) - m_trans.disp ()) * m_trans * db::DTrans (db::DPoint () - m_p1);
db::DPoint org1 = tr * ruler->p1 ();
db::DPoint org2 = tr * ruler->p2 ();

} else if (m_move_mode == MoveSelected) {
auto snp = snap2_details (org1, p1, ruler, ac);
double dist = p1.distance (snp.snapped_point);

if (min_dist < 0 || dist < min_dist) {
min_snp = snp;
min_dist = dist;
min_delta = snp.snapped_point - p1;
}

snp = snap2_details (org2, p2, ruler, ac);
dist = p2.distance (snp.snapped_point);

if (min_dist < 0 || dist < min_dist) {
min_snp = snp;
min_dist = dist;
min_delta = snp.snapped_point - p2;
}

}

if (min_snp.object_snap != lay::PointSnapToObjectResult::NoObject) {
mouse_cursor_from_snap_details (min_snp);
}

m_trans = db::DTrans (min_delta) * m_trans;
}

void
Service::move_transform (const db::DPoint & /*p*/, db::DFTrans tr, lay::angle_constraint_type ac)
{
if (m_rulers.empty () || m_selected.empty ()) {
return;
}

auto ac_eff = ac == lay::AC_Global ? m_snap_mode : ac;
clear_mouse_cursors ();

if (m_move_mode == MoveSelected) {

m_trans *= db::DTrans (m_p1 - db::DPoint ()) * db::DTrans (tr) * db::DTrans (db::DPoint () - m_p1);

snap_rulers (ac_eff);

for (std::vector<ant::View *>::iterator r = m_rulers.begin (); r != m_rulers.end (); ++r) {
(*r)->transform_by (db::DCplxTrans (m_trans));
}
Expand All @@ -1553,90 +1595,66 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac)
return;
}

auto ac_eff = ac == lay::AC_Global ? m_snap_mode : ac;
clear_mouse_cursors ();

if (m_move_mode == MoveP1) {

m_current.seg_p1 (m_seg_index, snap2 (m_p1, p, &m_current, ac).second);
m_current.seg_p1 (m_seg_index, snap2_visual (m_p1, p, &m_current, ac));
m_rulers [0]->redraw ();

} else if (m_move_mode == MoveP2) {

m_current.seg_p2 (m_seg_index, snap2 (m_p1, p, &m_current, ac).second);
m_current.seg_p2 (m_seg_index, snap2_visual (m_p1, p, &m_current, ac));
m_rulers [0]->redraw ();

} else if (m_move_mode == MoveP12) {

db::DPoint p12 = snap2 (m_p1, p, &m_current, ac).second;
db::DPoint p12 = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p1 (m_seg_index, db::DPoint (m_current.seg_p1 (m_seg_index).x(), p12.y ()));
m_current.seg_p2 (m_seg_index, db::DPoint (p12.x (), m_current.seg_p2 (m_seg_index).y ()));
m_rulers [0]->redraw ();

} else if (m_move_mode == MoveP21) {

db::DPoint p21 = snap2 (m_p1, p, &m_current, ac).second;
db::DPoint p21 = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p1 (m_seg_index, db::DPoint (p21.x (), m_current.seg_p1 (m_seg_index).y ()));
m_current.seg_p2 (m_seg_index, db::DPoint (m_current.seg_p2 (m_seg_index).x(), p21.y ()));
m_rulers [0]->redraw ();

} else if (m_move_mode == MoveP1X) {

db::DPoint pc = snap2 (m_p1, p, &m_current, ac).second;
db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p1 (m_seg_index, db::DPoint (pc.x (), m_current.seg_p1 (m_seg_index).y ()));
m_rulers [0]->redraw ();

} else if (m_move_mode == MoveP2X) {

db::DPoint pc = snap2 (m_p1, p, &m_current, ac).second;
db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p2 (m_seg_index, db::DPoint (pc.x (), m_current.seg_p2 (m_seg_index).y ()));
m_rulers [0]->redraw ();

} else if (m_move_mode == MoveP1Y) {

db::DPoint pc = snap2 (m_p1, p, &m_current, ac).second;
db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p1 (m_seg_index, db::DPoint (m_current.seg_p1 (m_seg_index).x (), pc.y ()));
m_rulers [0]->redraw ();

} else if (m_move_mode == MoveP2Y) {

db::DPoint pc = snap2 (m_p1, p, &m_current, ac).second;
db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p2 (m_seg_index, db::DPoint (m_current.seg_p2 (m_seg_index).x (), pc.y ()));
m_rulers [0]->redraw ();

} else if (m_move_mode == MoveRuler) {

// try two ways of snapping
db::DVector dp = lay::snap_angle (p - m_p1, ac == lay::AC_Global ? m_snap_mode : ac);

db::DPoint p1 = m_original.p1 () + dp;
db::DPoint p2 = m_original.p2 () + dp;

std::pair<bool, db::DPoint> r1 = snap1 (p1, m_obj_snap && m_original.snap ());
db::DPoint q1 = r1.second;
std::pair<bool, db::DPoint> r2 = snap1 (p2, m_obj_snap && m_original.snap ());
db::DPoint q2 = r2.second;

if ((!r2.first && r1.first) || ((r1.first || (!r1.first && !r2.first)) && q1.distance (p1) < q2.distance (p2))) {
q2 = q1 + (m_original.p2 () - m_original.p1 ());
} else {
q1 = q2 + (m_original.p1 () - m_original.p2 ());
}

m_current.p1 (q1);
m_current.p2 (q2);

m_rulers [0]->redraw ();

} else if (m_move_mode == MoveSelected) {

db::DVector dp = p - m_p1;
// round the drag distance to grid if required: this is the least we can do in this case
if (m_grid_snap) {
dp = db::DVector (lay::snap (dp.x (), m_grid), lay::snap (dp.y (), m_grid));
}

dp = lay::snap_angle (dp, ac == lay::AC_Global ? m_snap_mode : ac);
dp = lay::snap_angle (dp, ac_eff);

m_trans = db::DTrans (dp + (m_p1 - db::DPoint ()) - m_trans.disp ()) * m_trans * db::DTrans (db::DPoint () - m_p1);

snap_rulers (ac_eff);

for (std::vector<ant::View *>::iterator r = m_rulers.begin (); r != m_rulers.end (); ++r) {
(*r)->transform_by (db::DCplxTrans (m_trans));
}
Expand All @@ -1646,7 +1664,6 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac)
if (m_move_mode != MoveSelected) {
show_message ();
}

}

void
Expand Down Expand Up @@ -1703,6 +1720,7 @@ Service::end_move (const db::DPoint &, lay::angle_constraint_type)
// termine the operation
m_move_mode = MoveNone;

clear_mouse_cursors ();
}

void
Expand Down Expand Up @@ -1766,6 +1784,7 @@ Service::edit_cancel ()
if (m_move_mode != MoveNone) {

m_move_mode = MoveNone;
m_selected.clear ();
selection_to_view ();

}
Expand Down Expand Up @@ -2039,7 +2058,7 @@ Service::mouse_move_event (const db::DPoint &p, unsigned int buttons, bool prio)
// otherwise we risk manipulating p1 too.
ant::Object::point_list pts = m_current.points ();
if (! pts.empty ()) {
pts.back () = snap2 (m_p1, p, mp_active_ruler->ruler (), ac_from_buttons (buttons)).second;
pts.back () = snap_details.snapped_point;
}
m_current.set_points_exact (pts);

Expand Down Expand Up @@ -2094,11 +2113,16 @@ Service::snap2_details (const db::DPoint &p1, const db::DPoint &p2, const ant::O
return lay::obj_snap (m_obj_snap && obj->snap () ? mp_view : 0, p1, p2, g, snap_mode, snap_range);
}

std::pair <bool, db::DPoint>
Service::snap2 (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac)
db::DPoint
Service::snap2_visual (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac)
{
lay::PointSnapToObjectResult res = snap2_details (p1, p2, obj, ac);
return std::make_pair (res.object_snap != lay::PointSnapToObjectResult::NoObject, res.snapped_point);

if (res.object_snap != lay::PointSnapToObjectResult::NoObject) {
mouse_cursor_from_snap_details (res);
}

return res.snapped_point;
}


Expand Down
7 changes: 4 additions & 3 deletions src/ant/ant/antService.h
Original file line number Diff line number Diff line change
Expand Up @@ -208,10 +208,9 @@ Q_OBJECT
* MoveP2X - dragging P2.x (if box-like)
* MoveP1Y - dragging P1.y (if box-like)
* MoveP2Y - dragging P2.y (if box-like)
* MoveRuler - dragging a whole ruler (one)
* MoveSelection - dragging a whole ruler (many)
*/
enum MoveMode { MoveNone, MoveP1, MoveP2, MoveP12, MoveP21, MoveP1X, MoveP2X, MoveP1Y, MoveP2Y, MoveRuler, MoveSelected };
enum MoveMode { MoveNone, MoveP1, MoveP2, MoveP12, MoveP21, MoveP1X, MoveP2X, MoveP1Y, MoveP2Y, MoveSelected };

Service (db::Manager *manager, lay::LayoutViewBase *view);

Expand Down Expand Up @@ -601,7 +600,7 @@ public slots:

std::pair<bool, db::DPoint> snap1 (const db::DPoint &p, bool obj_snap);
lay::PointSnapToObjectResult snap1_details (const db::DPoint &p, bool obj_snap);
std::pair<bool, db::DPoint> snap2 (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac);
db::DPoint snap2_visual (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac);
lay::PointSnapToObjectResult snap2_details (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac);
lay::TwoPointSnapToObjectResult auto_measure (const db::DPoint &p, lay::angle_constraint_type ac, const ant::Template &tpl);

Expand All @@ -620,6 +619,8 @@ public slots:
virtual bool mouse_double_click_event (const db::DPoint &p, unsigned int buttons, bool prio);
virtual void deactivated ();

void snap_rulers (lay::angle_constraint_type ac);

/**
* @brief Select a certain ruler
*
Expand Down
Loading
Loading