Aller au contenu

Surface bloc ligne de repère multiple


Messages recommandés

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

Lien à poster
Partager sur d’autres sites

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

Lien à poster
Partager sur d’autres sites

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

Lien à poster
Partager sur d’autres sites

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

Lien à poster
Partager sur d’autres sites
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.

Chargement
×
×
  • Créer...