2016-07-07 1 views
1

Je travaille une application qui nécessite des connaissances sur quelle pièce frontière de l'autre. Dans cette situation, il est pertinent de savoir si une bordure de pièce est un mur ou un séparateur de pièce.Comment puis-je obtenir des séparateurs de pièce dans revit 2017

public FindsRoomSeperators(){ 
     SpatialElementBoundaryOptions options = new SpatialElementBoundaryOptions(); 
     options.SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Finish; 

     foreach (IList<Autodesk.Revit.DB.BoundarySegment> boundSegList in room.GetBoundarySegments(options)) 
       { 
        foreach (Autodesk.Revit.DB.BoundarySegment boundSeg in boundSegList) 
          if ((BuiltInCategory)el.Category.Id.IntegerValue == BuiltInCategory.OST_RoomSeparationLines) 
           //proccess el 
       } 
    } 

Cependant comme de ce code 2017 Revit lance maintenant la méthode non trouvée: 'Autodesk.Revit.DB.Element Autodesk.Revit.DB.BoundarySegment.get_Element()'. exception suggérant que cette méthode a été supprimée.

 var geometry = (Solid)room.get_Geometry(new Options()).First(); 
     var faces = geometry.Faces; 

Et tout cela ne me permet pas de juger des choses comme tout ou non un plancher est debout à un angle, il ne me dit pas que des bords viennent des murs et qui, de sepeartors des chambres.

Idéalement, je serais en mesure de prendre les visages que nous avons et de vérifier si l'un des bords d'un visage est un séparateur de pièce. J'ai déjà une liste de tous les murs si cela aide.

Alors, comment fait-on cela dans Revit 2017? De préférence sans casser la compatibilité avec 2015.

+0

les GetBoundarySegments() n'a pas été retirée de l'API sur 2017, il toujours là (même pas marqué comme « désapprouvée »). Vous ne manquez pas une référence? –

+0

Le code déclenche une exception dans la boucle foreach lorsqu'il est appelé en 2017 mais fonctionne correctement en 2016. La méthode ci-dessus lève l'exception: Méthode introuvable: 'Autodesk.Revit.DB.Element Autodesk.Revit.DB.BoundarySegment.get_Element()'. – Thijser

Répondre

2

Ce qui est attendu et documenté sur les modifications de l'API plate-forme Revit et ajouts fichier (see SDK), cette méthode a été marquée comme dépréciée sur 2016 et a été retiré sur 2017.

Au lieu de cela vous doit utiliser ElementId ou LinkElementId (voir la documentation).

foreach (Autodesk.Revit.DB.BoundarySegment boundSeg in boundSegList) 
{ 
    Element el = doc.GetElement(boundSeg.ElementId); // or doc.GetElement(boundSeg.LinkElementId); 
    if ((BuiltInCategory)el.Category.Id.IntegerValue == BuiltInCategory.OST_RoomSeparationLines) 
    { 

    } 
} 
+0

Se pourrait-il que boundSeg.ElementId n'existe pas dans revit 2015? Cela me donne une erreur: le segment Boundry ne contient pas de définition pour 'ElementID'. – Thijser

+0

Oui, la propriété BoundarySegment.ElementId a été introduite en 2016 (selon la documentation) –

+0

Savez-vous comment utiliser les deux? Je dois être compétitif avec 2015 et 2017. – Thijser

2

La documentation API Platform Revit Modifications et ajouts que les points ci-dessus Augusto est également disponible en ligne:

http://thebuildingcoder.typepad.com/blog/2016/04/whats-new-in-the-revit-2017-api.html

vous suffit de rechercher BoundarySegment. La méthode get_Element que vous manque est en fait une enveloppe pour la propriété Element, qui a été supprimé dans Revit 2017.

Un exemple illustrant l'utilisation de la bibliothèque .NET réflexion pour soutenir des fonctionnalités différentes dans les différentes versions de Revit est fournie par le bâtiment Coder à

http://thebuildingcoder.typepad.com/blog/2012/07/multi-version-add-in.html