Skip to content

Commit bf45832

Browse files
committed
Merge branch 'develop' into release/46beta
2 parents 534fb80 + a740e52 commit bf45832

File tree

48 files changed

+1054
-306
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1054
-306
lines changed

dev/WPFEdit/WPFEdit/WPFEdit.csproj

+5
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@
105105
<Generator>MSBuild:Compile</Generator>
106106
<SubType>Designer</SubType>
107107
</Page>
108+
<Page Include="..\..\..\extensions\pyRevitTools.extension\pyRevit.tab\Modify.panel\Match.pushbutton\MatchConfigWindowLegacy.xaml">
109+
<Link>Tools\MatchConfigWindowLegacy.xaml</Link>
110+
<Generator>MSBuild:Compile</Generator>
111+
<SubType>Designer</SubType>
112+
</Page>
108113
<Page Include="..\..\..\extensions\pyRevitTools.extension\pyRevit.tab\Modify.panel\Patterns.splitpushbutton\Make Pattern.pushbutton\MakePatternWindow.xaml">
109114
<Link>Tools\MakePatternWindow.xaml</Link>
110115
<Generator>MSBuild:Compile</Generator>

dev/todo.todo

+3
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@ pyrevit cli:
33
installer:
44

55
pyrevit:
6+
☐ fix log messages in tools
7+
☐ faster sheet titleblock selection tool
8+
☐ the help uri for splitpushbutton doesn't work correctly e.g match tool
69
☐ slowly move collectors in List tool to db.query
710
☐ slowly phase out the extpackages module and user PyRevitLabs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pyRevit[beforeall:]

extensions/pyRevitCore.extension/pyRevit.tab/pyRevit.panel/Settings.smartbutton/SettingsWindow.xaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
<StackPanel>
8181
<WrapPanel Margin="10,15,0,5">
8282
<ToggleButton Style="{StaticResource AnimatedSwitch}" Height="24" x:Name="rocketmode_cb" IsChecked="False"/>
83-
<TextBlock Margin="30,4,0,0">Rocket Mode &#x1F680; (Experimental / Reload Required)</TextBlock>
83+
<TextBlock Margin="30,4,0,0">Rocket Mode &#x1F680; (Reload Required)</TextBlock>
8484
</WrapPanel>
8585
<TextBlock TextWrapping="WrapWithOverflow" Margin="65,0,10,10">This is the switch for pyRevit Rocket Mode.
8686
If enabled, pyRevit will use a shared engine per each extension
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
__doc__ = 'Print the full path to the central model (if model is workshared).'
1+
"""Print the full path to the central model (if model is workshared)."""
22

3-
4-
from pyrevit import revit, DB, UI
3+
#pylint: disable=E0401
4+
from pyrevit import revit
55
from pyrevit import forms
66

77

8-
if revit.doc.IsWorkshared:
9-
model_path = revit.doc.GetWorksharingCentralModelPath()
10-
print(DB.ModelPathUtils.ConvertModelPathToUserVisiblePath(model_path))
11-
else:
12-
forms.alert('Model is not workshared.')
8+
forms.check_workshared(doc=revit.doc)

extensions/pyRevitTools.extension/extension.json

+4
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,9 @@
1010
"url": "https://github.com/eirannejad/pyRevit.git",
1111
"website": "http://eirannejad.github.io/pyRevit/",
1212
"image": "",
13+
"templates": {
14+
"author": "Ehsan Iran-Nejad",
15+
"docpath": "https://www.youtube.com/watch?v="
16+
},
1317
"dependencies": []
1418
}

extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack2/Inspect.pulldown/Find Linked Elements.pushbutton/script.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44

55
__context__ = 'selection'
6-
__helpurl__ = 'https://www.youtube.com/watch?v=4IlvCkoOolw'
6+
__helpurl__ = '{{docpath}}4IlvCkoOolw'
77
__doc__ = 'Lists all the elements that are tied to the selected element.'\
88
' For example elements tags or dimensions.'
99

extensions/pyRevitTools.extension/pyRevit.tab/Analysis.panel/Tools.stack2/Sum.pushbutton/script.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,9 @@ def process_sets(element_list):
149149
el_sets[el.LineStyle.Name].append(el)
150150
else:
151151
eltype = revit.doc.GetElement(el.GetTypeId())
152-
wrapped_eltype = revit.ElementWrapper(eltype)
153-
el_sets[wrapped_eltype.name].append(el)
152+
if eltype:
153+
wrapped_eltype = revit.ElementWrapper(eltype)
154+
el_sets[wrapped_eltype.name].append(el)
154155

155156
return el_sets
156157

extensions/pyRevitTools.extension/pyRevit.tab/Drawing Set.panel/Print.pulldown/Print Ordered Sheet Index.pushbutton/script.py

+40-27
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,18 @@ def show_placeholders(self):
9797
def include_placeholders(self):
9898
return self.indexspace_cb.IsChecked
9999

100+
@property
101+
def sheet_list(self):
102+
return self.sheets_lb.ItemsSource
103+
104+
@sheet_list.setter
105+
def sheet_list(self, value):
106+
self.sheets_lb.ItemsSource = value
107+
108+
@property
109+
def printable_sheets(self):
110+
return [x for x in self.sheet_list if x.printable]
111+
100112
def _get_schedule_text_data(self, schedule_view):
101113
schedule_data_file = \
102114
script.get_instance_data_file(str(schedule_view.Id.IntegerValue))
@@ -112,8 +124,8 @@ def _get_schedule_text_data(self, schedule_view):
112124
as sched_data_file:
113125
return sched_data_file.readlines()
114126
except Exception as open_err:
115-
logger.error('Error opening sheet index export: {} | {}'
116-
.format(schedule_data_file, open_err))
127+
logger.error('Error opening sheet index export: %s | %s',
128+
schedule_data_file, open_err)
117129
return sched_data
118130

119131
def _order_sheets_by_schedule_data(self, schedule_view, sheet_list):
@@ -126,13 +138,12 @@ def _order_sheets_by_schedule_data(self, schedule_view, sheet_list):
126138
for sheet in sheet_list:
127139
for line_no, data_line in enumerate(sched_data):
128140
try:
129-
if sheet.CanBePrinted:
130-
if sheet.SheetNumber in data_line:
131-
ordered_sheets_dict[line_no] = sheet
132-
break
133-
else:
134-
logger.warning('Sheet {} is not printable.'
135-
.format(sheet.SheetNumber))
141+
if sheet.SheetNumber in data_line:
142+
ordered_sheets_dict[line_no] = sheet
143+
break
144+
if not sheet.CanBePrinted:
145+
logger.debug('Sheet %s is not printable.',
146+
sheet.SheetNumber)
136147
except Exception:
137148
continue
138149

@@ -166,7 +177,7 @@ def _get_printmanager(self):
166177
except Exception as printerr:
167178
logger.critical('Error getting printer manager from document. '
168179
'Most probably there is not a printer defined '
169-
'on your system. | {}'.format(printerr))
180+
'on your system. | %s', printerr)
170181
return None
171182

172183
def _print_combined_sheets_in_order(self):
@@ -182,11 +193,13 @@ def _print_combined_sheets_in_order(self):
182193
sheet_set = DB.ViewSet()
183194
original_sheetnums = []
184195
with revit.Transaction('Fix Sheet Numbers') as t:
185-
for idx, sheet in enumerate(self.sheets_lb.ItemsSource):
186-
sht = sheet.revit_sheet
187-
original_sheetnums.append(sht.SheetNumber)
188-
sht.SheetNumber = NPC * (idx + 1) + sht.SheetNumber
189-
sheet_set.Insert(sht)
196+
for idx, sheet in enumerate(self.sheet_list):
197+
rvtsheet = sheet.revit_sheet
198+
original_sheetnums.append(rvtsheet.SheetNumber)
199+
rvtsheet.SheetNumber = \
200+
NPC * (idx + 1) + rvtsheet.SheetNumber
201+
if sheet.printable:
202+
sheet_set.Insert(rvtsheet)
190203

191204
# Collect existing sheet sets
192205
cl = DB.FilteredElementCollector(revit.doc)
@@ -222,7 +235,7 @@ def _print_combined_sheets_in_order(self):
222235
logger.critical(
223236
'Error setting sheet set on print mechanism. '
224237
'These items are included in the viewset '
225-
'object:\n{}'.format(sheet_report)
238+
'object:\n%s', sheet_report
226239
)
227240
raise viewset_err
228241

@@ -241,10 +254,10 @@ def _print_combined_sheets_in_order(self):
241254

242255
# now fix the sheet names
243256
with revit.Transaction('Restore Sheet Numbers') as t:
244-
for sheet, sheetnum in zip(self.sheets_lb.ItemsSource,
257+
for sheet, sheetnum in zip(self.sheet_list,
245258
original_sheetnums):
246-
sht = sheet.revit_sheet
247-
sht.SheetNumber = sheetnum
259+
rvtsheet = sheet.revit_sheet
260+
rvtsheet.SheetNumber = sheetnum
248261

249262
def _print_sheets_in_order(self):
250263
# make sure we can access the print config
@@ -254,7 +267,7 @@ def _print_sheets_in_order(self):
254267
print_mgr.PrintToFile = True
255268
# print_mgr.CombinedFile = False
256269
print_mgr.PrintRange = DB.PrintRange.Current
257-
for sheet in self.sheets_lb.ItemsSource:
270+
for sheet in self.sheet_list:
258271
output_fname = \
259272
coreutils.cleanup_filename('{:05} {} - {}.pdf'
260273
.format(sheet.print_index,
@@ -265,8 +278,8 @@ def _print_sheets_in_order(self):
265278
if sheet.printable:
266279
print_mgr.SubmitPrint(sheet.revit_sheet)
267280
else:
268-
logger.warning('Sheet {} is not printable. Skipping print.'
269-
.format(sheet.SheetNumber))
281+
logger.debug('Sheet %s is not printable. Skipping print.',
282+
sheet.number)
270283

271284
def _update_print_indices(self, sheet_list):
272285
for idx, sheet in enumerate(sheet_list):
@@ -295,20 +308,20 @@ def selection_changed(self, sender, args):
295308
if not self.include_placeholders:
296309
self._update_print_indices(printable_sheets)
297310

298-
self.sheets_lb.ItemsSource = printable_sheets
311+
self.sheet_list = printable_sheets
299312

300313
else:
301314
self.indexspace_cb.IsChecked = True
302315
self.indexspace_cb.IsEnabled = False
303316
# update print indices
304317
self._update_print_indices(sheet_list)
305318
# Show all sheets
306-
self.sheets_lb.ItemsSource = sheet_list
319+
self.sheet_list = sheet_list
307320

308321
def print_sheets(self, sender, args):
309-
if self.sheets_lb.ItemsSource:
322+
if self.sheet_list:
310323
if not self.combine_print:
311-
sheet_count = len(self.sheets_lb.ItemsSource)
324+
sheet_count = len(self.sheet_list)
312325
if sheet_count > 5:
313326
if not forms.alert('Are you sure you want to print {} '
314327
'sheets individually? The process can '
@@ -340,7 +353,7 @@ def drop_sheet(self, sender, args):
340353
dropped_idx = self.sheets_lb.Items.IndexOf(dropped_data)
341354
target_idx = self.sheets_lb.Items.IndexOf(target)
342355

343-
sheet_list = self.sheets_lb.ItemsSource
356+
sheet_list = self.sheet_list
344357
sheet_list.remove(dropped_data)
345358
sheet_list.insert(target_idx, dropped_data)
346359
self._update_print_indices(sheet_list)

extensions/pyRevitTools.extension/pyRevit.tab/Drawing Set.panel/Revision.pulldown/Create Revised Sheet Set.pushbutton/script.py

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from pyrevit import forms
44

55

6-
__author__ = '{{author}}'
76
__doc__ = 'Select a revision from the list of revisions and this script '\
87
'will create a print sheet set for the revised sheets under the '\
98
'selected revision, and will assign the new sheet set as '\

extensions/pyRevitTools.extension/pyRevit.tab/Drawing Set.panel/Sheets.pulldown/Batch Sheet Maker.pushbutton/script.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from pyrevit import script
77

88

9-
__helpurl__ = "https://www.youtube.com/watch?v=SJzs9ZxqRYc"
9+
__helpurl__ = "{{docpath}}SJzs9ZxqRYc"
1010

1111
__doc__ = 'Enter sheet names and numbers in the text box and '\
1212
'this tool will create all at once.'

extensions/pyRevitTools.extension/pyRevit.tab/Drawing Set.panel/Sheets.pulldown/Copy Sheets to Open Documents.pushbutton/script.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from Autodesk.Revit.DB import Element as DBElement
88

99

10-
__helpurl__ = 'https://www.youtube.com/watch?v=9Q-J6mWBYJI&t=17s'
10+
__helpurl__ = '{{docpath}}9Q-J6mWBYJI&t=17s'
1111
__doc__ = 'Copies selected or current sheet(s) to other ' \
1212
'projects currently open in Revit. Make sure the destination ' \
1313
'documents have at least one Legend view (Revit API does not ' \

extensions/pyRevitTools.extension/pyRevit.tab/Drawing Set.panel/views.stack3/Legends.pulldown/Copy Selected Legends As Detail Views To Open Documents.pushbutton/script.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from pyrevit import forms
55

66

7-
__helpurl__ = 'https://www.youtube.com/watch?v=ThzcRM_Tj8g'
7+
__helpurl__ = '{{docpath}}ThzcRM_Tj8g'
88
__doc__ = 'Converts selected legend views to detail views and copies '\
99
'them to all projects currently open in Revit.'
1010

extensions/pyRevitTools.extension/pyRevit.tab/Drawing Set.panel/views.stack3/Legends.pulldown/Copy Selected Legends To Open Documents.pushbutton/script.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from pyrevit import forms
77

88

9-
__helpurl__ = 'https://www.youtube.com/watch?v=ThzcRM_Tj8g'
9+
__helpurl__ = '{{docpath}}ThzcRM_Tj8g'
1010

1111

1212
class CopyUseDestination(DB.IDuplicateTypeNamesHandler):

extensions/pyRevitTools.extension/pyRevit.tab/Drawing Set.panel/views.stack3/Views.pulldown/Find Referring Views.pushbutton/script.py

+13-10
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pyrevit import script
66

77

8+
logger = script.get_logger()
89
output = script.get_output()
910

1011

@@ -30,12 +31,12 @@
3031

3132
class ReferencingView:
3233
def __init__(self, view_id):
33-
self.element = doc.GetElement(view_id)
34+
self.element = revit.doc.GetElement(view_id)
3435
if not self._valid_view():
3536
raise Exception()
3637

37-
title = self.element.LookupParameter('Title on Sheet').AsString()
38-
self.name = title if title else self.element.ViewName
38+
titleos = self.element.LookupParameter('Title on Sheet').AsString()
39+
self.name = titleos if titleos else self.element.ViewName
3940
self.refs = []
4041
self._update_refs(all_ref_els)
4142
# self._update_refs(self.element.GetReferenceCallouts())
@@ -59,9 +60,12 @@ def _valid_view(self):
5960

6061
def _update_refs(self, el_list):
6162
for elid in el_list:
62-
el = doc.GetElement(elid)
63-
if el.OwnerViewId == self.element.Id:
64-
self.refs.append(el.Name)
63+
element = revit.doc.GetElement(elid)
64+
viewnameparam = element.LookupParameter("View Name")
65+
if element.OwnerViewId == self.element.Id \
66+
or (viewnameparam \
67+
and viewnameparam.AsString() == self.element.ViewName):
68+
self.refs.append(element.Name)
6569

6670
def is_referring_to(self, view_name):
6771
return view_name in self.refs
@@ -76,14 +80,13 @@ def is_sheeted(self):
7680
try:
7781
rv = ReferencingView(view.Id)
7882
all_views.append(rv)
79-
except Exception:
80-
pass
83+
except Exception as ex:
84+
logger.debug(ex)
8185

8286

8387
print('{} views processed...'.format(len(all_views)))
8488

85-
for selid in selection:
86-
vp = revit.doc.GetElement(selid)
89+
for vp in selection:
8790
if isinstance(vp, DB.Viewport):
8891
v = revit.doc.GetElement(vp.ViewId)
8992
title = v.LookupParameter('Title on Sheet').AsString()

extensions/pyRevitTools.extension/pyRevit.tab/Drawing Set.panel/views.stack3/Views.pulldown/Purge Unused Filters.pushbutton/script.py

+25-25
Original file line numberDiff line numberDiff line change
@@ -45,28 +45,28 @@ def name(self):
4545

4646
if not unusedFilters:
4747
forms.alert('All filters are in use. No purging in necessary.')
48-
49-
# ask user for wipe actions
50-
return_options = \
51-
forms.SelectFromList.show(
52-
[ViewFilterToPurge(revit.doc.GetElement(DB.ElementId(x)))
53-
for x in unusedFilters],
54-
title='Select Filters to Purge',
55-
width=500,
56-
button_name='Purge Filters',
57-
multiselect=True
58-
)
59-
60-
# print('{} Filters have not been used and will be purged.'
61-
# .format(len(unusedFilters)))
62-
63-
if return_options:
64-
with revit.Transaction('Purge Unused Filters'):
65-
for vf in return_options:
66-
logger.debug('Purging Filter: {0}\t{1}'
67-
.format(vf.Id, vf.Name))
68-
try:
69-
revit.doc.Delete(vf.Id)
70-
except Exception as del_err:
71-
logger.error('Error purging filter: {} | {}'
72-
.format(vf.Name, del_err))
48+
else:
49+
# ask user for wipe actions
50+
return_options = \
51+
forms.SelectFromList.show(
52+
[ViewFilterToPurge(revit.doc.GetElement(DB.ElementId(x)))
53+
for x in unusedFilters],
54+
title='Select Filters to Purge',
55+
width=500,
56+
button_name='Purge Filters',
57+
multiselect=True
58+
)
59+
60+
# print('{} Filters have not been used and will be purged.'
61+
# .format(len(unusedFilters)))
62+
63+
if return_options:
64+
with revit.Transaction('Purge Unused Filters'):
65+
for vf in return_options:
66+
logger.debug('Purging Filter: {0}\t{1}'
67+
.format(vf.Id, vf.Name))
68+
try:
69+
revit.doc.Delete(vf.Id)
70+
except Exception as del_err:
71+
logger.error('Error purging filter: {} | {}'
72+
.format(vf.Name, del_err))

0 commit comments

Comments
 (0)