MoveTitleBlockForms.py
# IN[0]=move_report, IN[1]=audit_report ; OUT="Shown"/error
# WPF window with Copy Audit / Copy All / Save Audit… buttons.
import clr
clr.AddReference('PresentationFramework')
clr.AddReference('PresentationCore')
clr.AddReference('WindowsBase')
import System
from System import DateTime
from System.Collections import IDictionary, IEnumerable
from System.Windows import Window, Application, Thickness, GridLength, GridUnitType, Clipboard
from System.Windows.Controls import Grid, TextBlock, ListBox, RowDefinition, Button, StackPanel, TextBox
from Microsoft.Win32 import SaveFileDialog
# no RoutedEventHandler import needed
move_report = IN[0] if len(IN)>0 else []
audit_report = IN[1] if len(IN)>1 else []
def as_seq(x):
if x is None: return []
if isinstance(x, (list, tuple)): return x
if isinstance(x, IEnumerable) and not isinstance(x, str):
return [i for i in x]
return [x]
def try_get(rec, key, default=None):
if isinstance(rec, dict): return rec.get(key, default)
if isinstance(rec, IDictionary):
try:
if key in rec.Keys: return rec[key]
except: pass
return default
def move_line(rec):
sh = try_get(rec, "sheet", "?")
nm = try_get(rec, "name", "?")
st = try_get(rec, "status", "?")
d = try_get(rec, "delta", None)
c = try_get(rec, "moved_count", try_get(rec, "count", None))
skipped = try_get(rec, "skipped_cad_name_like_0_0", None)
s = 'Sheet {0} "{1}": {2}'.format(sh, nm, st)
if d: s += " | delta {0}".format(d)
if c is not None: s += " | {0} elems".format(c)
if skipped is not None: s += " | skipped CAD: {0}".format(skipped)
return s
def audit_block(rec):
sh = try_get(rec, "sheet", "?")
nm = try_get(rec, "name", "?")
cnt = try_get(rec, "offender_count", 0)
offenders = as_seq(try_get(rec, "offenders", []))
lines = ['Sheet {0} "{1}": {2} outside'.format(sh, nm, cnt)]
for o in offenders:
oid = try_get(o, "Id", "?")
cat = try_get(o, "Category", "NoCategory")
lines.append(" Id {0} | {1}".format(oid, cat))
return "\n".join(lines)
def build_move_text(data): return "\n".join([move_line(r) for r in as_seq(data)])
def build_audit_text(data): return "\n\n".join([audit_block(r) for r in as_seq(data)])
class ReportWindow(Window):
def __init__(self, move_data, audit_data):
self.Title = "Sheet Normalize + Audit"
self.Width = 900
self.Height = 650
self.move_text = build_move_text(move_data)
self.audit_text = build_audit_text(audit_data)
self.timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm")
g = Grid(); g.Margin = Thickness(10)
g.RowDefinitions.Add(RowDefinition()) # buttons
g.RowDefinitions.Add(RowDefinition()); g.RowDefinitions[1].Height = GridLength(1, GridUnitType.Star) # move
g.RowDefinitions.Add(RowDefinition()); g.RowDefinitions[2].Height = GridLength(1, GridUnitType.Star) # audit
g.RowDefinitions.Add(RowDefinition()); g.RowDefinitions[3].Height = GridLength(2, GridUnitType.Star) # text
# Buttons
btnPanel = StackPanel(); btnPanel.Orientation = System.Windows.Controls.Orientation.Horizontal
btnPanel.Margin = Thickness(0,0,0,8)
btnCopyAudit = Button(); btnCopyAudit.Content = "Copy Audit"; btnCopyAudit.Margin = Thickness(0,0,8,0)
btnCopyAll = Button(); btnCopyAll.Content = "Copy All"; btnCopyAll.Margin = Thickness(0,0,8,0)
btnSaveAudit = Button(); btnSaveAudit.Content = "Save Audit…"
btnPanel.Children.Add(btnCopyAudit); btnPanel.Children.Add(btnCopyAll); btnPanel.Children.Add(btnSaveAudit)
# Button handlers (plain Python funcs; no RoutedEventHandler)
def on_copy_audit(sender, e):
try:
Clipboard.SetText(self.audit_text if self.audit_text else "(no audit data)")
except Exception as ex:
Clipboard.SetText("Copy failed: {0}".format(ex))
def on_copy_all(sender, e):
blob = "=== Relocation Report ===\n{0}\n\n=== Out-of-Bounds Audit ===\n{1}\n\nGenerated: {2}".format(
self.move_text or "(no move data)",
self.audit_text or "(no audit data)",
self.timestamp
)
try: Clipboard.SetText(blob)
except Exception as ex: Clipboard.SetText("Copy failed: {0}".format(ex))
def on_save_audit(sender, e):
dlg = SaveFileDialog()
dlg.Title = "Save Audit Report"
dlg.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*"
dlg.FileName = "sheet_audit_{0}.txt".format(DateTime.Now.ToString("yyyyMMdd_HHmm"))
if dlg.ShowDialog():
from System.IO import File
try: File.WriteAllText(dlg.FileName, self.audit_text or "(no audit data)")
except Exception as ex: Clipboard.SetText("Save failed: {0}".format(ex))
btnCopyAudit.Click += on_copy_audit
btnCopyAll.Click += on_copy_all
btnSaveAudita.Click += on_save_audit
# Move list
tb1 = TextBlock(); tb1.Text = "Relocation Report"; tb1.Margin = Thickness(0,0,0,4)
lb1 = ListBox()
for rec in as_seq(move_data): lb1.Items.Add(move_line(rec))
# Audit list
tb2 = TextBlock(); tb2.Text = "Out-of-Bounds Audit"; tb2.Margin = Thickness(0,6,0,4)
lb2 = ListBox()
for rec in as_seq(audit_data): lb2.Items.Add(audit_block(rec))
# Combined text box (easy copy)
txt = TextBox()
txt.Margin = Thickness(0,8,0,0)
txt.TextWrapping = System.Windows.TextWrapping.Wrap
txt.AcceptsReturn = True
txt.IsReadOnly = True
txt.VerticalScrollBarVisibility = System.Windows.Controls.ScrollBarVisibility.Auto
txt.Text = "=== Relocation Report ===\n{0}\n\n=== Out-of-Bounds Audit ===\n{1}\n".format(
self.move_text or "(no move data)",
self.audit_text or "(no audit data)"
)
g.Children.Add(btnPanel); System.Windows.Controls.Grid.SetRow(btnPanel, 0)
g.Children.Add(tb1); System.Windows.Controls.Grid.SetRow(tb1, 1)
g.Children.Add(lb1); System.Windows.Controls.Grid.SetRow(lb1, 1)
g.Children.Add(tb2); System.Windows.Controls.Grid.SetRow(tb2, 2)
g.Children.Add(lb2); System.Windows.Controls.Grid.SetRow(lb2, 2)
g.Children.Add(txt); System.Windows.Controls.Grid.SetRow(txt, 3)
self.Content = g
try:
app = Application.Current if Application.Current else Application()
win = ReportWindow(move_report, audit_report)
win.Show()
OUT = "Shown"
except Exception as ex:
OUT = "Failed to show: {0}".format(ex)
Comments
Post a Comment