Редактирование и загрузка семейств в проект.
Главная › Форумы › Задать вопрос › Редактирование и загрузка семейств в проект.
- В этой теме 0 ответов, 1 участник, последнее обновление 5 лет, 11 месяцев назад сделано Евгений.
-
АвторСообщения
-
Коллеги, здравствуйте. На днях столкнулся с следующей проблемой.
Во всех аннотациях проекта потребовалось заменить стиль текста.
Решил поделиться основными методами по редактированию вложенных в семейство элементов, так как очень много времени потратил на поиск и понимание ключевого метода загрузки семейства. Вдруг кому то будет полезно.Ниже с код и описание. Я понимаю что некоторые моменты реализованы довольно криво, но переписывать не хочется.
#Подгрузка библиотек:
import clr
clr.AddReference(‘RevitAPI’)
import Autodesk
from Autodesk.Revit.DB import *clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *clr.AddReference(“RevitServices”)
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager# Далее следует самая важная часть которую я так до конца и не понял. В двух словах здесь создается класс с наследованием от интерфейса загрузки семейства с описанием методов загрузки. В общем этот класс нужно использовать в любом случае, так как через обычное обращение к методам OnFamilyFound и OnSharedFamilyFound почему то не работает. Этот класс нужно просто закопипастить к себе в код и обращаться к нему при загрузке семейства обратно в проект.
class FamilyOption(IFamilyLoadOptions):
def OnFamilyFound(self, familyInUse, overwriteParameterValues):
overwriteParameterValues = True
return Truedef OnSharedFamilyFound(self, sharedFamily, familyInUse, source, overwriteParameterValues):
source = FamilySource.Family
overwriteParameterValues = True
return True# Это просто моя функция для разворачивания элемента. Здесь не используется
def U(elem):
a = UnwrapElement(elem)
return a# Далее мы получаем текущий документ
doc = DocumentManager.Instance.CurrentDBDocument
# Создание списков
test = []
test2 = []
AnnIds = []
Anns = []
ts = []# Далее я получаю все семейства и отфильтровываю аннотации
Annotation = FilteredElementCollector(doc).OfClass(Autodesk.Revit.DB.FamilySymbol).ToElements()
for i in Annotation:
if str(i.Category.CategoryType) == “Annotation”:
if i.Family.Id not in AnnIds:
AnnIds.append(i.Family.Id)
Anns.append(i.Family)# Получив нужные для редактирования семейства создаю цикл для их обработки. Прошу прощения что поленился нормально все назвать.
Далее начинаются основные моменты .for family in Anns:
famDoc = doc.EditFamily(family) # открываем семейство и получаем документ семейства.
ELS = FilteredElementCollector(famDoc).OfClass(TextElement).ToElements() # собираем все текстовые аннотации внутри открытого семействаfor i in ELS: # далее перебираем аннотации
if i.Symbol.Id.ToString() not in ts: # отфильтровываем повторяющиеся
t = Transaction(famDoc) # открываем транзакцию для семейства. Транзакция через TransactionManager почему то не всегда срабатывает, а эта норм.
t.Start
i.Symbol.LookupParameter(“Шрифт текста”).Set(“Arial”) # находим параметр по его имени через LookupParameter и устанавливаем значение через Set.
ts.append(i.Symbol.Id.ToString())t.Commit # Закрываем транзакцию
famDoc.LoadFamily(doc, FamilyOption()) # И ключевая строка в этом коде, которая загружает семейство в основную модель используя созданный в самом начале класс FamilyOption() .
famDoc.Close(False) # Закрываем семейство без сохраненияOUT = Anns
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.