개정판 f730f5c4
issue #1437: 복사/붙여넣기
Change-Id: Ie5e540f941709824420f8bbddd95b57be7c693a8
HYTOS/HYTOS/QtImageViewer.py | ||
---|---|---|
512 | 512 |
|
513 | 513 |
scenePos = self.mapToScene(event.pos()) |
514 | 514 |
uid = event.mimeData().text() |
515 |
svg = self.createSymbolObject(uid) |
|
515 |
svg = self.scene.createSymbolObject(uid)
|
|
516 | 516 |
if svg: |
517 |
self.place_symbol(svg, scenePos) |
|
517 |
self.scene.place_symbol(svg, scenePos)
|
|
518 | 518 |
|
519 | 519 |
event.acceptProposedAction() |
520 | 520 |
except Exception as ex: |
... | ... | |
526 | 526 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
527 | 527 |
|
528 | 528 |
''' |
529 |
@brief drop create Symbol |
|
530 |
@author kyouho |
|
531 |
@date 2018.07.27 |
|
532 |
''' |
|
533 |
def createSymbolObject(self, uid): |
|
534 |
from AppDocData import AppDocData |
|
535 |
import symbol |
|
536 |
|
|
537 |
app_doc_data = AppDocData.instance() |
|
538 |
symbol = app_doc_data.getSymbolByQuery('uid', uid) |
|
539 |
svgFileName = symbol.sName |
|
540 |
svgType = symbol.sType |
|
541 |
svgAngle = 0 |
|
542 |
svgScale = 1 |
|
543 |
svgOrigin = symbol.originalPoint |
|
544 |
svgFilePath = os.path.join(app_doc_data.symbol_file_path, symbol.getCategory(), symbol.getType(), svgFileName + '.svg') |
|
545 |
svg = SymbolSvgItem.createItem(symbol.getType(), None, owner=None, flip=0, symbol=uid) |
|
546 |
connPts = None |
|
547 |
strConnPts = symbol.connectionPoint |
|
548 |
if strConnPts is not None and strConnPts != '': |
|
549 |
connPts = [(float(x.split(',')[0]), float(x.split(',')[1])) if len(x.split(',')) == 2 else (x.split(',')[0], float(x.split(',')[1]), float(x.split(',')[2])) \ |
|
550 |
for x in strConnPts.split('/')] |
|
551 |
|
|
552 |
svg.buildItem(svgFileName, svgType, svgAngle, svgScale, None, svgOrigin, connPts, uid) |
|
553 |
|
|
554 |
return svg |
|
555 |
|
|
556 |
''' |
|
557 |
@brief match symbol to line |
|
558 |
@author kyouho |
|
559 |
@date 2018.07.27 |
|
560 |
@history humkyung 2018.08.23 change scenePos to connector's center when symbol is placed on connector |
|
561 |
''' |
|
562 |
|
|
563 |
def place_symbol(self, svg, scenePos): |
|
564 |
from EngineeringConnectorItem import QEngineeringConnectorItem |
|
565 |
from CreateCommand import CreateCommand |
|
566 |
|
|
567 |
items = [item for item in self.scene.items(scenePos) if type(item) is not QGraphicsPixmapItem] |
|
568 |
if len(items) > 0 and type(items[0]) is QEngineeringConnectorItem: |
|
569 |
scenePos = QPointF(items[0].center()[0], items[0].center()[1]) |
|
570 |
|
|
571 |
transform = QTransform() |
|
572 |
transform.translate(scenePos.x() - svg.symbolOrigin[0], scenePos.y() - svg.symbolOrigin[1]) |
|
573 |
svg.setTransform(transform) |
|
574 |
svg.loc = [round(scenePos.x() - svg.symbolOrigin[0], 1), round(scenePos.y() - svg.symbolOrigin[1], 1)] |
|
575 |
svg.size = [svg.boundingRect().width(), svg.boundingRect().height()] |
|
576 |
svg.origin = [round(scenePos.x(), 1), round(scenePos.y(), 1)] |
|
577 |
self.scene.addItem(svg) |
|
578 |
|
|
579 |
self.scene.undo_stack.push(CreateCommand(self.scene, [svg, ])) |
|
580 |
|
|
581 |
svg.transfer.onRemoved.connect(self.mainWindow.on_item_removed) |
|
582 |
|
|
583 |
self.scene.clearFocus() |
|
584 |
for item in self.scene.selectedItems(): |
|
585 |
item.setSelected(False) |
|
586 |
|
|
587 |
''' |
|
588 | 529 |
@brief find item by uid (SymbolSvgItem 기반, QEngineeringConnectorItem 제외, QEngineeringLineItem 포함) |
589 | 530 |
@author kyouho |
590 | 531 |
@date 2018.07.31 |
HYTOS/HYTOS/QtImageViewerScene.py | ||
---|---|---|
42 | 42 |
QGraphicsScene.removeItem(self, item) |
43 | 43 |
self.contents_changed.emit() |
44 | 44 |
|
45 |
def to_xml(self, selectItems): |
|
46 |
from xml.etree import ElementTree |
|
47 |
from AppDocData import AppDocData |
|
48 |
from SymbolBase import SymbolBase |
|
49 |
from SymbolSvgItem import SymbolSvgItem |
|
50 |
|
|
51 |
import uuid |
|
52 |
app_doc_data = AppDocData.instance() |
|
53 |
root = ElementTree.Element("DATA") |
|
54 |
for selectItem in selectItems: |
|
55 |
if issubclass(type(selectItem), SymbolSvgItem): |
|
56 |
parent = ElementTree.Element("SYMBOL") |
|
57 |
root.append(parent) |
|
58 |
symboTemplate = app_doc_data.getTemplateSymbol(selectItem.dbUid) |
|
59 |
symbolBase = SymbolBase(selectItem.uid, |
|
60 |
selectItem.name, |
|
61 |
selectItem.category, |
|
62 |
selectItem.type, |
|
63 |
symboTemplate[0][2], |
|
64 |
symboTemplate[0][3]) |
|
65 |
|
|
66 |
uidElement = ElementTree.SubElement(parent, "uid") |
|
67 |
uidElement.text = str(symbolBase.uid) |
|
68 |
|
|
69 |
dbUidElement = ElementTree.SubElement(parent, "dbUid") |
|
70 |
dbUidElement.text = str(selectItem.dbUid) |
|
71 |
|
|
72 |
nameElement = ElementTree.SubElement(parent, "name") |
|
73 |
nameElement.text = str(symbolBase.sName) |
|
74 |
|
|
75 |
categoryElement = ElementTree.SubElement(parent, "category") |
|
76 |
categoryElement.text = str(symbolBase.sCategory) |
|
77 |
|
|
78 |
typeElement = ElementTree.SubElement(parent, "type") |
|
79 |
typeElement.text = str(symbolBase.sType) |
|
80 |
|
|
81 |
scaleElement = ElementTree.SubElement(parent, "scale") |
|
82 |
scaleElement.text = str(selectItem._scale) |
|
83 |
|
|
84 |
angleElement = ElementTree.SubElement(parent, "angle") |
|
85 |
angleElement.text = str(selectItem.angle) |
|
86 |
|
|
87 |
originalPointElement = ElementTree.SubElement(parent, "originalPoint") |
|
88 |
originalPointElement.text = str(symbolBase.originalPoint) |
|
89 |
|
|
90 |
connectionPointElement = ElementTree.SubElement(parent, "connectionPoint") |
|
91 |
connectionPointElement.text = str(symbolBase.connectionPoint) |
|
92 |
|
|
93 |
tree = ElementTree.ElementTree(root) |
|
94 |
|
|
95 |
tree.write("filename.xml", xml_declaration=True, encoding='utf-8') |
|
96 |
|
|
97 |
return root |
|
98 |
|
|
45 | 99 |
def keyPressEvent(self, event): |
46 | 100 |
"""delete selected items when press delete key""" |
47 | 101 |
from SymbolSvgItem import SymbolSvgItem |
... | ... | |
56 | 110 |
(issubclass(type(item), QGraphicsPathItem))] |
57 | 111 |
|
58 | 112 |
self._undo_stack.push(DeleteCommand(self, selected)) |
113 |
elif event.key() == Qt.Key_C and event.modifiers() & Qt.ControlModifier: |
|
114 |
from xml.etree import ElementTree |
|
115 |
selected = self.to_xml([item for item in self.selectedItems() |
|
116 |
if issubclass(type(item), SymbolSvgItem)]) |
|
117 |
if selected: |
|
118 |
xmlStr = str(ElementTree.tostring(selected, encoding='utf-8', method='xml')) |
|
119 |
xmlStr = xmlStr[xmlStr.find('<DATA>'):xmlStr.find('</DATA>') + 7] |
|
120 |
QApplication.clipboard().setText(xmlStr) |
|
121 |
elif event.key() == Qt.Key_V and event.modifiers() & Qt.ControlModifier: |
|
122 |
clipBoardText = QApplication.clipboard().text() |
|
123 |
if clipBoardText.find('<DATA>') > -1 and clipBoardText.find('</DATA>') > -1: |
|
124 |
from xml.etree import ElementTree |
|
125 |
from SymbolBase import SymbolBase |
|
126 |
elementXml = ElementTree.fromstring(clipBoardText) |
|
127 |
for elementSymbol in elementXml.findall('SYMBOL'): |
|
128 |
|
|
129 |
symbolUID = str(elementSymbol.find('uid').text) |
|
130 |
symboldbUid = str(elementSymbol.find('dbUid').text) |
|
131 |
symbolType = str(elementSymbol.find('type').text) |
|
132 |
symbolName = str(elementSymbol.find('name').text) |
|
133 |
symbolCategory = str(elementSymbol.find('category').text) |
|
134 |
angle = str(elementSymbol.find('angle').text) |
|
135 |
scale = str(elementSymbol.find('scale').text) |
|
136 |
symbolOriginalPoint = str(elementSymbol.find('originalPoint').text) |
|
137 |
symbolConnectionPoint = str(elementSymbol.find('connectionPoint').text) |
|
138 |
symbol = SymbolBase(symboldbUid, symbolName, symbolCategory, symbolType, symbolOriginalPoint, |
|
139 |
symbolConnectionPoint) |
|
140 |
|
|
141 |
svg = self.createSymbolObject(symboldbUid, scale, angle) |
|
142 |
if svg: |
|
143 |
pt = self.views()[0].mapFromGlobal(QCursor.pos()) |
|
144 |
pt = self.views()[0].mapToScene(pt) |
|
145 |
self.place_symbol(svg, pt) |
|
59 | 146 |
elif event.key() == Qt.Key_Z and event.modifiers() & Qt.ControlModifier: |
60 | 147 |
self._undo_stack.undo() |
61 | 148 |
elif event.key() == Qt.Key_R and event.modifiers() & Qt.ControlModifier: |
... | ... | |
82 | 169 |
self._pressed_position = None |
83 | 170 |
super(QtImageViewerScene, self).mouseReleaseEvent(event) |
84 | 171 |
|
172 |
''' |
|
173 |
@brief drop create Symbol |
|
174 |
@author kyouho |
|
175 |
@date 2018.07.27 |
|
176 |
''' |
|
177 |
|
|
178 |
def createSymbolObject(self, uid, scale, angle): |
|
179 |
from AppDocData import AppDocData |
|
180 |
from SymbolSvgItem import SymbolSvgItem |
|
181 |
import symbol |
|
182 |
|
|
183 |
app_doc_data = AppDocData.instance() |
|
184 |
symbol = app_doc_data.getSymbolByQuery('uid', uid) |
|
185 |
svgFileName = symbol.sName |
|
186 |
svgType = symbol.sType |
|
187 |
svgAngle = 0 |
|
188 |
svgScale = 1 |
|
189 |
svgOrigin = symbol.originalPoint |
|
190 |
svgFilePath = os.path.join(app_doc_data.symbol_file_path, symbol.getCategory(), symbol.getType(), |
|
191 |
svgFileName + '.svg') |
|
192 |
svg = SymbolSvgItem.createItem(symbol.getType(), None, owner=None, flip=0, symbol=uid) |
|
193 |
connPts = None |
|
194 |
strConnPts = symbol.connectionPoint |
|
195 |
if strConnPts is not None and strConnPts != '': |
|
196 |
connPts = [(float(x.split(',')[0]), float(x.split(',')[1])) if len(x.split(',')) == 2 else ( |
|
197 |
x.split(',')[0], float(x.split(',')[1]), float(x.split(',')[2])) \ |
|
198 |
for x in strConnPts.split('/')] |
|
199 |
|
|
200 |
svg.buildItem(svgFileName, svgType, svgAngle, svgScale, None, svgOrigin, connPts, uid) |
|
201 |
|
|
202 |
return svg |
|
203 |
|
|
204 |
''' |
|
205 |
@brief match symbol to line |
|
206 |
@author kyouho |
|
207 |
@date 2018.07.27 |
|
208 |
@history humkyung 2018.08.23 change scenePos to connector's center when symbol is placed on connector |
|
209 |
''' |
|
210 |
|
|
211 |
def place_symbol(self, svg, scenePos): |
|
212 |
from EngineeringConnectorItem import QEngineeringConnectorItem |
|
213 |
from CreateCommand import CreateCommand |
|
214 |
|
|
215 |
items = [item for item in self.items(scenePos) if type(item) is not QGraphicsPixmapItem] |
|
216 |
if len(items) > 0 and type(items[0]) is QEngineeringConnectorItem: |
|
217 |
scenePos = QPointF(items[0].center()[0], items[0].center()[1]) |
|
218 |
|
|
219 |
transform = QTransform() |
|
220 |
transform.translate(scenePos.x() - svg.symbolOrigin[0], scenePos.y() - svg.symbolOrigin[1]) |
|
221 |
svg.setTransform(transform) |
|
222 |
svg.loc = [round(scenePos.x() - svg.symbolOrigin[0], 1), round(scenePos.y() - svg.symbolOrigin[1], 1)] |
|
223 |
svg.size = [svg.boundingRect().width(), svg.boundingRect().height()] |
|
224 |
svg.origin = [round(scenePos.x(), 1), round(scenePos.y(), 1)] |
|
225 |
self.addItem(svg) |
|
226 |
|
|
227 |
self.undo_stack.push(CreateCommand(self, [svg, ])) |
|
228 |
|
|
229 |
svg.transfer.onRemoved.connect(self.parent().on_item_removed) |
|
230 |
|
|
231 |
self.clearFocus() |
|
232 |
for item in self.selectedItems(): |
|
233 |
item.setSelected(False) |
|
234 |
|
|
85 | 235 |
""" |
86 | 236 |
def rectForTile(self, x, y): |
87 | 237 |
# Return the rectangle for the tile at position (x, y). |
내보내기 Unified diff