From aceec95a39eeb828195ac1d1d8db15b1ead2c56f Mon Sep 17 00:00:00 2001 From: wandererfan Date: Mon, 20 Oct 2025 18:42:28 -0400 Subject: [PATCH 1/3] [TD]defend against deleted object error - App.ActiveDocument.Objects was returning a deleted object Most likely due to shenanigans with DrawViewPart/DrawProjGroup item in TaskProjGroup. --- .../CommandFillTemplateFields.py | 62 ++++++++++--------- .../TechDrawTools/TaskFillTemplateFields.py | 16 +++-- 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/src/Mod/TechDraw/TechDrawTools/CommandFillTemplateFields.py b/src/Mod/TechDraw/TechDrawTools/CommandFillTemplateFields.py index 3ec1ab5759..00c7afca3e 100644 --- a/src/Mod/TechDraw/TechDrawTools/CommandFillTemplateFields.py +++ b/src/Mod/TechDraw/TechDrawTools/CommandFillTemplateFields.py @@ -62,37 +62,39 @@ class CommandFillTemplateFields: """Return True when the command should be active or False when it should be disabled (greyed).""" if App.ActiveDocument: - objs = App.ActiveDocument.Objects + objs = App.ActiveDocument.findObjects(Type="TechDraw::DrawPage") + if not objs: + return false + for obj in objs: - if obj.TypeId == "TechDraw::DrawPage": - file_path = ( - App.getResourceDir() - + "Mod/TechDraw/CSVdata/FillTemplateFields.csv" - ) - if os.path.exists(file_path): - listofkeys = [ - "CreatedByChkLst", - "ScaleChkLst", - "LabelChkLst", - "CommentChkLst", - "CompanyChkLst", - "LicenseChkLst", - "CreatedDateChkLst", - "LastModifiedDateChkLst", - ] - with codecs.open(file_path, encoding="utf-8") as fp: - reader = csv.DictReader(fp) - page = obj - texts = page.Template.EditableTexts - if ( - texts - and os.path.exists(file_path) - and listofkeys == reader.fieldnames - and obj.Views != [] - ): - return True - else: - return False + file_path = ( + App.getResourceDir() + + "Mod/TechDraw/CSVdata/FillTemplateFields.csv" + ) + if os.path.exists(file_path): + listofkeys = [ + "CreatedByChkLst", + "ScaleChkLst", + "LabelChkLst", + "CommentChkLst", + "CompanyChkLst", + "LicenseChkLst", + "CreatedDateChkLst", + "LastModifiedDateChkLst", + ] + with codecs.open(file_path, encoding="utf-8") as fp: + reader = csv.DictReader(fp) + page = obj + texts = page.Template.EditableTexts + if ( + texts + and os.path.exists(file_path) + and listofkeys == reader.fieldnames + and obj.Views != [] + ): + return True + return false + # diff --git a/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py b/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py index d39de1b0ca..1660932085 100644 --- a/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py +++ b/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py @@ -91,11 +91,11 @@ keyLst = [] class TaskFillTemplateFields: def __init__(self): - objs = App.ActiveDocument.Objects + objs = App.ActiveDocument.findObjects(Type="TechDraw::DrawPage") + for obj in objs: if ( - obj.TypeId == "TechDraw::DrawPage" - and os.path.exists(file_path) + os.path.exists(file_path) and listofkeys == reader.fieldnames ): self.page = obj @@ -117,10 +117,14 @@ class TaskFillTemplateFields: projgrp_view = None for pageObj in obj.Views: - if pageObj.isDerivedFrom("TechDraw::DrawViewPart"): - projgrp_view = self.page.Views[0] - elif pageObj.isDerivedFrom("TechDraw::DrawProjGroup"): + if ( + pageObj.isDerivedFrom("TechDraw::DrawViewPart") + or pageObj.isDerivedFrom("TechDraw::DrawProjGroup") + ): + # should this not be pageObj? this is looking for any DVP or DPG on the page? + # Views[0] could be an annotation or symbol or ??? - WF projgrp_view = self.page.Views[0] + break self.texts = self.page.Template.EditableTexts From 127aa38c8cbdeaa0914b52d334396eb44c1d150a Mon Sep 17 00:00:00 2001 From: wandererfan Date: Thu, 23 Oct 2025 12:49:33 -0400 Subject: [PATCH 2/3] [TD]restore undo/redo function in FillTemplates --- src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py b/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py index 1660932085..1e9cfa7b69 100644 --- a/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py +++ b/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py @@ -433,7 +433,7 @@ class TaskFillTemplateFields: self.dialog.show() self.dialog.exec_() - App.setActiveTransaction("Fill template fields") +# App.setActiveTransaction("Fill template fields") else: msgBox = QtGui.QMessageBox() msgTitle = QtCore.QT_TRANSLATE_NOOP( @@ -524,17 +524,20 @@ class TaskFillTemplateFields: self.button.setEnabled(False) def proceed(self): + transactionName = QtCore.QT_TRANSLATE_NOOP("Techdraw_FillTemplateFields", "Fill template fields") + App.setActiveTransaction(transactionName) i = 0 for cb in self.checkBoxList: if cb.isChecked(): self.texts[keyLst[i]] = self.lineTextList[i].text() i += 1 self.page.Template.EditableTexts = self.texts + App.closeActiveTransaction(False) self.close() App.closeActiveTransaction() def close(self): self.dialog.hide() - App.closeActiveTransaction(True) +# App.closeActiveTransaction(True) return True From eac9478b6c09ee687a688fc1b6816356cdda6ab8 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Mon, 27 Oct 2025 18:16:11 -0400 Subject: [PATCH 3/3] [TD]use scale from view to fill template --- src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py b/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py index 1e9cfa7b69..d7c2c4b859 100644 --- a/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py +++ b/src/Mod/TechDraw/TechDrawTools/TaskFillTemplateFields.py @@ -121,9 +121,9 @@ class TaskFillTemplateFields: pageObj.isDerivedFrom("TechDraw::DrawViewPart") or pageObj.isDerivedFrom("TechDraw::DrawProjGroup") ): - # should this not be pageObj? this is looking for any DVP or DPG on the page? - # Views[0] could be an annotation or symbol or ??? - WF - projgrp_view = self.page.Views[0] + # use the scale from the first DVP or DPG encountered to fill the template's + # Scale editable text. + projgrp_view = pageObj break self.texts = self.page.Template.EditableTexts @@ -539,5 +539,4 @@ class TaskFillTemplateFields: def close(self): self.dialog.hide() -# App.closeActiveTransaction(True) return True