Realice un pequeño programa,para asociar una cantidad de una puerta a un habitacion,pero no lo hace.
Que es lo que me falta?
Alguien que me pueda ayudar
Aqui estas los codigos
...
UIApplication uiapp = commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Application app = uiapp.Application;
Document doc = uidoc.Document;
Dictionary<string, string> dict = new Dictionary<string, string>();
List<Room> rooms = ObtenerListaHabitaciones(doc);
List<FamilyInstance> familyInstances = ObtenerListaCategorias(doc);
string puerta = string.Empty;
foreach (Room room in rooms)
{
ElementId elId = room.Id;
string datos = room.Name;
foreach (var fi in familyInstances)
{
if (fi == null)
continue;
ElementId elementId = fi.get_Parameter(BuiltInParameter.PHASE_CREATED).AsElementId();
Phase phase = doc.GetElement(elementId) as Phase;
Room hj = fi.get_ToRoom(phase);
Room gj = fi.get_Room(phase);
//if (fi.Room == null)
// continue;
if (fi.Category.Id == new ElementId(BuiltInCategory.OST_Doors))
{
if (hj.Id == elId || gj.Id == elId)
puerta = rooms.Count.ToString();
}
}
if (!dict.ContainsKey(datos))
dict.Add(datos, puerta);
}
string resultados = "";
foreach (var item in dict)
{
resultados += GetOutputString(item) + "\n";
}
TaskDialog.Show("Infor", resultados);
return Result.Succeeded;
...
#region Obtener lista de Habitaciones
/// <summary>
/// Obtiene una lista de Habitacionesdel Proyecto
/// </summary>
public List<Room> ObtenerListaHabitaciones(Document doc)
{
//Crear una lista vacia
List<Room> habitaciones = new List<Room>();
//Crear un collector de Rooms
foreach (Element element in new FilteredElementCollector(doc).OfClass(typeof(SpatialElement)).ToList())
{
if (element as Room != null)
{
//Obtengo la Room
Room habitacion = element as Room;
habitaciones.Add(habitacion);
}
}
return habitaciones;
}
#endregion
#region Obtener lista de Activo
public List<FamilyInstance> ObtenerListaCategorias(Document doc)
{
List<FamilyInstance> fi = new List<FamilyInstance>();
IList<BuiltInCategory> catList = new List<BuiltInCategory>();
catList.Add(BuiltInCategory.OST_Doors);
catList.Add(BuiltInCategory.OST_Windows);
ElementMulticategoryFilter multicategoryFilter = new ElementMulticategoryFilter(catList);
foreach (FamilyInstance item in new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).WhereElementIsNotElementType().WherePasses(multicategoryFilter))
{
fi.Add(item);
}
return fi;
}
#endregion
Solved! Go to Solution.
Realice un pequeño programa,para asociar una cantidad de una puerta a un habitacion,pero no lo hace.
Que es lo que me falta?
Alguien que me pueda ayudar
Aqui estas los codigos
...
UIApplication uiapp = commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Application app = uiapp.Application;
Document doc = uidoc.Document;
Dictionary<string, string> dict = new Dictionary<string, string>();
List<Room> rooms = ObtenerListaHabitaciones(doc);
List<FamilyInstance> familyInstances = ObtenerListaCategorias(doc);
string puerta = string.Empty;
foreach (Room room in rooms)
{
ElementId elId = room.Id;
string datos = room.Name;
foreach (var fi in familyInstances)
{
if (fi == null)
continue;
ElementId elementId = fi.get_Parameter(BuiltInParameter.PHASE_CREATED).AsElementId();
Phase phase = doc.GetElement(elementId) as Phase;
Room hj = fi.get_ToRoom(phase);
Room gj = fi.get_Room(phase);
//if (fi.Room == null)
// continue;
if (fi.Category.Id == new ElementId(BuiltInCategory.OST_Doors))
{
if (hj.Id == elId || gj.Id == elId)
puerta = rooms.Count.ToString();
}
}
if (!dict.ContainsKey(datos))
dict.Add(datos, puerta);
}
string resultados = "";
foreach (var item in dict)
{
resultados += GetOutputString(item) + "\n";
}
TaskDialog.Show("Infor", resultados);
return Result.Succeeded;
...
#region Obtener lista de Habitaciones
/// <summary>
/// Obtiene una lista de Habitacionesdel Proyecto
/// </summary>
public List<Room> ObtenerListaHabitaciones(Document doc)
{
//Crear una lista vacia
List<Room> habitaciones = new List<Room>();
//Crear un collector de Rooms
foreach (Element element in new FilteredElementCollector(doc).OfClass(typeof(SpatialElement)).ToList())
{
if (element as Room != null)
{
//Obtengo la Room
Room habitacion = element as Room;
habitaciones.Add(habitacion);
}
}
return habitaciones;
}
#endregion
#region Obtener lista de Activo
public List<FamilyInstance> ObtenerListaCategorias(Document doc)
{
List<FamilyInstance> fi = new List<FamilyInstance>();
IList<BuiltInCategory> catList = new List<BuiltInCategory>();
catList.Add(BuiltInCategory.OST_Doors);
catList.Add(BuiltInCategory.OST_Windows);
ElementMulticategoryFilter multicategoryFilter = new ElementMulticategoryFilter(catList);
foreach (FamilyInstance item in new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).WhereElementIsNotElementType().WherePasses(multicategoryFilter))
{
fi.Add(item);
}
return fi;
}
#endregion
Solved! Go to Solution.
Solved by franciscopossetto. Go to Solution.
Hola,
Probando el programa encontré un problema esta línea:
if (hj.Id == elId || gj.Id == elId)
Si algunas de estas variables es null, cuando trata de leer el Id, devuelve error. Lo solucione agregando dos condiciones mas, en el paso previo:
if (fi.Category.Id == new ElementId(BuiltInCategory.OST_Doors) && hj != null && gj != null)
{
if (hj.Id == elId || gj.Id == elId)
puerta = rooms.Count.ToString();
}
Después, el programa corre sin errores, pero devuelve un diccionario que contiene como clave el nombre del Room y como valor la cantidad de Rooms, que es siempre la misma para cada key, dado que cuenta la cantidad de Rooms que hay en el documento..
Según entiendo, necesitas agregar como valor la cantidad de puertas que hay en el Room. Si esto es correcto podrías resolverlo de la siguiente forma:
if (fi.Category.Id == new ElementId(BuiltInCategory.OST_Doors) && hj != null && gj != null)
{
if (hj.Id == elId || gj.Id == elId)
puerta = puerta + 1;
}
Cada vez que termines una iteración la variable puerta vuelve a cero. Así es como queda el código:
int puerta = 0;
foreach (Room room in rooms)
{
ElementId elId = room.Id;
string datos = room.Name;
foreach (var fi in familyInstances)
{
if (fi == null)
continue;
ElementId elementId = fi.get_Parameter(BuiltInParameter.PHASE_CREATED).AsElementId();
Phase phase = doc.GetElement(elementId) as Phase;
Room hj = fi.get_ToRoom(phase);
Room gj = fi.get_Room(phase);
//if (fi.Room == null)
// continue;
if (fi.Category.Id == new ElementId(BuiltInCategory.OST_Doors) && hj != null && gj != null)
{
if (hj.Id == elId || gj.Id == elId)
puerta = puerta + 1;
}
}
if (!dict.ContainsKey(datos))
dict.Add(datos, puerta.ToString())
puerta = 0;
}
string resultados = "";
foreach (var item in dict)
{
resultados += item + "\n";
}
TaskDialog.Show("Infor", resultados);
Algo a tener en cuenta:
Si una puerta esta o no dentro de un Room, depende del sentido hacia donde abre. Si la puerta no abre hacia el Room en cuestión, no será considerada dentro de la suma. Por esta razón puede que el total de puertas contadas por el programa no sea igual al total de puertas del proyecto. Puede pasar que una puerta abra hacia un espacio que no tiene Rooms, por ejemplo una puerta exterior que abre hacia afuera.
Espero sea de ayuda,
Saludos.
Hola,
Probando el programa encontré un problema esta línea:
if (hj.Id == elId || gj.Id == elId)
Si algunas de estas variables es null, cuando trata de leer el Id, devuelve error. Lo solucione agregando dos condiciones mas, en el paso previo:
if (fi.Category.Id == new ElementId(BuiltInCategory.OST_Doors) && hj != null && gj != null)
{
if (hj.Id == elId || gj.Id == elId)
puerta = rooms.Count.ToString();
}
Después, el programa corre sin errores, pero devuelve un diccionario que contiene como clave el nombre del Room y como valor la cantidad de Rooms, que es siempre la misma para cada key, dado que cuenta la cantidad de Rooms que hay en el documento..
Según entiendo, necesitas agregar como valor la cantidad de puertas que hay en el Room. Si esto es correcto podrías resolverlo de la siguiente forma:
if (fi.Category.Id == new ElementId(BuiltInCategory.OST_Doors) && hj != null && gj != null)
{
if (hj.Id == elId || gj.Id == elId)
puerta = puerta + 1;
}
Cada vez que termines una iteración la variable puerta vuelve a cero. Así es como queda el código:
int puerta = 0;
foreach (Room room in rooms)
{
ElementId elId = room.Id;
string datos = room.Name;
foreach (var fi in familyInstances)
{
if (fi == null)
continue;
ElementId elementId = fi.get_Parameter(BuiltInParameter.PHASE_CREATED).AsElementId();
Phase phase = doc.GetElement(elementId) as Phase;
Room hj = fi.get_ToRoom(phase);
Room gj = fi.get_Room(phase);
//if (fi.Room == null)
// continue;
if (fi.Category.Id == new ElementId(BuiltInCategory.OST_Doors) && hj != null && gj != null)
{
if (hj.Id == elId || gj.Id == elId)
puerta = puerta + 1;
}
}
if (!dict.ContainsKey(datos))
dict.Add(datos, puerta.ToString())
puerta = 0;
}
string resultados = "";
foreach (var item in dict)
{
resultados += item + "\n";
}
TaskDialog.Show("Infor", resultados);
Algo a tener en cuenta:
Si una puerta esta o no dentro de un Room, depende del sentido hacia donde abre. Si la puerta no abre hacia el Room en cuestión, no será considerada dentro de la suma. Por esta razón puede que el total de puertas contadas por el programa no sea igual al total de puertas del proyecto. Puede pasar que una puerta abra hacia un espacio que no tiene Rooms, por ejemplo una puerta exterior que abre hacia afuera.
Espero sea de ayuda,
Saludos.
Muchas gracias,me sirvio,solo que ubique el int puerta ante del foreach FamilyInstance,y quite el get_Room(),
Aqui te dejo el codigo,de como mostrar el dictionary
public static string GetOutputString(KeyValuePair<string, int> kvp)
{
//string separator = ","; //you can change this if needed (maybe a newline?)
string outputString = kvp.Key + " - " + "Cantidad = " + kvp.Value + " " + "puertas";
return outputString;
}
Muchas gracias,me sirvio,solo que ubique el int puerta ante del foreach FamilyInstance,y quite el get_Room(),
Aqui te dejo el codigo,de como mostrar el dictionary
public static string GetOutputString(KeyValuePair<string, int> kvp)
{
//string separator = ","; //you can change this if needed (maybe a newline?)
string outputString = kvp.Key + " - " + "Cantidad = " + kvp.Value + " " + "puertas";
return outputString;
}
Can't find what you're looking for? Ask the community or share your knowledge.