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.
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).
Résolu ! Accéder à la solution.
Résolu par Y.AUBRY. Accéder à la solution.
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
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
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
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
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
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"
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
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 :
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.
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.