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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Time limit exceeded. Please complete the captcha once again.

  • Antes de enviar tu consulta, échale un vistazo a la información básica sobre protección de datos aquí.

    Modelical.com le informa que los datos personales que usted proporcione serán tratados por MODELICAL CONSULTORIA S.L. como responsable de este sitio web.

    Finalidad de la recogida y tratamiento de los datos personales: Enviar la información que el usuario requiera a través del sitio web. - Legitimación: Consentimiento del interesado. - Destinatarios: Hosting: Gigas, hosting 100% español y 100% seguro. - Derechos: Podrá ejercer sus derechos de acceso, rectificación, limitación y supresión de los datos de unsubscribe@modelical.com así como el derecho a presentar una reclamación ante una autoridad de control.