From e1a2b6f59aecd858e195388144f298205550cb0e Mon Sep 17 00:00:00 2001 From: EF <> Date: Sun, 13 Apr 2025 18:49:10 +0200 Subject: [PATCH 01/18] DoorFlipState with changes in door - Initial Commit --- .../Door Flip State.pushbutton/icon.dark.png | Bin 0 -> 3288 bytes .../Door Flip State.pushbutton/icon.png | Bin 0 -> 3773 bytes .../Door Flip State.pushbutton/script.py | 166 ++++++++++++++++++ 3 files changed, 166 insertions(+) create mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.dark.png create mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.png create mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/script.py diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.dark.png b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..14d4ae45fab1ad775381692490b13d3ac761377f GIT binary patch literal 3288 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 HQ}q7;LD**J literal 0 HcmV?d00001 diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.png b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc7b2b96fd9f14210de8e66af8e28c442ee9c83 GIT binary patch literal 3773 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 if(Anschlagseite gespiegelt, "Tür Rechts", "Tür Links")) + +_____________________________________________________________________ +Prerequisites: +In familys as instance, standard value as "blocked" formula +[Parameter] - 'Türfamilienaufgehrichtung_standard' +[Parameter] - 'Türfamilienaufgehrichtung_gespiegelt' + +In project as instance: +[Parameter] - 'Flügel Aufgehrichtung' +_____________________________________________________________________ +Last update: + +- V 0.1 Creation(24.05.2021) +- V 0.2 (07.06.2021) + - Refactored + - Show Family/Types that did not have parameters set. +- V 0.3 (13.04.2025) + - List changes in doors +_____________________________________________________________________ + +""" +#-------------------------------------------------------------------------------------------------------------------- +#IMPORTS +# System +import time, sys +#pyRevit +from pyrevit import script + +from Autodesk.Revit.DB import * +from collections import defaultdict + +doc = __revit__.ActiveUIDocument.Document +uidoc = __revit__.ActiveUIDocument +app = __revit__.Application +output = script.get_output() +#-------------------------------------------------------------------------------------------------------------------- +#GLOBAL PARAMETERS +TUERAUFG_STANDARD_PARAMETER = "Türfamilienaufgehrichtung_standard" +TUERAUFG_STANDARD_GESPIEGELT_PARAMETER = "Türfamilienaufgehrichtung_gespiegelt" +TUERAUFG_WRITEBACK_PARAMETER = "Flügel Aufgehrichtung" +TUERAUFG_ERROR_VALUE = "-" # Value if the family does't have shared param. above + +#-------------------------------------------------------------------------------------------------------------------- +#MAIN +timer_start = time.time() + +# GET ALL DOORS +doors_collector = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors).WhereElementIsNotElementType().ToElements() +if not doors_collector: + sys.exit("No doors were found in the project.") + +# FUNCTION TO CHECK IF PARAMETER EXISTS +def parameter_exists(parameter_name): + binding_map = doc.ParameterBindings + iterator = binding_map.ForwardIterator() + iterator.Reset() + while iterator.MoveNext(): + if iterator.Key.Name == parameter_name: + return True + return False + +# CHECK IF TUERAUFG_WRITEBACK_PARAMETER EXISTS +if not parameter_exists(TUERAUFG_WRITEBACK_PARAMETER): + print("The parameter '{}' does not exist in the current document.".format(TUERAUFG_WRITEBACK_PARAMETER)) + print("Please create the parameter as an instance parameter, option different values for groupes,") + print("for the category doors in the project.") + + sys.exit() + +# CREATE CONTAINERS +count_parameter = 0 +count_not_parameter = 0 +doors_without_parameter = [] +data_doors_changed = [] + +t = Transaction(doc,__title__) +t.Start() +# CREATE A DICT FOR DOORS WITH CHANGED PARAMETERS +door_changed =[] +# LOOP THROUGH ALL DOORS +for door in doors_collector: + # GET VALUE + try: + if door.Mirrored: + value = door.LookupParameter(TUERAUFG_STANDARD_GESPIEGELT_PARAMETER).AsString() + else: + value = door.LookupParameter(TUERAUFG_STANDARD_PARAMETER).AsString() + count_parameter +=1 + + except: + # IF VALUE IS UNAVAILABLE - USE DEFAULT ERROR VALUE + value = TUERAUFG_ERROR_VALUE + count_not_parameter += 1 + + # LOG DOOR TYPE WITHOUT VALUE + door_family = door.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() + door_type = door.get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM).AsValueString() + door_name = "{family}-{type}".format(family=door_family, type=door_type) + if door_name not in doors_without_parameter: + doors_without_parameter.append(door_name) + + # SET PARAMETER + try: + # CHECK IF THE WRITEBACK PARAMETER EXISTS + door_out_param = door.LookupParameter(TUERAUFG_WRITEBACK_PARAMETER) + + # WRITE CHANGES IN PARAMETERS + door_out_param_old = door.LookupParameter(TUERAUFG_WRITEBACK_PARAMETER).AsString() + door_out_param_new = value + if door_out_param_old != door_out_param_new: + data_doors_changed.append(door_changed) + door_out_param_changed = "{} -> {}".format(door_out_param_old, door_out_param_new) + door_changed.append(door.Name) + door_changed.append(door_out_param_changed) + door_changed_link = output.linkify(door.Id) + door_changed.append(door_changed_link) + # SET DOOR FLIP STATE TO THE WRITEBACK PARAMETER + door_out_param.Set(str(value)) + except: + print("Please make sure OUT instance parameter exists: {}".format(TUERAUFG_WRITEBACK_PARAMETER)) + sys.exit() +t.Commit() + +# FINAL PRINT +output.print_md("\nNumber of doors found in the project: {} ".format(len(doors_collector))) +output.print_md("of theese with writeback parameters defined in door family: {}".format(count_parameter)) +output.print_md("without writeback parameters defined in door family: {a}".format(a=count_not_parameter,)) +output.print_md("The default writeback value for doors without defined values will be : "'"{b}"'" ".format(b=TUERAUFG_ERROR_VALUE)) +output.print_md("****************************************************************") +print("door families without writeback parameter defined in family:") +for door_type in doors_without_parameter: + print(door_type) + +print("****************************************************************") +print("Changes to previous run of the script:") + +# Create a table for changed parameter values +if data_doors_changed: + output.print_table(table_data=data_doors_changed, title="Doors with changed parameters:", columns=["Door", "Changed Value", "ElementId"]) +else: + output.print_md("No doors with changed parameters were found.") + +# End +output.print_md('---') +output.print_md('#### Script has finished in {}s'.format(time.time() - timer_start)) \ No newline at end of file From d32e04909d5a0e1ee333823b8ffbac3e19bb8bec Mon Sep 17 00:00:00 2001 From: EF <> Date: Thu, 1 May 2025 13:20:24 +0200 Subject: [PATCH 02/18] Integrated correct output in changes list --- .../Door Flip State.pushbutton/script.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/script.py index e1c27f7be..93f808a6c 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/script.py @@ -92,12 +92,12 @@ def parameter_exists(parameter_name): count_parameter = 0 count_not_parameter = 0 doors_without_parameter = [] +# CREATE A LIST FOR DOORS WITH CHANGED PARAMETERS data_doors_changed = [] t = Transaction(doc,__title__) t.Start() -# CREATE A DICT FOR DOORS WITH CHANGED PARAMETERS -door_changed =[] +#door_changed =[] # LOOP THROUGH ALL DOORS for door in doors_collector: # GET VALUE @@ -129,12 +129,10 @@ def parameter_exists(parameter_name): door_out_param_old = door.LookupParameter(TUERAUFG_WRITEBACK_PARAMETER).AsString() door_out_param_new = value if door_out_param_old != door_out_param_new: - data_doors_changed.append(door_changed) door_out_param_changed = "{} -> {}".format(door_out_param_old, door_out_param_new) - door_changed.append(door.Name) - door_changed.append(door_out_param_changed) + door_name = door.Name door_changed_link = output.linkify(door.Id) - door_changed.append(door_changed_link) + data_doors_changed.append([door_name, door_out_param_changed, door_changed_link]) # SET DOOR FLIP STATE TO THE WRITEBACK PARAMETER door_out_param.Set(str(value)) except: From 159bccad78920cb0215b317957d6279ce8e4dd0b Mon Sep 17 00:00:00 2001 From: EF <> Date: Thu, 1 May 2025 17:04:56 +0200 Subject: [PATCH 03/18] WIP --- .../Door Flip State.pushbutton/bundle.yaml | 0 .../DoorMirrorStateParam.txt | Bin 0 -> 1038 bytes .../Door Mirror State.pushbutton/bundle.yaml | 34 +++++ .../icon.dark.png | Bin 0 -> 3288 bytes .../Door Mirror State.pushbutton/icon.png | Bin 0 -> 3773 bytes .../Door Mirror State.pushbutton/script.py | 131 ++++++++++++++++++ 6 files changed, 165 insertions(+) create mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/bundle.yaml create mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/DoorMirrorStateParam.txt create mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml create mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/icon.dark.png create mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/icon.png create mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/bundle.yaml b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/bundle.yaml new file mode 100644 index 000000000..e69de29bb diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/DoorMirrorStateParam.txt b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/DoorMirrorStateParam.txt new file mode 100644 index 0000000000000000000000000000000000000000..1ab56ed711e05c908b13064a1763a7edb169a79c GIT binary patch literal 1038 zcmbW0OHaZ;6ot>WCjJK!cO)2EmB+F|RT7~_!N4kWK|3p2}oXm*m(fNrc#0$PTxtz{1{;syQCF5*s zhMi)K!H@;l1oTwT*fHyMi72b92pyq3UE-bVLLJ5G5qI%=8(G`s3lY%eyPeBA1{-Uj zGjbhNcwj@wr~d%8CLFm2y87?W;y+A1|R}M2F=9HR$xI1umBmH`h+C#Lf@g z=pDBl^ENX4Ror%`nz6$IZ$`yqu1MEdk7YMtUtz01)TSW!SVMMhvVR3#>8IKpb*WS9 zvup0EKAi!1n;-{QLwgwchgX?Ild%wAVj^=P&9<=*T&(3>7JJ pR`>!k#kuC>>*Sg&-&JkS2Az%N#6v0v`2SUJbFSXB{eQo!{{S<#lj8sY literal 0 HcmV?d00001 diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml new file mode 100644 index 000000000..4de71dfc7 --- /dev/null +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml @@ -0,0 +1,34 @@ +title: + ru: Направление двери + fr_fr: Porte Miroir/Non Miroir + en_us: Door Mirrored/Unmirrored + de_de: Tür Gespiegelt/Ungespiegelt +tooltip: + en_us: >- + Writes the mirror state (aka Left/Right) of doors back to an instance parameter 'Door Wing Opening Direction' in doors. This needs to be an instance parameter of type text with the option different values for group instances. Prints a summary of accomplished job including changes to previous state. + + All families to treat need 2 shared parameters 'DoorFamilyOpeningDirection_standard' and 'DoorFamilyOpeningDirection_mirrored' as instances with values corresponding, as in family defined standard to write back to parameter 'Door Wing Opening Direction'. + For families who have a symtetry chechbox "Door Mirrored" standard value my be changed by conditional statement in family: (f.ex -> if(Door Mirrored, "1 Wing Right", "1 Wing Left")) + + Prerequisites: + In 'FAMILY' as instance, standard value as "blocked" formula + [Parameter] - 'DoorFamilyOpeningDirection_standard' + [Parameter] - 'DoorFamilyOpeningDirection_mirrored' + + In 'PROJECT' as instance: + [Parameter] - 'Door Wing Opening Direction' + de_de: >- + Schreibt den Spiegelzustand (auch bekannt als Links/Rechts) von Türen zurück in einen Instanzparameter 'Door Wing Opening Direction' in doors. Dies muss ein Instanzparameter vom Typ Text sein, mit der Option verschiedene Werte für Gruppeninstanzen. Druckt eine Zusammenfassung des ausgeführten Auftrags einschließlich der Änderungen zum vorherigen Zustand. + + Alle zu behandelnden Familien benötigen 2 gemeinsame Parameter 'DoorFamilyOpeningDirection_standard' und 'DoorFamilyOpeningDirection_mirrored' als Instanzen mit Werten, die dem in der Familie definierten Standard entsprechen, um in den Parameter 'Door Wing Opening Direction' zurückzuschreiben. + Für Familien, die ein Symtetrie-Kästchen „Tür gespiegelt“ haben, kann der Standardwert durch eine bedingte Anweisung in der Familie geändert werden: (z.B. -> if(Tür gespiegelt, „1 Flügel rechts“, „1 Flügel links“)) + + Voraussetzungen: + In 'FAMILY' als Instanz, Standardwert als „blockierte“ Formel + [Parameter] - 'DoorFamilyOpeningDirection_standard' + [Parameter] - 'DoorFamilyOpeningDirection_mirrored' (Türöffnungsrichtung gespiegelt) + + Im 'PROJEKT' als Instanzparameter mit der Option verschiedene "Unterschiedliche Werte für das Exemplar einer Gruppe" (Türöffnungsrichtung): + [Parameter] - 'Door Wing Opening Direction' + fr_fr: >- +author: Jakob Steiner (special thanks to Erik Frits) \ No newline at end of file diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/icon.dark.png b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/icon.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..14d4ae45fab1ad775381692490b13d3ac761377f GIT binary patch literal 3288 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 HQ}q7;LD**J literal 0 HcmV?d00001 diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/icon.png b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc7b2b96fd9f14210de8e66af8e28c442ee9c83 GIT binary patch literal 3773 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", "ElementId"]) +else: + output.print_md('#### No doors with changed parameters were found.') + +# End +output.print_md('---') +output.print_md('#### Script has finished in {}s'.format(time.time() - timer_start)) \ No newline at end of file From 4aa8948dc0a17b7f9ea055d9d00f0b967c4a6334 Mon Sep 17 00:00:00 2001 From: EF <> Date: Thu, 1 May 2025 17:05:12 +0200 Subject: [PATCH 04/18] deleted --- .../Door Flip State.pushbutton/bundle.yaml | 0 .../Door Flip State.pushbutton/icon.dark.png | Bin 3288 -> 0 bytes .../Door Flip State.pushbutton/icon.png | Bin 3773 -> 0 bytes .../Door Flip State.pushbutton/script.py | 164 ------------------ 4 files changed, 164 deletions(-) delete mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/bundle.yaml delete mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.dark.png delete mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.png delete mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/script.py diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/bundle.yaml b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/bundle.yaml deleted file mode 100644 index e69de29bb..000000000 diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.dark.png b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.dark.png deleted file mode 100644 index 14d4ae45fab1ad775381692490b13d3ac761377f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3288 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 HQ}q7;LD**J diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.png b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Flip State.pushbutton/icon.png deleted file mode 100644 index 3fc7b2b96fd9f14210de8e66af8e28c442ee9c83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3773 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 if(Anschlagseite gespiegelt, "Tür Rechts", "Tür Links")) - -_____________________________________________________________________ -Prerequisites: -In familys as instance, standard value as "blocked" formula -[Parameter] - 'Türfamilienaufgehrichtung_standard' -[Parameter] - 'Türfamilienaufgehrichtung_gespiegelt' - -In project as instance: -[Parameter] - 'Flügel Aufgehrichtung' -_____________________________________________________________________ -Last update: - -- V 0.1 Creation(24.05.2021) -- V 0.2 (07.06.2021) - - Refactored - - Show Family/Types that did not have parameters set. -- V 0.3 (13.04.2025) - - List changes in doors -_____________________________________________________________________ - -""" -#-------------------------------------------------------------------------------------------------------------------- -#IMPORTS -# System -import time, sys -#pyRevit -from pyrevit import script - -from Autodesk.Revit.DB import * -from collections import defaultdict - -doc = __revit__.ActiveUIDocument.Document -uidoc = __revit__.ActiveUIDocument -app = __revit__.Application -output = script.get_output() -#-------------------------------------------------------------------------------------------------------------------- -#GLOBAL PARAMETERS -TUERAUFG_STANDARD_PARAMETER = "Türfamilienaufgehrichtung_standard" -TUERAUFG_STANDARD_GESPIEGELT_PARAMETER = "Türfamilienaufgehrichtung_gespiegelt" -TUERAUFG_WRITEBACK_PARAMETER = "Flügel Aufgehrichtung" -TUERAUFG_ERROR_VALUE = "-" # Value if the family does't have shared param. above - -#-------------------------------------------------------------------------------------------------------------------- -#MAIN -timer_start = time.time() - -# GET ALL DOORS -doors_collector = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors).WhereElementIsNotElementType().ToElements() -if not doors_collector: - sys.exit("No doors were found in the project.") - -# FUNCTION TO CHECK IF PARAMETER EXISTS -def parameter_exists(parameter_name): - binding_map = doc.ParameterBindings - iterator = binding_map.ForwardIterator() - iterator.Reset() - while iterator.MoveNext(): - if iterator.Key.Name == parameter_name: - return True - return False - -# CHECK IF TUERAUFG_WRITEBACK_PARAMETER EXISTS -if not parameter_exists(TUERAUFG_WRITEBACK_PARAMETER): - print("The parameter '{}' does not exist in the current document.".format(TUERAUFG_WRITEBACK_PARAMETER)) - print("Please create the parameter as an instance parameter, option different values for groupes,") - print("for the category doors in the project.") - - sys.exit() - -# CREATE CONTAINERS -count_parameter = 0 -count_not_parameter = 0 -doors_without_parameter = [] -# CREATE A LIST FOR DOORS WITH CHANGED PARAMETERS -data_doors_changed = [] - -t = Transaction(doc,__title__) -t.Start() -#door_changed =[] -# LOOP THROUGH ALL DOORS -for door in doors_collector: - # GET VALUE - try: - if door.Mirrored: - value = door.LookupParameter(TUERAUFG_STANDARD_GESPIEGELT_PARAMETER).AsString() - else: - value = door.LookupParameter(TUERAUFG_STANDARD_PARAMETER).AsString() - count_parameter +=1 - - except: - # IF VALUE IS UNAVAILABLE - USE DEFAULT ERROR VALUE - value = TUERAUFG_ERROR_VALUE - count_not_parameter += 1 - - # LOG DOOR TYPE WITHOUT VALUE - door_family = door.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() - door_type = door.get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM).AsValueString() - door_name = "{family}-{type}".format(family=door_family, type=door_type) - if door_name not in doors_without_parameter: - doors_without_parameter.append(door_name) - - # SET PARAMETER - try: - # CHECK IF THE WRITEBACK PARAMETER EXISTS - door_out_param = door.LookupParameter(TUERAUFG_WRITEBACK_PARAMETER) - - # WRITE CHANGES IN PARAMETERS - door_out_param_old = door.LookupParameter(TUERAUFG_WRITEBACK_PARAMETER).AsString() - door_out_param_new = value - if door_out_param_old != door_out_param_new: - door_out_param_changed = "{} -> {}".format(door_out_param_old, door_out_param_new) - door_name = door.Name - door_changed_link = output.linkify(door.Id) - data_doors_changed.append([door_name, door_out_param_changed, door_changed_link]) - # SET DOOR FLIP STATE TO THE WRITEBACK PARAMETER - door_out_param.Set(str(value)) - except: - print("Please make sure OUT instance parameter exists: {}".format(TUERAUFG_WRITEBACK_PARAMETER)) - sys.exit() -t.Commit() - -# FINAL PRINT -output.print_md("\nNumber of doors found in the project: {} ".format(len(doors_collector))) -output.print_md("of theese with writeback parameters defined in door family: {}".format(count_parameter)) -output.print_md("without writeback parameters defined in door family: {a}".format(a=count_not_parameter,)) -output.print_md("The default writeback value for doors without defined values will be : "'"{b}"'" ".format(b=TUERAUFG_ERROR_VALUE)) -output.print_md("****************************************************************") -print("door families without writeback parameter defined in family:") -for door_type in doors_without_parameter: - print(door_type) - -print("****************************************************************") -print("Changes to previous run of the script:") - -# Create a table for changed parameter values -if data_doors_changed: - output.print_table(table_data=data_doors_changed, title="Doors with changed parameters:", columns=["Door", "Changed Value", "ElementId"]) -else: - output.print_md("No doors with changed parameters were found.") - -# End -output.print_md('---') -output.print_md('#### Script has finished in {}s'.format(time.time() - timer_start)) \ No newline at end of file From ec51d6d90040dba13710fc3c06d35ef893ac6853 Mon Sep 17 00:00:00 2001 From: EF <> Date: Thu, 1 May 2025 20:00:23 +0200 Subject: [PATCH 05/18] DoorMirrorState --- .../Door Mirror State.pushbutton/bundle.yaml | 26 +++++++++++++----- .../Door Mirror State.pushbutton/tooltip.png | Bin 0 -> 117599 bytes 2 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/tooltip.png diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml index 4de71dfc7..5407ef93b 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml @@ -7,7 +7,7 @@ tooltip: en_us: >- Writes the mirror state (aka Left/Right) of doors back to an instance parameter 'Door Wing Opening Direction' in doors. This needs to be an instance parameter of type text with the option different values for group instances. Prints a summary of accomplished job including changes to previous state. - All families to treat need 2 shared parameters 'DoorFamilyOpeningDirection_standard' and 'DoorFamilyOpeningDirection_mirrored' as instances with values corresponding, as in family defined standard to write back to parameter 'Door Wing Opening Direction'. + All families to treat need two shared parameters 'DoorFamilyOpeningDirection_standard' and 'DoorFamilyOpeningDirection_mirrored' as instances with values corresponding, as in family defined standard to write back to parameter 'Door Wing Opening Direction'. For families who have a symtetry chechbox "Door Mirrored" standard value my be changed by conditional statement in family: (f.ex -> if(Door Mirrored, "1 Wing Right", "1 Wing Left")) Prerequisites: @@ -18,17 +18,29 @@ tooltip: In 'PROJECT' as instance: [Parameter] - 'Door Wing Opening Direction' de_de: >- - Schreibt den Spiegelzustand (auch bekannt als Links/Rechts) von Türen zurück in einen Instanzparameter 'Door Wing Opening Direction' in doors. Dies muss ein Instanzparameter vom Typ Text sein, mit der Option verschiedene Werte für Gruppeninstanzen. Druckt eine Zusammenfassung des ausgeführten Auftrags einschließlich der Änderungen zum vorherigen Zustand. + Schreibt den Zustand ungegespiegel/gespiegelt (Links/Rechts) von Türen zurück in einen Instanzparameter 'Door Wing Opening Direction' in doors. Es muss ein Instanzparameter vom Typ Text sein, mit der Option "Unterschiedliche Werte für das Exemplar einer Gruppe". Ein Bericht über den ausgeführten Auftrag einschließlich der Änderungen zum vorherigen Zustand wird angezeigt. - Alle zu behandelnden Familien benötigen 2 gemeinsame Parameter 'DoorFamilyOpeningDirection_standard' und 'DoorFamilyOpeningDirection_mirrored' als Instanzen mit Werten, die dem in der Familie definierten Standard entsprechen, um in den Parameter 'Door Wing Opening Direction' zurückzuschreiben. - Für Familien, die ein Symtetrie-Kästchen „Tür gespiegelt“ haben, kann der Standardwert durch eine bedingte Anweisung in der Familie geändert werden: (z.B. -> if(Tür gespiegelt, „1 Flügel rechts“, „1 Flügel links“)) + Alle zu behandelnden Familien benötigen zwei gemeinsame genutzte Parameter 'DoorFamilyOpeningDirection_standard' und 'DoorFamilyOpeningDirection_mirrored' als Instanzen mit Werten, die dem in der Familie definierten Standard entsprechen, um in den Parameter 'Door Wing Opening Direction' zurückzuschreiben. + Für Familien, die eine Option (bool) „Tür gespiegelt“ haben, kann der Standardwert auch durch eine Formel in der Familie geändert werden: (z.B. -> if(Tür gespiegelt, „1 Flügel DIN/Rechts“, „1 Flügel DIN/Links“)) Voraussetzungen: - In 'FAMILY' als Instanz, Standardwert als „blockierte“ Formel + In 'FAMILY' als Instanzparameter, Standardwert als „blockierte“ Formel [Parameter] - 'DoorFamilyOpeningDirection_standard' - [Parameter] - 'DoorFamilyOpeningDirection_mirrored' (Türöffnungsrichtung gespiegelt) + [Parameter] - 'DoorFamilyOpeningDirection_mirrored' - Im 'PROJEKT' als Instanzparameter mit der Option verschiedene "Unterschiedliche Werte für das Exemplar einer Gruppe" (Türöffnungsrichtung): + Im 'PROJEKT' als Instanzparameter mit der Option verschiedene "Unterschiedliche Werte für das Exemplar einer Gruppe": [Parameter] - 'Door Wing Opening Direction' fr_fr: >- + Réécrit l'état non-miroir/miroir (gauche/droite) des portes dans un paramètre d'instance 'Door Wing Opening Direction' dans les portes. Il doit s'agir d'un paramètre d'instance de type texte, avec l'option 'valeurs peuvent varier en fonction de l'occurrence de groupe'. Un rapport sur le travail effectué, y compris les modifications par rapport à l'état précédent, est affiché. + + Toutes les familles à traiter nécessitent deux paramètres communs utilisés 'DoorFamilyOpeningDirection_standard' et 'DoorFamilyOpeningDirection_mirrored' en tant qu'instances avec des valeurs correspondant au standard défini dans la famille, afin de pouvoir réécrire dans le paramètre 'Door Wing Opening Direction'. + Pour les familles qui ont une option (bool) « Miroiter la porte », la valeur par défaut peut également être modifiée par une formule dans la famille : (par ex. -> if(Miroiter la porte, " 1 vantail droite ", " 1 vantail gauche ")) + + Conditions préalables : + Dans la ' FAMILLE ' comme paramètre d'instance, valeur par défaut comme formule 'bloquée'. + [paramètre] - 'DoorFamilyOpeningDirection_standard' + [paramètre] - 'DoorFamilyOpeningDirection_mirrored' + + Dans le 'PROJET' comme paramètre d'instance avec l'option différentes 'valeurs peuvent varier en fonction de l'occurrence de groupe': + [paramètre] - 'Door Wing Opening Direction' author: Jakob Steiner (special thanks to Erik Frits) \ No newline at end of file diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/tooltip.png b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..10df173917920305cedf9d5aed6d9bd0ed7696d1 GIT binary patch literal 117599 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%0DJ@%nN7xri2;dO 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

vkGKVsidupk1u|r^CDR$cY6+S+L9D;<-2$mQr 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 IY!LXr0BM^f-~a#s literal 0 HcmV?d00001 From d85b745eaabfc9823628c8a403bbd26b5da80afb Mon Sep 17 00:00:00 2001 From: EF <> Date: Thu, 1 May 2025 20:15:57 +0200 Subject: [PATCH 06/18] FinalCleanup --- .../Door Mirror State.pushbutton/script.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index 8b263f6b1..10298a90f 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -1,12 +1,8 @@ # -*- coding: utf-8 -*- - +"""Writes the door swing direction of doors +to a shared parameter.""" __title__ = "DoorMirrorState" -__author__ = "Jakob Steiner" -__doc__ = """Version = 0.3 -Date = 13.04.2025 -""" -#-------------------------------------------------------------------------------------------------------------------- #IMPORTS # System import time, sys @@ -20,14 +16,13 @@ uidoc = __revit__.ActiveUIDocument app = __revit__.Application output = script.get_output() -#-------------------------------------------------------------------------------------------------------------------- + #GLOBAL PARAMETERS DOORDIR_STANDARD_PARAM = "DoorFamilyOpeningDirection_standard" DOORDIR_MIRRORED_PARAM = "DoorFamilyOpeningDirection_mirrored" DOORDIR_WRITEBACK_PARAM = "Door Wing Opening Direction" DOORDIR_ERROR_VALUE = "-" # Value if the family does't have shared param. above -#-------------------------------------------------------------------------------------------------------------------- #MAIN timer_start = time.time() From 58ce923f8490b91f46c87eeb893c3e4338e1aea3 Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Fri, 2 May 2025 07:21:45 +0200 Subject: [PATCH 07/18] Update extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py Co-authored-by: devloai[bot] <168258904+devloai[bot]@users.noreply.github.com> --- .../Analyse.pulldown/Door Mirror State.pushbutton/script.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index 10298a90f..921f9ec2b 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -87,7 +87,7 @@ def parameter_exists(parameter_name): door_out_param = door.LookupParameter(DOORDIR_WRITEBACK_PARAM) # WRITE CHANGES IN PARAMETERS - door_out_param_old = door.LookupParameter(DOORDIR_WRITEBACK_PARAM).AsString() + door_out_param_old = door_out_param.AsString() door_out_param_new = value if door_out_param_old != door_out_param_new: door_out_param_changed = "{} -> {}".format(door_out_param_old, door_out_param_new) From 96b98949a6dad6e069889e57b1cce10a9fcd438b Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Fri, 2 May 2025 07:35:53 +0200 Subject: [PATCH 08/18] General cleanup - Black formatting - Removed unnecessary comments - Error Handling - pyrevit module usage instead of Autodesk's --- .../Door Mirror State.pushbutton/script.py | 198 ++++++++++-------- 1 file changed, 111 insertions(+), 87 deletions(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index 921f9ec2b..806ed91af 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -1,37 +1,33 @@ # -*- coding: utf-8 -*- -"""Writes the door swing direction of doors -to a shared parameter.""" -__title__ = "DoorMirrorState" -#IMPORTS -# System import time, sys -#pyRevit -from pyrevit import script, DB +from pyrevit import script, DB, revit, DOCS, forms from pyrevit.framework import List -#Autodesk.Revit.DB -from Autodesk.Revit.DB import Transaction, BuiltInParameter -doc = __revit__.ActiveUIDocument.Document -uidoc = __revit__.ActiveUIDocument -app = __revit__.Application +doc = DOCS.doc output = script.get_output() -#GLOBAL PARAMETERS -DOORDIR_STANDARD_PARAM = "DoorFamilyOpeningDirection_standard" -DOORDIR_MIRRORED_PARAM = "DoorFamilyOpeningDirection_mirrored" +DOORDIR_STANDARD_PARAM = "DoorFamilyOpeningDirection_standard" +DOORDIR_MIRRORED_PARAM = "DoorFamilyOpeningDirection_mirrored" DOORDIR_WRITEBACK_PARAM = "Door Wing Opening Direction" -DOORDIR_ERROR_VALUE = "-" # Value if the family does't have shared param. above +DOORDIR_ERROR_VALUE = "-" # Value if the family does't have shared param. above -#MAIN +# MAIN timer_start = time.time() # GET ALL DOORS -doors_collector = DB.FilteredElementCollector(doc).OfCategory(DB.BuiltInCategory.OST_Doors).WhereElementIsNotElementType().ToElements() +doors_collector = ( + DB.FilteredElementCollector(doc) + .OfCategory(DB.BuiltInCategory.OST_Doors) + .WhereElementIsNotElementType() + .ToElements() +) + if not doors_collector: - sys.exit("No doors were found in the project.") + forms.alert("No doors found in the model.", title="Warning") + script.exit() + -# FUNCTION TO CHECK IF PARAMETER EXISTS def parameter_exists(parameter_name): binding_map = doc.ParameterBindings iterator = binding_map.ForwardIterator() @@ -41,86 +37,114 @@ def parameter_exists(parameter_name): return True return False -# CHECK IF TUERAUFG_WRITEBACK_PARAMETER EXISTS + if not parameter_exists(DOORDIR_WRITEBACK_PARAM): - print("The parameter '{}' does not exist in the current document.".format(DOORDIR_WRITEBACK_PARAM)) - print("Please create the parameter as an instance parameter, option different values for groupes,") + print( + "The parameter '{}' does not exist in the current document.".format( + DOORDIR_WRITEBACK_PARAM + ) + ) + print( + "Please create the parameter as an instance parameter, option different values for groupes," + ) print("for the category doors in the project.") sys.exit() -# CREATE CONTAINERS count_parameter = 0 count_not_parameter = 0 doors_without_parameter = [] -# CREATE A LIST FOR DOORS WITH CHANGED PARAMETERS data_doors_changed = [] -t = Transaction(doc,__title__) -t.Start() -#door_changed =[] -# LOOP THROUGH ALL DOORS -for door in doors_collector: - # GET VALUE - try: - if door.Mirrored: - value = door.LookupParameter(DOORDIR_MIRRORED_PARAM).AsString() - else: - value = door.LookupParameter(DOORDIR_STANDARD_PARAM).AsString() - count_parameter +=1 - - except: - # IF VALUE IS UNAVAILABLE - USE DEFAULT ERROR VALUE - value = DOORDIR_ERROR_VALUE - count_not_parameter += 1 - - # LOG DOOR TYPE WITHOUT VALUE - door_family = door.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() - door_type = door.get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM).AsValueString() - door_name = "{family}-{type}".format(family=door_family, type=door_type) - if door_name not in doors_without_parameter: - doors_without_parameter.append(door_name) - - # SET PARAMETER - try: - # CHECK IF THE WRITEBACK PARAMETER EXISTS - door_out_param = door.LookupParameter(DOORDIR_WRITEBACK_PARAM) - - # WRITE CHANGES IN PARAMETERS - door_out_param_old = door_out_param.AsString() - door_out_param_new = value - if door_out_param_old != door_out_param_new: - door_out_param_changed = "{} -> {}".format(door_out_param_old, door_out_param_new) - door_name = door.Name - door_changed_link = output.linkify(door.Id) - data_doors_changed.append([door_name, door_out_param_changed, door_changed_link]) - # SET DOOR FLIP STATE TO THE WRITEBACK PARAMETER - door_out_param.Set(str(value)) - except: - print('Please make sure OUT instance parameter exists: {}'.format(DOORDIR_WRITEBACK_PARAM)) - sys.exit() -t.Commit() - -# FINAL PRINT -output.print_md('### Number of doors found in the project: {} '.format(len(doors_collector))) -output.print_md('of these with writeback parameters defined in door family: {}'.format(count_parameter)) -output.print_md('without writeback parameters defined in door family: {a}'.format(a=count_not_parameter,)) -output.print_md('parameters missing: '"'{b}'"', '"'{c}'"''.format(b=DOORDIR_STANDARD_PARAM, c=DOORDIR_MIRRORED_PARAM)) -output.print_md('you will find in the folder of the script a shared parameter file containing this parameters.') -output.print_md('The default writeback value for doors without defined values will be : '" {d} "' '.format(d=DOORDIR_ERROR_VALUE)) -output.print_md('---') -output.print_md('### Door families without writeback parameter defined in family:') +with revit.Transaction(doc, "DoorMirrorState"): + for door in doors_collector: + try: + if door.Mirrored: + value = door.LookupParameter(DOORDIR_MIRRORED_PARAM).AsString() + else: + value = door.LookupParameter(DOORDIR_STANDARD_PARAM).AsString() + count_parameter += 1 + + except AttributeError: + value = DOORDIR_ERROR_VALUE + count_not_parameter += 1 + + door_family = door.get_Parameter( + DB.BuiltInParameter.ELEM_FAMILY_PARAM + ).AsValueString() + door_type = door.get_Parameter( + DB.BuiltInParameter.ELEM_TYPE_PARAM + ).AsValueString() + door_name = "{family}-{type}".format(family=door_family, type=door_type) + if door_name not in doors_without_parameter: + doors_without_parameter.append(door_name) + + try: + door_out_param = door.LookupParameter(DOORDIR_WRITEBACK_PARAM) + + door_out_param_old = door_out_param.AsString() + door_out_param_new = value + if door_out_param_old != door_out_param_new: + door_out_param_changed = "{} -> {}".format( + door_out_param_old, door_out_param_new + ) + door_name = door.Name + door_changed_link = output.linkify(door.Id) + data_doors_changed.append( + [door_name, door_out_param_changed, door_changed_link] + ) + door_out_param.Set(str(value)) + except AttributeError: + print( + "Please make sure instance parameter exists: {}".format( + DOORDIR_WRITEBACK_PARAM + ) + ) + +output.print_md( + "### Number of doors found in the project: {} ".format(len(doors_collector)) +) +output.print_md( + "of these with writeback parameters defined in door family: {}".format( + count_parameter + ) +) +output.print_md( + "without writeback parameters defined in door family: {a}".format( + a=count_not_parameter, + ) +) +output.print_md( + "parameters missing: " + "'{b}'" + ", " + "'{c}'" + "".format(b=DOORDIR_STANDARD_PARAM, c=DOORDIR_MIRRORED_PARAM) +) +output.print_md( + "you will find in the folder of the script a shared parameter file containing this parameters." +) +output.print_md( + "The default writeback value for doors without defined values will be : " + " {d} " + " ".format(d=DOORDIR_ERROR_VALUE) +) +output.print_md("---") +output.print_md("### Door families without writeback parameter defined in family:") for door_type in doors_without_parameter: print(door_type) -output.print_md('---') -output.print_md('### Changes to previous run of the script:') +output.print_md("---") +output.print_md("### Changes to previous run of the script:") -# Create a table for changed parameter values if data_doors_changed: - output.print_table(table_data=data_doors_changed, title="Doors with changed parameters:", columns=["Door", "Changed Value (old->new)", "ElementId"]) + output.print_table( + table_data=data_doors_changed, + title="Doors with changed parameters:", + columns=["Door", "Changed Value (old->new)", "ElementId"], + ) else: - output.print_md('#### No doors with changed parameters were found.') + output.print_md("#### No doors with changed parameters were found.") -# End -output.print_md('---') -output.print_md('#### Script has finished in {}s'.format(time.time() - timer_start)) \ No newline at end of file +output.print_md("---") +elapsed_time = time.time() - timer_start +output.print_md("#### Script has finished in {:.2f}s".format(elapsed_time)) From 86f2888a7d7d3cc8c2b860e529772cd3a056946f Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Fri, 2 May 2025 07:41:48 +0200 Subject: [PATCH 09/18] Update extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../Analyse.pulldown/Door Mirror State.pushbutton/script.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index 806ed91af..a0c381f6d 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -10,7 +10,7 @@ DOORDIR_STANDARD_PARAM = "DoorFamilyOpeningDirection_standard" DOORDIR_MIRRORED_PARAM = "DoorFamilyOpeningDirection_mirrored" DOORDIR_WRITEBACK_PARAM = "Door Wing Opening Direction" -DOORDIR_ERROR_VALUE = "-" # Value if the family does't have shared param. above +DOORDIR_ERROR_VALUE = "-" # Value if the family doesn't have shared param. above # MAIN timer_start = time.time() From e9b7298b24c888fd211117a24c56aaa632f31cd9 Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Fri, 2 May 2025 07:42:39 +0200 Subject: [PATCH 10/18] Update extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml index 5407ef93b..483129e8a 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/bundle.yaml @@ -8,7 +8,7 @@ tooltip: Writes the mirror state (aka Left/Right) of doors back to an instance parameter 'Door Wing Opening Direction' in doors. This needs to be an instance parameter of type text with the option different values for group instances. Prints a summary of accomplished job including changes to previous state. All families to treat need two shared parameters 'DoorFamilyOpeningDirection_standard' and 'DoorFamilyOpeningDirection_mirrored' as instances with values corresponding, as in family defined standard to write back to parameter 'Door Wing Opening Direction'. - For families who have a symtetry chechbox "Door Mirrored" standard value my be changed by conditional statement in family: (f.ex -> if(Door Mirrored, "1 Wing Right", "1 Wing Left")) + For families who have a symmetry checkbox "Door Mirrored" standard value may be changed by conditional statement in family: (f.ex -> if(Door Mirrored, "1 Wing Right", "1 Wing Left")) Prerequisites: In 'FAMILY' as instance, standard value as "blocked" formula From 784d563c9840512dfd664a4a47897a55cffcd852 Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Fri, 2 May 2025 08:08:06 +0200 Subject: [PATCH 11/18] print statements cleanup --- .../Door Mirror State.pushbutton/script.py | 62 +++++++------------ 1 file changed, 22 insertions(+), 40 deletions(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index a0c381f6d..9a69963c5 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -40,16 +40,11 @@ def parameter_exists(parameter_name): if not parameter_exists(DOORDIR_WRITEBACK_PARAM): print( - "The parameter '{}' does not exist in the current document.".format( - DOORDIR_WRITEBACK_PARAM - ) + "The parameter '{}' does not exist in the current document.\n" + "Please create the parameter as an instance parameter, option different values for groupes,\n" + "for the category doors in the project.".format(DOORDIR_WRITEBACK_PARAM) ) - print( - "Please create the parameter as an instance parameter, option different values for groupes," - ) - print("for the category doors in the project.") - - sys.exit() + script.exit() count_parameter = 0 count_not_parameter = 0 @@ -95,46 +90,34 @@ def parameter_exists(parameter_name): ) door_out_param.Set(str(value)) except AttributeError: - print( + forms.alert( "Please make sure instance parameter exists: {}".format( DOORDIR_WRITEBACK_PARAM ) ) + script.exit() output.print_md( - "### Number of doors found in the project: {} ".format(len(doors_collector)) -) -output.print_md( - "of these with writeback parameters defined in door family: {}".format( - count_parameter - ) -) -output.print_md( - "without writeback parameters defined in door family: {a}".format( - a=count_not_parameter, + "### Number of doors found in the project: {} \n" + "- With writeback parameters defined in door family: {}\n" + "- Without writeback parameters defined in door family: {}\n" + "- Parameters missing: '{}', '{}'\n" + "- You will find in the folder of the script a shared parameter file containing these parameters.\n" + "- The default writeback value for doors without defined values will be: '{}'\n" + "---\n".format( + len(doors_collector), + count_parameter, + count_not_parameter, + DOORDIR_STANDARD_PARAM, + DOORDIR_MIRRORED_PARAM, + DOORDIR_ERROR_VALUE, ) ) -output.print_md( - "parameters missing: " - "'{b}'" - ", " - "'{c}'" - "".format(b=DOORDIR_STANDARD_PARAM, c=DOORDIR_MIRRORED_PARAM) -) -output.print_md( - "you will find in the folder of the script a shared parameter file containing this parameters." -) -output.print_md( - "The default writeback value for doors without defined values will be : " - " {d} " - " ".format(d=DOORDIR_ERROR_VALUE) -) -output.print_md("---") + output.print_md("### Door families without writeback parameter defined in family:") for door_type in doors_without_parameter: print(door_type) -output.print_md("---") -output.print_md("### Changes to previous run of the script:") +output.print_md("---\n### Changes to previous run of the script:") if data_doors_changed: output.print_table( @@ -145,6 +128,5 @@ def parameter_exists(parameter_name): else: output.print_md("#### No doors with changed parameters were found.") -output.print_md("---") elapsed_time = time.time() - timer_start -output.print_md("#### Script has finished in {:.2f}s".format(elapsed_time)) +output.print_md("---\n#### Script has finished in {:.2f}s".format(elapsed_time)) From e3274f9478db281932f6ddf9b0550b8c75e6f596 Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Wed, 11 Jun 2025 15:43:11 +0200 Subject: [PATCH 12/18] Update extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py Co-authored-by: Andrea Ghensi --- .../Analyse.pulldown/Door Mirror State.pushbutton/script.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index 9a69963c5..ce2f43edf 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -115,8 +115,7 @@ def parameter_exists(parameter_name): ) output.print_md("### Door families without writeback parameter defined in family:") -for door_type in doors_without_parameter: - print(door_type) +output.print_md("- " + "\n - ".join(doors_without_parameter)) output.print_md("---\n### Changes to previous run of the script:") if data_doors_changed: From 36a073c4861362caac0954594873021d734c06e2 Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Wed, 11 Jun 2025 15:43:29 +0200 Subject: [PATCH 13/18] Update extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py Co-authored-by: Andrea Ghensi --- .../Analyse.pulldown/Door Mirror State.pushbutton/script.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index ce2f43edf..bddc38a8e 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -125,7 +125,7 @@ def parameter_exists(parameter_name): columns=["Door", "Changed Value (old->new)", "ElementId"], ) else: - output.print_md("#### No doors with changed parameters were found.") + output.print_md("*No doors with changed parameters were found.*") elapsed_time = time.time() - timer_start output.print_md("---\n#### Script has finished in {:.2f}s".format(elapsed_time)) From b5f794f783b1f8021c8f4d2da232e6abb68b8d6c Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Wed, 11 Jun 2025 15:44:08 +0200 Subject: [PATCH 14/18] Update extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py Co-authored-by: Andrea Ghensi --- .../Analyse.pulldown/Door Mirror State.pushbutton/script.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index bddc38a8e..461c3e901 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -71,8 +71,7 @@ def parameter_exists(parameter_name): DB.BuiltInParameter.ELEM_TYPE_PARAM ).AsValueString() door_name = "{family}-{type}".format(family=door_family, type=door_type) - if door_name not in doors_without_parameter: - doors_without_parameter.append(door_name) + doors_without_parameter.add(door_name) try: door_out_param = door.LookupParameter(DOORDIR_WRITEBACK_PARAM) From 1537c8c1924df328f96569e8e6e39a889d941e5e Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Wed, 11 Jun 2025 15:44:18 +0200 Subject: [PATCH 15/18] Update extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py Co-authored-by: Andrea Ghensi --- .../Analyse.pulldown/Door Mirror State.pushbutton/script.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index 461c3e901..2a74d1a8f 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -48,7 +48,7 @@ def parameter_exists(parameter_name): count_parameter = 0 count_not_parameter = 0 -doors_without_parameter = [] +doors_without_parameter = set() data_doors_changed = [] with revit.Transaction(doc, "DoorMirrorState"): From fb72b7bf650e3e139c01b7d8e8f4559625f04b9a Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Wed, 11 Jun 2025 15:45:17 +0200 Subject: [PATCH 16/18] Update extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py Co-authored-by: Andrea Ghensi --- .../Analyse.pulldown/Door Mirror State.pushbutton/script.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index 2a74d1a8f..3e7cbe096 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -54,10 +54,8 @@ def parameter_exists(parameter_name): with revit.Transaction(doc, "DoorMirrorState"): for door in doors_collector: try: - if door.Mirrored: - value = door.LookupParameter(DOORDIR_MIRRORED_PARAM).AsString() - else: - value = door.LookupParameter(DOORDIR_STANDARD_PARAM).AsString() + param_name = DOORDIR_MIRRORED_PARAM if door.Mirrored else DOORDIR_STANDARD_PARAM + value = get_param_value(get_param(door, param_name)) count_parameter += 1 except AttributeError: From e6a3caaacb3ff88d444379c5770a04289908a233 Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Wed, 11 Jun 2025 15:45:50 +0200 Subject: [PATCH 17/18] Update extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py Co-authored-by: Andrea Ghensi --- .../Door Mirror State.pushbutton/script.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index 3e7cbe096..8653e5c34 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -28,17 +28,7 @@ script.exit() -def parameter_exists(parameter_name): - binding_map = doc.ParameterBindings - iterator = binding_map.ForwardIterator() - iterator.Reset() - while iterator.MoveNext(): - if iterator.Key.Name == parameter_name: - return True - return False - - -if not parameter_exists(DOORDIR_WRITEBACK_PARAM): +if not model_has_parameter(DOORDIR_WRITEBACK_PARAM, doc=doc): print( "The parameter '{}' does not exist in the current document.\n" "Please create the parameter as an instance parameter, option different values for groupes,\n" From e1ba260e809bd0755092ca17a6b140eabaeb5725 Mon Sep 17 00:00:00 2001 From: Jean-Marc Couffin Date: Wed, 11 Jun 2025 15:46:09 +0200 Subject: [PATCH 18/18] Update extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py Co-authored-by: Andrea Ghensi --- .../Door Mirror State.pushbutton/script.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py index 8653e5c34..517ea759b 100644 --- a/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py +++ b/extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack/Analyse.pulldown/Door Mirror State.pushbutton/script.py @@ -16,12 +16,7 @@ timer_start = time.time() # GET ALL DOORS -doors_collector = ( - DB.FilteredElementCollector(doc) - .OfCategory(DB.BuiltInCategory.OST_Doors) - .WhereElementIsNotElementType() - .ToElements() -) +doors_collector = get_doors(doc=doc) if not doors_collector: forms.alert("No doors found in the model.", title="Warning")