mirror of https://github.com/KLayout/klayout.git
Implementing "spaced array" option
The "make array" dialog now has a tab where you can select "spaced mode". In spaced mode, the bounding box of the selection is used to compute the array pitch. You can add a space between the columns and rows and decide whether to use all layers for the instance bounding boxes or only the visible ones.
This commit is contained in:
parent
415650bb3a
commit
222c08a73a
|
|
@ -6,8 +6,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>561</width>
|
<width>586</width>
|
||||||
<height>323</height>
|
<height>431</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
|
@ -20,32 +20,6 @@
|
||||||
<property name="margin" stdset="0">
|
<property name="margin" stdset="0">
|
||||||
<number>9</number>
|
<number>9</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>The selection will be copied row * columns times. Each copy will be displaced by a vector given by the row vector times the row index and the column vector times the column index.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer>
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType">
|
|
||||||
<enum>QSizePolicy::Fixed</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>10</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="array_grp">
|
<widget class="QGroupBox" name="array_grp">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
|
|
@ -61,144 +35,248 @@
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout">
|
<layout class="QGridLayout">
|
||||||
<property name="margin" stdset="0">
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="3" column="3">
|
<item row="3" column="0" colspan="5">
|
||||||
<widget class="QLineEdit" name="row_x_le">
|
<widget class="QTabWidget" name="mode_tab">
|
||||||
<property name="sizePolicy">
|
<property name="currentIndex">
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
<number>1</number>
|
||||||
<horstretch>1</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
</property>
|
||||||
|
<widget class="QWidget" name="tab">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Array with pitch vectors</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0" colspan="5">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string> Each copy will be displaced by a vector given by the row vector times the row index and the column vector times the column index.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="3">
|
||||||
|
<widget class="QLabel" name="label_15">
|
||||||
|
<property name="text">
|
||||||
|
<string>y =</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLineEdit" name="column_x_le">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_16">
|
||||||
|
<property name="text">
|
||||||
|
<string> Column vector (x,y)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="label_14">
|
||||||
|
<property name="text">
|
||||||
|
<string>x =</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="4">
|
||||||
|
<widget class="QLineEdit" name="column_y_le">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="2">
|
||||||
|
<widget class="QLineEdit" name="row_x_le">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLabel" name="label_11">
|
||||||
|
<property name="text">
|
||||||
|
<string>x =</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="3">
|
||||||
|
<widget class="QLabel" name="label_10">
|
||||||
|
<property name="text">
|
||||||
|
<string>y =</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="4">
|
||||||
|
<widget class="QLineEdit" name="row_y_le">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_9">
|
||||||
|
<property name="text">
|
||||||
|
<string> Row vector (x,y)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="5">
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tab_2">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Grid with space</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_17">
|
||||||
|
<property name="text">
|
||||||
|
<string>Space</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLineEdit" name="space_x_le">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="4">
|
||||||
|
<widget class="QLineEdit" name="space_y_le">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="2">
|
||||||
|
<spacer name="verticalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>30</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="5">
|
||||||
|
<spacer name="horizontalSpacer_3">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="label_18">
|
||||||
|
<property name="text">
|
||||||
|
<string>horizonal =</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="3">
|
||||||
|
<widget class="QLabel" name="label_13">
|
||||||
|
<property name="text">
|
||||||
|
<string>vertical =</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="6">
|
||||||
|
<widget class="QCheckBox" name="vis_only_cbx">
|
||||||
|
<property name="text">
|
||||||
|
<string>Use visible layers only for bounding boxes of instances</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0" colspan="6">
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>The selection is placed in a rectangular array, with the bounding box defining the pitch. Additional space can be added between columns and rows.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="2">
|
<item row="0" column="0" colspan="5">
|
||||||
<widget class="QLabel" name="label_11">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>x =</string>
|
<string>The selection will be copied row * columns times.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<property name="wordWrap">
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="5">
|
<item row="2" column="0" colspan="5">
|
||||||
<widget class="QLineEdit" name="column_y_le">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>1</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0" colspan="3">
|
|
||||||
<widget class="QLabel" name="label_8">
|
|
||||||
<property name="text">
|
|
||||||
<string>Columns =</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="4">
|
|
||||||
<widget class="QLabel" name="label_6">
|
|
||||||
<property name="text">
|
|
||||||
<string>Rows =</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="3">
|
|
||||||
<widget class="QLineEdit" name="columns_le">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>1</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0" colspan="2">
|
|
||||||
<widget class="QLabel" name="label_9">
|
|
||||||
<property name="text">
|
|
||||||
<string> Row vector (x,y)</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0" colspan="2">
|
|
||||||
<widget class="QLabel" name="label_16">
|
|
||||||
<property name="text">
|
|
||||||
<string> Column vector (x,y)</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="5">
|
|
||||||
<widget class="QLineEdit" name="row_y_le">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>1</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
|
||||||
<widget class="QLabel" name="label_14">
|
|
||||||
<property name="text">
|
|
||||||
<string>x =</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="3">
|
|
||||||
<widget class="QLineEdit" name="column_x_le">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>1</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="5">
|
|
||||||
<widget class="QLineEdit" name="rows_le">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>1</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="4">
|
|
||||||
<widget class="QLabel" name="label_15">
|
|
||||||
<property name="text">
|
|
||||||
<string>y =</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="4">
|
|
||||||
<widget class="QLabel" name="label_10">
|
|
||||||
<property name="text">
|
|
||||||
<string>y =</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0" colspan="6">
|
|
||||||
<spacer name="verticalSpacer">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
|
|
@ -214,6 +292,59 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_8">
|
||||||
|
<property name="text">
|
||||||
|
<string>Columns =</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="columns_le">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="label_6">
|
||||||
|
<property name="text">
|
||||||
|
<string>Rows =</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="3">
|
||||||
|
<widget class="QLineEdit" name="rows_le">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="4">
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
@ -271,10 +402,14 @@
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>columns_le</tabstop>
|
<tabstop>columns_le</tabstop>
|
||||||
<tabstop>rows_le</tabstop>
|
<tabstop>rows_le</tabstop>
|
||||||
|
<tabstop>mode_tab</tabstop>
|
||||||
<tabstop>column_x_le</tabstop>
|
<tabstop>column_x_le</tabstop>
|
||||||
<tabstop>column_y_le</tabstop>
|
<tabstop>column_y_le</tabstop>
|
||||||
<tabstop>row_x_le</tabstop>
|
<tabstop>row_x_le</tabstop>
|
||||||
<tabstop>row_y_le</tabstop>
|
<tabstop>row_y_le</tabstop>
|
||||||
|
<tabstop>space_x_le</tabstop>
|
||||||
|
<tabstop>space_y_le</tabstop>
|
||||||
|
<tabstop>vis_only_cbx</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
#include "dbLayout.h"
|
#include "dbLayout.h"
|
||||||
|
|
||||||
#include "edtDialogs.h"
|
#include "edtDialogs.h"
|
||||||
|
#include "edtMainService.h"
|
||||||
#include "layEditorUtils.h"
|
#include "layEditorUtils.h"
|
||||||
#include "layObjectInstPath.h"
|
#include "layObjectInstPath.h"
|
||||||
#include "layCellView.h"
|
#include "layCellView.h"
|
||||||
|
|
@ -646,29 +647,41 @@ MakeArrayOptionsDialog::MakeArrayOptionsDialog (QWidget *parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
MakeArrayOptionsDialog::exec_dialog (db::DVector &a, unsigned int &na, db::DVector &b, unsigned int &nb)
|
MakeArrayOptionsDialog::exec_dialog (ArrayOptions &options)
|
||||||
{
|
{
|
||||||
rows_le->setText (tl::to_qstring (tl::to_string (na)));
|
rows_le->setText (tl::to_qstring (tl::to_string (options.na)));
|
||||||
columns_le->setText (tl::to_qstring (tl::to_string (nb)));
|
columns_le->setText (tl::to_qstring (tl::to_string (options.nb)));
|
||||||
row_x_le->setText (tl::to_qstring (tl::micron_to_string (a.x ())));
|
row_x_le->setText (tl::to_qstring (tl::micron_to_string (options.a.x ())));
|
||||||
row_y_le->setText (tl::to_qstring (tl::micron_to_string (a.y ())));
|
row_y_le->setText (tl::to_qstring (tl::micron_to_string (options.a.y ())));
|
||||||
column_x_le->setText (tl::to_qstring (tl::micron_to_string (b.x ())));
|
column_x_le->setText (tl::to_qstring (tl::micron_to_string (options.b.x ())));
|
||||||
column_y_le->setText (tl::to_qstring (tl::micron_to_string (b.y ())));
|
column_y_le->setText (tl::to_qstring (tl::micron_to_string (options.b.y ())));
|
||||||
|
space_x_le->setText (tl::to_qstring (tl::micron_to_string (options.space.x ())));
|
||||||
|
space_y_le->setText (tl::to_qstring (tl::micron_to_string (options.space.y ())));
|
||||||
|
|
||||||
|
mode_tab->setCurrentIndex (options.mode == ArrayOptions::PitchVectors ? 0 : 1);
|
||||||
|
vis_only_cbx->setChecked (options.use_visible_layers);
|
||||||
|
|
||||||
if (QDialog::exec ()) {
|
if (QDialog::exec ()) {
|
||||||
|
|
||||||
|
options.mode = mode_tab->currentIndex () == 0 ? ArrayOptions::PitchVectors : ArrayOptions::Spaced;
|
||||||
|
options.use_visible_layers = vis_only_cbx->isChecked ();
|
||||||
|
|
||||||
double bx = 0.0, by = 0.0;
|
double bx = 0.0, by = 0.0;
|
||||||
double ax = 0.0, ay = 0.0;
|
double ax = 0.0, ay = 0.0;
|
||||||
|
double sx = 0.0, sy = 0.0;
|
||||||
|
|
||||||
tl::from_string_ext (tl::to_string (column_x_le->text ()), bx);
|
tl::from_string_ext (tl::to_string (column_x_le->text ()), bx);
|
||||||
tl::from_string_ext (tl::to_string (column_y_le->text ()), by);
|
tl::from_string_ext (tl::to_string (column_y_le->text ()), by);
|
||||||
tl::from_string_ext (tl::to_string (columns_le->text ()), nb);
|
tl::from_string_ext (tl::to_string (columns_le->text ()), options.nb);
|
||||||
tl::from_string_ext (tl::to_string (row_x_le->text ()), ax);
|
tl::from_string_ext (tl::to_string (row_x_le->text ()), ax);
|
||||||
tl::from_string_ext (tl::to_string (row_y_le->text ()), ay);
|
tl::from_string_ext (tl::to_string (row_y_le->text ()), ay);
|
||||||
tl::from_string_ext (tl::to_string (rows_le->text ()), na);
|
tl::from_string_ext (tl::to_string (rows_le->text ()), options.na);
|
||||||
|
tl::from_string_ext (tl::to_string (space_x_le->text ()), sx);
|
||||||
|
tl::from_string_ext (tl::to_string (space_y_le->text ()), sy);
|
||||||
|
|
||||||
a = db::DVector (ax, ay);
|
options.a = db::DVector (ax, ay);
|
||||||
b = db::DVector (bx, by);
|
options.b = db::DVector (bx, by);
|
||||||
|
options.space = db::DVector (sx, sy);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
@ -758,7 +771,7 @@ popup_tap_layer_menu (lay::LayoutViewBase *view, const std::set<db::LayerPropert
|
||||||
std::set<std::pair<unsigned int, unsigned int> > layers_in_selection;
|
std::set<std::pair<unsigned int, unsigned int> > layers_in_selection;
|
||||||
|
|
||||||
for (lay::ShapeFinder::iterator f = finder.begin (); f != finder.end (); ++f) {
|
for (lay::ShapeFinder::iterator f = finder.begin (); f != finder.end (); ++f) {
|
||||||
if (cv_index < 0 || f->cv_index () == cv_index) {
|
if (cv_index < 0 || int (f->cv_index ()) == cv_index) {
|
||||||
const db::Layout &ly = view->cellview (f->cv_index ())->layout ();
|
const db::Layout &ly = view->cellview (f->cv_index ())->layout ();
|
||||||
// ignore guiding shapes and only provide layers from the filter
|
// ignore guiding shapes and only provide layers from the filter
|
||||||
if (f->layer () != ly.guiding_shape_layer ()
|
if (f->layer () != ly.guiding_shape_layer ()
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,8 @@ namespace lay
|
||||||
|
|
||||||
namespace edt {
|
namespace edt {
|
||||||
|
|
||||||
|
class ArrayOptions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The copy mode dialog
|
* @brief The copy mode dialog
|
||||||
*/
|
*/
|
||||||
|
|
@ -173,10 +175,10 @@ class MakeArrayOptionsDialog
|
||||||
private Ui::MakeArrayOptionsDialog
|
private Ui::MakeArrayOptionsDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
MakeArrayOptionsDialog (QWidget *parent);
|
MakeArrayOptionsDialog (QWidget *parent);
|
||||||
bool exec_dialog (db::DVector &a, unsigned int &na, db::DVector &b, unsigned int &nb);
|
bool exec_dialog (ArrayOptions &options);
|
||||||
|
|
||||||
virtual void accept ();
|
virtual void accept ();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -81,8 +81,6 @@ MainService::MainService (db::Manager *manager, lay::LayoutViewBase *view, lay::
|
||||||
m_distribute_vmode (1), m_distribute_vpitch (0.0), m_distribute_vspace (0.0),
|
m_distribute_vmode (1), m_distribute_vpitch (0.0), m_distribute_vspace (0.0),
|
||||||
m_distribute_visible_layers (false),
|
m_distribute_visible_layers (false),
|
||||||
m_origin_mode_x (-1), m_origin_mode_y (-1), m_origin_visible_layers_for_bbox (false),
|
m_origin_mode_x (-1), m_origin_mode_y (-1), m_origin_visible_layers_for_bbox (false),
|
||||||
m_array_a (0.0, 1.0), m_array_b (1.0, 0.0),
|
|
||||||
m_array_na (1), m_array_nb (1),
|
|
||||||
m_router (0.0), m_rinner (0.0), m_npoints (64), m_undo_before_apply (true)
|
m_router (0.0), m_rinner (0.0), m_npoints (64), m_undo_before_apply (true)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_QT)
|
#if defined(HAVE_QT)
|
||||||
|
|
@ -2251,32 +2249,66 @@ MainService::cm_make_array ()
|
||||||
tl_assert (false); // see TODO
|
tl_assert (false); // see TODO
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
size_t n = 0;
|
|
||||||
check_no_guiding_shapes ();
|
check_no_guiding_shapes ();
|
||||||
|
|
||||||
std::vector<edt::Service *> edt_services = view ()->get_plugins <edt::Service> ();
|
std::vector<edt::Service *> edt_services = view ()->get_plugins <edt::Service> ();
|
||||||
|
|
||||||
for (std::vector<edt::Service *>::const_iterator es = edt_services.begin (); es != edt_services.end (); ++es) {
|
bool any = false;
|
||||||
for (EditableSelectionIterator s = (*es)->begin_selection (); ! s.at_end (); ++s) {
|
for (std::vector<edt::Service *>::const_iterator es = edt_services.begin (); es != edt_services.end () && ! any; ++es) {
|
||||||
++n;
|
any = ! (*es)->begin_selection ().at_end ();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (! any) {
|
||||||
if (n == 0) {
|
|
||||||
throw tl::Exception (tl::to_string (tr ("Nothing selected to make arrays of")));
|
throw tl::Exception (tl::to_string (tr ("Nothing selected to make arrays of")));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_QT)
|
#if defined(HAVE_QT)
|
||||||
// TODO: make parameters persistent so we can set them externally
|
// TODO: make parameters persistent so we can set them externally
|
||||||
if (! make_array_options_dialog ()->exec_dialog (m_array_a, m_array_na, m_array_b, m_array_nb)) {
|
if (! make_array_options_dialog ()->exec_dialog (m_array_options)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
unsigned int na = m_array_options.na;
|
||||||
|
unsigned int nb = m_array_options.nb;
|
||||||
|
db::DVector a = m_array_options.a;
|
||||||
|
db::DVector b = m_array_options.b;
|
||||||
|
|
||||||
|
if (m_array_options.mode == ArrayOptions::Spaced) {
|
||||||
|
|
||||||
|
db::DBox bbox;
|
||||||
|
|
||||||
|
// get the selection bbox
|
||||||
|
for (std::vector<edt::Service *>::const_iterator es = edt_services.begin (); es != edt_services.end (); ++es) {
|
||||||
|
for (EditableSelectionIterator s = (*es)->begin_selection (); ! s.at_end (); ++s) {
|
||||||
|
|
||||||
|
const db::Layout &layout = view ()->cellview (s->cv_index ())->layout ();
|
||||||
|
db::CplxTrans tr = db::CplxTrans (layout.dbu ()) * s->trans ();
|
||||||
|
|
||||||
|
if (! s->is_cell_inst ()) {
|
||||||
|
bbox += tr * s->shape ().bbox ();
|
||||||
|
} else {
|
||||||
|
bbox += inst_bbox (tr, view (), s->cv_index (), s->back (), m_array_options.use_visible_layers);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute pitch vectors
|
||||||
|
a = db::DVector (0.0, m_array_options.space.y () + bbox.height ()); // row-pitch
|
||||||
|
b = db::DVector (m_array_options.space.x () + bbox.width (), 0.0); // column-pitch
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
make_array (na, nb, a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MainService::make_array (unsigned int na, unsigned int nb, const db::DVector &a, const db::DVector &b)
|
||||||
|
{
|
||||||
view ()->cancel_edits ();
|
view ()->cancel_edits ();
|
||||||
|
|
||||||
// undo support for small arrays only
|
// undo support for small arrays only
|
||||||
bool has_undo = (m_array_na * m_array_nb < 1000);
|
bool has_undo = (na * nb < 1000);
|
||||||
|
|
||||||
// No undo support currently - the undo buffering is pretty inefficient right now.
|
// No undo support currently - the undo buffering is pretty inefficient right now.
|
||||||
if (manager ()) {
|
if (manager ()) {
|
||||||
|
|
@ -2287,7 +2319,17 @@ MainService::cm_make_array ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tl::RelativeProgress progress (tl::to_string (tr ("Make array")), (size_t (m_array_na) * size_t (m_array_nb) - 1) * n, 1000);
|
std::vector<edt::Service *> edt_services = view ()->get_plugins <edt::Service> ();
|
||||||
|
|
||||||
|
// count selected items for progress
|
||||||
|
size_t n = 0;
|
||||||
|
for (std::vector<edt::Service *>::const_iterator es = edt_services.begin (); es != edt_services.end (); ++es) {
|
||||||
|
for (EditableSelectionIterator s = (*es)->begin_selection (); ! s.at_end (); ++s) {
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tl::RelativeProgress progress (tl::to_string (tr ("Make array")), (size_t (na) * size_t (nb) - 1) * n, 1000);
|
||||||
|
|
||||||
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) {
|
||||||
|
|
||||||
|
|
@ -2302,15 +2344,15 @@ MainService::cm_make_array ()
|
||||||
|
|
||||||
if (s->is_cell_inst ()) {
|
if (s->is_cell_inst ()) {
|
||||||
|
|
||||||
for (unsigned int ia = 0; ia < m_array_na; ++ia) {
|
for (unsigned int ia = 0; ia < na; ++ia) {
|
||||||
for (unsigned int ib = 0; ib < m_array_nb; ++ib) {
|
for (unsigned int ib = 0; ib < nb; ++ib) {
|
||||||
|
|
||||||
// don't create a copy
|
// don't create a copy
|
||||||
if (ia == 0 && ib == 0) {
|
if (ia == 0 && ib == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
db::DCplxTrans dtrans (m_array_a * double (ia) + m_array_b * double (ib));
|
db::DCplxTrans dtrans (a * double (ia) + b * double (ib));
|
||||||
db::ICplxTrans itrans (db::DCplxTrans (s->trans ()).inverted () * db::DCplxTrans (1.0 / cv->layout ().dbu ()) * dtrans * db::DCplxTrans (cv->layout ().dbu ()) * db::DCplxTrans (s->trans ()));
|
db::ICplxTrans itrans (db::DCplxTrans (s->trans ()).inverted () * db::DCplxTrans (1.0 / cv->layout ().dbu ()) * dtrans * db::DCplxTrans (cv->layout ().dbu ()) * db::DCplxTrans (s->trans ()));
|
||||||
|
|
||||||
db::Instance new_inst = target_cell.insert (s->back ().inst_ptr);
|
db::Instance new_inst = target_cell.insert (s->back ().inst_ptr);
|
||||||
|
|
@ -2326,15 +2368,15 @@ MainService::cm_make_array ()
|
||||||
|
|
||||||
db::Shapes &target_shapes = target_cell.shapes (s->layer ());
|
db::Shapes &target_shapes = target_cell.shapes (s->layer ());
|
||||||
|
|
||||||
for (unsigned int ia = 0; ia < m_array_na; ++ia) {
|
for (unsigned int ia = 0; ia < na; ++ia) {
|
||||||
for (unsigned int ib = 0; ib < m_array_nb; ++ib) {
|
for (unsigned int ib = 0; ib < nb; ++ib) {
|
||||||
|
|
||||||
// don't create a copy
|
// don't create a copy
|
||||||
if (ia == 0 && ib == 0) {
|
if (ia == 0 && ib == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
db::DCplxTrans dtrans (m_array_a * double (ia) + m_array_b * double (ib));
|
db::DCplxTrans dtrans (a * double (ia) + b * double (ib));
|
||||||
db::ICplxTrans itrans (db::DCplxTrans (s->trans ()).inverted () * db::DCplxTrans (1.0 / cv->layout ().dbu ()) * dtrans * db::DCplxTrans (cv->layout ().dbu ()) * db::DCplxTrans (s->trans ()));
|
db::ICplxTrans itrans (db::DCplxTrans (s->trans ()).inverted () * db::DCplxTrans (1.0 / cv->layout ().dbu ()) * dtrans * db::DCplxTrans (cv->layout ().dbu ()) * db::DCplxTrans (s->trans ()));
|
||||||
|
|
||||||
db::Shape new_shape = target_shapes.insert (s->shape ());
|
db::Shape new_shape = target_shapes.insert (s->shape ());
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,21 @@ class DistributeOptionsDialog;
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
|
|
||||||
|
struct ArrayOptions
|
||||||
|
{
|
||||||
|
enum mode_type { PitchVectors, Spaced };
|
||||||
|
|
||||||
|
ArrayOptions () : mode (PitchVectors), a (0.0, 1.0), b (1.0, 0.0), na (1), nb (1) { }
|
||||||
|
|
||||||
|
mode_type mode;
|
||||||
|
db::DVector a, b;
|
||||||
|
unsigned int na, nb;
|
||||||
|
db::DVector space;
|
||||||
|
bool use_visible_layers;
|
||||||
|
};
|
||||||
|
|
||||||
|
// -------------------------------------------------------------
|
||||||
|
|
||||||
class MainService
|
class MainService
|
||||||
: public lay::Plugin,
|
: public lay::Plugin,
|
||||||
public lay::Editable,
|
public lay::Editable,
|
||||||
|
|
@ -155,6 +170,11 @@ public:
|
||||||
*/
|
*/
|
||||||
void cm_make_array ();
|
void cm_make_array ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The parameterized function for making arrays
|
||||||
|
*/
|
||||||
|
void make_array (unsigned na, unsigned nb, const db::DVector &a, const db::DVector &b);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Align the selected shapes and instances
|
* @brief Align the selected shapes and instances
|
||||||
*/
|
*/
|
||||||
|
|
@ -242,11 +262,11 @@ private:
|
||||||
std::string m_make_cell_name;
|
std::string m_make_cell_name;
|
||||||
int m_origin_mode_x, m_origin_mode_y;
|
int m_origin_mode_x, m_origin_mode_y;
|
||||||
bool m_origin_visible_layers_for_bbox;
|
bool m_origin_visible_layers_for_bbox;
|
||||||
db::DVector m_array_a, m_array_b;
|
|
||||||
unsigned int m_array_na, m_array_nb;
|
|
||||||
double m_router, m_rinner;
|
double m_router, m_rinner;
|
||||||
unsigned int m_npoints;
|
unsigned int m_npoints;
|
||||||
bool m_undo_before_apply;
|
bool m_undo_before_apply;
|
||||||
|
ArrayOptions m_array_options;
|
||||||
|
|
||||||
#if defined(HAVE_QT)
|
#if defined(HAVE_QT)
|
||||||
edt::RoundCornerOptionsDialog *mp_round_corners_dialog;
|
edt::RoundCornerOptionsDialog *mp_round_corners_dialog;
|
||||||
edt::AreaAndPerimeterDialog *mp_area_and_perimeter_dialog;
|
edt::AreaAndPerimeterDialog *mp_area_and_perimeter_dialog;
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>432</width>
|
<width>449</width>
|
||||||
<height>349</height>
|
<height>370</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
|
@ -405,6 +405,13 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFrame" name="frame">
|
<widget class="QFrame" name="frame">
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
|
|
@ -429,44 +436,12 @@
|
||||||
<property name="bottomMargin">
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
|
||||||
<spacer>
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>209</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="pushButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>Ok</string>
|
|
||||||
</property>
|
|
||||||
<property name="default">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="pushButton_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>Cancel</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>pushButton</tabstop>
|
|
||||||
<tabstop>pushButton_2</tabstop>
|
|
||||||
<tabstop>lt</tabstop>
|
<tabstop>lt</tabstop>
|
||||||
<tabstop>ct</tabstop>
|
<tabstop>ct</tabstop>
|
||||||
<tabstop>rt</tabstop>
|
<tabstop>rt</tabstop>
|
||||||
|
|
@ -486,34 +461,34 @@
|
||||||
</resources>
|
</resources>
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
<connection>
|
||||||
<sender>pushButton</sender>
|
<sender>buttonBox</sender>
|
||||||
<signal>clicked()</signal>
|
<signal>accepted()</signal>
|
||||||
<receiver>AlignCellOptionsDialog</receiver>
|
<receiver>AlignCellOptionsDialog</receiver>
|
||||||
<slot>accept()</slot>
|
<slot>accept()</slot>
|
||||||
<hints>
|
<hints>
|
||||||
<hint type="sourcelabel">
|
<hint type="sourcelabel">
|
||||||
<x>237</x>
|
<x>224</x>
|
||||||
<y>203</y>
|
<y>295</y>
|
||||||
</hint>
|
</hint>
|
||||||
<hint type="destinationlabel">
|
<hint type="destinationlabel">
|
||||||
<x>147</x>
|
<x>224</x>
|
||||||
<y>81</y>
|
<y>176</y>
|
||||||
</hint>
|
</hint>
|
||||||
</hints>
|
</hints>
|
||||||
</connection>
|
</connection>
|
||||||
<connection>
|
<connection>
|
||||||
<sender>pushButton_2</sender>
|
<sender>buttonBox</sender>
|
||||||
<signal>clicked()</signal>
|
<signal>rejected()</signal>
|
||||||
<receiver>AlignCellOptionsDialog</receiver>
|
<receiver>AlignCellOptionsDialog</receiver>
|
||||||
<slot>reject()</slot>
|
<slot>reject()</slot>
|
||||||
<hints>
|
<hints>
|
||||||
<hint type="sourcelabel">
|
<hint type="sourcelabel">
|
||||||
<x>325</x>
|
<x>224</x>
|
||||||
<y>202</y>
|
<y>295</y>
|
||||||
</hint>
|
</hint>
|
||||||
<hint type="destinationlabel">
|
<hint type="destinationlabel">
|
||||||
<x>325</x>
|
<x>224</x>
|
||||||
<y>57</y>
|
<y>176</y>
|
||||||
</hint>
|
</hint>
|
||||||
</hints>
|
</hints>
|
||||||
</connection>
|
</connection>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue