Aller au contenu

Surface bloc ligne de repère multiple


Messages recommandés

Posté(e)

Bonjour à tous,

J'ai créé des lignes de repères personnalisées intégrant notamment des surfaces en référence à des polylignes et des hachures de couleur.

Pour le moment je renseigne manuellement les étiquettes correspondantes.

Ma question est de savoir si il existe une lisp ou une commande simple que permettrait :

 - Soit d'associer la valeur de surface de la polyligne à l'étiquette du bloc de la ligne de repère en cliquant sur l'un puis sur l'autre.

 - Soit de créer automatiquement la ligne de repère en lançant la commande après avoir cliqué sur la polyligne correspondante.

J'ai essayé de trouver une méthode semi-automatique avec les lisp TOTAL AREA ou la commande "champs" mais je n'arrive pas à créer quelque chose de fonctionnel. L'idéal serait évidemment que la valeur de l'étiquette se modifie en même temps que la polyligne si la surface est modifiée mais ce n'est pas indispensable.

Merci de votre attention !

Guillaume

Posté(e)

Bonjour,

Je peux te proposer ceci (un lisp destiné à l'origine pour les longueurs et rapidement adapté pour les surfaces), je pense que ça peut être un bon départ...

Citation

je n'arrive pas à créer quelque chose de fonctionnel

Donc je pense que tu sera capable de faire les petits ajustements à ta convenance, si nécessaire.

(vl-load-com)
(defun make_mlead (pt obj / ptlst arr nw_obj)
  (setq
    ptlst (append pt (polar pt o_lead d_lead))
    arr (vlax-make-safearray vlax-vbdouble (cons 0 (- (length ptlst) 1)))
  )
  (if (not inc) (setq inc -1))
  (vlax-safearray-fill arr ptlst)
  (setq nw_obj (vla-addMLeader Space (vlax-make-variant arr) 0))
  (vla-put-contenttype nw_obj acMTextContent)
  (vla-put-textstring nw_obj 
    (strcat
      "{\\fArial|b0|i0|c0|p34;"
      (itoa (setq inc (1+ inc)))
      "\\P"
      "%<\\AcObjProp Object(%<\\_ObjId "
      (itoa (vla-get-ObjectID obj))
      ">%).Area \\f \"%lu2%pr2%ps[,m²]\">%}"
    )
  )
  (vla-put-layer nw_obj (getvar "CLAYER"))
  (vla-put-ArrowheadSize nw_obj (* (getvar "TEXTSIZE") 0.5))
  (vla-put-TextHeight nw_obj (getvar "TEXTSIZE"))
  (if (> (car (getvar "VIEWCTR")) (car pt_lead))
    (progn
      (vla-SetDogLegDirection nw_obj 0 (vlax-3D-point '(-1.0 0.0 0.0)))
      (vla-put-TextJustify nw_obj acAttachmentPointMiddleRight)
      (vla-setLeaderLineVertices nw_obj 0 (vlax-make-variant arr))
    )
    (vla-put-TextJustify nw_obj acAttachmentPointMiddleLeft)
  )
  (vla-update nw_obj)
)
(defun c:num&area2lead ( / js htx rtx rtx0 pt_lead d_lead o_lead AcDoc Space n ename pt)
  (princ "\nSélectionner les polylignes/hachures à mesurer")
  (while (null (setq js (ssget (list
        '(0 . "*POLYLINE")
        '(-4 . "<AND")
          '(-4 . "<NOT")
            '(-4 . "&")
            '(70 . 120)
          '(-4 . "NOT>")
          '(-4 . "&")
          '(70 . 1)
        '(-4 . "AND>")
        (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
        (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
      )))))
  (initget 6)
  (setq htx (getdist (getvar "VIEWCTR") (strcat "\nDonner la hauteur du champ <" (rtos (getvar "TEXTSIZE")) ">: ")))
  (if htx (setvar "TEXTSIZE" htx))
  (if (not (setq rtx (getorient (getvar "VIEWCTR") "\nDonner l'orientation du champ <0.0>: "))) (setq rtx 0.0))
  (setq rtx0 (+ (angle '(0 0 0) (getvar "UCSXDIR")) rtx))
  (initget 1)
  (setq pt_lead (getpoint (getvar "VIEWCTR") "\nDonner l'orientation générale et la distance de la ligne de guidage: "))
  (setq d_lead (distance (getvar "VIEWCTR") pt_lead))
  (setq o_lead (angle (getvar "VIEWCTR") pt_lead))
  (setq
    AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
    Space
    (if (= 1 (getvar "CVPORT"))
      (vla-get-PaperSpace AcDoc)
      (vla-get-ModelSpace AcDoc)
    )
  )
  (vla-startundomark AcDoc)
  (repeat (setq n (sslength js))
    (setq
      ename (vlax-ename->vla-object (ssname js (setq n (1- n))))
      pt (vlax-curve-getPointAtParam ename (* (- (vlax-curve-getEndParam ename) (vlax-curve-getStartParam ename)) 0.5))
    )
    (make_mlead pt ename)
  )
  (vla-regen AcDoc acactiveviewport)
  (vla-endundomark AcDoc)
  (prin1)
)

 

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

Posté(e)

Coucou,

Il y a plusieurs solutions, en fonction du nombre d'étiquettes à créer :

  • La première version consiste à le faire sans programmation, en passant par l'insertion d'un champ. Pour cela, il suffit de créer une ligne de repère, d'éditer le texte de cette ligne et de cliquer sur "Insérer un champ" (sans le ruban, c'est la petite flèche vers le bas en haut à droite, sinon c'est dans l'onglet "Editeur de texte", sous-onglet "Insertion" et option "Champ" avec le ruban). Cela ouvre une fenêtre et il suffit de choisir dans la colonne de gauche "Noms de champs: " le champ nommé "Objet", dans la colonne au centre, il suffit de cliquer sur la polyligne désirée et de choisir la propriété "Aire", puis la colonne de droite permet de définir un format particulier si besoin.
    En cliquant sur "OK", l'expression de champ ainsi générée permettra de lier la ligne de repère avec la polyligne et donc si la polyligne est modifiée, la valeur contenue dans l'étiquette sera mis à jour à chaque "_REGEN"  et/ou "_REGENALL".
    PS : c'est comme cela que fonctionne le programme TOTAL AREA d'ailleurs, sauf que ce programme créé un texte un nom une ligne de repère.
  • La seconde version serait d'utiliser un script (je ne possède pas les compétences pour le faire cependant).
  • La troisième solution est de passer par de la programmation (LISP, VBA, etc...). Je pourrais te proposer le programme suivant (non testé) assez simpliste :
    (defun c:AREAtoMLEADER (/ name area str)
    
    	(while	(and
    			(setq name (car (entsel "\nSelect a polyline : ")))
    			(= (cdr (assoc 0 (entget name))) "LWPOLYLINE")
    			(setq area (getpropertyvalue name "AREA"))
    			(setq str
    				(strcat
    					"%<\\AcObjProp Object(%<\\_ObjId "
    					(itoa (vla-get-objectID (vlax-ename->vla-object name)))
    					">%).Area \\f \"%lu2\">%"
    				)
    			)
    		)
    		(command "_MLEADER" pause pause str)
    	)
    	(princ)
    
    )
  • Il est également possible de créer un programme un peu plus complexe que celui-ci pour s'adapter au mieux à tes besoins mais il faudrait pour cela prendre un peu plus de temps, ou voir @lecrabe sortir un programme de son chapeau magique comme il sait si bien faire :3
    EDIT : ou simplement un BonusCAD qui passe par là 🙂

Bisous,
Luna

Posté(e)

Bonjour BonusCad et Luna,

Merci pour vos 2 réponses très détaillés. Je pense essayer vos 2 solutions pour m'initier aux LISP notamment.

Je vous fais un retour d'ici 1 a 2 semaines après les avoir testées pour pouvoir clore le sujet.

Guillaume

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

Bonjour,

Voici mon retour, 1 an plus tard. 

Ayant acheté un logiciel CAO sur base Autocad spécifique à mon activité sur la même période j'ai été trop occupé à en intégré les nouvelles dispositions dans un premier temps. Et quand j'ai voulu travailler à ce programme... je me suis rendu compte que je n'avais plus accès aux lisp ni aux vlisp.

Apparemment ce n'est pas modifiable, je n'ai donc pas la possibilité de tester vos propositions.

Peut-être vaut-il mieux clore ce sujet pour le moment si personne d'autre n'a souhaiter tester cette macro, j'y reviendrai volontiers si je repasse à une version Autocad native par la suite (le logiciel en question me pose pas mal de souci...).

Merci encore pour vos réponses.

Guillaume

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é