Communauté
BIM Revit, BIM et Autodesk Construction Cloud (ACC) - Français
Bienvenue sur le forum AEC francophone dédié aux solutions BIM de la société Autodesk. Cet espace est dédié aux professionnels et passionnés du secteur de l'Architecture, de l'Ingénierie et de la Construction (AEC) qui utilisent le logiciel Revit ainsi que les plateformes collaboratives d'Autodesk (ACC et Autodesk Forma). Partagez vos connaissances, posez des questions, collaborez sur des idées, et explorez les sujets, que vous soyez architecte, ingénieur, gestionnaire de projet ou tout autre acteur de l'AEC.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Revit : C# Trouver les largeurs des portes dans les piéces

8 RÉPONSES 8
RÉSOLU
Répondre
Message 1 sur 9
be-bj
275 Visites, 8 Réponses

Revit : C# Trouver les largeurs des portes dans les piéces

Bonjour, je cherche une solution en C# pour trouver les largeurs des portes pour déduire du périmètre des pièces  (calcul des plinthes) à partir de la boucle en C# exemple.

À partir d'une boucle sur les portes, apparemment cela dépend du sens de l'ouverture !!!

 

Cordialement bonne journée.

 

Nb_Connecter = 0;
foreach (Element item in rooms1)
{
//Info.AppendLine(item.Name);
bj_Page.treeView1.Nodes[0].Nodes.Add(item.Name);
bj_Page.treeView1.Nodes[0].Nodes[N1].Nodes.Add("Index");
bj_Page.treeView1.Nodes[0].Nodes[N1].Nodes[0].Nodes.Add("" + item.Id);
// SURFACE
IList<Parameter> CommSurface = item.GetParameters("Surface");
Parameter pSur = CommSurface.First();
double surface = pSur.AsDouble();
bj_Page.treeView1.Nodes[0].Nodes[N1].Nodes.Add("Surface");
bj_Page.treeView1.Nodes[0].Nodes[N1].Nodes[1].Nodes.Add(string.Format("{0:n}", surface*0.092947));

 


Le titre du sujet a été modifié par un modérateur pour faciliter la recherche. Titre original:
C# Trouver les largeurs des portes dans les piéces

8 RÉPONSES 8
Message 2 sur 9
Charles.Piro
en réponse à: be-bj

Salut,

 

pour les largeurs des portes, il y a deux méthodes :

1) Aller cherche le paramètre de largeur défini par défaut dans les familles de catégorie "porte"

2) Etudier la géométrie de la porte et récupérer les lignes et/ou faces de l'objet pour ensuite en déduire la largeur. Solution bien plus complexe.

 

Je te prépare un exemple avec la première solution.

 

😉



PIRO Charles
Developer

PIRO CIE
Linkedin


Message 3 sur 9
Charles.Piro
en réponse à: be-bj

Salut,

 

Sur le même principe que les codes présentés dans ce post : Trouver les portes d'une pièces , voici un code qui va permettre de calculer le périmètre d'une pièce sans les largeurs de porte.

 

public void GetWallLenghtOfRoomWithoutDoors()
{
	UIDocument uidoc = this.Application.ActiveUIDocument;
	Document doc = uidoc.Document;
			
	//Sélection de la pièce
	Reference refsel = uidoc.Selection.PickObject(ObjectType.Element,"selection pièce");
	Element elmnt = doc.GetElement(refsel.ElementId);
	Room _room = elmnt as Room;
						
	//Récupération de la "BoundingBox" de la pièce
	BoundingBoxXYZ bbxyzRoom = _room.get_BoundingBox(null);
	//Liste des pièces dont la géométrie intersecte celle de la pièce
	BoundingBoxIntersectsFilter bbxyzIntersectFilter = new BoundingBoxIntersectsFilter(new Outline(bbxyzRoom.Min,bbxyzRoom.Max));
	List<Element> lstDoors = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Doors).WherePasses(bbxyzIntersectFilter).ToList();
			
	//Récupération des lignes "BoundarySegment" délimitant la pièce
	SpatialElementBoundaryOptions spatialOpt = new SpatialElementBoundaryOptions();
	IList<IList<BoundarySegment>> lstlstBoundary = _room.GetBoundarySegments(spatialOpt);
			
	double dblLength = 0.0;
	List<ElementId> lstWallsOfRoom = new List<ElementId>();
			
	for (int i = 0; i < lstlstBoundary.Count(); i++)
	{
		IList<BoundarySegment> lstBoundary = lstlstBoundary[i];
		for (int j = 0; j < lstBoundary.Count(); j++)
		{
			BoundarySegment segment = lstBoundary[j];
					
			Curve cu = segment.GetCurve();//Chaque "BoundarySegment" possède la "curve" delimitant la pièce
			dblLength += cu.Length;//longueur de la curve
					
			Element segmentElmnt = doc.GetElement(segment.ElementId);//Chaque "BoundarySegment" possède l'identifiant de l'hôte - exemple : Mur
			if(segmentElmnt is Wall && !lstWallsOfRoom.Contains(segmentElmnt.Id))
				lstWallsOfRoom.Add(segmentElmnt.Id);
		}
	}
			
	//Pour chaque porte on la convertie en solide pour en deduire les faces et retenir les deux faces perpendiculaires au mur. On calcule ensuite la distance entre les 2 faces sélectionnées pour connaitre la longueur de plinthe a déduire.
	foreach (Element _element in lstDoors) 
	{
		try 
		{
			FamilyInstance famInst = _element as FamilyInstance;
			if(famInst.Host != null)
			{
				//Host
				Element hostElmnt = famInst.Host;
				Wall _hostWall = hostElmnt as Wall;
					
				if(lstWallsOfRoom.Contains(hostElmnt.Id))
				{
					Reference refface = HostObjectUtils.GetSideFaces(_hostWall, ShellLayerType.Exterior).First<Reference>();
					PlanarFace wallface = _hostWall.GetGeometryObjectFromReference(refface) as PlanarFace;//On part de principe que le mur est droit. Code à faire évoluer en cas de mur courbe ou non vetical
			//TaskDialog.Show("debug",wallface.FaceNormal.ToString());
					
					//Door
					Solid sld  = CreateSolidFromBoundingBox(_element.get_BoundingBox(null));
					List<Face> lstFaces = new List<Face>();
					foreach (Face _face in sld.Faces) 
					{
						try 
						{
							if(_face is PlanarFace)
						{
							PlanarFace _plFace = _face as PlanarFace;
							if(IsPerpendicular(_plFace.FaceNormal,wallface.FaceNormal) && Math.Abs(_plFace.FaceNormal.Z) != XYZ.BasisZ.Z)
							{
								lstFaces.Add(_face);
							}
						}
						} catch (Exception) 
						{}
						
					}
					TaskDialog.Show("debug",string.Format("{0} faces perpendiculaires",lstFaces.Count()));
					
					//Création d'une ligne entre les 2 faces pour calculer la distance.
					XYZ pntCenter = sld.ComputeCentroid();
					Face m_face1 = lstFaces.First();
                	Face m_face2 = lstFaces.Last();
                	XYZ pt1 = m_face1.Project(pntCenter).XYZPoint;
                	XYZ pt2 = m_face2.Project(pntCenter).XYZPoint;
					Line _line = Line.CreateBound(pt1, pt2);
					double dblDistance = _line.Length;
					
					//TaskDialog.Show("debug",string.Format("distance entre les faces : {0}",dblDistance*0.3048));
					
					dblLength -= dblDistance;
					}
				}
				} catch (Exception) 
				{}
			}
			
			TaskDialog.Show("debug",string.Format("Longueur de plinthes : {0} m",dblLength*0.3048));
		}
		
		public bool IsPerpendicular(XYZ a, XYZ b)
        {
            double angle = a.AngleTo(b);
            return IsEqual(angle, Math.PI/2);
        }
		
		private static bool IsEqual(double a, double b)
        {
			double _eps = 1.0e-2;
            return Math.Abs(a - b) < _eps;
        }
		
		
		 public Solid CreateSolidFromBoundingBox(BoundingBoxXYZ bbox)
        {
			
					 	
            // Corners in BBox coords
            XYZ pt0 = new XYZ(bbox.Min.X, bbox.Min.Y, bbox.Min.Z);
            XYZ pt1 = new XYZ(bbox.Max.X, bbox.Min.Y, bbox.Min.Z);
            XYZ pt2 = new XYZ(bbox.Max.X, bbox.Max.Y, bbox.Min.Z);
            XYZ pt3 = new XYZ(bbox.Min.X, bbox.Max.Y, bbox.Min.Z);

            // Edges in BBox coords
            Line edge0 = Line.CreateBound(pt0, pt1);
            Line edge1 = Line.CreateBound(pt1, pt2);
            Line edge2 = Line.CreateBound(pt2, pt3);
            Line edge3 = Line.CreateBound(pt3, pt0);

            // Create loop, still in BBox coords
            List<Curve> edges = new List<Curve>();
            edges.Add(edge0);
            edges.Add(edge1);
            edges.Add(edge2);
            edges.Add(edge3);

            double height = bbox.Max.Z - bbox.Min.Z;

            CurveLoop baseLoop = CurveLoop.Create(edges);

            List<CurveLoop> loopList = new List<CurveLoop>();
            loopList.Add(baseLoop);

            Solid preTransformBox = GeometryCreationUtilities.CreateExtrusionGeometry(loopList, XYZ.BasisZ, height);

            Solid transformBox = SolidUtils.CreateTransformed(preTransformBox, bbox.Transform);

            return transformBox;
        }

 

 

Je te joins également un fichier exemple contenant ce code (ainsi que ceux de l'autre post) pour tester le fonctionnement.

 

😉



PIRO Charles
Developer

PIRO CIE
Linkedin


Message 4 sur 9
patrick.emin
en réponse à: be-bj

Bonjour @be-bj 

Parmi les réponses qui vous ont été données, si une (ou plusieurs) d'entre elles apporte une solution à votre problème ou vous a permis de mieux l'analyser et le comprendre, voulez vous avoir l'amabilité de cliquer sur le bouton  APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Merci de ne pas accepter comme solution le message que vous êtes en train de lire.


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
Message 5 sur 9
be-bj
en réponse à: patrick.emin

Bonjour, c'est super, dans un autre programme, j'ai juste besoin de la largeur et de la hauteur des portes, as-tu une solution plus simple directeur sur les paramètres Hauteur et Largeur de la famille de Revit.

 

Cordialement, bonne journée

Message 6 sur 9
francis_l-haridon
en réponse à: be-bj

Bonsoir

 

Est-ce indispensable de faire cela en C# ? Avec Dynamo, tu peux obtenir le même résultat.

 

@ plus

Message 7 sur 9
be-bj
en réponse à: francis_l-haridon

Bonjour, oui pour un développement spécifique, cordialement bonne journée.

Message 8 sur 9
Charles.Piro
en réponse à: be-bj

Salut,

 

pour les portes, je vous ai répondu dans l'autre fil de discussion dédié : https://forums.autodesk.com/t5/revit-bim-et-acc-francais/revit-c-largeur-dune-porte-en/td-p/11724776

Vous pouvez clore ce post en validant la réponse plus haute.

 

Par contre, qu'appelez vous un développement spécifique ? Car dynamo est justement fait pour des développements spécifiques !

 

😉



PIRO Charles
Developer

PIRO CIE
Linkedin


Message 9 sur 9
patrick.emin
en réponse à: be-bj

Bonjour @be-bj 

Si une des réponses à votre question résout votre problème, vous a permis de le comprendre ou contribue significativement à sa résolution, voulez vous avoir l'amabilité de cliquer sur le bouton  APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?

Cela aidera les futurs lecteurs qui pourront directement aller à la solution.

Merci de ne pas accepter comme solution le message que vous êtes en train de lire.

Si nos équipes de support technique ont pu vous apporter une solution ou contribuer significativement à vous aider en dehors de ce forum, pouvez vous partager ici la solution trouvée et cliquer sur le bouton  APPROUVER LA SOLUTION  de façon qu'elle bénéficie à la communauté?
Merci.


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report