Skip to content

Commit ad8a199

Browse files
authored
Merge branch 'pyrevitlabs:develop' into develop
2 parents 62eaf5d + 6332a36 commit ad8a199

File tree

5 files changed

+105
-12
lines changed

5 files changed

+105
-12
lines changed

extensions/pyRevitDevTools.extension/pyRevitDev.tab/Developer Tools.panel/Generate API Stubs.pushbutton/script.py

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,67 @@
77
from pyrevit import labs
88
from pyrevit import forms
99
from pyrevit import script
10+
from rpw.ui.forms.flexform import FlexForm, Label, Button, CheckBox
1011

1112

1213
logger = script.get_logger()
1314
output = script.get_output()
1415

15-
16-
ASSMS = [
16+
RVT_ASSMS = [
1717
'RevitAPI',
18-
'RevitAPIUI',
18+
'RevitAPIUI'
19+
]
20+
DYN_ASSMS = [
21+
'DynamoServices',
22+
'DynamoCore',
23+
'DynamoApplications',
24+
'DSCoreNodes',
25+
'RevitServices',
26+
'RevitNodes',
27+
# 'ProtoGeometry',
1928
# 'UIFramework',
2029
# 'Adwindows',
30+
]
31+
PYR_ASSMS = [
2132
'pyRevitLabs.Common',
2233
'pyRevitLabs.TargetApps.Revit',
23-
'pyRevitLabs.PyRevit',
34+
'pyRevitLabs.PyRevit'
2435
]
2536

37+
def flexform_select():
38+
components = [
39+
Label('Select Assembly Group to Generate Stubs:'),
40+
CheckBox('Revit', 'Revit Assemblies', default=True),
41+
CheckBox('Dynamo', 'Dynamo Assemblies', default=False),
42+
CheckBox('pyRevit', 'pyRevit Assemblies', default=False),
43+
Button('Pick Destination Folder and Continue'),
44+
]
45+
form = FlexForm('Generate API Stubs', components)
46+
form.show()
47+
selected = []
48+
if form.values.get('Revit'):
49+
selected.extend(RVT_ASSMS)
50+
if form.values.get('Dynamo'):
51+
selected.extend(DYN_ASSMS)
52+
if form.values.get('pyRevit'):
53+
selected.extend(PYR_ASSMS)
54+
return selected
55+
56+
ASSMS = flexform_select()
57+
if not ASSMS:
58+
print("No assembly group selected. Exiting...")
59+
script.exit()
60+
2661
dest_path = forms.pick_folder()
2762

2863
if dest_path:
2964
for assm_name in ASSMS:
65+
print('Processing assembly: {}'.format(assm_name))
66+
try:
67+
load_assm = assmutils.load_asm(assm_name)
68+
print('Loaded assembly: {}'.format(assm_name))
69+
except Exception as ldEx:
70+
print('Error loading assembly {} | {}'.format(assm_name, ldEx))
3071
assm = assmutils.find_loaded_asm(assm_name)
3172
if assm:
3273
try:
@@ -37,3 +78,4 @@
3778
print('Generated stubs for %s -> %s' % (assm_name, stubs_path))
3879
except Exception as sgEx:
3980
logger.error('Failed generating stubs for %s', assm_name)
81+

pyrevitlib/pyrevit/forms/ParameterItemStyle.xaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@
2020
<Border x:Name="IsReadOnly" Background="{DynamicResource pyRevitAccentBrush}" Height="16" Margin="10,0,0,0" Padding="8,0,8,0" Visibility="Collapsed" CornerRadius="4">
2121
<TextBlock Text="Read-Only" Foreground="White" FontSize="10"/>
2222
</Border>
23+
<Border x:Name="IsUnit" Background="DarkKhaki" Height="16" Margin="10,0,0,0" Padding="8,0,8,0" Visibility="Collapsed" CornerRadius="4">
24+
<TextBlock Text="Unit" Foreground="White" FontSize="10"/>
25+
</Border>
26+
<Border x:Name="Storagetype" Background="PowderBlue" Height="16" Margin="10,0,0,0" Padding="8,0,8,0" Visibility="Visible" CornerRadius="4">
27+
<TextBlock Text="{Binding storagetype}" Foreground="LightSlateGray" FontSize="10"/>
28+
</Border>
2329
</WrapPanel>
2430
<ControlTemplate.Triggers>
2531
<DataTrigger Binding="{Binding Path=istype}" Value="True">
@@ -28,5 +34,8 @@
2834
<DataTrigger Binding="{Binding Path=isreadonly}" Value="True">
2935
<Setter TargetName="IsReadOnly" Property="Visibility" Value="Visible"/>
3036
</DataTrigger>
37+
<DataTrigger Binding="{Binding Path=isunit}" Value="True">
38+
<Setter TargetName="IsUnit" Property="Visibility" Value="Visible"/>
39+
</DataTrigger>
3140
</ControlTemplate.Triggers>
3241
</ControlTemplate>

pyrevitlib/pyrevit/forms/__init__.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,16 @@
7070
XAML_FILES_DIR = op.dirname(__file__)
7171

7272

73-
ParamDef = namedtuple("ParamDef", ["name", "istype", "definition", "isreadonly"])
73+
ParamDef = namedtuple("ParamDef", ["name", "istype", "definition", "isreadonly", "isunit", "storagetype"])
7474
"""Parameter definition tuple.
7575
7676
Attributes:
7777
name (str): parameter name
7878
istype (bool): true if type parameter, otherwise false
7979
definition (Autodesk.Revit.DB.Definition): parameter definition object
8080
isreadonly (bool): true if the parameter value can't be edited
81+
isunit (bool): true if its ForgeTypeId is measurable
82+
storagetype (Autodesk.Revit.DB.Storagetype): String, Integer, Double or ElementId
8183
"""
8284

8385

@@ -1016,6 +1018,22 @@ def _get_active_ctx(self):
10161018
else:
10171019
return self._context
10181020

1021+
def _get_all_ctx(self):
1022+
"""Get all context items across all groups"""
1023+
ctx = self._context
1024+
if ctx is None:
1025+
return
1026+
1027+
if isinstance(ctx, dict):
1028+
for group_items in ctx.values():
1029+
for item in group_items:
1030+
yield item
1031+
elif isinstance(ctx, (list, tuple, set)):
1032+
for item in ctx:
1033+
yield item
1034+
else:
1035+
yield ctx
1036+
10191037
def _list_options(self, option_filter=None):
10201038
if option_filter:
10211039
self.checkall_b.Content = "Check"
@@ -1062,12 +1080,12 @@ def _unwrap_options(options):
10621080
def _get_options(self):
10631081
if self.multiselect:
10641082
if self.return_all:
1065-
return [x for x in self._get_active_ctx()]
1083+
return list(self._get_all_ctx())
10661084
else:
10671085
return self._unwrap_options(
10681086
[
10691087
x
1070-
for x in self._get_active_ctx()
1088+
for x in self._get_all_ctx()
10711089
if x.state or x in self.list_lb.SelectedItems
10721090
]
10731091
)
@@ -2735,6 +2753,12 @@ def select_parameters(
27352753
istype=False,
27362754
definition=x.Definition,
27372755
isreadonly=x.IsReadOnly,
2756+
isunit=(
2757+
DB.UnitUtils.IsMeasurableSpec(x.Definition.GetDataType())
2758+
if HOST_APP.is_newer_than(2022, True)
2759+
else False
2760+
),
2761+
storagetype=x.StorageType,
27382762
)
27392763
for x in src_element.Parameters
27402764
if x.StorageType != non_storage_type
@@ -2752,6 +2776,12 @@ def select_parameters(
27522776
istype=True,
27532777
definition=x.Definition,
27542778
isreadonly=x.IsReadOnly,
2779+
isunit=(
2780+
DB.UnitUtils.IsMeasurableSpec(x.Definition.GetDataType())
2781+
if HOST_APP.is_newer_than(2022, True)
2782+
else False
2783+
),
2784+
storagetype=x.StorageType,
27552785
)
27562786
for x in src_type.Parameters
27572787
if x.StorageType != non_storage_type

pyrevitlib/pyrevit/revit/db/ensure.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
"""Idempotent operations to ensure a database object exists."""
22
import os.path as op
33

4+
from System import Int64
5+
46
from pyrevit import HOST_APP, DOCS, PyRevitException
57
from pyrevit import coreutils
68
from pyrevit.coreutils.logger import get_logger
79
from pyrevit import DB
8-
from pyrevit.revit import db
10+
from pyrevit.compat import get_elementid_from_value_func
911
from pyrevit.revit.db import query
1012
from pyrevit.revit.db import create
1113
from pyrevit.revit.db import transaction #pylint: disable=E0611
1214

1315

1416
#pylint: disable=W0703,C0302,C0103
1517
mlogger = get_logger(__name__)
16-
18+
get_elementid_from_value = get_elementid_from_value_func()
1719

1820
def ensure_sharedparam(sparam_name, sparam_categories, sparam_group,
1921
load_param=True, allow_vary_betwen_groups=False,
@@ -75,8 +77,8 @@ def ensure_element_ids(mixed_list):
7577
element_id_list.append(item.Id)
7678
elif hasattr(item, 'Id') and isinstance(item.Id, DB.ElementId):
7779
element_id_list.append(item.Id)
78-
elif isinstance(item, int):
79-
element_id_list.append(DB.ElementId(item))
80+
elif isinstance(item, (int, Int64)):
81+
element_id_list.append(get_elementid_from_value(item))
8082

8183
return element_id_list
8284

pyrevitlib/rpws/server.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
r"""Python wrapper for Autodesk Revit Server.
23
34
Example:
@@ -21,6 +22,7 @@
2122
import uuid
2223
import getpass
2324
import socket
25+
import urllib
2426

2527
# third party modules
2628
import requests
@@ -45,6 +47,14 @@
4547
"2016": "/RevitServerAdminRESTService2016/AdminRESTService.svc",
4648
"2017": "/RevitServerAdminRESTService2017/AdminRESTService.svc",
4749
"2018": "/RevitServerAdminRESTService2018/AdminRESTService.svc",
50+
"2019": "/RevitServerAdminRESTService2019/AdminRESTService.svc",
51+
"2020": "/RevitServerAdminRESTService2020/AdminRESTService.svc",
52+
"2021": "/RevitServerAdminRESTService2021/AdminRESTService.svc",
53+
"2022": "/RevitServerAdminRESTService2022/AdminRESTService.svc",
54+
"2023": "/RevitServerAdminRESTService2023/AdminRESTService.svc",
55+
"2024": "/RevitServerAdminRESTService2024/AdminRESTService.svc",
56+
"2025": "/RevitServerAdminRESTService2025/AdminRESTService.svc",
57+
"2026": "/RevitServerAdminRESTService2026/AdminRESTService.svc",
4858
}
4959

5060

@@ -154,7 +164,7 @@ def _httpmethod(self, http_method, command, node_uri=None, rootcmd=False):
154164
if rootcmd:
155165
req_url = self._base_uri + command
156166
else:
157-
req_url = self._base_uri + '/' + self._api_path(node_uri) + command
167+
req_url = self._base_uri + '/' + urllib.quote(self._api_path(node_uri).encode('utf-8')) + command
158168

159169
# send to server
160170
try:

0 commit comments

Comments
 (0)