Skip to content

Commit e16430e

Browse files
authored
Merge pull request #3155 from thumDer/3110-template-handling
Warn users when view range is driven by view template
2 parents e99b812 + 56c9004 commit e16430e

File tree

1 file changed

+75
-33
lines changed
  • extensions/pyRevitTools.extension/pyRevit.tab/Toggles.panel/toggles3.stack/ViewRange.pushbutton

1 file changed

+75
-33
lines changed

extensions/pyRevitTools.extension/pyRevit.tab/Toggles.panel/toggles3.stack/ViewRange.pushbutton/script.py

Lines changed: 75 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,20 @@
1212
logger = script.get_logger()
1313
output = script.get_output()
1414

15-
PLANES = OrderedDict([
16-
(DB.PlanViewPlane.TopClipPlane, ([0, 255, 0], "Top Clip Plane", "topplane")),
17-
(DB.PlanViewPlane.CutPlane, ([255, 0, 0], "Cut Plane", "cutplane")),
18-
(DB.PlanViewPlane.BottomClipPlane, ([0, 0, 255], "Bottom Clip Plane", "bottomplane")),
19-
(DB.PlanViewPlane.ViewDepthPlane, ([255, 127, 0], "View Depth Plane", "viewdepth")),
20-
])
15+
PLANES = OrderedDict(
16+
[
17+
(DB.PlanViewPlane.TopClipPlane, ([0, 255, 0], "Top Clip Plane", "topplane")),
18+
(DB.PlanViewPlane.CutPlane, ([255, 0, 0], "Cut Plane", "cutplane")),
19+
(
20+
DB.PlanViewPlane.BottomClipPlane,
21+
([0, 0, 255], "Bottom Clip Plane", "bottomplane"),
22+
),
23+
(
24+
DB.PlanViewPlane.ViewDepthPlane,
25+
([255, 127, 0], "View Depth Plane", "viewdepth"),
26+
),
27+
]
28+
)
2129

2230
get_elementid_value = get_elementid_value_func()
2331
INVALID_ID_VALUE = get_elementid_value(DB.ElementId.InvalidElementId)
@@ -67,17 +75,38 @@ def source_view(self, value):
6775
if not compare_views(self._source_view, value):
6876
self._source_view = value
6977
self._levels_populated = False # Reset when view changes
78+
79+
self._source_template = None
80+
if (
81+
self.source_view is not None
82+
and self.source_view.ViewTemplateId != DB.ElementId.InvalidElementId
83+
):
84+
template = self.source_view.Document.GetElement(
85+
self.source_view.ViewTemplateId
86+
)
87+
non_controlled_params = template.GetNonControlledTemplateParameterIds()
88+
if (
89+
DB.ElementId(DB.BuiltInParameter.PLAN_VIEW_RANGE)
90+
not in non_controlled_params
91+
):
92+
self._source_template = template
93+
7094
self.context_changed()
7195

7296
def update_view_range(self, new_values, new_levels=None):
7397
if not self.source_view or not isinstance(self.source_view, DB.ViewPlan):
7498
self.view_model.warning_message = "No valid plan view selected"
7599
return False
76-
if self.source_view.IsTemplate:
77-
self.view_model.warning_message = (
78-
"Cannot modify view range - this is a view template"
100+
101+
if self._source_template is not None:
102+
dialog_result = forms.alert(
103+
"You are about to change a View Template! Are you sure you want to proceed?",
104+
ok=False,
105+
yes=True,
106+
no=True,
79107
)
80-
return False
108+
if not dialog_result:
109+
return False
81110

82111
events.execute_in_revit_context(
83112
self._update_view_range_internal, new_values, new_levels
@@ -268,7 +297,9 @@ def _populate_available_levels(self):
268297
"""Populate the list of available levels in the project"""
269298
try:
270299
# Get all levels in the project
271-
level_collector = DB.FilteredElementCollector(self.source_view.Document).OfClass(DB.Level)
300+
level_collector = DB.FilteredElementCollector(
301+
self.source_view.Document
302+
).OfClass(DB.Level)
272303
levels = list(level_collector)
273304

274305
# Sort levels by elevation
@@ -279,7 +310,11 @@ class LevelItem(object):
279310
def __init__(self, name, element_id, elevation=None, is_special=False):
280311
self.Name = name
281312
self.Id = element_id
282-
self.IdValue = get_elementid_value(element_id) if element_id else INVALID_ID_VALUE
313+
self.IdValue = (
314+
get_elementid_value(element_id)
315+
if element_id
316+
else INVALID_ID_VALUE
317+
)
283318
self.Elevation = elevation
284319
self.IsSpecial = is_special
285320

@@ -348,9 +383,15 @@ def _set_current_level_selections(self, view_range):
348383
self.view_model.viewdepth_level_id = None
349384

350385
# Then set the actual values
351-
self.view_model.topplane_level_id = stored_selections.get("top", INVALID_ID_VALUE)
352-
self.view_model.bottomplane_level_id = stored_selections.get("bottom", INVALID_ID_VALUE)
353-
self.view_model.viewdepth_level_id = stored_selections.get("viewdepth", INVALID_ID_VALUE)
386+
self.view_model.topplane_level_id = stored_selections.get(
387+
"top", INVALID_ID_VALUE
388+
)
389+
self.view_model.bottomplane_level_id = stored_selections.get(
390+
"bottom", INVALID_ID_VALUE
391+
)
392+
self.view_model.viewdepth_level_id = stored_selections.get(
393+
"viewdepth", INVALID_ID_VALUE
394+
)
354395

355396
except Exception as e:
356397
self.view_model.warning_message = (
@@ -521,19 +562,17 @@ def is_valid(self):
521562
)
522563
self.view_model.can_modify_view = False
523564
else:
524-
can_modify = (
525-
isinstance(self.source_view, DB.ViewPlan)
526-
and not self.source_view.IsTemplate
527-
)
565+
can_modify = isinstance(self.source_view, DB.ViewPlan)
528566
self.view_model.can_modify_view = can_modify
529567

530-
if self.source_view.IsTemplate:
531-
self.view_model.message = "Showing View Range of [{}]\n(View Template - Cannot Modify)".format(
532-
self.source_view.Name
533-
)
534-
else:
535-
self.view_model.message = "Showing View Range of\n[{}]".format(
536-
self.source_view.Name
568+
self.view_model.message = "Showing View Range of\n[{}]".format(
569+
self.source_view.Name
570+
)
571+
if self._source_template is not None:
572+
self.view_model.message += (
573+
" - ⚠️ View Range driven by Template [{}]".format(
574+
self._source_template.Name
575+
)
537576
)
538577
return True
539578

@@ -777,8 +816,8 @@ def reset_values_click(self, sender, e):
777816
original_level_id
778817
and original_level_id != DB.ElementId.InvalidElementId
779818
):
780-
self.DataContext.topplane_level_id = (
781-
get_elementid_value(original_level_id)
819+
self.DataContext.topplane_level_id = get_elementid_value(
820+
original_level_id
782821
)
783822
else:
784823
self.DataContext.topplane_level_id = INVALID_ID_VALUE
@@ -791,7 +830,10 @@ def reset_values_click(self, sender, e):
791830
):
792831
try:
793832
# Use source_view.Document instead of active_view.Document
794-
if context.source_view and context.source_view.IsValidObject:
833+
if (
834+
context.source_view
835+
and context.source_view.IsValidObject
836+
):
795837
level = context.source_view.Document.GetElement(
796838
original_level_id
797839
)
@@ -810,8 +852,8 @@ def reset_values_click(self, sender, e):
810852
original_level_id
811853
and original_level_id != DB.ElementId.InvalidElementId
812854
):
813-
self.DataContext.bottomplane_level_id = (
814-
get_elementid_value(original_level_id)
855+
self.DataContext.bottomplane_level_id = get_elementid_value(
856+
original_level_id
815857
)
816858
else:
817859
self.DataContext.bottomplane_level_id = INVALID_ID_VALUE
@@ -821,8 +863,8 @@ def reset_values_click(self, sender, e):
821863
original_level_id
822864
and original_level_id != DB.ElementId.InvalidElementId
823865
):
824-
self.DataContext.viewdepth_level_id = (
825-
get_elementid_value(original_level_id)
866+
self.DataContext.viewdepth_level_id = get_elementid_value(
867+
original_level_id
826868
)
827869
else:
828870
self.DataContext.viewdepth_level_id = INVALID_ID_VALUE

0 commit comments

Comments
 (0)