Skip to content

Instantly share code, notes, and snippets.

@htlcnn
Created February 8, 2023 07:25
Show Gist options
  • Save htlcnn/5e1abeb3f29e0c99db42976f96b9b096 to your computer and use it in GitHub Desktop.
Save htlcnn/5e1abeb3f29e0c99db42976f96b9b096 to your computer and use it in GitHub Desktop.

You: Viết 1 đoạn code Python để chạy trong pyRevit, nội dung là yêu cầu người dùng chọn nhiều đối tượng thuộc category Structural Columns


ChatGPT: Here is a sample code in Python to be run in pyRevit that asks the user to select multiple objects belonging to the "Structural Columns" category:

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import FilteredElementCollector, BuiltInCategory

# Get the current Revit document
doc = __revit__.ActiveUIDocument.Document

# Use FilteredElementCollector to get all elements of "Structural Columns" category
columns = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralColumns).WhereElementIsNotElementType().ToElements()

# Get multiple selection from user
selected_columns = [i for i in __revit__.ActiveUIDocument.Selection.PickElementsByRectangle(Columns) if i.GetType().Name == "FamilyInstance"]

# Do something with the selected columns
for col in selected_columns:
    # Code here
    pass

You: sai rồi, Columns có viết hoa đâu


ChatGPT: Here's a corrected version of the code:

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import FilteredElementCollector, BuiltInCategory

# Get the current Revit document
doc = __revit__.ActiveUIDocument.Document

# Use FilteredElementCollector to get all elements of "Structural Columns" category
columns = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralColumns).WhereElementIsNotElementType().ToElements()

# Get multiple selection from user
selected_columns = [i for i in __revit__.ActiveUIDocument.Selection.PickElementsByRectangle(columns) if i.GetType().Name == "FamilyInstance"]

# Do something with the selected columns
for col in selected_columns:
    # Code here
    pass

You: vẫn sai nhé. PickElementsByRectangle phải dùng ISelectionFilter chứ ko dùng FilteredElementCollector


ChatGPT: Here is a corrected version of the code that uses ISelectionFilter instead of FilteredElementCollector:

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import BuiltInCategory, ElementId, ISelectionFilter

# Get the current Revit document
doc = __revit__.ActiveUIDocument.Document

# Define an ISelectionFilter to pick only structural columns
class StructuralColumnSelectionFilter(ISelectionFilter):
    def AllowElement(self, element):
        if element.Category.Id.IntegerValue == BuiltInCategory.OST_StructuralColumns.GetHashCode():
            return True
        return False
    def AllowReference(self, reference, position):
        return False

# Get multiple selection from user using the ISelectionFilter
selected_columns = [doc.GetElement(i) for i in __revit__.ActiveUIDocument.Selection.PickElementsByRectangle(StructuralColumnSelectionFilter(), "Select Structural Columns")]

# Do something with the selected columns
for col in selected_columns:
    # Code here
    pass

You: có cách khác ngoài PickElementsByRectangle ko?


ChatGPT: Yes, there are other methods to get multiple selections from the user in Revit. Here's an example that uses PickObjects:

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import BuiltInCategory, ElementId, ISelectionFilter

# Get the current Revit document
doc = __revit__.ActiveUIDocument.Document

# Define an ISelectionFilter to pick only structural columns
class StructuralColumnSelectionFilter(ISelectionFilter):
    def AllowElement(self, element):
        if element.Category.Id.IntegerValue == BuiltInCategory.OST_StructuralColumns.GetHashCode():
            return True
        return False
    def AllowReference(self, reference, position):
        return False

# Get multiple selection from user using PickObjects
selected_ids = __revit__.ActiveUIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element, StructuralColumnSelectionFilter(), "Select Structural Columns")
selected_columns = [doc.GetElement(i) for i in selected_ids]

# Do something with the selected columns
for col in selected_columns:
    # Code here
    pass

You: PickObjects có trả về id đâu mà đặt tên là selected_ids


ChatGPT: Here's a corrected version of the code with the correct variable name:

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import BuiltInCategory, ElementId, ISelectionFilter

# Get the current Revit document
doc = __revit__.ActiveUIDocument.Document

# Define an ISelectionFilter to pick only structural columns
class StructuralColumnSelectionFilter(ISelectionFilter):
    def AllowElement(self, element):
        if element.Category.Id.IntegerValue == BuiltInCategory.OST_StructuralColumns.GetHashCode():
            return True
        return False
    def AllowReference(self, reference, position):
        return False

# Get multiple selection from user using PickObjects
selected_element_ids = __revit__.ActiveUIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element, StructuralColumnSelectionFilter(), "Select Structural Columns")
selected_columns = [doc.GetElement(i) for i in selected_element_ids]

# Do something with the selected columns
for col in selected_columns:
    # Code here
    pass

You: đừng so sánh IntegerValue và hash code. PickObjects trả về references


ChatGPT: Here's a corrected version of the code that uses the correct variable name and compares ElementIds instead of hash codes:

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import BuiltInCategory, ElementId, ISelectionFilter

# Get the current Revit document
doc = __revit__.ActiveUIDocument.Document

# Define an ISelectionFilter to pick only structural columns
class StructuralColumnSelectionFilter(ISelectionFilter):
    def AllowElement(self, element):
        if element.Category.Id == ElementId(BuiltInCategory.OST_StructuralColumns):
            return True
        return False
    def AllowReference(self, reference, position):
        return False

# Get multiple selection from user using PickObjects
selected_element_references = __revit__.ActiveUIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element, StructuralColumnSelectionFilter(), "Select Structural Columns")
selected_columns = [doc.GetElement(i.ElementId) for i in selected_element_references]

# Do something with the selected columns
for col in selected_columns:
    # Code here
    pass

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment