Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

AutoCAD : Convertir les hachures en polylignes (pas les contours).

6 RÉPONSES 6
RÉSOLU
Répondre
Message 1 sur 7
mounir.semai
252 Visites, 6 Réponses

AutoCAD : Convertir les hachures en polylignes (pas les contours).

Bonjour tout le monde,

Alors, je suis en train de calculer la quantité des cloisons sur un plan. D'habitude, quand je les trouve dessinées en polylignes, j'utilise un LISP pour me donner la totalité des polylignes avec une sélection totale de ces dernières. Mais cette fois, ils ont dessiné les cloisons avec des hachures, donc il est impossible d'utiliser le LISP sur les hachures. Si je l'utilise sur les contours des hachures, la quantité sera fausse car il va calculer la longueur de chaque cloison en double. Si je redessine des polylignes dans les hachures, cela va prendre énormément de temps vu la quantité des cloisons.

Je vous laisse une capture pour mieux comprendre et un plan.

Je voudrais savoir si quelqu'un a une idée ou bien une astuce pour faciliter la tâche.

Merci d'avance.

Capture01.PNG

Capture02.PNG

Capture03.PNG


Le titre du sujet a été modifié par un modérateur pour faciliter la recherche. Titre original:
Convertir les hachures en polylignes (pas les contours).

6 RÉPONSES 6
Message 2 sur 7
Y.AUBRY
en réponse à: mounir.semai

Bonjour @mounir.semai,

 

Le calcul automatique de distance me parait un peu compliqué à réalisé avec ton fichier d'origine.

 

Si toutes les hachures avaient été générées à partir d'un 'profil' rectangulaire (avec 4 sommets) il aurait été possible (via programmation) de regarder les dimensions de chaque hachure et d'en déduire sa hauteur et sa largeur.

Puis de dessiner une polyligne au centre de celle-ci.

 

Mais ton fichier comporte des éléments qui ne sont pas rectangulaire (et parfois mal aligné) et également des hachures de type rectangulaires avec plus de 4 cotés

YAUBRY_0-1716387584422.pngYAUBRY_1-1716387601853.pngYAUBRY_2-1716387625649.png

YAUBRY_3-1716387883590.png

 

D'autre part, j'avais également penser à générer des contours via HATCHGENERATEBOUNDARY puis des REGION sur l'ensemble des polylignes générées puis de les regrouper via la commande UNION mais la encore le problème des décalages ne permet pas de faire cela.

 

Je peux essayer de regarder pour te faire une commande pour l'ensemble des hachures ayant 4 côtés afin de limiter la représentation de polyligne centrale manuellement... mais pour le reste ça me parait compliqué.

 

A+ Yoan

Yoan AUBRY

EESignature

Message 3 sur 7
-didier-
en réponse à: mounir.semai

Bonjour @mounir.semai 

 

Je confirme les dires de @Y.AUBRY , j'ai aussi travaillé sur la question, mais j'ai lâché à cause de l'anarchie qu'est le dessin de ces hachures, il a des points colinéaires, il y a superposition de hachures.

Tout ça pour dire que ce n'est pas impossible, mais très particulier et loin d'être générique.

Amicalement

Éternel débutant.. my site for learning : Programmer dans AutoCAD

Didier Aveline

EESignature

Message 4 sur 7
O_Eckmann
en réponse à: mounir.semai

Bonjour @mounir.semai,

 

Les murs ont l'air de faire 12cm de large, donc si on prend la surface des hachures et que l'on divise par 0.12, ça ne devrait être pas trop loin du linéaire de cloison.

 

S'il y a des zones avec des murs de largeur différentes, il faut les isoler et traiter largeur par largeur.

 

Attention dans le dessin, il y a 3 hachures avec des "papillons" qui empêchent le calcul d'aire cumulée par AutoCAD. Il faudra corriger ces 3 géométries pour avoir une aire cumulée afficher dans la palette de propriété pour les 1810 hachures.

 

Olivier Eckmann

EESignature

Message 5 sur 7
-didier-
en réponse à: mounir.semai

Bonjour @mounir.semai 

 

Ce qui ressort des discours des "Expert Elite" s'intéressant au problème est que c'est faisable, mais dans les conditions actuelles pas vraiment.

Je reviens au côté générique et particulier.

Ici, on aime répondre "générique" pour que tout le monde en retire quelque chose.
Cette routine est très spécifique, elle ne va peut-être servir qu'une seule fois, merci de nous en parler pour nous motiver à travailler dessus.

 

Amicalement

Éternel débutant.. my site for learning : Programmer dans AutoCAD

Didier Aveline

EESignature

Message 6 sur 7
Y.AUBRY
en réponse à: mounir.semai

Bonjour,

 

C'est le mieux que je puisse faire avec ton dessin actuel...

 

Tu trouveras ci-joint un fichier où :

J'ai généré des polyligne sur les contours de hachure via HATCHGENERATEBOUNDARY

J'ai copié les polylignes générées dans un nouveau fichier

J'ai simplifié les polylignes (option AutoCAD MAP) via "Map - Dessin" / "Outils", "Généraliser les polylignes"

YAUBRY_0-1716390473539.png

 

Puis à l'aide d'un programme VB.NET j'ai généré des polylignes pour toutes les polylignes possédant 4 coins (rectangle)

 

Code Vb.NET:

 

 

 

	'Commande AJOUTER_POL_CENTRE_HACHURE
	<CommandMethod("AJOUTER_POL_CENTRE_HACHURE", "AJOUTER_POL_CENTRE_HACHURE", CommandFlags.Modal + CommandFlags.UsePickSet)>
	Public Sub AJOUTER_POL_CENTRE_HACHURE()

		Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
		Dim ed As Editor = doc.Editor
		Dim db As Database = doc.Database

		Dim FpDWG As String = doc.Name
		Dim lName As String = "Model"

		Dim acpoly As Polyline = Nothing

		Try
			Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("ctab", lName)

			CREER_CALQUE("POL_CENTRALE", 3)

			Dim tr As Transaction = db.TransactionManager.StartTransaction()

			Using tr

				Dim bt As BlockTable = TryCast(tr.GetObject(db.BlockTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead), BlockTable)
				Dim btfw As BlockTable = TryCast(tr.GetObject(db.BlockTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite), BlockTable)

				For Each id As ObjectId In bt

					Dim btr As BlockTableRecord
					btr = TryCast(tr.GetObject(id, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite), BlockTableRecord)

					If btr.IsLayout Then

						Dim lid As ObjectId = btr.LayoutId
						Dim lt As Layout = TryCast(tr.GetObject(lid, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite), Layout)
						Dim objsBlk As New List(Of ObjectId)()
						Dim objsPol As New List(Of ObjectId)()

						If lt.LayoutName <> lName Then
							Continue For
						Else

							Dim etypePol As RXClass = RXObject.GetClass(GetType(Polyline))

							For Each eid As ObjectId In btr

								Dim ent As Entity
								Dim Pol As Polyline

								ent = TryCast(tr.GetObject(eid, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite), Entity)

								If eid.ObjectClass.IsDerivedFrom(etypePol) Then

									Pol = ent
									objsBlk.Add(eid)

									acpoly = DirectCast(ent, Polyline)

									If acpoly.NumberOfVertices = 4 Then

										Dim ptA, ptB, ptC, ptD As Point2d
										ptA = acpoly.GetPoint2dAt(0)
										ptB = acpoly.GetPoint2dAt(1)
										ptC = acpoly.GetPoint2dAt(2)
										ptD = acpoly.GetPoint2dAt(3)

										Dim dist1, dist2 As Double

										dist1 = CALCUL_DISTANCE(ptA.X, ptA.Y, ptB.X, ptB.Y)
										dist2 = CALCUL_DISTANCE(ptB.X, ptB.Y, ptC.X, ptC.Y)

										Dim Longueur, Largeur As Double
										Dim ptC1, ptC2 As Point2d

										If dist1 > dist2 Then
											Longueur = dist1
											Largeur = dist2
											ptC1 = New Point2d(ptA.X + (ptD.X - ptA.X) / 2, ptA.Y + (ptD.Y - ptA.Y) / 2)
											ptC2 = New Point2d(ptB.X + (ptC.X - ptB.X) / 2, ptB.Y + (ptC.Y - ptB.Y) / 2)
										Else
											Longueur = dist2
											Largeur = dist1
											ptC1 = New Point2d(ptA.X + (ptB.X - ptA.X) / 2, ptA.Y + (ptB.Y - ptA.Y) / 2)
											ptC2 = New Point2d(ptD.X + (ptC.X - ptD.X) / 2, ptD.Y + (ptC.Y - ptD.Y) / 2)
										End If

										Dim pol2 As New Polyline

										pol2.AddVertexAt(0, New Point2d(ptC1.X, ptC1.Y), 0, 0, 0)
										pol2.AddVertexAt(1, New Point2d(ptC2.X, ptC2.Y), 0, 0, 0)

										pol2.Layer = "POL_CENTRALE"

										btr.AppendEntity(pol2)
										tr.AddNewlyCreatedDBObject(pol2, True)

									End If

								End If
							Next 'eid
						End If
					End If
				Next 'id

				tr.Commit()
				tr.Dispose()

			End Using 'tr

		Catch ex As System.Exception
			MsgBox(ex.ToString)
			ed.WriteMessage(vbLf & ex.Message & vbLf & ex.StackTrace)
		End Try

	End Sub

	'Calcul la distance entre deux points
	Public Shared Function CALCUL_DISTANCE(Xa As Double, Ya As Double, Xb As Double, Yb As Double) As Double
		Return Math.Sqrt((Xb - Xa) ^ 2 + (Yb - Ya) ^ 2)
	End Function

 

 

 

 

A+ Yoan

Yoan AUBRY

EESignature

Message 7 sur 7
mounir.semai
en réponse à: mounir.semai

Bonjour,

Tout d'abord, je tiens à remercier chaque personne qui a travaillé sur mon fichier et qui a essayé de trouver une solution afin que je puisse résoudre mon problème. En fait, j'avais une dizaine de plans à traiter de la même façon et j'avais besoin de calculer la longueur des hachures car elles représentent des cloisons. Finalement, j'ai opté pour une méthode qui est celle-ci :

  1. Comme l'a dit monsieur, dans ce cas, la largeur des hachures est de 0.12.
  2. J'ai effectué une extraction des données des hachures pour obtenir la surface de toutes les hachures.
  3. J'ai obtenu comme résultat un fichier Excel avec toutes les surfaces et le nombre de hachures ayant les mêmes dimensions.
  4. J'ai divisé toutes les surfaces par 0.12 dans une colonne.
  5. Puis je les ai multipliées par le nombre de hachures et j'ai fait la somme.

J'ai comparé le résultat avec une autre méthode où j'ai carrément redessiné des polylignes sur les hachures et calculé leur longueur totale avec un LISP qui calcule le cumul des polylignes. J'ai constaté une très petite différence, donc j'ai opté pour cette solution rapide et efficace pour finir les plans que j'avais.

J'espère que d'autres personnes pourront bénéficier de vos retours et peut-être de ma solution dans d'autres cas similaires.

Merci encore pour votre aide.

@Y.AUBRY 

@-didier- 

@O_Eckmann 

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