Place Legends on Sheets

Script para colocar leyendas en planos de manera automatizada en función del nombre del plano y el nombre de la leyenda.

2018-11-24_10-41-Place legend

VERSIÓN MACRO C# (USANDO EL MACRO MANAGER)

/*
* Created by SharpDevelop.
* User: david
* Date: 10/23/2018
* Time: 10:58 AM
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;

namespace MAC_DCA
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.DB.Macros.AddInId(“75915E9A-4149-47F2-93D9-DED3102ECC0E”)]
public partial class ThisDocument
{
public void legendOnSheets()
{
Document doc = this.ActiveUIDocument.Document;

// create list of element ids for the sheets that will get the legends
List<ElementId> sheetIds = new List<ElementId>();

// use SheetNumber to find the desired sheets add each sheet to the list of sheet ids //

sheetIds.Add(new FilteredElementCollector(doc)
.OfClass(typeof(ViewSheet))
.Cast<ViewSheet>()
.FirstOrDefault(q => q.SheetNumber == “A101”).Id);

sheetIds.Add(new FilteredElementCollector(doc)
.OfClass(typeof(ViewSheet))
.Cast<ViewSheet>()
.FirstOrDefault(q => q.SheetNumber == “A102”).Id);

sheetIds.Add(new FilteredElementCollector(doc)
.OfClass(typeof(ViewSheet))
.Cast<ViewSheet>()
.FirstOrDefault(q => q.SheetNumber == “A103”).Id);

// find the legend to put on the sheets
// use ViewType.Legend and the view name to find the legend view

Element legend = new FilteredElementCollector(doc)
.OfClass(typeof(View))
.Cast<View>()
.FirstOrDefault(q => q.ViewType == ViewType.Legend && q.Name == “Legend 1”);

// create a transaction so that the document can be modified

using (Transaction t = new Transaction(doc, “Legends on Sheets”))
{
// start the transaction
t.Start();

// foreach loop through the list of sheet ids
foreach (ElementId sheetid in sheetIds)
{
// create a new viewport for the legend on each sheet
// place the legend view at the 0,0,0 location on each sheet
// user will need to move the legend to the desired location
Viewport.Create(doc, sheetid, legend.Id, new XYZ(0,0,0));
}

// commit the changes
t.Commit();
}
}

VERSIÓN ADDIN USANDO VISUAL STUDIO 2017

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;

namespace LegendsOnSheets
{
[TransactionAttribute(TransactionMode.Manual)]
public class PlaceLegends : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//Get UIDocument
UIDocument uidoc = commandData.Application.ActiveUIDocument;

//Get Document
Document doc = uidoc.Document;

//Find Sheet
ViewSheet vSheet = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Sheets)
.Cast<ViewSheet>()
.First(x => x.Name == “Plano Ejemplo”);

//Find ViewLegend
Element vLegend = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Views)
.First(x => x.Name == “Legend_01”);

//Get Midpoint
BoundingBoxUV outline = vSheet.Outline;
double xu = (outline.Max.U + outline.Min.U) / 2;
double yu = (outline.Max.V + outline.Min.V) / 2;
XYZ midPoint = new XYZ(xu, yu, 0);

try
{
using (Transaction trans = new Transaction(doc, “Place View”))
{
trans.Start();

//Place View
Viewport vPort = Viewport.Create(doc, vSheet.Id, vLegend.Id, midPoint);

trans.Commit();
}

return Result.Succeeded;
}
catch (Exception e)
{
message = e.Message;
return Result.Failed;
}

}
}
}

 

My first Revit Macros _Task Dialogs

Sencillo tutorial para crear 3 macros muy simples en VB.NET con Sharp Develop.

  1. Cuadro de diálogo emergente  con mensaje predeterminado.
  2. Cuadro de diálogo emergente con la ruta del documento en curso.
  3. Cuadro de diálogo que tras la selección de un elemento muestra el ID de dicho elemento.

macros _task dialog


Imports System
Imports Autodesk.Revit.UI
Imports Autodesk.Revit.DB
Imports Autodesk.Revit.UI.Selection
Imports System.Collections.Generic
Imports System.Linq

<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)> _
<Autodesk.Revit.DB.Macros.AddInId(“923809C1-8A44-492F-B406-F45B12927667”)> _
Partial Public Class ThisDocument

Private Sub Module_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

End Sub

Private Sub Module_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown

End Sub

 Public Sub my1stmacro()
TaskDialog.Show(“HelloWorld”,”This is My First Macro!”)

End Sub

Public Sub my2ndmacro()
TaskDialog.Show(“HelloWorld”, “This current File Name ” & Me.Application.ActiveUIDocument.Document.PathName)

 ‘        //Con & concatenamos valores , ojo que tiene que estar guardado el documento para mostrar la ruta//

End Sub

Public Sub my3tdmacro()
‘        //DECLARAMOS LA VARIABLE COMO el Element.ID del objecto seleccionado//

Dim currentelementID As ElementId
currentelementID = Me.Application.ActiveUIDocument.Selection.PickObject(ObjectType.Element,”Select Model Element”).ElementId

‘        //Creamos el cuadro de diálogo para desplegar el valor de la variable//

TaskDialog.Show(“ELEMENT ID OF SELECTION”, “The selection Elem_ID is ” & currentelementID.ToString)

‘        // hay que definir el Element ID como string si no da error//
End Sub
End Class


Fuentes


https://learn.archsmarter.com/courses/mastering-revit-macros

#Mastering Revit Macros – Lesson 1

 

Mi primer plugin para Revit _ Group Selection&Copy.

Después de casi cuatro años utilizando Revit en proyectos , he decidido comenzar de manera autodidacta a mejorar mis habilidades en programación  ( de ahí el propósito de este blog).

Uno de los mayores handicaps en este sentido, ha sido la falta de información ordenada a la hora de comenzar. Estos recursos los he conseguido curioseando por internet y a través de referencias de otros compañeros que ya dominan el API y a los que he visto programar.

En esta entrada dejo algunos de los recursos que he empleado para empezar a dar mis primeros pasos en código utilizando C# y el Revit API.

Tutorial oficial de Autodesk para crear nuestro primer plugin.

https://knowledge.autodesk.com/support/revit-products/learn-explore/caas/simplecontent/content/lesson-1-the-basic-plug.html

Un video explicativo en el  canal de youtube That BIM girl del tutorial anterior paso a paso.

How to write a plugin for Revit – Coding for AEC Lesson 2

Tras este pequeño tutorial y con algunos conocimientos básicos de Visual Studio y C# seremos capaces de realizar nuestro primer plugin para Revit que nos servirá para copiar grupos.

 

 

1_lesson_9

**Nota : Si somos principiantes y no tenemos nociones de programación general ( como es mi caso) . Recomiendo comenzar aprendiendo bases de programación en C# en cualquier plataforma gratuita on line , por ejemplo yo he utilizado :

https://www.sololearn.com/Course/CSharp/

Este aprendizaje nos dará unas bases fundamentales para poder interpretar y comprender mejor el lenguaje de programación y la estructura del código. No simplemente copiar y pegar.

-Siempre estoy haciendo lo que no puedo hacer para poder aprender cómo hacerlo.-Pablo Picasso.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using Autodesk.Revit.ApplicationServices;

using Autodesk.Revit.Attributes;

using Autodesk.Revit.DB;

using Autodesk.Revit.UI;

using Autodesk.Revit.UI.Selection;

namespace Lab1PlaceGroup

{

    [Transaction(TransactionMode.Manual)]

    [Regeneration(RegenerationOption.Manual)]

    public class Class1 : IExternalCommand

    {

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)

        {

//Get application and documnet objects

            UIApplication uiapp = commandData.Application;

            Document doc = uiapp.ActiveUIDocument.Document;

            //Define a reference Object to accept the pick result

            Reference pickedref = null;

            //Pick a group

            Selection sel = uiapp.ActiveUIDocument.Selection;

            pickedref = sel.PickObject(ObjectType.Element, "Please select a group");

            Element elem = doc.GetElement(pickedref);

            Group group = elem as Group;

            //Pick point

            XYZ point = sel.PickPoint("Please pick a point to place group");

            //Place the group

            Transaction trans = new Transaction(doc);

            trans.Start("Lab");

            doc.Create.PlaceGroup(point, group.GroupType);

            trans.Commit();

            return Result.Succeeded;

        }

    }

}