|
|
|
@ -2,14 +2,69 @@ import FreeCAD as App
|
|
|
|
|
import FreeCADGui as Gui |
|
|
|
|
|
|
|
|
|
from PySide.QtCore import QTimer |
|
|
|
|
from pickle import TRUE |
|
|
|
|
|
|
|
|
|
import TechDraw, TechDrawGui |
|
|
|
|
from PySide import QtGui, QtCore |
|
|
|
|
TDG = TechDrawGui |
|
|
|
|
|
|
|
|
|
class CursorItem(QtGui.QGraphicsItem): |
|
|
|
|
def __init__(self, parent = None, view = None): |
|
|
|
|
super().__init__(parent) |
|
|
|
|
self.Type = QtGui.QGraphicsItem.UserType + 501 |
|
|
|
|
self.setZValue(500) |
|
|
|
|
self.margin = 10.0 |
|
|
|
|
self.size = 100.0 |
|
|
|
|
self.view = view |
|
|
|
|
|
|
|
|
|
def onViewPosChange(self, callback): |
|
|
|
|
self.viewPosChangeCallback = callback |
|
|
|
|
|
|
|
|
|
def boundingRect(self): |
|
|
|
|
return QtCore.QRectF(-self.size/2 - self.margin, -self.size/2 - self.margin, |
|
|
|
|
self.size + 2.0*self.margin, self.size + 2.0*self.margin) |
|
|
|
|
|
|
|
|
|
def paint(self, painter, option, widget): |
|
|
|
|
#print("paint") |
|
|
|
|
painter.setBrush(QtCore.Qt.darkRed) |
|
|
|
|
#painter.drawRoundedRect(-100, -100, 200, 200, 50, 50) |
|
|
|
|
h = self.size/2.0 |
|
|
|
|
painter.drawLine(-h, 0, h, 0) |
|
|
|
|
painter.drawLine(0, -h, 0, h) |
|
|
|
|
|
|
|
|
|
def mousePressEvent(self, event): |
|
|
|
|
#print('mouse press', event) |
|
|
|
|
self.startMovePos = event.pos() |
|
|
|
|
|
|
|
|
|
def mouseMoveEvent(self, event): |
|
|
|
|
#print('mouse move', event) |
|
|
|
|
offset = event.pos() - self.startMovePos |
|
|
|
|
self.moveBy(offset.x(), offset.y()) |
|
|
|
|
|
|
|
|
|
def mouseReleaseEvent(self, event): |
|
|
|
|
#print('mouse release', event) |
|
|
|
|
#print('new pos', self.x(), self.y()) |
|
|
|
|
if self.viewPosChangeCallback is not None: |
|
|
|
|
self.viewPosChangeCallback(self.getViewPos()) |
|
|
|
|
|
|
|
|
|
def getViewPos(self): |
|
|
|
|
scale = self.view.Scale * 10.0 |
|
|
|
|
return App.Vector(self.x() / scale, -self.y() / scale) |
|
|
|
|
|
|
|
|
|
def setViewPos(self, p): |
|
|
|
|
scale = self.view.Scale * 10.0 |
|
|
|
|
self.setPos(p.x * scale, -p.y * scale) |
|
|
|
|
|
|
|
|
|
class TechDrawExtensions: |
|
|
|
|
views_to_repaint = {} |
|
|
|
|
|
|
|
|
|
view_cursors = {} |
|
|
|
|
|
|
|
|
|
updating_balloon = False |
|
|
|
|
|
|
|
|
|
def __init__(self): |
|
|
|
|
workbench = Gui.getWorkbench("AssemblyHandbookWorkbench") #: :type workbench: AssemblyHandbookWorkbench |
|
|
|
|
workbench.docObserver.onObjectTypeSelected('view_annotate_balloon_selected', 'TechDraw::DrawViewBalloon', lambda operation, obj, sub, point: self.onBalloonSelected(operation, obj, sub, point)) |
|
|
|
|
workbench.docObserver.onObjectTypeChanged('balloon_changed', 'TechDraw::DrawViewBalloon', lambda obj, prop: self.onBalloonChanged(obj, prop)) |
|
|
|
|
workbench.docObserver.onObjectTypeSelected('balloon_selected', 'TechDraw::DrawViewBalloon', lambda operation, obj, sub, point: self.onBalloonSelected(operation, obj, sub, point)) |
|
|
|
|
|
|
|
|
|
def repaint(self, view): |
|
|
|
|
self.views_to_repaint[view] = True |
|
|
|
@ -24,7 +79,7 @@ class TechDrawExtensions:
|
|
|
|
|
self.views_to_repaint = {} |
|
|
|
|
|
|
|
|
|
for view in to_repaint: |
|
|
|
|
print("Repainting " + view.Name) |
|
|
|
|
#print("Repainting " + view.Name) |
|
|
|
|
|
|
|
|
|
selected_balloons = [] |
|
|
|
|
for obj in Gui.Selection.getSelection(): |
|
|
|
@ -81,6 +136,35 @@ class TechDrawExtensions:
|
|
|
|
|
is_first_part = False |
|
|
|
|
|
|
|
|
|
view.requestPaint() |
|
|
|
|
|
|
|
|
|
cursor = self.view_cursors.get(view, None) |
|
|
|
|
if cursor is None: |
|
|
|
|
cursor = CursorItem(view = view) |
|
|
|
|
TDG.addQGIToView(view, cursor); |
|
|
|
|
cursor.onViewPosChange(lambda new_pos: self.onCursorMoved(view, new_pos)) |
|
|
|
|
self.view_cursors[view] = cursor |
|
|
|
|
|
|
|
|
|
if selected_balloons[0] is None: |
|
|
|
|
cursor.setVisible(False) |
|
|
|
|
else: |
|
|
|
|
cursor.setViewPos(App.Vector(selected_balloons[0].OriginX, selected_balloons[0].OriginY)) |
|
|
|
|
cursor.setVisible(True) |
|
|
|
|
|
|
|
|
|
def onCursorMoved(self, view, new_pos): |
|
|
|
|
if len(Gui.Selection.getSelection()) == 0: return |
|
|
|
|
balloon = Gui.Selection.getSelection()[0] |
|
|
|
|
if balloon.TypeId != 'TechDraw::DrawViewBalloon' or not 'AssemblyHandbook_PartName' in balloon.PropertiesList: return |
|
|
|
|
if balloon.SourceView != view: return |
|
|
|
|
|
|
|
|
|
balloon.OriginX = new_pos.x |
|
|
|
|
balloon.OriginY = new_pos.y |
|
|
|
|
|
|
|
|
|
obj = balloon.Document.getObject(balloon.AssemblyHandbook_PartName) |
|
|
|
|
view = balloon.SourceView |
|
|
|
|
center = self.computePartCenter(view, obj) |
|
|
|
|
|
|
|
|
|
balloon.AssemblyHandbook_OriginOffsetX = new_pos.x - center.x |
|
|
|
|
balloon.AssemblyHandbook_OriginOffsetY = new_pos.y - center.y |
|
|
|
|
|
|
|
|
|
def onBalloonSelected(self, operation, balloon, sub, point): |
|
|
|
|
import time |
|
|
|
@ -90,6 +174,35 @@ class TechDrawExtensions:
|
|
|
|
|
#print(operation + " " + balloon.Name) |
|
|
|
|
view = balloon.SourceView |
|
|
|
|
self.repaint(view) |
|
|
|
|
|
|
|
|
|
def onBalloonChanged(self, obj, prop): |
|
|
|
|
# Avoid reentry |
|
|
|
|
if self.updating_balloon: |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
#print('Balloon changed: ' + obj.Name + '.' + prop) |
|
|
|
|
if prop == 'Y' and "AssemblyHandbook_PartName" in obj.PropertiesList: |
|
|
|
|
self.updating_balloon = True |
|
|
|
|
self.updateBalloon(obj) |
|
|
|
|
self.updating_balloon = False |
|
|
|
|
|
|
|
|
|
def updateBalloon(self, balloon): |
|
|
|
|
workbench = Gui.getWorkbench("AssemblyHandbookWorkbench") #: :type workbench: AssemblyHandbookWorkbench |
|
|
|
|
|
|
|
|
|
view = balloon.SourceView |
|
|
|
|
doc = view.Document |
|
|
|
|
obj = doc.getObject(balloon.AssemblyHandbook_PartName) |
|
|
|
|
|
|
|
|
|
objectCenterView = workbench.techDrawExtensions.computePartCenter(view, obj) |
|
|
|
|
|
|
|
|
|
balloon.OriginX = objectCenterView.x + balloon.AssemblyHandbook_OriginOffsetX |
|
|
|
|
balloon.OriginY = objectCenterView.y + balloon.AssemblyHandbook_OriginOffsetY |
|
|
|
|
|
|
|
|
|
balloon.Text = obj.LinkedObject.Document.Name if obj.TypeId == 'App::Link' else obj.Name |
|
|
|
|
balloon.ViewObject.Font = 'DejaVu Sans' |
|
|
|
|
balloon.ViewObject.Fontsize = 4 |
|
|
|
|
balloon.BubbleShape = 'Inspection' |
|
|
|
|
balloon.EndTypeScale = 4 |
|
|
|
|
|
|
|
|
|
def getViewPage(self, view): |
|
|
|
|
for obj in view.InList: |
|
|
|
|