From 13ff11293a7510a524407a0e27e55f9841b9a37a Mon Sep 17 00:00:00 2001 From: Youen Date: Mon, 2 Jan 2023 16:43:11 +0100 Subject: [PATCH] Added code to initialize pages when loading a document (fix for balloons visibility and image file path) --- ahb_document_observer.py | 22 ++++++++++++++++++- ahb_raster_view.py | 4 ++-- ahb_techdraw_extensions.py | 43 +++++++++++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/ahb_document_observer.py b/ahb_document_observer.py index 37c0634..a97bf50 100644 --- a/ahb_document_observer.py +++ b/ahb_document_observer.py @@ -43,11 +43,28 @@ class DocLinkObserver: class DocObserver: changed_object_by_type = {} selection_by_type = {} + doc_callbacks = {} was_selected = [] def __init__(self): Gui.Selection.addObserver(self) + + def slotActivateDocument(self, doc): + #print('slotActivateDocument', doc.Name) + self._triggerDocumentEvent(doc, 'activate') + + def slotCreatedDocument(self, doc): + #print('slotCreatedDocument', doc.Name) + self._triggerDocumentEvent(doc, 'created') + + def slotDeletedDocument(self, doc): + #print('slotDeletedDocument', doc.Name) + self._triggerDocumentEvent(doc, 'deleted') + + def _triggerDocumentEvent(self, doc, event): + for callback in self.doc_callbacks.values(): + callback(doc, event) def slotChangedObject(self, obj, prop): #print("object changed: " + str(obj).replace('<', '').replace(' object>', '') + " " + obj.Name + " : " + str(prop)) @@ -94,4 +111,7 @@ class DocObserver: if callbacks is None: callbacks = {} self.selection_by_type[type_id] = callbacks - callbacks[callback_id] = callback \ No newline at end of file + callbacks[callback_id] = callback + + def onDocumentEvent(self, callback_id: str, callback): + self.doc_callbacks[callback_id] = callback diff --git a/ahb_raster_view.py b/ahb_raster_view.py index cb89073..8913a25 100644 --- a/ahb_raster_view.py +++ b/ahb_raster_view.py @@ -207,7 +207,7 @@ class RasterView: self.image_view.Assembly_handbook_ViewVolumeHeight = viewVolume.getHeight() self.image_view.Assembly_handbook_ViewVolumeDepth = viewVolume.getDepth() - max_res = 3200 # todo: keep aspect ratio when we limit max image dimensions + max_res = 3200 #max_res = 1500 resolution = [ int(viewVolume.getWidth() * view.Scale * 10), @@ -291,7 +291,7 @@ class RasterView: image.Scale = image_scale image.X = view.X image.Y = view.Y - image.ImageFile = self.image_file_name # TODO: see if it's possible to set a relative path + image.ImageFile = self.image_file_name image.ViewObject.Crop = True image.Width = composite_img.size[0] * image_scale / 10.0 * 1.01 image.Height = composite_img.size[1] * image_scale / 10.0 * 1.01 diff --git a/ahb_techdraw_extensions.py b/ahb_techdraw_extensions.py index 7336d69..43dda58 100644 --- a/ahb_techdraw_extensions.py +++ b/ahb_techdraw_extensions.py @@ -77,10 +77,16 @@ class TechDrawExtensions: enable_selected_part_highlight = False # disable for now, for performance reasons + initialized_documents = [] + def __init__(self): workbench = Gui.getWorkbench("AssemblyHandbookWorkbench") #: :type workbench: AssemblyHandbookWorkbench 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)) + workbench.docObserver.onDocumentEvent('techdrawext_doc_event', lambda doc, event: self.onDocumentEvent(doc, event)) + + if App.ActiveDocument is not None: + self.onDocumentEvent(App.ActiveDocument, 'activate') def repaint(self, view, fast_render = True): self.views_to_repaint[view] = fast_render @@ -646,8 +652,20 @@ class TechDrawExtensions: QTimer.singleShot(10, restoreKeepUpdated) def refreshOverlays(self, page, callback = None): + import os + + doc = page.Document + for image in page.Views: + if image.TypeId == 'TechDraw::DrawViewImage': + folder_name = '/' + os.path.basename(doc.FileName).replace('.FCStd', '') + '_raster/' + if folder_name in image.ImageFile: + full_path = doc.FileName.replace('.FCStd', '') + '_raster/' + image.ImageFile.split(folder_name)[1] + if image.ImageFile != full_path: + image.ImageFile = full_path + if page.KeepUpdated: - callback() + if callback: + callback() else: page.KeepUpdated = True def restoreKeepUpdated(): @@ -772,3 +790,26 @@ class TechDrawExtensions: cache = ViewCache() self.view_cache[view] = cache return cache + + def onDocumentEvent(self, doc, event): + if event == 'activate': + if doc not in self.initialized_documents: + self.initialized_documents.append(doc) + self.initializeDocument(doc) + elif event == 'deleted': + if doc in self.initialized_documents: + self.initialized_documents.remove(doc) + + def initializeDocument(self, doc): + def doInit(): + try: + for obj in doc.Objects: + if obj.TypeId == 'TechDraw::DrawPage': + self.onPageLoaded(obj) + except: + pass + + QTimer.singleShot(0, doInit) + + def onPageLoaded(self, page): + self.refreshOverlays(page)