mirror of
https://github.com/KLayout/klayout.git
synced 2026-09-03 07:24:02 +02:00
@@ -415,11 +415,15 @@ private:
|
||||
} while (f != future && bc (*f->first).left () == xx);
|
||||
} while (f != future && f - c < min_box_size);
|
||||
|
||||
if (m_report_progress) {
|
||||
// Note: there is no better estimation of the progress than "current" ...
|
||||
progress->set (current - m_pp.begin ());
|
||||
}
|
||||
|
||||
for (iterator_type i = f0; i != f; ++i) {
|
||||
for (iterator_type j = c; j < i; ++j) {
|
||||
if (bs_boxes_overlap (bc (*i->first), bc (*j->first), enl)) {
|
||||
if (seen.insert (std::make_pair (i->first, j->first)).second) {
|
||||
seen.insert (std::make_pair (j->first, i->first));
|
||||
rec.add (i->first, i->second, j->first, j->second);
|
||||
if (rec.stop ()) {
|
||||
return false;
|
||||
@@ -431,10 +435,6 @@ private:
|
||||
|
||||
x = xx;
|
||||
|
||||
if (m_report_progress) {
|
||||
progress->set (f - m_pp.begin ());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
y = yy;
|
||||
|
||||
@@ -1023,15 +1023,21 @@ connected_clusters<T>::join_cluster_with (typename local_cluster<T>::id_type id,
|
||||
|
||||
// handle the connections by translating
|
||||
|
||||
const connections_type &to_join = connections_for_cluster (with_id);
|
||||
connections_type &target = m_connections [id];
|
||||
target.insert (target.end (), to_join.begin (), to_join.end ());
|
||||
typename std::map<typename local_cluster<T>::id_type, connections_type>::iterator tc = m_connections.find (with_id);
|
||||
if (tc != m_connections.end ()) {
|
||||
|
||||
connections_type &to_join = tc->second;
|
||||
|
||||
for (connections_type::const_iterator c = to_join.begin (); c != to_join.end (); ++c) {
|
||||
m_rev_connections [*c] = id;
|
||||
}
|
||||
|
||||
connections_type &target = m_connections [id];
|
||||
target.splice (target.end (), to_join, to_join.begin (), to_join.end ());
|
||||
|
||||
m_connections.erase (tc);
|
||||
|
||||
for (connections_type::const_iterator c = to_join.begin (); c != to_join.end (); ++c) {
|
||||
m_rev_connections [*c] = id;
|
||||
}
|
||||
|
||||
m_connections.erase (with_id);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
@@ -1161,6 +1167,11 @@ public:
|
||||
: cluster_id (_cluster_id), other_ci (_other_ci)
|
||||
{ }
|
||||
|
||||
bool operator== (const ClusterInstanceInteraction &other) const
|
||||
{
|
||||
return cluster_id == other.cluster_id && other_ci == other.other_ci;
|
||||
}
|
||||
|
||||
size_t cluster_id;
|
||||
ClusterInstance other_ci;
|
||||
};
|
||||
@@ -1205,6 +1216,7 @@ public:
|
||||
db::ICplxTrans t;
|
||||
consider_cluster_instance_pair (*c1, *i2, t, ic);
|
||||
|
||||
ic.unique ();
|
||||
m_ci_interactions.splice (m_ci_interactions.end (), ic, ic.begin (), ic.end ());
|
||||
}
|
||||
|
||||
@@ -1405,6 +1417,8 @@ private:
|
||||
for (std::list<std::pair<ClusterInstance, ClusterInstance> >::iterator i = ii_interactions.begin (); i != ii_interactions.end (); ++i) {
|
||||
propagate_cluster_inst (i->second, i2.cell_index (), i2t, i2.prop_id ());
|
||||
}
|
||||
|
||||
ii_interactions.unique ();
|
||||
interacting_clusters.splice (interacting_clusters.end (), ii_interactions, ii_interactions.begin (), ii_interactions.end ());
|
||||
|
||||
}
|
||||
@@ -1430,6 +1444,8 @@ private:
|
||||
for (std::list<std::pair<ClusterInstance, ClusterInstance> >::iterator i = ii_interactions.begin (); i != ii_interactions.end (); ++i) {
|
||||
propagate_cluster_inst (i->first, i1.cell_index (), i1t, i1.prop_id ());
|
||||
}
|
||||
|
||||
ii_interactions.unique ();
|
||||
interacting_clusters.splice (interacting_clusters.end (), ii_interactions, ii_interactions.begin (), ii_interactions.end ());
|
||||
|
||||
}
|
||||
@@ -1442,15 +1458,28 @@ private:
|
||||
|
||||
}
|
||||
|
||||
cluster_instance_pair_list_type &cached = (*mp_instance_interaction_cache) [ii_key];
|
||||
cached = interacting_clusters;
|
||||
// remove duplicates (after doing a quick unique before)
|
||||
// NOTE: duplicates may happen due to manifold child/child interactions which boil down to
|
||||
// identical parent cluster interactions.
|
||||
std::vector<std::pair<ClusterInstance, ClusterInstance> > sorted_interactions;
|
||||
sorted_interactions.reserve (interacting_clusters.size ());
|
||||
sorted_interactions.insert (sorted_interactions.end (), interacting_clusters.begin (), interacting_clusters.end ());
|
||||
interacting_clusters.clear ();
|
||||
std::sort (sorted_interactions.begin (), sorted_interactions.end ());
|
||||
sorted_interactions.erase (std::unique (sorted_interactions.begin (), sorted_interactions.end ()), sorted_interactions.end ());
|
||||
|
||||
// return the list of unique interactions
|
||||
interacting_clusters.insert (interacting_clusters.end (), sorted_interactions.begin (), sorted_interactions.end ());
|
||||
|
||||
// normalize transformations in cache
|
||||
db::ICplxTrans i1ti = i1t.inverted (), i2ti = i2t.inverted ();
|
||||
for (std::list<std::pair<ClusterInstance, ClusterInstance> >::iterator i = cached.begin (); i != cached.end (); ++i) {
|
||||
for (std::vector<std::pair<ClusterInstance, ClusterInstance> >::iterator i = sorted_interactions.begin (); i != sorted_interactions.end (); ++i) {
|
||||
i->first.transform (i1ti);
|
||||
i->second.transform (i2ti);
|
||||
}
|
||||
|
||||
cluster_instance_pair_list_type &cached = (*mp_instance_interaction_cache) [ii_key];
|
||||
cached.insert (cached.end (), sorted_interactions.begin (), sorted_interactions.end ());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1773,11 +1802,8 @@ private:
|
||||
const ClusterInstance &k2 = ic->second;
|
||||
|
||||
// Note: "with_self" is false as we're going to create a connected cluster anyway
|
||||
mp_tree->propagate_cluster_inst (*mp_layout, *mp_cell, k1, mp_cell->cell_index (), false);
|
||||
mp_tree->propagate_cluster_inst (*mp_layout, *mp_cell, k2, mp_cell->cell_index (), false);
|
||||
|
||||
id_type x1 = mp_cell_clusters->find_cluster_with_connection (k1);
|
||||
id_type x2 = mp_cell_clusters->find_cluster_with_connection (k2);
|
||||
id_type x1 = mp_tree->propagate_cluster_inst (*mp_layout, *mp_cell, k1, mp_cell->cell_index (), false);
|
||||
id_type x2 = mp_tree->propagate_cluster_inst (*mp_layout, *mp_cell, k2, mp_cell->cell_index (), false);
|
||||
|
||||
if (x1 == 0) {
|
||||
|
||||
@@ -2228,9 +2254,8 @@ hier_clusters<T>::build_hier_connections (cell_clusters_box_converter<T> &cbc, c
|
||||
} else {
|
||||
|
||||
// ensures the cluster is propagated so we can connect it with another
|
||||
propagate_cluster_inst (layout, cell, *i, cell.cell_index (), false);
|
||||
size_t other_id = propagate_cluster_inst (layout, cell, *i, cell.cell_index (), false);
|
||||
|
||||
size_t other_id = local.find_cluster_with_connection (*i);
|
||||
if (other_id == gcid) {
|
||||
// shouldn't happen, but duplicate instances may trigger this
|
||||
} else if (other_id) {
|
||||
|
||||
@@ -136,19 +136,9 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void set_can_cancel (bool f)
|
||||
void set_progress (tl::Progress *progress)
|
||||
{
|
||||
mp_progress_widget->set_can_cancel (f);
|
||||
}
|
||||
|
||||
void set_text (const std::string &text)
|
||||
{
|
||||
mp_progress_widget->set_text (text);
|
||||
}
|
||||
|
||||
void set_value (double v, const std::string &value)
|
||||
{
|
||||
mp_progress_widget->set_value (v, value);
|
||||
mp_progress_widget->set_progress (progress);
|
||||
}
|
||||
|
||||
void add_widget (QWidget *widget)
|
||||
@@ -4732,23 +4722,14 @@ MainWindow::progress_get_widget () const
|
||||
bool
|
||||
MainWindow::update_progress (tl::Progress *progress)
|
||||
{
|
||||
bool can_cancel = progress->can_cancel ();
|
||||
std::string text = progress->desc ();
|
||||
std::string value = progress->formatted_value ();
|
||||
double v = progress->value ();
|
||||
|
||||
if (mp_progress_dialog) {
|
||||
|
||||
mp_progress_dialog->set_can_cancel (can_cancel);
|
||||
mp_progress_dialog->set_text (text);
|
||||
mp_progress_dialog->set_value (v, value);
|
||||
mp_progress_dialog->set_progress (progress);
|
||||
return true;
|
||||
|
||||
} else if (isVisible () && mp_progress_widget) {
|
||||
|
||||
mp_progress_widget->set_can_cancel (can_cancel);
|
||||
mp_progress_widget->set_text (text);
|
||||
mp_progress_widget->set_value (v, value);
|
||||
mp_progress_widget->set_progress (progress);
|
||||
return true;
|
||||
|
||||
} else {
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <QFrame>
|
||||
#include <QGridLayout>
|
||||
#include <QLabel>
|
||||
|
||||
#include <math.h>
|
||||
|
||||
@@ -34,22 +35,15 @@ namespace lay
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
class ProgressBarWidget
|
||||
: public QWidget
|
||||
: public QWidget
|
||||
{
|
||||
public:
|
||||
ProgressBarWidget (QWidget *parent, const char *name = "");
|
||||
|
||||
void set_value (double v, const std::string &value);
|
||||
|
||||
QSize sizeHint () const
|
||||
{
|
||||
return QSize (m_width, 1);
|
||||
}
|
||||
|
||||
QSize minimumSizeHint () const
|
||||
{
|
||||
return QSize (m_width, 1);
|
||||
}
|
||||
QSize sizeHint () const;
|
||||
QSize minimumSizeHint () const;
|
||||
|
||||
private:
|
||||
double m_value;
|
||||
@@ -69,6 +63,7 @@ ProgressBarWidget::ProgressBarWidget (QWidget *parent, const char *name)
|
||||
{
|
||||
setObjectName (QString::fromUtf8 (name));
|
||||
setMinimumSize (64, 10);
|
||||
setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -90,6 +85,19 @@ ProgressBarWidget::set_value (double v, const std::string &value)
|
||||
}
|
||||
}
|
||||
|
||||
QSize
|
||||
ProgressBarWidget::sizeHint () const
|
||||
{
|
||||
QFontMetrics fm (font ());
|
||||
return QSize (m_width, fm.height () + 2);
|
||||
}
|
||||
|
||||
QSize
|
||||
ProgressBarWidget::minimumSizeHint () const
|
||||
{
|
||||
return QSize (m_width, 1);
|
||||
}
|
||||
|
||||
void
|
||||
ProgressBarWidget::paintEvent (QPaintEvent *)
|
||||
{
|
||||
@@ -161,16 +169,21 @@ ProgressWidget::ProgressWidget (ProgressReporter *pr, QWidget *parent, bool full
|
||||
|
||||
QFrame *progress_bar_frame = new QFrame (bar_frame);
|
||||
progress_bar_frame->setFrameStyle (QFrame::Box | QFrame::Plain);
|
||||
progress_bar_frame->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Preferred);
|
||||
progress_bar_frame->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
layout->addWidget (progress_bar_frame, 0, col, 1, 1);
|
||||
layout->setColumnStretch(col++, 2);
|
||||
|
||||
QHBoxLayout *pbf_layout = new QHBoxLayout (progress_bar_frame);
|
||||
QGridLayout *pbf_layout = new QGridLayout (progress_bar_frame);
|
||||
progress_bar_frame->setLayout (pbf_layout);
|
||||
pbf_layout->setMargin (0);
|
||||
pbf_layout->setSpacing (0);
|
||||
|
||||
mp_progress_bar = new ProgressBarWidget (progress_bar_frame);
|
||||
pbf_layout->addWidget (mp_progress_bar);
|
||||
mp_progress_bar1 = new ProgressBarWidget (progress_bar_frame);
|
||||
pbf_layout->addWidget (mp_progress_bar1, 0, 0, 1, 1);
|
||||
mp_progress_bar2 = new ProgressBarWidget (progress_bar_frame);
|
||||
pbf_layout->addWidget (mp_progress_bar2, 1, 0, 1, 1);
|
||||
mp_progress_bar3 = new ProgressBarWidget (progress_bar_frame);
|
||||
pbf_layout->addWidget (mp_progress_bar3, 2, 0, 1, 1);
|
||||
|
||||
layout->addItem (new QSpacerItem (8, 8, QSizePolicy::Fixed, QSizePolicy::Fixed), 0, col++, 1, 1);
|
||||
|
||||
@@ -218,21 +231,43 @@ ProgressWidget::remove_widget ()
|
||||
}
|
||||
|
||||
void
|
||||
ProgressWidget::set_can_cancel (bool f)
|
||||
ProgressWidget::set_progress (tl::Progress *progress)
|
||||
{
|
||||
mp_cancel_button->setEnabled (f);
|
||||
}
|
||||
bool can_cancel = false;
|
||||
std::string text;
|
||||
|
||||
void
|
||||
ProgressWidget::set_text (const std::string &text)
|
||||
{
|
||||
if (progress) {
|
||||
can_cancel = progress->can_cancel ();
|
||||
text = progress->desc ();
|
||||
}
|
||||
|
||||
mp_cancel_button->setEnabled (can_cancel);
|
||||
mp_label->setText (tl::to_qstring (text));
|
||||
}
|
||||
|
||||
void
|
||||
ProgressWidget::set_value (double v, const std::string &value)
|
||||
{
|
||||
mp_progress_bar->set_value (v, value);
|
||||
lay::ProgressBarWidget *progress_bars[] = { mp_progress_bar1, mp_progress_bar2, mp_progress_bar3 };
|
||||
|
||||
for (size_t i = 0; i < sizeof (progress_bars) / sizeof (progress_bars[0]); ++i) {
|
||||
|
||||
lay::ProgressBarWidget *pb = progress_bars[i];
|
||||
|
||||
if (progress) {
|
||||
|
||||
pb->show ();
|
||||
|
||||
std::string value = progress->formatted_value ();
|
||||
double v = progress->value ();
|
||||
pb->set_value (v, value);
|
||||
|
||||
progress = progress->next ();
|
||||
|
||||
} else {
|
||||
pb->hide ();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// according to the doc this should not be required, but without, the progress bar does not resize
|
||||
mp_progress_bar1->parentWidget ()->updateGeometry ();
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -37,6 +37,11 @@ class QLabel;
|
||||
class QToolButton;
|
||||
class QGridLayout;
|
||||
|
||||
namespace tl
|
||||
{
|
||||
class Progress;
|
||||
}
|
||||
|
||||
namespace lay
|
||||
{
|
||||
|
||||
@@ -50,9 +55,7 @@ Q_OBJECT
|
||||
public:
|
||||
ProgressWidget (ProgressReporter *pr, QWidget *parent, bool full_width = false);
|
||||
|
||||
void set_text (const std::string &text);
|
||||
void set_value (double v, const std::string &value);
|
||||
void set_can_cancel (bool f);
|
||||
void set_progress (tl::Progress *progress);
|
||||
void add_widget (QWidget *widget);
|
||||
void remove_widget ();
|
||||
QWidget *get_widget () const;
|
||||
@@ -64,7 +67,7 @@ public slots:
|
||||
|
||||
private:
|
||||
QLabel *mp_label;
|
||||
ProgressBarWidget *mp_progress_bar;
|
||||
ProgressBarWidget *mp_progress_bar1, *mp_progress_bar2, *mp_progress_bar3;
|
||||
QWidget *mp_widget;
|
||||
int m_widget_col;
|
||||
QGridLayout *mp_layout;
|
||||
|
||||
@@ -148,8 +148,7 @@ Progress::set_desc (const std::string &d)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Progress::test (bool force_yield)
|
||||
bool Progress::test(bool force_yield)
|
||||
{
|
||||
if (++m_interval_count >= m_yield_interval || force_yield) {
|
||||
|
||||
@@ -180,6 +179,10 @@ Progress::test (bool force_yield)
|
||||
throw tl::BreakException ();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,8 +225,9 @@ RelativeProgress &
|
||||
RelativeProgress::set (size_t count, bool force_yield)
|
||||
{
|
||||
m_count = count;
|
||||
test (force_yield || m_count - m_last_count >= m_unit);
|
||||
m_last_count = m_count;
|
||||
if (test (force_yield || m_count - m_last_count >= m_unit)) {
|
||||
m_last_count = m_count;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
@@ -203,7 +203,7 @@ protected:
|
||||
* This method must be called by the derived class.
|
||||
* If "force_yield" is true, the events are always processed.
|
||||
*/
|
||||
void test (bool force_yield = false);
|
||||
bool test (bool force_yield = false);
|
||||
|
||||
/**
|
||||
* @brief This method needs to be called by all derived classes after initialization has happened
|
||||
|
||||
Reference in New Issue
Block a user