Aller au contenu

Outils de réparage polyligne + Mtext


Messages recommandés

Posté(e)

Bonsoir,

 

Je cherche à créer un outils de repérage pour mes plans.

 

En gros je lance la macro :

 

- Dessin de la polyligne qui délimite la pièce,

- Choix du point d'insertion du Mtext,

- Boite de dialogue pour saisir le numéro de la pièce,

- Calcul de l'aire de la polyligne en licquant sur l'objet

- affichage du Mtext avec code de pièce + sruface.

 

En gros c'est ça :

 

Sub aire_code_piece()

   ' Déclaration des variables
   Dim returnObj As AcadObject
   Dim returnPnt As Variant
   Dim basePnt As Variant
   Dim aire As String
   Dim code As String
   Dim texte As String
   Dim largeur As Double
   Dim Htxt As Double
   Dim objMtext As AcadMText
   Dim a As String
   Dim Msg, Style, Title, Help, Ctxt, Response, MyString
   
   a = "Oui"
   While (a = "Oui")

   ' Dessin de la polyligne
   thisdrawing.SendCommand ("_pline" & vbCr)
   
   ' Selection de la polyligne et calcul de l'aire
   thisdrawing.Utility.GetEntity returnObj, "Sélectionner une polyligne."
   aire = Format(returnObj.Area * 1, "#0.00")

   ' Positionnement de texte multiligne
   returnPnt = thisdrawing.Utility.GetPoint(, "Sélectionner le point de base du texte.")

   ' Boite de dialogue de saisie du nom du local
   code = InputBox("Code du local : ", "Code du local")
   
   ' Style du texte multiligne
   largeur = 10
   Htxt = 5
   
   ' Création du texte multiligne
   texte = code & vbCrLf & aire
   Set objMtexte = thisdrawing.ModelSpace.AddMText(returnPnt, largeur, texte)
   objMtexte.Height = Htxt
   
   Msg = "Souhaitez-vous continuer ?"    ' Définit le message.
   Style = vbYesNo + vbCritical + vbDefaultButton2    ' Définit les boutons.
   Title = "Démonstration de MsgBox "    ' Définit le titre.
   Help = "DEMO.HLP"    ' Définit le fichier d'aide.
   Ctxt = 1000    ' Définit le contexte de la rubrique.
   Response = MsgBox(Msg, Style, Title, Help, Ctxt)
   If Response = vbYes Then    ' L'utilisateur a choisi Oui.
       a = "Oui"    ' Effectue une action.
   Else
       a = "Non"    ' Effectue une action.
   End If
   
   Wend
   
End Sub 

 

Seulement le bout de lisp ne s'exécute pas il passe direct au choix de la polyligne.

 

Alors que le lisp tout seul sur du vba tourne.

 

Et je passe par lisp pck dessiner une polyligne après 2h de recherche pas trouvé pour que ce soit sur les points de l'utilisateur.

 

Un petit coup de main serait sympa .

 

Merci à tous.

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

Ah bah !!! L'avatar de Patrick_35 !!! Le pauvre... Si j'étais lui je gueulerais... :P :P :P

 

[Edité le 24/6/2008 par Matt666]

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Tu proposes un bout de code en VBA et tu parles de lisp???

 

Donc je vais te faire une proposition en lisp qui découle de ce sujet

 

Si tu le veux en VBA, ça pourra peut être t'aider pour faire une transcription.

 

NB: Le champ surface est lié à la polyligne, si tu la modifie et que tu fais une régénération ou une mise à jour de champ, la valeur de la surface va suivre.

Bien sur, ceci pour une version d'autocad où les champs peuvent être utilisés

 

(defun c:pline&field ( / obj AcDoc Space nw_style pt)
(command "_.pline"
	(while (not (zerop (getvar "cmdactive")))
		(command pause)
	)
)
(setq
	obj (entlast)
	AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
	Space
	(if (= 1 (getvar "CVPORT"))
		(vla-get-PaperSpace AcDoc)
		(vla-get-ModelSpace AcDoc)
	)
)
(cond
	((null (tblsearch "LAYER" "Id-Surfaces"))
		(vlax-put (vla-add (vla-get-layers AcDoc) "Id-Surfaces") 'color 96)
	)
)
(cond
	((null (tblsearch "STYLE" "Romand20"))
		(setq nw_style (vla-add (vla-get-textstyles AcDoc) "Romand20"))
		(vlax-put nw_style 'fontfile "romand.shx")
		(vlax-put nw_style 'height 0.0)
		(vlax-put nw_style 'obliqueangle (/ (* 15.0 pi) 180))
		(vlax-put nw_style 'width 1.0)
		(vlax-put nw_style 'textgenerationflag 0.0)
	)
)
(initget 9)
(setq pt (getpoint "\nPoint d'insertion du champ: "))
(initget 1)
(setq nw_obj
	(vla-addMtext Space
		(vlax-3d-point (trans pt 1 0))
		0.0
		(strcat
			"%[b]<[/b]\\AcObjProp.16.2 Object(%[b]<[/b]\\_ObjId "
			(itoa (vla-get-ObjectID (vlax-ename-[b]>[/b]vla-object obj)))
			"[b]>[/b]%).Area \\f \"%lu2%pr2%ps[Code pièce n°"
			(itoa (getint "\nNuméro de la pièce: "))
			" S=,cm²]\"[b]>[/b]%"
		)
	)
)
(vlax-put nw_obj 'AttachmentPoint 5)
(vlax-put nw_obj 'Height 2.0)
(vlax-put nw_obj 'DrawingDirection 5)
(vlax-put nw_obj 'InsertionPoint (trans pt 1 0))
(vlax-put nw_obj 'StyleName "Romand20")
(vlax-put nw_obj 'Layer "Id-Surfaces")
(prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci. Je vais regarder ta proposition car l'ensemble parait intéressant.

 

J'avais réussi à me sortir de ma polyligne avec cela :

 Sub aire_code_piece()

   ' Déclaration des variables
   Dim returnObj As AcadObject
   Dim returnPnt As Variant
   Dim basePnt As Variant
   Dim aire As String
   Dim code As String
   Dim texte As String
   Dim largeur As Double
   Dim Htxt As Double
   Dim objMtext As AcadMText
   Dim a As String
   Dim Msg, Style, Title, Help, Ctxt, Response, MyString
   Dim saisie
   Dim vertices(0 To 500) As Double
   Dim pnt As Variant
   Dim i, j
   Dim polyObj As AcadPolyline
   
   ' Paramétrage de la fenetre
   Msg = "Souhaitez-vous continuer ?"    ' Définit le message.
   Style = vbYesNo + vbCritical + vbDefaultButton2    ' Définit les boutons.
   Title = "Démonstration de MsgBox "    ' Définit le titre.
   Help = "DEMO.HLP"    ' Définit le fichier d'aide.
   Ctxt = 1000    ' Définit le contexte de la rubrique.

   ' Initialisation des variables
   i = 0
   j = 0
   k = 0
   a = "Oui"
   
   While (a = "Oui")
       pnt = ThisDrawing.Utility.GetPoint(, "Sélectionner un point ? ")
       j = i + 1
       k = j + 1
       vertices(i) = pnt(0): vertices(j) = pnt(1): vertices(k) = pnt(2)
       Response = MsgBox(Msg, Style, Title, Help, Ctxt) ' Boite de dialogue pour continuer
       If Response = vbYes Then    ' L'utilisateur a choisi Oui.
           a = "Oui"    ' Effectue une action.
       Else
           a = "Non"    ' Effectue une action.
       End If
       j = i + 1
       k = j + 1
       i = k + 1
   Wend
       
   ' Dessin de la polyligne
   Set polyObj = ThisDrawing.ModelSpace.AddPolyline(vertices)
   'polyObj.Closed = True
   
   ' Selection de la polyligne et calcul de l'aire
   aire = Format(polyObj.Area * 1, "#0.00")

   ' Positionnement de texte multiligne
   returnPnt = ThisDrawing.Utility.GetPoint(, "Sélectionner le point de base du texte.")

   ' Boite de dialogue de saisie du nom du local
   code = InputBox("Code du local : ", "Code du local")
   
   ' Style du texte multiligne
   largeur = 10
   Htxt = 5
   
   ' Création du texte multiligne
   texte = code & vbCrLf & aire
   Set objMtexte = ThisDrawing.ModelSpace.AddMText(returnPnt, largeur, texte)
   objMtexte.Height = Htxt
End Sub

 

Par contre encore un petit soucis, il passe toujours la polyligne par le point 0.0.0. Mais sinon c'est presque ça.

 

Par contre ta solution m'intéresse pour la maj auto des champs. Le couplage du lisp est du vba à qq avantages par moment.

 

PS : petite erreur lorsque j'execute ton code : ; erreur: no function definition: VLAX-GET-ACAD-OBJECT normal ?

 

[Edité le 25/6/2008 par g_barthe]

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

merci à tous.

 

L'exemple lisp est exactement ce que je recherchais.

 

Mais je voulais plutôt le faire en VBA parce que le lisp je connais pas du tout et ça me rebute un peu.

 

Donc l'exemple est là et j'espère arriver à la meme chose en vba. Ce serait le pied.

 

Un grand merci en chapeau.

 

PS : si des gens on déjà créés des chamsp en vba ils peuvent me dire quelle est la propriété pck je trouve rien la dessus.

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

J'ai trouvé un bout de réponse :

 

    ThisDrawing.Utility.GetEntity returnObj, basePnt, "Select an object"
   toto = returnObj.ObjectID
   text = "%<\AcObjProp Object(%<\_ObjId " & toto & ">%).Area>%"
   insertionPoint(0) = 2: insertionPoint(1) = 2: insertionPoint(2) = 0
   height = 0.5
   
   ' Create the text object in model space
   Set textObj = ThisDrawing.ModelSpace.AddText(text, insertionPoint, height) 

 

En fait vous sélectionner l'objet et il vous insère un champs avec la surface qui sera mise à jour sur régén du dessin si mise à jour de la polyligne.

 

Encore quelques améliorations et je vais être au top.

 

Je test plusieurs choses mais je suis déjà très content d'en être arrivé là.

 

Merci encore @ tous @ bientôt pour la suite du prog.

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

Bonjour à tous,

 

Alors voilà la bête.

 

En résumé ça fait :

 

- Création calque "réparage" couleur magenta

- Demande de choisir un élément de texte du dessin pour en reprendre la hauteur du texte

- Permet de dessiner la polyligne en choisissant au fur et à mesure si on veut continuer la polyligne (O ou N) et fermeture de la polyligne (La fonction sera revue à terme je pense)

- Choix du point de base du texte

- Saisie du texte (code ou repère de la pièce)

- Insertion du texte sur 2 ligne avec le code ou repère et en dessous le champs surface de la polyligne pour mise à jour automatique si modif.

 

 Sub plan_reperage()
   ' Déclaration des variables
   Dim returnObj As AcadObject
   Dim returnPnt As Variant
   Dim basePnt As Variant
   Dim code As String
   Dim texte As String
   Dim largeur As Double
   Dim Htxt As Double
   Dim objMtext As AcadMText
   Dim a As String
   Dim Reponse As String
   Dim vertices() As Double
   Dim pnt As Variant
   Dim i, j As Integer
   Dim polyObj As AcadPolyline
   Dim toto, titi As String
   Dim layerObj As AcadLayer
   Dim texteref As AcadObject

   ' Creation du calque repérage de couleur magenta
   Set layerObj = ThisDrawing.Layers.Add("Repérage")
   layerObj.color = acMagenta
   ThisDrawing.ActiveLayer = layerObj
   
   ' Selection d'un texte du dessin pour récupérer les hauteurs de texte du dessin
   ThisDrawing.Utility.GetEntity texteref, basePnt, "Sélectionner un texte pour définir la hauteur : "
   Htxt = texteref.height
   largeur = 5
   
   ' Initialisation des variables
   i = 0
   j = 0
   k = 0
   a = "Oui"
   ReDim vertices(0 To 1000) ' Redimensionnement du tableau de points
   
   ' Boucle pour saisir plusieurs points pour la plyligne
   While (a = "Oui")
       pnt = ThisDrawing.Utility.GetPoint(, "Sélectionner un point ? ")
       j = i + 1
       k = j + 1
       vertices(i) = pnt(0): vertices(j) = pnt(1): vertices(k) = pnt(2)

       Reponse = ThisDrawing.Utility.GetString(False, "Autre point Oui ou Non (Taper  pour valider): ")
       Select Case Reponse
           Case "o", "O"
               a = "Oui"    ' Effectue une action.
           Case "n", "N"
               a = "Non"    ' Effectue une action.
       End Select
       j = i + 1
       k = j + 1
       i = k + 1
   Wend
   ReDim Preserve vertices(0 To k) ' Redimensionnement du tableau de points en fonction de nombre de points réels

   ' Dessin de la polyligne
   Set polyObj = ThisDrawing.ModelSpace.AddPolyline(vertices)
   polyObj.Closed = True ' cloture de la polyligne
   
   ' Choix du point de base du texte
   returnPnt = ThisDrawing.Utility.GetPoint(, "Sélectionner le point de base du texte.")

   ' Saisie au prompt du code du local
   code = ThisDrawing.Utility.GetString(True, "Code du local (Taper  pour valider): ")
   
   ' Création du texte avec le code du local et sur la ligne en dessous la surface arrondi 0.00
   toto = polyObj.ObjectID ' recup de l'ID de la polyligne
   titi = "" & "\f " & Chr(34) & Chr(37) & "lu2" & Chr(37) & "pr2" & Chr(34) & "" ' mise en forme de l'arrondi
   texte = code & vbCrLf & "%<\AcObjProp Object(%<\_ObjId " & toto & ">%).Area " & titi & ">%" ' concatenation champs + code local
   Set objMtexte = ThisDrawing.ModelSpace.AddMText(returnPnt, largeur, texte)
   objMtexte.height = Htxt
End Sub

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

  • 2 mois après...
Posté(e)

Bonjour,

 

Je reviens sur cet outils car il a des lacunes.

 

En même temps je l'ai pondu sur un bout de table en peu de temps.

 

Donc je le reprend et j'ai intégré l'unité de la surface "m²".

 

J'ai rajouté la gestion de l'unité du dessin car si le plan est en cm la surface inséré par le champ est en cm² et je vous laisse imaginer si c'est du mm alors la valeur monstrueuse et peu parlante de la surface.

 

Pour cela je place lors de la première utilisation du code une propriété personnalisé dans les infos du fichier (comme la où est rentré auteur...) et je récupère la valeur lors de la seconde utilisation. Et après je fais un rapport sur la surface calculée dans le champs. Tout cela est prévu en fait dans les options du champs aire.

 

Reste à gérer la hauteur de texte lorsqu'on choisit un attribut et non un text ou mtext pour reproduire la même hauteur.

 

C'est également un bon exercice d'école pour gérer des trucs pas super documenter.

 

Je vous mets ca dans les prochaines semaines.

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

Bonjour à tous,

 

Alors voici une mise à jour du programme.

 

Je gère maintenant l'unité dans laquelle le dessin a été fait et je la rajoute dans les propriétés du fichier.

 

Plus besoin de choisir la polyligne que l'on vient de dessiner pour en sortir la surface.

 

Ajout je l'unité au bout du champs surface.

 

Voilà des améliorations qui permettent un meilleur confort d'utilisation.

 

Il me reste à trouver pour hachurer la région en excluant la texte des hachures et à permettre à l'utilisateur de saisir ses points pour la polyligne sans avoir à dire oui je veux un nouveau point.

 

Mais là déjà c'est plus agréable je trouve.

 

Sub plan_reperage()
   ' Déclaration des variables
   Dim returnObj As AcadObject
   Dim returnPnt(0 To 2) As Double
   Dim basePnt As Variant
   Dim code As String
   Dim texte As String
   Dim largeur_mini, largeur_texte, largeur As Double
   Dim Htxt As Double
   Dim objMtext As AcadMText
   Dim a As String
   Dim rapport As Double
   Dim Reponse, echelle_du_plan As String
   Dim vertices() As Double
   Dim pnt As Variant
   Dim i, j As Integer
   Dim polyObj As AcadPolyline
   Dim toto, titi As String
   Dim layerObj As AcadLayer
   Dim texteref As AcadObject
   Dim Centroid, region As Variant
   Dim region_element(0) As AcadEntity
   Dim boxObj As AcadRegion
   Dim hatchObj As AcadHatch
   Dim patternName As String
   Dim PatternType As Long
   Dim bAssociativity As Boolean
   Dim EchelleHachure As Double
   Dim echelle, unite As String
   Dim Value1 As String
   Dim type_entite As String

   ' Creation du calque repérage de couleur magenta
   Set layerObj = ThisDrawing.Layers.Add("Repérage")
   layerObj.color = acMagenta
   ThisDrawing.ActiveLayer = layerObj
   
   ' Verification si l'unite du dessin a deja été définie
   If (ThisDrawing.SummaryInfo.NumCustomInfo >= 1) Then
       ThisDrawing.SummaryInfo.GetCustomByKey "unite", Value1
       Select Case Value1
           Case "m"
               rapport = 1
           Case "cm"
               rapport = 0.0001
           Case "mm"
               rapport = 0.000001
       End Select
   Else
       echelle_du_plan = ThisDrawing.Utility.GetString(False, "Echelle du plan C, M, MM (Taper  pour valider): ")
       Select Case echelle_du_plan
           Case "m", "M"
               unite = "m"
           Case "c", "C"
               unite = "cm"
           Case "mm", "MM"
               unite = "mm"
       End Select
       ThisDrawing.SummaryInfo.AddCustomInfo "unite", unite
   End If
   
   ' Selection d'un texte du dessin pour récupérer les hauteurs de texte du dessin
   ThisDrawing.Utility.GetEntity texteref, basePnt, "Sélectionner un texte pour définir la hauteur : "
   type_entite = texteref.EntityName
   Select Case type_entite ' Cas d'un texte normal
       Case "AcDbText"
           Htxt = texteref.height
       Case "AcDbMText" ' Cas d'un texte multiligne
           Htxt = texteref.height
       Case "AcDbBlockReference" ' Cas d'un texte dans un attribut de bloc
           Dim varAttributes As Variant
           varAttributes = texteref.GetAttributes
           Htxt = varAttributes(0).height
   End Select
   
   largeur_mini = 7 * Htxt
   
   ' Initialisation des variables
   i = 0
   j = 0
   k = 0
   a = "Oui"
   ReDim vertices(0 To 1000) ' Redimensionnement du tableau de points
   
   ' Boucle pour saisir plusieurs points pour la plyligne
   While (a = "Oui")
       pnt = ThisDrawing.Utility.GetPoint(, "Sélectionner un point ? ")
       j = i + 1
       k = j + 1
       vertices(i) = pnt(0): vertices(j) = pnt(1): vertices(k) = pnt(2)

       Reponse = ThisDrawing.Utility.GetString(False, "Autre point Oui ou Non (Taper  pour valider): ")
       Select Case Reponse
           Case "o", "O"
               a = "Oui"
           Case "n", "N"
               a = "Non"
       End Select
       j = i + 1
       k = j + 1
       i = k + 1
   Wend
   ReDim Preserve vertices(0 To k) ' Redimensionnement du tableau de points en fonction de nombre de points réels

   ' Dessin de la polyligne
   Set polyObj = ThisDrawing.ModelSpace.AddPolyline(vertices)
   polyObj.Closed = True
   
   'création de la région
   Set region_element(0) = polyObj
   region = ThisDrawing.ModelSpace.AddRegion(region_element)
   
   ' Transformation de la region Variant en objet region pour après trouver le centre
   Set boxObj = region(0)
   
   ' Le point de base du texte est le centre de la region
   Centroid = boxObj.Centroid
   returnPnt(0) = Centroid(0): returnPnt(1) = Centroid(1): returnPnt(2) = 0
   
   ' Saisie au prompt du code du local
   code = ThisDrawing.Utility.GetString(True, "Code du local (Taper  pour valider): ")
   
   ' Operations pour définir une largeur de texte cohérente avec la longueur du texte
   largeur_texte = Len(code) * Htxt
   If largeur_texte > largeur_mini Then
       largeur = largeur_texte
   Else
       largeur = largeur_mini
   End If
   
   ' Création du texte avec le code du local et sur la ligne en dessous la surface arrondi 0.00
   toto = polyObj.ObjectID ' recup de l'ID de la polyligne
   echelle = "ct8[" & rapport & "]"
   titi = "" & "\f " & Chr(34) & Chr(37) & "lu2" & Chr(37) & "pr2" & Chr(37) & echelle & Chr(34) & ""
   texte = code & vbCrLf & "%<\AcObjProp Object(%<\_ObjId " & toto & ">%).Area " & titi & ">%" & " m²" ' concatenation champs + code local
   Set objMtexte = ThisDrawing.ModelSpace.AddMText(returnPnt, largeur, texte)
   objMtexte.height = Htxt

End Sub 

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

Bonjour à toutes et tous,

 

g_barthe, j'ai testé ton dernier BB et j'ai une erreur sur cette ligne (AutoCAD 2008 full) =>

 

pnt = ThisDrawing.Utility.GetPoint(, "Sélectionner un point ? ")

 

http://images1.hiboox.com/images/4008/e3da331548e4a393ea3d884cc0d0c248.jpg

 

Mais je pense que c'est moi qui utilise mal ton code, ;)

Merci d'avance,

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

je suis en train de finaliser avec le coup des hachures la version devrait venir dans la journée.

 

Je dois aussi tester la version sur le poste qui fait tourner le prog vu que j'utilise les champs et que les versions plus anciennes n'ont pas forcément cette fonctionnalité je testerais au cas où.

 

Ton pb est bizarre car tu pourrais avoir une erreur si tu ne sélectionne pas de texte au début pour choisir la hauteur en cas de clic dans le vide par exemple.

 

Mais la c'est quand tu choisis tes poins c'est ça ?

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

Re,

 

En fait, je ne sais pas ce que je dois faire lors du choix des points ???!!!

 

Un extrait de ma ligne de commande =>

 

Commande:

Commande: _VBARUN Sélectionner un texte pour définir la hauteur :

Commande: Sélectionner un point ?

Commande: Autre point Oui ou Non (Taper pour valider): o

Commande: Sélectionner un point ?

Commande: Autre point Oui ou Non (Taper pour valider):

Commande: Sélectionner un point ?

Commande: Autre point Oui ou Non (Taper pour valider):

Commande: Sélectionner un point ?

Commande:

 

Peux-tu expliquer en quelques mots la démarche d'utilisation STP ?

 

Je suis presque sur que j'utilise mal le code,..... ;)

 

Merci d'avance,

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Re bonjour,

 

Alors voici la version finalisée du programme.

 

Sub plan_reperage()
   ' Déclaration des variables
   Dim returnObj As AcadObject
   Dim returnPnt(0 To 2) As Double
   Dim basePnt As Variant
   Dim code As String
   Dim texte As String
   Dim largeur_mini, largeur_texte, largeur As Double
   Dim Htxt As Double
   Dim objMtext As AcadMText
   Dim a As String
   Dim rapport As Double
   Dim Reponse, echelle_du_plan As String
   Dim vertices() As Double
   Dim pnt As Variant
   Dim i, j As Integer
   Dim polyObj As AcadPolyline
   Dim toto, titi As String
   Dim layerObj As AcadLayer
   Dim texteref As AcadObject
   Dim Centroid, region As Variant
   Dim region2 As Variant
   Dim region_element(0) As AcadEntity
   Dim region_element2(0) As AcadEntity
   Dim boxObj As AcadRegion
   Dim boxObj2 As AcadRegion
   Dim hatchObj As AcadHatch
   Dim patternName As String
   Dim PatternType As Long
   Dim bAssociativity As Boolean
   Dim EchelleHachure As Double
   Dim echelle, unite As String
   Dim Value1 As String
   Dim type_entite As String
   Dim espacement_entre_lignes As Double
   Dim currInsertionPoint As Variant
   Dim vertices1(0 To 11) As Double
   Dim version As String
   Dim Msg, Style, Title, Response
   
   ' Récupération de la version pour éviter les erreurs sur les anciennes versions
   version = ThisDrawing.Application.version
   version = Left(version, 4)
   If version >= "16.2" Then ' si la version est antérieure à Autocad 2006 on n'exécute pas le programme
       ' Creation du calque repérage de couleur magenta
       Set layerObj = ThisDrawing.Layers.Add("Repérage")
       layerObj.color = acMagenta
       ThisDrawing.ActiveLayer = layerObj
       
       ' Verification si l'unite du dessin a deja été définie
       If (ThisDrawing.SummaryInfo.NumCustomInfo >= 1) Then
           ThisDrawing.SummaryInfo.GetCustomByKey "unite", Value1
           Select Case Value1
               Case "m"
                   rapport = 1
               Case "cm"
                   rapport = 0.0001
               Case "mm"
                   rapport = 0.000001
           End Select
       Else
           echelle_du_plan = ThisDrawing.Utility.GetString(False, "Echelle du plan C, M, MM (Taper  pour valider): ")
           Select Case echelle_du_plan
               Case "m", "M"
                   unite = "m"
                   rapport = 1
               Case "c", "C"
                   unite = "cm"
                   rapport = 0.0001
               Case "mm", "MM"
                   unite = "mm"
                   rapport = 0.000001
           End Select
           ThisDrawing.SummaryInfo.AddCustomInfo "unite", unite
       End If
       
       ' Selection d'un texte du dessin pour récupérer les hauteurs de texte du dessin
       ThisDrawing.Utility.GetEntity texteref, basePnt, "Sélectionner un texte pour définir la hauteur : "
       type_entite = texteref.EntityName
       Select Case type_entite ' Cas d'un texte normal
           Case "AcDbText"
               Htxt = texteref.height
           Case "AcDbMText" ' Cas d'un texte multiligne
               Htxt = texteref.height
           Case "AcDbBlockReference" ' Cas d'un texte dans un attribut de bloc
               Dim varAttributes As Variant
               varAttributes = texteref.GetAttributes
               Htxt = varAttributes(0).height
       End Select
       
       largeur_mini = 7 * Htxt
       
       ' Initialisation des variables
       i = 0
       j = 0
       k = 0
       a = "Oui"
       ReDim vertices(0 To 1000) ' Redimensionnement du tableau de points
       
       ' Boucle pour saisir plusieurs points pour la polyligne
       While (a = "Oui")
           pnt = ThisDrawing.Utility.GetPoint(, "Sélectionner un point ? ")
           j = i + 1
           k = j + 1
           vertices(i) = pnt(0): vertices(j) = pnt(1): vertices(k) = pnt(2)
   
           Reponse = ThisDrawing.Utility.GetString(False, "Autre point Oui ou Non (Taper  pour valider): ")
           Select Case Reponse
               Case "o", "O"
                   a = "Oui"
               Case "n", "N"
                   a = "Non"
           End Select
           j = i + 1
           k = j + 1
           i = k + 1
       Wend
       ReDim Preserve vertices(0 To k) ' Redimensionnement du tableau de points en fonction de nombre de points réels
   
       ' Dessin de la polyligne
       Set polyObj = ThisDrawing.ModelSpace.AddPolyline(vertices)
       polyObj.Closed = True
       
       ' Création de la région
       Set region_element(0) = polyObj
       region = ThisDrawing.ModelSpace.AddRegion(region_element)
       
       ' Transformation de la region Variant en objet region pour après trouver le centre
       Set boxObj = region(0)
       
       ' Le point de base du texte est le centre de la region
       Centroid = boxObj.Centroid
       returnPnt(0) = Centroid(0): returnPnt(1) = Centroid(1): returnPnt(2) = 0
       
       ' Saisie au prompt du code du local
       code = ThisDrawing.Utility.GetString(True, "Code du local (Taper  pour valider): ")
       
       ' Operations pour définir une largeur de texte cohérente avec la longueur du texte
       largeur_texte = Len(code) * Htxt
       If largeur_texte > largeur_mini Then
           largeur = largeur_texte
       Else
           largeur = largeur_mini
       End If
       
       ' Création du texte avec le code du local et sur la ligne en dessous la surface arrondi 0.00
       toto = boxObj.ObjectID ' recup de l'ID de la region
       echelle = "ct8[" & rapport & "]"
       titi = "" & "\f " & Chr(34) & Chr(37) & "lu2" & Chr(37) & "pr2" & Chr(37) & echelle & Chr(34) & ""
       texte = code & vbCrLf & "%<\AcObjProp Object(%<\_ObjId " & toto & ">%).Area " & titi & ">%" & " m\U+00B2" ' concatenation champs + code local
       Set objMtexte = ThisDrawing.ModelSpace.AddMText(returnPnt, largeur, texte)
       espacement_entre_lignes = 1.5 * Htxt
       objMtexte.height = Htxt
       currInsertionPoint = objMtexte.InsertionPoint
       objMtexte.AttachmentPoint = acAttachmentPointMiddleCenter
   
       ' Coordonnées de la polyligne liée au texte
       vertices1(0) = currInsertionPoint(0): vertices1(1) = currInsertionPoint(1): vertices1(2) = currInsertionPoint(2)
       vertices1(3) = currInsertionPoint(0) + largeur: vertices1(4) = currInsertionPoint(1): vertices1(5) = currInsertionPoint(2)
       vertices1(6) = currInsertionPoint(0) + largeur: vertices1(7) = currInsertionPoint(1) - espacement_entre_lignes - 2 * Htxt: vertices1(8) = currInsertionPoint(2)
       vertices1(9) = currInsertionPoint(0): vertices1(10) = currInsertionPoint(1) - espacement_entre_lignes - 2 * Htxt: vertices1(11) = currInsertionPoint(2)
       
       ' Dessin de la polyligne liée au texte
       Set polyObj2 = ThisDrawing.ModelSpace.AddPolyline(vertices1)
       polyObj2.Closed = True
       
       ' Création de la région liée au texte
       Set region_element2(0) = polyObj2
       region2 = ThisDrawing.ModelSpace.AddRegion(region_element2)
   
       ' Creation des hachures dans la region
       patternName = "ANSI31"
       PatternType = acPreDefinedGradient
       bAssociativity = True
       EchelleHachure = Htxt / 2
       Set hatchObj = ThisDrawing.ModelSpace.AddHatch(PatternType, patternName, bAssociativity)
       hatchObj.AppendOuterLoop (region)
       hatchObj.PatternScale = EchelleHachure
       
       ' Suppression des hachures dans la region liée au texte
       hatchObj.AppendInnerLoop (region2)
   
       ' Actualisation du dessin et des hachures
       hatchObj.Evaluate
       ThisDrawing.Regen True
       
       ' Suppression de la polyligne sinon doublon avec la region créée
       polyObj.Delete
       polyObj2.Delete
   Else
       Msg = "Votre version d'Autocad n'est pas compatible avec ce programme. Une version plus récente est nécessaire"
       Style = vbOK + vbCritical
       Title = "Incompatibilité de version"
       Response = MsgBox(Msg, Style, Title)
   End If
End Sub

 

J'ai mis en téléchargement le fichier dvb ainsi qu'une documentation en format doc ici : http://pausebroderie.fr/taz_genie_climatique/plans_reperages.zip

 

N'hésitez pas à me rapporter des bugs, idées d'améliorations...

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

Re,

 

Trés jolie programme et didacticiel,...

 

Merci encore pour ce partage g_barthe,...

 

Maintenant j'ai ce message =>

 

region = ThisDrawing.ModelSpace.AddRegion(region_element)

 

Suite à =>

 

Commande:

Commande: _VBARUN Echelle du plan C, M, MM (Taper pour valider): c

Commande: Sélectionner un texte pour définir la hauteur :

Commande: Sélectionner un point ?

Commande: Autre point Oui ou Non (Taper pour valider): o

Commande: Sélectionner un point ?

Commande: Autre point Oui ou Non (Taper pour valider): n

Commande:

 

Bug ou toujours moi qui m'y prend mal ?

 

Merci encore,

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Salut

 

Merci du compliment

 

Je pense que ton pb est lié à la forme de ta polyligne.

 

Il faut que les points que tu as saisis soit dans un ordre qui permette de faire des formes sans croisement de segments. En fait un truc qui va delimiter une region. euh pas facile a expliquer.

 

Le mieux est que tu essaie en faisant un rectangle coté par coté en tournant dans un sens.

 

Dis moi si tu as pigé ce que je dis pck pas clair peut être. Je pense que ton pb vient de la forme que tu cherche à dessiner.

 

PS : j'ai testé sous 2006 et MEP 2008 donc normalement ça doit le faire mais pas à l'abri d'une c.... ;)

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

Rere,

 

C'est bien ce que je pensais !

C'est moi qui utilisai mal le code !

 

Valider par o pour chaque nouveau point !!!!

 

Par contre, je n'ai pas de hachures ?

 

De plus, à quoi sert la région puisque lorsque l'on souhaite modifier la polyligne ainsi créée on est obligé de la supprimer ?

 

Là aussi, je n'ai peut-être pas compris toutes les subtilités,... ;)

 

En tout cas, belle démonstration de vba pour moi. (gile) a fait un outil de ce type mais en lisp. Me voilà alors avec deux langages bien différents pour un résultat identique !

 

Merci encore,

 

D'autres ont testés ? :P

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Pour le coup de la région j'en étais arrivé à la même conclusion.

 

Et l'utilité est juste pour trouver le centroid afin de positionner le texte.

 

Donc je vais peut être récupérer le centroid et virer la région pour utiliser la polyligne. A voir.

 

Oui pour le moment le seul point noir c'est la confirmation après chaque point pour savoir si on en veut un autre ou non. Dommage.

 

Tu n'as pas de hachures ???? peut être un pb d'échelle des hachures non ?

 

Je suis déjà rassuré que ça marche pour toi.

 

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité