Announcements
Atención para clientes sin autenticación multifactor o inicio de sesión único: la verificación OTP se implementará en abril de 2025. Lee todo al respecto aquí.
Anonymous
433 Views, 1 Reply

Auto-join between walls and slabs

Good afternoon, I found this code to join walls and slabs, but when I compile it in C # it makes an error in the code line "Document doc = this.ActiveUIDocument.Document;". I am using the code in visual studio community 2019 and the following error appears in the list of errors

Error "Class1" does not contain a definition for "ActiveUIDocument" or an accessible extension method "ActiveUIDocument" that accepts a first argument of type "Class1".

 

Could you please help me and know what the code is missing to be functional and to use it in revit.
PS: I found the code in an autodesk forum more or less in 2014, I don't know if it has to be updated, I'm new to this topic.

 

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

namespace Autojoining_floors_and_walls
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class Class1
{
private bool overlap1D(double a1, double a2, double b1, double b2)
{

if (a2 >= b1 && b2 >= a1) return true;

return false;

}

private bool bbIntersect(BoundingBoxXYZ A, BoundingBoxXYZ B)
{

return overlap1D(A.Min.X, A.Max.X, B.Min.X, B.Max.X) &&
overlap1D(A.Min.Y, A.Max.Y, B.Min.Y, B.Max.Y) &&
overlap1D(A.Min.Z, A.Max.Z, B.Min.Z, B.Max.Z);

}

public void joinFloorWall()
{

Document doc = this.ActiveUIDocument.Document;
UIDocument uiDoc = new UIDocument(doc);

FilteredElementCollector walls = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType();
FilteredElementCollector floors = new FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_Floors).WhereElementIsNotElementType();

using (Transaction t = new Transaction(doc, "Join walls to floors"))
{

t.Start();
foreach (Wall w in walls)
{

BoundingBoxXYZ wBB = w.get_BoundingBox(null);

if (wBB != null) foreach (Floor f in floors)
{

BoundingBoxXYZ fBB = f.get_BoundingBox(null);

if (fBB != null) if (bbIntersect(wBB, fBB))
{

if (!JoinGeometryUtils.AreElementsJoined(doc, w, f))
{
try
{
JoinGeometryUtils.JoinGeometry(doc, w, f);
}
catch (Autodesk.Revit.Exceptions.ApplicationException)
{
}
}

}
}
}

t.Commit();

}

}
}
}

Tags (3)
Hominis06
in reply to: Anonymous

Hello @Anonymous 
Error means exactly what is written in error code

When you type:

Document doc = this.ActiveUIDocument.Document;

 you mean, that you want accessing to property "ActiveUIDocument" of "Class1"

However, I can't see property "ActiveUIDocument" in your code snippet. Also "Class1" doesn't inherit from any class, that might contain this property. That's why compiler throws an error.

To avoid this error, modify your code like this:

........
public class Class1
{
    public UIDocument ActiveUIDocument { get; private set; }//define property with private set signature - it means you can't asign property value outside of your class
    public Class1(UIDocument uIDocument)//define constructor
    {
        ActiveUIDocument = uIDocument;//asign value to your property
    }
.........//the rest of the code snippet remains unchanged
}