Duplicar planos en Revit
Incluir planos y listados
Descripción
Con el siguiente código puedes generar una macro para duplicar planos. Es script duplica las vistas y las renombra, crea planos nuevos y coloca las vistas en la misma posición que los planos originales y de paso cambia algunos parámetros de visibildiad en los worksets. Es una rutina muy útil para preparar una modelo para la fase de obra. Cuéntanos qué te parece y cómo lo mejorarías.
public void DuplicateSheetandchangeworksetsvisibility()
{
UIDocument uidoc = this.ActiveUIDocument;
Document doc = uidoc.Document;
ViewSheet vs = doc.ActiveView as ViewSheet;
using(Transaction t = new Transaction(doc, "Duplicate Sheet"))
{
t.Start();
FamilyInstance titleblock = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance))
.OfCategory(BuiltInCategory.OST_TitleBlocks).Cast<FamilyInstance>()
.First(q => q.OwnerViewId == vs.Id);
ViewSheet newsheet = ViewSheet.Create(doc, titleblock.GetTypeId());
newsheet.SheetNumber = vs.SheetNumber + "_EXE";
newsheet.Name = vs.Name;
// all views but schedules
foreach(ElementId eid in vs.GetAllPlacedViews())
{
View ev = doc.GetElement(eid) as View;
View newview = null;
// legends
if (ev.ViewType == ViewType.Legend)
{
newview = ev;
}
// all non-legend and non-schedule views
else
{
ElementId newviewid = ev.Duplicate(ViewDuplicateOption.WithDetailing);
newview = doc.GetElement(newviewid) as View;
newview.Name = ev.Name + "_EXE";
// Change worksets visibility
FilteredWorksetCollector worksets = new FilteredWorksetCollector(doc);
List <Workset> exeWorkSets = new List<Workset>();
List <WorksetId> exeWorkSetsID = new List<WorksetId>();
List <WorksetId> nonExeWorkSetsID = new List<WorksetId>();
foreach (Workset exeWorkSet in worksets)
{
if (exeWorkSet.Name.EndsWith("_EXE"))
{
exeWorkSets.Add(exeWorkSet);
exeWorkSetsID.Add(exeWorkSet.Id);
}
}
foreach (Workset nonExeWorkset in worksets)
{
foreach (Workset exeid in exeWorkSets)
{
String nonExename = exeid.Name.Replace("_EXE", "");
if(nonExeWorkset.Name.Equals(nonExename))
{
nonExeWorkSetsID.Add(nonExeWorkset.Id);
}
}
}
foreach (WorksetId exeWorkSetID in exeWorkSetsID)
{
newview.SetWorksetVisibility(exeWorkSetID, WorksetVisibility.Visible);
}
foreach (WorksetId nonexeWorkSetID in nonExeWorkSetsID)
{
newview.SetWorksetVisibility(nonexeWorkSetID, WorksetVisibility.Hidden);
}
// end of worksets visibility
}
foreach (Viewport vp in new FilteredElementCollector(doc).OfClass(typeof(Viewport)))
{
if (vp.SheetId == vs.Id && vp.ViewId == ev.Id)
{
BoundingBoxXYZ vpbb = vp.get_BoundingBox(vs);
XYZ initialCenter = (vpbb.Max + vpbb.Min) / 2;
Viewport newvp = Viewport.Create(doc, newsheet.Id, newview.Id, XYZ.Zero);
BoundingBoxXYZ newvpbb = newvp.get_BoundingBox(newsheet);
XYZ newCenter = (newvpbb.Max + newvpbb.Min) / 2;
ElementTransformUtils.MoveElement(doc, newvp.Id, new XYZ(
initialCenter.X - newCenter.X,
initialCenter.Y - newCenter.Y,
0));
}
}
}
// schedules
foreach (ScheduleSheetInstance si in (new FilteredElementCollector(doc).OfClass(typeof(ScheduleSheetInstance))))
{
if (si.OwnerViewId == vs.Id)
{
if (!si.IsTitleblockRevisionSchedule)
{
foreach (ViewSchedule vsc in new FilteredElementCollector(doc).OfClass(typeof(ViewSchedule)))
{
if (si.ScheduleId == vsc.Id)
{
BoundingBoxXYZ sibb = si.get_BoundingBox(vs);
XYZ initialCenter = (sibb.Max + sibb.Min) / 2;
ScheduleSheetInstance newssi = ScheduleSheetInstance.Create(doc, newsheet.Id, vsc.Id, XYZ.Zero);
BoundingBoxXYZ newsibb = newssi.get_BoundingBox(newsheet);
XYZ newCenter = (newsibb.Max + newsibb.Min) / 2;
ElementTransformUtils.MoveElement(doc, newssi.Id, new XYZ(
initialCenter.X - newCenter.X,
initialCenter.Y - newCenter.Y,
0));
}
}
}
}
}
t.Commit();
}
}
Plataforma
Revit.
Tipo
Revit API Macro.