Second part for implementation of #113 (healing of XOR output)

This commit is contained in:
Matthias Koefferlein 2018-04-29 23:02:40 +02:00
parent 821aab3320
commit 4c4b079286
5 changed files with 280 additions and 210 deletions

View File

@ -47,6 +47,10 @@
* Bugfix: https://github.com/klayoutmatthias/klayout/issues/114
Custom line styles not loaded from tech's layer properties
file.
* Enhancement: https://github.com/klayoutmatthias/klayout/issues/113
The XOR tool has an option now to heal result shapes which
cross tile boundaries. The result shape count of tiled
and non-tiled mode should basically be the same then.
* Bugfix: https://github.com/klayoutmatthias/klayout/issues/112
Salt package repository relative paths have not been working.
* Bugfix: https://github.com/klayoutmatthias/klayout/issues/109

View File

@ -1,7 +1,8 @@
<ui version="4.0" >
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>XORToolDialog</class>
<widget class="QDialog" name="XORToolDialog" >
<property name="geometry" >
<widget class="QDialog" name="XORToolDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
@ -9,87 +10,103 @@
<height>649</height>
</rect>
</property>
<property name="windowTitle" >
<property name="windowTitle">
<string>XOR Tool</string>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox" >
<property name="title" >
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Input</string>
</property>
<layout class="QGridLayout" >
<property name="margin" >
<layout class="QGridLayout">
<property name="leftMargin">
<number>9</number>
</property>
<property name="spacing" >
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="5" column="0" >
<widget class="QLabel" name="label_12" >
<property name="text" >
<item row="5" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>From region</string>
</property>
</widget>
</item>
<item row="0" column="0" >
<widget class="QLabel" name="label" >
<property name="text" >
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Layout A</string>
</property>
</widget>
</item>
<item row="3" column="0" >
<widget class="QLabel" name="label_8" >
<property name="text" >
<item row="3" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Use for input </string>
</property>
</widget>
</item>
<item row="1" column="0" >
<widget class="QLabel" name="label_2" >
<property name="text" >
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Layout B</string>
</property>
</widget>
</item>
<item row="3" column="1" >
<widget class="QComboBox" name="input_layers_cbx" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<item row="3" column="1">
<widget class="QComboBox" name="input_layers_cbx">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text" >
<property name="text">
<string>All Layers (different layouts)</string>
</property>
</item>
<item>
<property name="text" >
<property name="text">
<string>Visible layers (different layouts)</string>
</property>
</item>
</widget>
</item>
<item row="2" column="1" >
<item row="2" column="1">
<spacer>
<property name="orientation" >
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" >
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>10</height>
@ -97,72 +114,66 @@
</property>
</spacer>
</item>
<item row="5" column="1" >
<widget class="QComboBox" name="region_cbx" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<item row="5" column="1">
<widget class="QComboBox" name="region_cbx">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text" >
<property name="text">
<string>All</string>
</property>
</item>
<item>
<property name="text" >
<property name="text">
<string>Visible region</string>
</property>
</item>
<item>
<property name="text" >
<property name="text">
<string>Clipped to ruler</string>
</property>
</item>
</widget>
</item>
<item row="1" column="1" >
<widget class="lay::CellViewSelectionComboBox" name="layoutb" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<item row="1" column="1">
<widget class="lay::CellViewSelectionComboBox" name="layoutb">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy" >
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContentsOnFirstShow</enum>
</property>
</widget>
</item>
<item row="0" column="1" >
<widget class="lay::CellViewSelectionComboBox" name="layouta" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<item row="0" column="1">
<widget class="lay::CellViewSelectionComboBox" name="layouta">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy" >
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContentsOnFirstShow</enum>
</property>
</widget>
</item>
<item row="4" column="1" >
<item row="4" column="1">
<spacer>
<property name="orientation" >
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" >
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>10</height>
@ -170,17 +181,15 @@
</property>
</spacer>
</item>
<item row="1" column="2" >
<widget class="QLabel" name="label_13" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>7</hsizetype>
<vsizetype>5</vsizetype>
<item row="1" column="2">
<widget class="QLabel" name="label_13">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<property name="text">
<string/>
</property>
</widget>
@ -189,59 +198,64 @@
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2" >
<property name="title" >
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Options</string>
</property>
<layout class="QGridLayout" >
<property name="margin" >
<layout class="QGridLayout">
<property name="leftMargin">
<number>9</number>
</property>
<property name="spacing" >
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="1" column="1" colspan="2" >
<widget class="QCheckBox" name="anotb_cb" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<item row="1" column="1" colspan="2">
<widget class="QCheckBox" name="anotb_cb">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<property name="text">
<string>A NOT B (In A but not in B)</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2" >
<widget class="QCheckBox" name="axorb_cb" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<item row="0" column="1" colspan="2">
<widget class="QCheckBox" name="axorb_cb">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<property name="text">
<string>A XOR B (differences)</string>
</property>
<property name="checked" >
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0" colspan="3" >
<item row="3" column="0" colspan="3">
<spacer>
<property name="orientation" >
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" >
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>10</height>
@ -249,72 +263,79 @@
</property>
</spacer>
</item>
<item row="4" column="1" colspan="2" >
<widget class="QCheckBox" name="summarize_cb" >
<property name="text" >
<item row="4" column="1" colspan="2">
<widget class="QCheckBox" name="summarize_cb">
<property name="text">
<string>Summarize missing layers</string>
</property>
<property name="checked" >
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="0" >
<widget class="QLabel" name="label_5" >
<property name="text" >
<item row="5" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Tolerances</string>
</property>
</widget>
</item>
<item row="0" column="0" >
<widget class="QLabel" name="label_4" >
<property name="text" >
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Compare modes </string>
</property>
</widget>
</item>
<item row="5" column="2" >
<widget class="QLabel" name="label_6" >
<property name="text" >
<item row="5" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Tolerances (t1,t2,..) in micron</string>
</property>
</widget>
</item>
<item row="7" column="0" >
<widget class="QLabel" name="label_10" >
<property name="text" >
<item row="7" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Threads</string>
</property>
</widget>
</item>
<item row="6" column="0" >
<widget class="QLabel" name="label_7" >
<property name="text" >
<item row="6" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Tiling</string>
</property>
</widget>
</item>
<item row="6" column="1" colspan="2" >
<widget class="QFrame" name="frame" >
<property name="frameShape" >
<item row="6" column="1" colspan="2">
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow" >
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLineEdit" name="tiling" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<widget class="QLineEdit" name="tiling">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@ -322,56 +343,68 @@
</widget>
</item>
<item>
<widget class="QLabel" name="label_3" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>5</vsizetype>
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<property name="text">
<string>Tile size in micron</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="heal_cb">
<property name="text">
<string>Heal result shapes</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="7" column="1" colspan="2" >
<widget class="QFrame" name="frame_2" >
<property name="frameShape" >
<item row="7" column="1" colspan="2">
<widget class="QFrame" name="frame_2">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow" >
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSpinBox" name="threads" >
<property name="minimum" >
<widget class="QSpinBox" name="threads">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_11" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>5</vsizetype>
<widget class="QLabel" name="label_11">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<property name="text">
<string>Used for tiles and layers</string>
</property>
</widget>
@ -379,27 +412,23 @@
</layout>
</widget>
</item>
<item row="2" column="1" colspan="2" >
<widget class="QCheckBox" name="bnota_cb" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<item row="2" column="1" colspan="2">
<widget class="QCheckBox" name="bnota_cb">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<property name="text">
<string>B NOT A (in B but not in A)</string>
</property>
</widget>
</item>
<item row="5" column="1" >
<widget class="QLineEdit" name="tolerances" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<item row="5" column="1">
<widget class="QLineEdit" name="tolerances">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@ -410,74 +439,79 @@
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_4" >
<property name="title" >
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Output</string>
</property>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<item>
<widget class="QLabel" name="label_9" >
<property name="text" >
<widget class="QLabel" name="label_9">
<property name="text">
<string>Send output to </string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="output_cbx" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>7</hsizetype>
<vsizetype>0</vsizetype>
<widget class="QComboBox" name="output_cbx">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text" >
<property name="text">
<string>Marker database</string>
</property>
</item>
<item>
<property name="text" >
<property name="text">
<string>Other layout</string>
</property>
</item>
<item>
<property name="text" >
<property name="text">
<string>New layers in layout A ...</string>
</property>
</item>
<item>
<property name="text" >
<property name="text">
<string>New layers in layout B ...</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QLabel" name="layer_offset_lbl" >
<property name="text" >
<widget class="QLabel" name="layer_offset_lbl">
<property name="text">
<string>with offset</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="layer_offset_le" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<widget class="QLineEdit" name="layer_offset_le">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<property name="text">
<string>1000/0</string>
</property>
</widget>
@ -487,10 +521,10 @@
</item>
<item>
<spacer>
<property name="orientation" >
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" >
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>16</height>
@ -499,12 +533,12 @@
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox" >
<property name="orientation" >
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons" >
<set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
@ -541,11 +575,11 @@
<receiver>XORToolDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel" >
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel" >
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
@ -557,11 +591,11 @@
<receiver>XORToolDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel" >
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel" >
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>

View File

@ -41,6 +41,7 @@ FORMS += \
SizingOptionsDialog.ui \
StreamImportDialog.ui \
MergeOptionsDialog.ui \
XORToolDialog.ui
SOURCES += \
extBooleanOperationsDialogs.cc \

View File

@ -29,6 +29,7 @@
#include "dbRecursiveShapeIterator.h"
#include "dbClip.h"
#include "dbLayoutUtils.h"
#include "dbRegion.h"
#include "tlTimer.h"
#include "tlProgress.h"
#include "tlThreadedWorkers.h"
@ -58,6 +59,7 @@ std::string cfg_xor_bnota ("xor-bnota");
std::string cfg_xor_summarize ("xor-summarize");
std::string cfg_xor_tolerances ("xor-tolerances");
std::string cfg_xor_tiling ("xor-tiling");
std::string cfg_xor_tiling_heal ("xor-tiling-heal");
std::string cfg_xor_region_mode ("xor-region-mode");
// Note: this enum must match with the order of the combo box entries in the
@ -254,6 +256,11 @@ XORToolDialog::exec_dialog (lay::LayoutView *view)
mp_ui->tiling->setText (tl::to_qstring (tiling));
}
bool heal = false;
if (config_root->config_get (cfg_xor_tiling_heal, heal)) {
mp_ui->heal_cb->setChecked (heal);
}
int ret = QDialog::exec ();
if (ret) {
@ -329,6 +336,7 @@ BEGIN_PROTECTED
config_root->config_set (cfg_xor_summarize, mp_ui->summarize_cb->isChecked ());
config_root->config_set (cfg_xor_tolerances, tl::to_string (mp_ui->tolerances->text ()));
config_root->config_set (cfg_xor_tiling, tl::to_string (mp_ui->tiling->text ()));
config_root->config_set (cfg_xor_tiling_heal, mp_ui->heal_cb->isChecked ());
config_root->config_end ();
QDialog::accept ();
@ -380,6 +388,7 @@ public:
m_op (op),
m_el_handling (el_handling),
m_has_tiles (false),
m_tile_heal (false),
m_dbu (dbu),
m_cva (cva),
m_cvb (cvb),
@ -415,11 +424,12 @@ public:
return m_has_tiles;
}
void has_tiles (bool ht, int nx, int ny)
void set_tiles (bool ht, int nx, int ny, bool heal)
{
m_has_tiles = ht;
m_nx = ht ? nx : 0;
m_ny = ht ? ny : 0;
m_tile_heal = heal;
}
double dbu () const
@ -500,11 +510,17 @@ public:
}
}
void issue_polygon (unsigned int tol_index, unsigned int layer_index, const db::Polygon &polygon, const db::CplxTrans &trans)
void issue_polygon (unsigned int tol_index, unsigned int layer_index, const db::Polygon &polygon, bool touches_border = false)
{
QMutexLocker locker (&m_mutex);
db::CplxTrans trans (dbu ());
if (m_output_mode == OMMarkerDatabase) {
if (m_tile_heal && touches_border) {
// save for merging later
m_polygons_to_heal [std::make_pair (tol_index, layer_index)].insert (polygon);
} else if (m_output_mode == OMMarkerDatabase) {
rdb::Category *layercat = m_layer_categories[tol_index][layer_index];
@ -532,6 +548,16 @@ public:
}
}
void finish ()
{
// merge the polygons to heal and re-issue (this time without healing)
for (std::map<std::pair<size_t, size_t>, db::Region>::iterator p = m_polygons_to_heal.begin (); p != m_polygons_to_heal.end (); ++p) {
for (db::Region::const_iterator mp = p->second.begin_merged (); !mp.at_end (); ++mp) {
issue_polygon (p->first.first, p->first.second, *mp, false);
}
}
}
virtual tl::Worker *create_worker ();
private:
@ -539,6 +565,7 @@ private:
db::BooleanOp::BoolOp m_op;
EmptyLayerHandling m_el_handling;
bool m_has_tiles;
bool m_tile_heal;
double m_dbu;
lay::CellView m_cva;
lay::CellView m_cvb;
@ -554,6 +581,7 @@ private:
std::string m_result_string;
size_t m_nx, m_ny;
std::map<std::pair<db::LayerProperties, db::Coord>, std::vector<std::vector<size_t> > > m_results;
std::map<std::pair<size_t, size_t>, db::Region> m_polygons_to_heal;
};
class XORTask
@ -826,8 +854,6 @@ XORWorker::do_perform (const XORTask *xor_task)
sp.size (xor_results, xor_results_cell, 0, xor_results_cell.shapes (0), ((*t + 1) / 2), (unsigned int)2, false);
}
db::CplxTrans trans = db::CplxTrans (mp_job->dbu ());
size_t n = 0;
for (db::Shapes::shape_iterator s = xor_results_cell.shapes (0).begin (db::ShapeIterator::All); ! s.at_end (); ++s) {
@ -836,14 +862,16 @@ XORWorker::do_perform (const XORTask *xor_task)
std::vector <db::Polygon> clipped_poly;
clip_poly (s->polygon (), xor_task->clip_box (), clipped_poly, false /*don't resolve holes*/);
db::Box inner = xor_task->clip_box ().enlarged (db::Vector (-1, -1));
for (std::vector <db::Polygon>::const_iterator cp = clipped_poly.begin (); cp != clipped_poly.end (); ++cp) {
mp_job->issue_polygon (tol_index, xor_task->layer_index (), *cp, trans);
mp_job->issue_polygon (tol_index, xor_task->layer_index (), *cp, !cp->box ().inside (inner));
++n;
}
} else {
mp_job->issue_polygon (tol_index, xor_task->layer_index (), s->polygon (), trans);
mp_job->issue_polygon (tol_index, xor_task->layer_index (), s->polygon ());
++n;
}
@ -988,6 +1016,7 @@ XORToolDialog::run_xor ()
}
double tile_size = 0; // in micron units
bool tile_heal = mp_ui->heal_cb->isChecked ();
{
std::string text (tl::to_string (mp_ui->tiling->text ()));
@ -1298,7 +1327,7 @@ XORToolDialog::run_xor ()
db::Coord tile_enlargement_b = db::coord_traits<db::Coord>::rounded_up (tile_enlargement * dbu / cvb->layout ().dbu ());
if (ntiles_w > 1 || ntiles_h > 1 || region_mode != RMAll /*enforces clip*/) {
job.has_tiles (true, ntiles_w, ntiles_h);
job.set_tiles (true, ntiles_w, ntiles_h, tile_heal);
}
// create the XOR tasks
@ -1378,6 +1407,9 @@ XORToolDialog::run_xor ()
throw tl::Exception (tl::to_string (QObject::tr ("Errors occured during processing. First error message says:\n")) + job.error_messages ().front ());
}
// apply healing if required
job.finish ();
}
if (was_cancelled && output_mode == OMMarkerDatabase) {

View File

@ -97,7 +97,6 @@ FORMS = \
TechLayerMappingEditorPage.ui \
TechMacrosPage.ui \
TechSetupDialog.ui \
XORToolDialog.ui \
TechLoadOptionsEditorPage.ui \
TechSaveOptionsEditorPage.ui \
MainConfigPage7.ui \