# -*- coding: utf-8 -*-
import clr
clr.AddReference("RevitServices")
clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")
clr.AddReference("System.Windows.Forms")
clr.AddReference("System.Drawing")
from RevitServices.Persistence import DocumentManager
from Autodesk.Revit.DB import FilteredElementCollector, BuiltInCategory, Transaction, Level, BuiltInParameter, ElementId
from System.Windows.Forms import Form, Label, Button, ListBox, MessageBox, MessageBoxButtons, MessageBoxIcon, SelectionMode
from System.Drawing import Point, Size
import System
import sys
doc = __revit__.ActiveUIDocument.Document
uidoc = __revit__.ActiveUIDocument
if doc is None:
raise Exception("Er is geen actief Revit-document geopend.")
# Laat de gebruiker elementen selecteren in de tekening
selected_ids = uidoc.Selection.GetElementIds()
if not selected_ids:
MessageBox.Show("Geen elementen geselecteerd. Selecteer elementen en probeer opnieuw.", "Fout", MessageBoxButtons.OK, MessageBoxIcon.Error)
sys.exit()
# Verzamel de geselecteerde elementen
elements = [doc.GetElement(id) for id in selected_ids]
def find_level_and_elevation(elem😞
"""Zoekt de Level en Elevation from Level parameters en controleert Reference Level voor MEP-elementen."""
possible_params = ["Level", "Base Level", "Reference Level", "Host Level", "Associated Level", "Work Plane"]
level_param = None
elevation_param = elem.LookupParameter("Elevation from Level")
for name in possible_params:
param = elem.LookupParameter(name)
if param and not param.IsReadOnly:
level_param = param
break
if not level_param:
level_param = elem.get_Parameter(BuiltInParameter.FAMILY_LEVEL_PARAM)
level = doc.GetElement(level_param.AsElementId()) if level_param else None
elevation = elevation_param.AsDouble() if elevation_param else None
return level, level_param, elevation, elevation_param
# Zoek naar wijzigbare niveau- en hoogteparameters
elements_with_levels = []
for elem in elements:
level, level_param, elevation, elevation_param = find_level_and_elevation(elem)
if level_param and not level_param.IsReadOnly:
elements_with_levels.append((elem, level, level_param, elevation, elevation_param))
if not elements_with_levels:
MessageBox.Show("Geen van de geselecteerde elementen heeft een wijzigbare Level- of Reference Level-parameter.", "Fout", MessageBoxButtons.OK, MessageBoxIcon.Error)
sys.exit()
# Verzamel alle beschikbare levels
levels = FilteredElementCollector(doc).OfClass(Level).ToElements()
levels_sorted = sorted(levels, key=lambda l: l.Name)
level_names = [l.Name for l in levels_sorted]
level_names_net = System.Array[System.Object](level_names)
class SelectionForm(Form😞
def __init__(self😞
self.Text = "Selecteer een nieuw referentieniveau"
self.Size = Size(400, 300)
self.MinimumSize = Size(300, 250)
self.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
self.label_levels = Label()
self.label_levels.Text = "Selecteer een nieuw referentieniveau:"
self.label_levels.Location = Point(10, 10)
self.label_levels.Width = 350
self.Controls.Add(self.label_levels)
self.listbox_levels = ListBox()
self.listbox_levels.Location = Point(10, 40)
self.listbox_levels.Width = 350
self.listbox_levels.Height = 150
self.listbox_levels.SelectionMode = SelectionMode.One
self.listbox_levels.Items.AddRange(level_names_net)
self.Controls.Add(self.listbox_levels)
self.ok_button = Button()
self.ok_button.Text = "OK"
self.ok_button.Location = Point(self.ClientSize.Width // 2 - 40, self.ClientSize.Height - 50)
self.ok_button.Click += self.ok_click
self.Controls.Add(self.ok_button)
self.selected_level = None
self.Resize += self.on_resize
def on_resize(self, sender, event😞
self.listbox_levels.Size = Size(self.ClientSize.Width - 20, self.ClientSize.Height - 100)
self.ok_button.Location = Point(self.ClientSize.Width // 2 - 40, self.ClientSize.Height - 50)
def ok_click(self, sender, event😞
if self.listbox_levels.SelectedIndex != -1:
self.selected_level = levels_sorted[self.listbox_levels.SelectedIndex]
self.DialogResult = System.Windows.Forms.DialogResult.OK
self.Close()
else:
MessageBox.Show("Selecteer een referentieniveau.", "Fout", MessageBoxButtons.OK, MessageBoxIcon.Error)
form = SelectionForm()
form.ShowDialog()
if form.selected_level is None:
sys.exit()
# Start een transactie om de niveau- en elevatieparameter aan te passen
t = Transaction(doc, "Wijzig referentieniveau en Elevation from Level van geselecteerde elementen")
t.Start()
try:
for elem, old_level, level_param, elevation, elevation_param in elements_with_levels:
old_level_elevation = old_level.Elevation if old_level else 0
new_level_elevation = form.selected_level.Elevation
# Bereken het nieuwe elevation-from-level
new_elevation_value = (elevation or 0) + (old_level_elevation - new_level_elevation)
# Stel het nieuwe niveau in
if level_param:
level_param.Set(form.selected_level.Id)
# Stel de nieuwe elevatie in
if elevation_param and not elevation_param.IsReadOnly:
elevation_param.Set(new_elevation_value)
t.Commit()
MessageBox.Show("Niveau en hoogte succesvol gewijzigd.", "Succes", MessageBoxButtons.OK, MessageBoxIcon.Information)
except Exception as e:
t.RollBack()
MessageBox.Show("Fout bij het wijzigen van het niveau: {}".format(e), "Fout", MessageBoxButtons.OK, MessageBoxIcon.Error)