mirror of https://github.com/KLayout/klayout.git
A new function to separate inside/outside
- This feature is found in Edit/Selection/Separate The first selection is separated into parts inside and outside the secondary selection In addition, shapes are not deleted on the boolean (selection-based) functions if they come from a different layer than the primary selection.
This commit is contained in:
parent
5221027b3a
commit
692b1e6c31
|
|
@ -95,6 +95,8 @@ MainService::menu_activated (const std::string &symbol)
|
||||||
cm_union ();
|
cm_union ();
|
||||||
} else if (symbol == "edt::sel_intersection") {
|
} else if (symbol == "edt::sel_intersection") {
|
||||||
cm_intersection ();
|
cm_intersection ();
|
||||||
|
} else if (symbol == "edt::sel_separate") {
|
||||||
|
cm_separate ();
|
||||||
} else if (symbol == "edt::sel_difference") {
|
} else if (symbol == "edt::sel_difference") {
|
||||||
cm_difference ();
|
cm_difference ();
|
||||||
} else if (symbol == "edt::sel_change_layer") {
|
} else if (symbol == "edt::sel_change_layer") {
|
||||||
|
|
@ -1554,15 +1556,24 @@ MainService::boolean_op (int mode)
|
||||||
|
|
||||||
std::vector <db::Polygon> out;
|
std::vector <db::Polygon> out;
|
||||||
db::EdgeProcessor ep;
|
db::EdgeProcessor ep;
|
||||||
ep.boolean (primary, secondary, out, mode);
|
|
||||||
|
if (mode == -1 /*== separate*/) {
|
||||||
|
ep.boolean (primary, secondary, out, db::BooleanOp::And);
|
||||||
|
ep.boolean (primary, secondary, out, db::BooleanOp::ANotB);
|
||||||
|
} else {
|
||||||
|
ep.boolean (primary, secondary, out, mode);
|
||||||
|
}
|
||||||
|
|
||||||
view ()->cancel_edits ();
|
view ()->cancel_edits ();
|
||||||
manager ()->transaction (tl::to_string (QObject::tr ("Boolean operation on selection")));
|
manager ()->transaction (tl::to_string (QObject::tr ("Boolean operation on selection")));
|
||||||
|
|
||||||
// Delete the current selection
|
// Delete the current selection
|
||||||
|
// NOTE: we delete only those shapes from the primary layer and keep shapes from other layers.
|
||||||
|
// Let's see whether this heuristics is more accepted.
|
||||||
|
|
||||||
for (std::vector<edt::Service *>::const_iterator es = edt_services.begin (); es != edt_services.end (); ++es) {
|
for (std::vector<edt::Service *>::const_iterator es = edt_services.begin (); es != edt_services.end (); ++es) {
|
||||||
for (edt::Service::obj_iterator s = (*es)->selection ().begin (); s != (*es)->selection ().end (); ++s) {
|
for (edt::Service::obj_iterator s = (*es)->selection ().begin (); s != (*es)->selection ().end (); ++s) {
|
||||||
if (! s->is_cell_inst () && (s->shape ().is_polygon () || s->shape ().is_path () || s->shape ().is_box ())) {
|
if (int (s->layer ()) == layer_index && ! s->is_cell_inst () && (s->shape ().is_polygon () || s->shape ().is_path () || s->shape ().is_box ())) {
|
||||||
db::Cell &cell = view ()->cellview (s->cv_index ())->layout ().cell (s->cell_index ());
|
db::Cell &cell = view ()->cellview (s->cv_index ())->layout ().cell (s->cell_index ());
|
||||||
if (cell.shapes (s->layer ()).is_valid (s->shape ())) {
|
if (cell.shapes (s->layer ()).is_valid (s->shape ())) {
|
||||||
cell.shapes (s->layer ()).erase_shape (s->shape ());
|
cell.shapes (s->layer ()).erase_shape (s->shape ());
|
||||||
|
|
@ -1612,13 +1623,19 @@ MainService::cm_intersection ()
|
||||||
boolean_op (db::BooleanOp::And);
|
boolean_op (db::BooleanOp::And);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MainService::cm_difference ()
|
MainService::cm_difference ()
|
||||||
{
|
{
|
||||||
boolean_op (db::BooleanOp::ANotB);
|
boolean_op (db::BooleanOp::ANotB);
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
void
|
||||||
|
MainService::cm_separate ()
|
||||||
|
{
|
||||||
|
boolean_op (-1); // == separate (And + ANotB)
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
db::DVector compute_alignment_vector (const db::DBox &prim_box, const db::DBox &box, int hmode, int vmode)
|
db::DVector compute_alignment_vector (const db::DBox &prim_box, const db::DBox &box, int hmode, int vmode)
|
||||||
{
|
{
|
||||||
double dx = 0.0;
|
double dx = 0.0;
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,11 @@ public:
|
||||||
*/
|
*/
|
||||||
void cm_intersection ();
|
void cm_intersection ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Separation of shapes
|
||||||
|
*/
|
||||||
|
void cm_separate ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Difference of shapes
|
* @brief Difference of shapes
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -230,6 +230,7 @@ public:
|
||||||
menu_entries.push_back (lay::MenuEntry ("edt::sel_union", "union:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Merge Shapes"))));
|
menu_entries.push_back (lay::MenuEntry ("edt::sel_union", "union:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Merge Shapes"))));
|
||||||
menu_entries.push_back (lay::MenuEntry ("edt::sel_intersection", "intersection:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Intersection - Others With First"))));
|
menu_entries.push_back (lay::MenuEntry ("edt::sel_intersection", "intersection:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Intersection - Others With First"))));
|
||||||
menu_entries.push_back (lay::MenuEntry ("edt::sel_difference", "difference:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Subtraction - Others From First"))));
|
menu_entries.push_back (lay::MenuEntry ("edt::sel_difference", "difference:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Subtraction - Others From First"))));
|
||||||
|
menu_entries.push_back (lay::MenuEntry ("edt::sel_separate", "separate:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Separate - First into Inside/Outside Others"))));
|
||||||
menu_entries.push_back (lay::MenuEntry ("hier_group:edit_mode", "edit_menu.selection_menu.end"));
|
menu_entries.push_back (lay::MenuEntry ("hier_group:edit_mode", "edit_menu.selection_menu.end"));
|
||||||
menu_entries.push_back (lay::MenuEntry ("edt::sel_flatten_insts", "flatten_insts:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Flatten Instances"))));
|
menu_entries.push_back (lay::MenuEntry ("edt::sel_flatten_insts", "flatten_insts:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Flatten Instances"))));
|
||||||
menu_entries.push_back (lay::MenuEntry ("edt::sel_resolve_arefs", "resolve_arefs:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Resolve Arrays"))));
|
menu_entries.push_back (lay::MenuEntry ("edt::sel_resolve_arefs", "resolve_arefs:edit_mode", "edit_menu.selection_menu.end", tl::to_string (QObject::tr ("Resolve Arrays"))));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue