Annonces

Announcement: We’re aware of an issue affecting starting a new topic from category pages and creating new blog posts. New topics can still be started directly from the relevant board. Learn more here.

AutoCAD : Longueur des multilignes

AutoCAD : Longueur des multilignes

henry_cremieux
Advocate Advocate
1 000 Visites
6 Réponses
Message 1 sur 7

AutoCAD : Longueur des multilignes

henry_cremieux
Advocate
Advocate

Bonjour à toutes & à tous.
Me revoilà (encore...) avec une nouvelle énigme, qui vous ravira j'en suis sûr.
Est-il normal que mes multilignes n'aient pas de longueur dans la fenêtre propriétés ?

Pareil dans le tableau d'extraction de données, je laisse le paramètre "géométrie" coché, afin d'avoir les longueur des différents objets sélectionné par fenêtrage dans mon espace objet, et la case des multilignes correspondant à la colonne longueur est vide.... Donc, comme d'habitude:

A L'AIDE...

une image valant parait 'il mille mots, je vous épargnerai ma prose en faveur de deux petits screen-shots:

henrycremieux_1-1658402615573.pnghenrycremieux_1-1658402615573.png

Pas de paramètre longueur dans la fenêtre propriétés

 

henrycremieux_0-1658402535691.pnghenrycremieux_0-1658402535691.png

Pas de valeur dans la case dédiée à la longueur

Merci d'avance pour le temps que vous voudrez bien accorder à ce "petit" sujet...
Cordialement, H.


Le titre du sujet a été modifié par un modérateur pour faciliter la recherche. Titre original:
Longueur des multilignes

Autocad 2025 & REVIT 2023 à 25 sur PC de bureau avec Windows 11 pro 24H2 64 bits CPU AMD RYZEN PRO 5945WX GPU Nvidia RTX A2000 12Gb DIRECTX 12 RAM 128G Corsair DDR5
0 J'aime
Solutions acceptées (1)
1 001 Visites
6 Réponses
Replies (6)
Message 2 sur 7

CADaSchtroumpf
Advisor
Advisor
Solution acceptée

Bonjour,

Une multi-ligne étant composée de segments parallèle, en cas de mise en place en zig-zag par exemple les segments n'auront pas la même longueur, donc Autodesk a choisi ne pas indiquer de valeur de longueur.

Si c'est seulement la longueur de la ligne de base de la multi-ligne qui t’intéresse, qu'elle soit centrale ou sur un bord, il est possible de l'obtenir.

Voici un bout de code pour ce faire.

(defun c:ml_length ( / js ent dxf_ent closed lst l_dist)
	(princ "\nChoix de la multiligne: ")
	(setq js (ssget "_+.:E:S" '((0 . "MLINE"))))
	(cond
		(js
			(setq
				ent (ssname js 0)
				dxf_ent (entget ent)
				closed (boole 1 (cdr (assoc 71 dxf_ent)) 2)
				lst (mapcar '(lambda (x) (trans x ent 1)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 11)) dxf_ent)))
				l_dist (mapcar 'distance (reverse (cdr (reverse lst))) (cdr lst))
			)
			(if (not (zerop closed)) (setq l_dist (cons (distance (last lst) (car lst)) l_dist)))
			(princ (strcat "\nLa longueur de la ligne de base de la multiligne est de: " (rtos (apply '+ l_dist))))
		)
		(T (princ "\nSélection vide ou ce n'est pas une multiligne"))
	)
	(prin1)
)
Message 3 sur 7

henry_cremieux
Advocate
Advocate

TROP BALEZE.

Autocad 2025 & REVIT 2023 à 25 sur PC de bureau avec Windows 11 pro 24H2 64 bits CPU AMD RYZEN PRO 5945WX GPU Nvidia RTX A2000 12Gb DIRECTX 12 RAM 128G Corsair DDR5
0 J'aime
Message 4 sur 7

henry_cremieux
Advocate
Advocate

TROP BALEZE.

Ca marche juste trop super bien.....

Du coup j'en profite tant que j'te tiens (si vous me permettez un peu de familiarité si malvenue soit-elle)..
Serait' il dans vos cordes de créer des raccord par rayon sur ces maudites multilignes comme sur les polyligne pour avoir de beaux arrondis en lieu et place de ces angles saillants????

Autocad 2025 & REVIT 2023 à 25 sur PC de bureau avec Windows 11 pro 24H2 64 bits CPU AMD RYZEN PRO 5945WX GPU Nvidia RTX A2000 12Gb DIRECTX 12 RAM 128G Corsair DDR5
Message 5 sur 7

Y.AUBRY
Advisor
Advisor

Bonjour,

 

Je ne suis pas certain que cela puisse se faire avec des multilignes (mais j'avoue que je ne les utilise jamais).

 

Par contre tu aura dans le lien ci-dessous, plusieurs lisp associés aux multilignes dont un permet de faire la transformation des multilignes en polylignes (et donc de pouvoir utiliser la commande RACCORD par la suite)

https://cadxp.com/topic/48854-les-multi-lignes-decouverte/

 

A+ Yoan

Yoan AUBRY

EESignature

0 J'aime
Message 6 sur 7

CADaSchtroumpf
Advisor
Advisor

@henry_cremieux  a écrit :

Serait' il dans vos cordes de créer des raccord par rayon sur ces maudites multilignes comme sur les polyligne pour avoir de beaux arrondis en lieu et place de ces angles saillants????


Il n'est pas possible de créer des arcs vrai sur une multi-ligne.

Cependant ont peut avoir recours à un subterfuge qui en approche.

Ce que je vous propose ici est une commande qui permet de transformer des POLYLINE,LIGNE,CERCLE,ARC en Multi-Ligne.

Je ne peut guère proposer quelque chose de mieux...

(defun def_bulg_pl (ls lb flag_closed / ls lb rad a l_new)
  (if (not (zerop flag_closed)) (setq ls (append ls (list (car ls)))))
  (while (cadr ls)
    (if (zerop (car lb))
      (setq l_new (append l_new (list (car ls))))
      (progn
        (setq
          rad (/ (distance (car ls) (cadr ls)) (sin (* 2.0 (atan (abs (car lb))))) 2.0)
          a (- (/ pi 2.0) (- pi (* 2.0 (atan (abs (car lb))))))
        )
        (if (< a 0.0) (setq a (- (* 2.0 pi) a)))
        (if (or (and (< (car lb) 0.0) (> (car lb) -1.0)) (> (car lb) 1.0))
          (setq l_new (append l_new (reverse (cdr (reverse (bulge_pts (polar (car ls) (- (angle (car ls) (cadr ls)) a) rad) (car ls) (cadr ls) rad (car lb)))))))
          (setq l_new (append l_new (reverse (cdr (reverse (bulge_pts (polar (car ls) (+ (angle (car ls) (cadr ls)) a) rad) (car ls) (cadr ls) rad (car lb)))))))
        )
      )
    )
    (setq ls (cdr ls) lb (cdr lb))
  )
  (append l_new (list (car ls)))
)
(defun bulge_pts (pt_cen pt_begin pt_end rad sens / inc ang nm p1 p2 lst)
  (setq
    inc (angle pt_cen (if (< sens 0.0) pt_end pt_begin))
    ang (+ (* 2.0 pi) (angle pt_cen (if (< sens 0.0) pt_begin pt_end)))
    nm (fix (/ (rem (- ang inc) (* 2.0 pi)) (/ (* pi 2.0) 36.0)))
  )
  (repeat nm
    (setq
      p1 (polar pt_cen inc rad)
      inc (+ inc (/ (* pi 2.0) 36.0))
      lst (append lst (list p1))
    )
  )
  (setq
    p2 (polar pt_cen ang rad)
    lst (append lst (list p2))
  )
  (if (< sens 0.0) (reverse lst) lst)
)
(defun c:polyarc2ml ( / jspl nbr ent dxf_ent typent name_layer closed lst l_bulg e_next dxf_next oldlayer oldosm key_mod scale_ml)
  (princ "\nChoix des polylignes à transformer en multilignes: ")
  (setq
    jspl (ssget '((0 . "*POLYLINE,LINE,CIRCLE,ARC") (-4 . "<NOT") (-4 . "&") (70 . 124) (-4 . "NOT>")))
    nbr 0
  )
  (cond
    (jspl
      (initget "Dessus Nulle dEssous _Top Zero Bottom")
      (setq key_mod
        (getkword
          (strcat
            "\nEntrez le type de justification [Dessus/Nulle/dEssous] <"
            (cond
              ((eq (getvar "cmljust") 0)
                "Dessus"
              )
              ((eq (getvar "cmljust") 1)
                "Nulle"
              )
              ((eq (getvar "cmljust") 2)
                "dEssous"
              )
            )
            ">: "
          )
        )
      )
      (if key_mod
        (cond
          ((eq key_mod "Top") (setvar "cmljust" 0))
          ((eq key_mod "Zero") (setvar "cmljust" 1))
          ((eq key_mod "Bottom") (setvar "cmljust" 2))
        )
      )
      (setq scale_ml (getdist (strcat "\nEntrez l'échelle de la multiligne <" (rtos (getvar "cmlscale")) ">: ")))
      (if scale_ml (setvar "cmlscale" scale_ml))
      (setq oldlayer (getvar "clayer") oldosm (getvar "osmode"))
      (setvar "osmode" 0)
      (setvar "cmdecho" 0)
      (command "_.ucs" "_world")
      (repeat (sslength jspl)
        (setq
          typent (cdr (assoc 0 (setq dxf_ent (entget (setq ent (ssname jspl nbr))))))
          name_layer (cdr (assoc 8 dxf_ent))
        )
        (cond
          ((eq typent "LWPOLYLINE")
            (setq
              closed (boole 1 (cdr (assoc 70 dxf_ent)) 1)
              lst (mapcar '(lambda (x) (trans x ent 1)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent)))
              l_bulg (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 42)) dxf_ent))
              lst (def_bulg_pl lst l_bulg closed)
            )
          )
          ((eq typent "POLYLINE")
            (setq
              closed (boole 1 (cdr (assoc 70 dxf_ent)) 1)
              e_next (entnext ent)
            )
            (while (= "VERTEX" (cdr (assoc 0 (setq dxf_next (entget e_next)))))
              (if (zerop (boole 1 223 (cdr (assoc 70 dxf_next))))
                (setq
                  lst (cons (trans (cdr (assoc 10 dxf_next)) ent 1) lst)
                  l_bulg (cons (cdr (assoc 42 dxf_next)) l_bulg)
                )
              )
              (setq e_next (entnext e_next))
            )
            (setq
              lst (reverse lst)
              l_bulg (reverse l_bulg)
              lst (def_bulg_pl lst l_bulg closed)
            )
          )
          ((eq typent "LINE")
            (setq
              lst (list (trans (cdr (assoc 10 dxf_ent)) 0 1) (trans (cdr (assoc 11 dxf_ent)) 0 1))
              closed 0
            )
          )
          ((eq typent "CIRCLE")
            (setq
              lst
                (bulge_pts
                  (trans (cdr (assoc 10 dxf_ent)) ent 1)
                  (polar (trans (cdr (assoc 10 dxf_ent)) ent 1) 0.0 (cdr (assoc 40 dxf_ent)))
                  (polar (trans (cdr (assoc 10 dxf_ent)) ent 1) (- (* 2.0 pi) (/ (* pi 2.0) 36.0)) (cdr (assoc 40 dxf_ent)))
                  (cdr (assoc 40 dxf_ent))
                  1
                )
              lst (append lst (list (car lst)))
              closed 1
            )
          )
          ((eq typent "ARC")
            (setq
              lst
                (bulge_pts
                  (trans (cdr (assoc 10 dxf_ent)) ent 1)
                  (polar (trans (cdr (assoc 10 dxf_ent)) ent 1) (cdr (assoc 50 dxf_ent)) (cdr (assoc 40 dxf_ent)))
                  (polar (trans (cdr (assoc 10 dxf_ent)) ent 1) (cdr (assoc 51 dxf_ent)) (cdr (assoc 40 dxf_ent)))
                  (cdr (assoc 40 dxf_ent))
                  1
                )
              closed 0
            )
          )
        )
        (cond
          (lst
            (setvar "clayer" name_layer)
            (command "_.mline")
            (foreach n lst (command n))
            (if (not (zerop closed)) (command "_close") (command ""))
            (entdel ent)
          )
        )
        (setq nbr (1+ nbr) lst nil l_bulg nil)
      )
      (command "_.ucs" "_previous")
      (setvar "clayer" oldlayer)
      (setvar "osmode" oldosm)
      (setvar "cmdecho" 1)
    )
    (T (princ "\nSélection vide"))
  )
  (prin1)
)
0 J'aime
Message 7 sur 7

henry_cremieux
Advocate
Advocate

MERCI BEAUCOUP @CADaSchtroumpf & @Y.AUBRY
On s'arrangera avec ça...

Autocad 2025 & REVIT 2023 à 25 sur PC de bureau avec Windows 11 pro 24H2 64 bits CPU AMD RYZEN PRO 5945WX GPU Nvidia RTX A2000 12Gb DIRECTX 12 RAM 128G Corsair DDR5
0 J'aime