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

Popular posts from this blog

Revit area plans adding new types and references (Gross and rentable)

Revit CSV file manager for families and re-exporting to a CSV file