1212logger = script .get_logger ()
1313output = 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
2230get_elementid_value = get_elementid_value_func ()
2331INVALID_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