Skip to content

Commit b109b18

Browse files
committed
Add combined wipe tool for DC3D + TemporaryGraphicsHandlerService
1 parent 950170c commit b109b18

2 files changed

Lines changed: 195 additions & 0 deletions

File tree

  • extensions/pyRevitTools.extension/pyRevit.tab/Project.panel/Wipe.pulldown/Wipe External Services.pushbutton
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
title:
2+
en_us: Wipe External Services
3+
ko: 외부 서비스 삭제
4+
fr_fr: Supprimer les services externes
5+
ru: Очистить внешние сервисы
6+
chinese_s: 清除外部服务
7+
es_es: Limpiar servicios externos
8+
de_de: Externe Dienste löschen
9+
pt_br: Remover Serviços Externos
10+
tooltip:
11+
en_us: >-
12+
This tool helps you remove custom external services registered in the
13+
model that may be causing crashes or instability, such as DirectContext3D
14+
servers and TemporaryGraphicsHandlerService callbacks (often added by
15+
third-party plugins). Run the tool and select the server(s) you'd like
16+
to remove. Then hit "Remove Selected Servers" and the process will
17+
unregister them. This can help resolve corruption or performance issues
18+
caused by orphaned or misbehaving external service registrations.
19+
ko: >-
20+
모델에 등록된 사용자 지정 외부 서비스 중 충돌이나 불안정을 유발할 수 있는 항목(예: DirectContext3D
21+
서버 및 서드파티 플러그인이 자주 추가하는 TemporaryGraphicsHandlerService 콜백)을 제거하는 데
22+
도움을 줍니다. 도구를 실행하고 제거하고 싶은 서버를 선택합니다. 그런 다음 "선택한 서버 제거"를 누르면
23+
해당 서버들의 등록이 해제됩니다. 이는 방치되거나 오작동하는 외부 서비스 등록으로 인한 손상이나 성능
24+
문제를 해결하는 데 도움이 될 수 있습니다.
25+
fr_fr: >-
26+
Cet outil vous aide à supprimer les services externes personnalisés
27+
enregistrés dans le modèle qui peuvent causer des plantages ou une
28+
instabilité, tels que les serveurs DirectContext3D et les rappels
29+
TemporaryGraphicsHandlerService (souvent ajoutés par des plugins tiers).
30+
Exécutez l'outil et sélectionnez le(s) serveur(s) que vous souhaitez
31+
supprimer. Appuyez ensuite sur "Supprimer les serveurs sélectionnés" et
32+
le processus les désenregistrera. Cela peut aider à résoudre des
33+
problèmes de corruption ou de performance causés par des enregistrements
34+
de services externes orphelins ou défaillants.
35+
ru: >-
36+
Данный инструмент поможет Вам удалить пользовательские внешние сервисы,
37+
зарегистрированные в модели, которые могут вызывать сбои или
38+
нестабильность, такие как серверы DirectContext3D и обработчики
39+
TemporaryGraphicsHandlerService (часто добавляемые сторонними
40+
плагинами). Запустите инструмент и выделите сервер(ы), которые вы
41+
хотите удалить. Затем нажмите "Удалить выбранные серверы" и процесс
42+
отменит их регистрацию. Это может помочь устранить повреждения или
43+
проблемы с производительностью, вызванные забытыми или неисправно
44+
работающими регистрациями внешних сервисов.
45+
chinese_s: 此工具帮助您移除模型中注册的可能导致崩溃或不稳定的自定义外部服务,例如 DirectContext3D 服务器以及第三方插件经常添加的 TemporaryGraphicsHandlerService 回调。运行工具,选择您希望移除的服务器,然后点击“移除所选服务器”,该过程将取消它们的注册。这有助于解决因遗留或异常的外部服务注册而导致的损坏或性能问题。
46+
es_es: >-
47+
Esta herramienta le ayuda a eliminar servicios externos personalizados
48+
registrados en el modelo que pueden estar causando bloqueos o
49+
inestabilidad, como servidores DirectContext3D y devoluciones de
50+
llamada de TemporaryGraphicsHandlerService (a menudo añadidos por
51+
plugins de terceros). Ejecute la herramienta y seleccione el/los
52+
servidor(es) que desea eliminar. Luego presione "Eliminar servidores
53+
seleccionados" y el proceso cancelará su registro. Esto puede ayudar a
54+
resolver problemas de corrupción o rendimiento causados por registros
55+
de servicios externos huérfanos o defectuosos.
56+
de_de: >-
57+
Dieses Werkzeug hilft Ihnen dabei, benutzerdefinierte externe Dienste zu
58+
entfernen, die im Modell registriert sind und Abstürze oder Instabilität
59+
verursachen können, wie z.B. DirectContext3D-Server und
60+
TemporaryGraphicsHandlerService- Callbacks (häufig von
61+
Drittanbieter-Plugins hinzugefügt). Führen Sie das Werkzeug aus und
62+
wählen Sie den/die Server aus, den/die Sie entfernen möchten. Klicken
63+
Sie dann auf "Ausgewählte Server entfernen" und der Prozess hebt deren
64+
Registrierung auf. Dies kann helfen, Beschädigungen oder
65+
Leistungsprobleme zu beheben, die durch verwaiste oder fehlerhafte
66+
Registrierungen externer Dienste verursacht werden.
67+
pt_br: >-
68+
Esta ferramenta ajuda a remover serviços externos personalizados
69+
registrados no modelo que podem estar causando travamentos ou
70+
instabilidade, como servidores DirectContext3D e callbacks
71+
TemporaryGraphicsHandlerService (frequentemente adicionados por plugins
72+
de terceiros). Execute a ferramenta e selecione o(s) servidor(es) que
73+
deseja remover. Em seguida, clique em "Remover Servidores Selecionados"
74+
e o processo cancelará o registro deles. Isso pode ajudar a resolver
75+
problemas de corrupção ou desempenho causados por registros de serviços
76+
externos órfãos ou com mau funcionamento.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# -*- coding: utf-8 -*-
2+
from pyrevit import script, forms, revit
3+
from pyrevit.api import ExternalService as es
4+
5+
logger = script.get_logger()
6+
7+
# Short key -> BuiltInExternalServices property name, used for both
8+
# resolving the service and labeling servers in the combined list.
9+
SERVICE_DEFS = [
10+
("DirectContext3D", "DirectContext3DService"),
11+
("TemporaryGraphics", "TemporaryGraphicsHandlerService"),
12+
]
13+
14+
15+
class ServerOption(object):
16+
def __init__(self, label, service_key, service, server_id):
17+
self.label = label
18+
self.service_key = service_key
19+
self.service = service
20+
self.server_id = server_id
21+
22+
def __str__(self):
23+
return self.label
24+
25+
26+
def get_service(prop_name):
27+
"""Resolve an ExternalService instance from a BuiltInExternalServices property name."""
28+
try:
29+
service_id = getattr(es.ExternalServices.BuiltInExternalServices, prop_name)
30+
return es.ExternalServiceRegistry.GetService(service_id)
31+
except Exception as ex:
32+
logger.exception("Failed resolving service " + prop_name + " : " + str(ex))
33+
return None
34+
35+
36+
def collect_options(service_key, service):
37+
"""Build ServerOption entries for all active servers on a given service."""
38+
options = []
39+
try:
40+
active_ids = list(service.GetActiveServerIds())
41+
except Exception as ex:
42+
logger.exception("Failed reading active server ids for " + service_key + " : " + str(ex))
43+
return options
44+
45+
for sid in active_ids:
46+
try:
47+
server = service.GetServer(sid)
48+
if server:
49+
try:
50+
name = server.GetName()
51+
except Exception:
52+
name = "Unnamed Server"
53+
try:
54+
desc = server.GetDescription()
55+
except Exception:
56+
desc = "No Desc"
57+
else:
58+
name = "Unknown Server"
59+
desc = "No Desc"
60+
label = "[" + service_key + "] " + name + " | " + desc + " | " + str(sid)
61+
options.append(ServerOption(label, service_key, service, sid))
62+
except Exception as ex:
63+
logger.exception("Failed reading server info " + str(sid) + " : " + str(ex))
64+
return options
65+
66+
67+
def main():
68+
"""Let user select which external service server(s) to remove.
69+
70+
Covers DirectContext3DService and TemporaryGraphicsHandlerService in a
71+
single combined list, so both can be cleared out in one pass when
72+
third-party plugins leave misbehaving registrations behind.
73+
"""
74+
all_options = []
75+
76+
for service_key, prop_name in SERVICE_DEFS:
77+
service = get_service(prop_name)
78+
if not service:
79+
print("Service unavailable: " + service_key)
80+
continue
81+
all_options.extend(collect_options(service_key, service))
82+
83+
if not all_options:
84+
print("No active/removable servers found on any service.")
85+
return
86+
87+
selection = forms.SelectFromList.show(
88+
all_options,
89+
title="Select External Service Server(s) to Remove",
90+
multiselect=True,
91+
button_name="Remove Selected Servers",
92+
)
93+
94+
if not selection:
95+
print("Nothing selected.")
96+
return
97+
98+
removed = 0
99+
skipped = 0
100+
for opt in selection:
101+
service = opt.service
102+
sid = opt.server_id
103+
try:
104+
if service.IsRegisteredServerId(sid):
105+
service.RemoveServer(sid)
106+
removed += 1
107+
print("Removed: " + opt.label)
108+
else:
109+
skipped += 1
110+
except Exception as ex:
111+
logger.exception("Failed removing " + str(sid) + " : " + str(ex))
112+
skipped += 1
113+
114+
revit.uidoc.RefreshActiveView()
115+
print("Done. Removed: " + str(removed) + " | Skipped: " + str(skipped))
116+
117+
118+
if __name__ == "__main__":
119+
main()

0 commit comments

Comments
 (0)