Classement
Contenu populaire
Affichage du contenu avec la meilleure réputation le 13/02/2024 dans toutes les zones
-
Cette version devrait répondre à la demande de @TUAU. ;; plineSignedArea ;; Obtient l'aire algébrique (signée) de la polyligne (defun plineSignedArea (pline / triangleArea arcArea elst lst area p0) (defun triangleArea (p1 p2 p3) (- (* (- (car p2) (car p1)) (- (cadr p3) (cadr p1))) (* (- (car p3) (car p1)) (- (cadr p2) (cadr p1))) ) ) (defun arcArea (p1 p2 bulge / ang rad) (setq ang (* 2 (atan bulge)) rad (/ (distance p1 p2) (* 2 (sin ang))) ) (* rad rad (- (* 2 ang) (sin (* 2 ang)))) ) (setq elst (entget pline)) (while (setq elst (member (assoc 10 elst) elst)) (setq lst (cons (cons (cdar elst) (cdr (assoc 42 elst))) lst) elst (cdr elst) ) ) (setq lst (reverse lst) area 0.0 p0 (caar lst) ) (if (/= 0 (cdar lst)) (setq area (arcArea p0 (caadr lst) (cdar lst))) ) (setq lst (cdr lst)) (if (equal (car (last lst)) p0 1e-9) (setq lst (reverse (cdr (reverse lst)))) ) (while (cadr lst) (setq area (+ area (triangleArea p0 (caar lst) (caadr lst)))) (if (/= 0 (cdar lst)) (setq area (+ area (arcArea (caar lst) (caadr lst) (cdar lst)))) ) (setq lst (cdr lst)) ) (if (/= 0 (cdar lst)) (setq area (+ area (arcArea (caar lst) p0 (cdar lst)))) ) (/ area 2.) ) ;; isClockwise ;; Evalue si la polyligne est en sens horaire (defun isClockwise (pline) (minusp (plineSignedArea pline))) ;; reversePline ;; Inverse l'ordre des sommets de la polyligne (defun reversePline (ent / split dxfLst vrtxLst lastVrtx) (defun split (l) (if l (cons (list (car l) (cadr l) (caddr l) (cadddr l)) (split (cddddr l)) ) ) ) (setq dxfLst (entget ent)) (setq vrtxLst (reverse (split (vl-remove-if-not '(lambda (x) (member (car x) '(10 40 41 42))) dxfLst ) ) ) dxfLst (vl-remove-if '(lambda (x) (member (car x) '(10 40 41 42))) dxfLst ) ) (setq lastVrtx (last vrtxLst) lastVrtx (subst (cons 40 (cdr (assoc 41 (car vrtxLst)))) (assoc 40 lastVrtx) (subst (cons 41 (cdr (assoc 40 (car vrtxLst)))) (assoc 41 lastVrtx) (subst (cons 42 (- (cdr (assoc 42 (car vrtxLst))))) (assoc 42 lastVrtx) lastVrtx ) ) ) ) (setq vrtxLst (mapcar '(lambda (x y) (setq x (subst (cons 40 (cdr (assoc 41 y))) (assoc 40 x) (subst (cons 41 (cdr (assoc 40 y))) (assoc 41 x) (subst (cons 42 (- (cdr (assoc 42 y)))) (assoc 42 x) x ) ) ) ) ) vrtxLst (cdr vrtxLst) ) ) (if (= (logand 1 (cdr (assoc 70 dxfLst))) 1) (setq vrtxLst (append (list lastVrtx) vrtxLst)) (setq vrtxLst (append vrtxLst (list lastVrtx))) ) (setq dxfLst (append dxfLst (apply 'append vrtxLst))) (entmod dxfLst) ) ;; massoc ;; Renvoie la liste de toutes les valeurs pour la clé spécifiée (defun massoc (key alst) (if (setq alst (member (assoc key alst) alst)) (cons (cdar alst) (massoc key (cdr alst))) ) ) ;; Commande de test (defun c:test (/ ss i pline plines ccwPlines) ;; invite "sélection de polyligne" ;; on fait une sélection classique autocad (if (setq ss (ssget '((0 . "LWPOLYLINE")))) (progn (repeat (setq i (sslength ss)) (setq pline (ssname ss (setq i (1- i)))) ;; Clore les polylignes et les mettre aux sens de parcours horaires (if (zerop (getpropertyvalue pline "Closed")) (setpropertyvalue pline "Closed" 1) ) (setq plines (cons pline plines)) ) ;; Détecter les polylignes fermées internes à d'autres (command-s "_.zoom" "_extents") (foreach pline plines (if (setq ss (ssget "_WP" (massoc 10 (entget pline)) '((0 . "LWPOLYLINE")) ) ) (repeat (setq i (sslength ss)) (setq ccwPlines (cons (ssname ss (setq i (1- i))) ccwPlines)) ) ) ) (command-s "_.zoom" "_previous") ;; Attribuer le sens des polylignes (foreach pline plines (if (member pline ccwPlines) (if (IsClockwise pline) (reversePline pline) ) (if (not (IsClockwise pline)) (reversePline pline) ) ) ) ) ) (princ) )2 points
-
Bonjour, Si tu as un AutoCAD Map, tu peux tenter le coup avec les MPolygones. Tu lances la commande MPOLYGON, puis Entrée pour passer en mode choix des objets, puis tu sélectionnes toutes tes polylignes et tu valides la transformation. Automatiquement les polylignes internes seront détectées et déduites des contours externes englobants. Tu supprimes les polylignes originales, puis tu décomposes tous les MPolygones. Tu obtiens à nouveau tes polylignes, les externes (englobantes) tournent en sens trigo et les poly internes (ilôts) tournent en sens horaire. Il te suffit alors d'inverser le sens de toutes tes polylignes : PEDIT MULTIPLE INVERSER Olivier2 points
-
Hello les KINGs Je ne sais comment vous remercier mais je vous souhaite de tout mon âme une bonne santé et longue vie à vous afin de continuer à faire du chaud dans les cœurs des demandeurs de routines LISP. Je te salut bien bas MR @gile depuis la nouvelle calédonie. 🙏👋1 point
-
Ce n'est plus du tout la demande initiale dans laquelle le sens est déterminé par le fait que la polyligne soit "interne" ou "externe". C'est dans la demande initiale. De toutes façons sens horaire/anti-horaire n'a de sens que si la polyligne est fermée.1 point
-
Hello @(gile) J adore ton Lisp sur les LWPLines ! SVP puis je te demander qq petites ameliorations : -- Poser la Question Sens Horaire (Defaut ou Sens Anti-Horairre) ( OK on peut aussi passer APRES par un PEDITM ... Inverser ... ) -- Traiter les PLines 2D Legeres ET Lourdes NOTE 1 : BRAVO car les XDATAs et ODs (Object Data de MAP) sont conservees ! NOTE 2 : j ai remarque que si les LWPLines ne sont pas Closes / Fermees alors ta Routine s en occupe !? Merci, Bye, lecrabe1 point
-
Bonjour, Dans ancien nom, il faut mettre PR-VOI-* et dans nouveau nom *1 point
-
;; plineSignedArea ;; Obtient l'aire algébrique (signée) de la polyligne (defun plineSignedArea (pline / triangleArea arcArea elst lst area p0) (defun triangleArea (p1 p2 p3) (- (* (- (car p2) (car p1)) (- (cadr p3) (cadr p1))) (* (- (car p3) (car p1)) (- (cadr p2) (cadr p1))) ) ) (defun arcArea (p1 p2 bulge / ang rad) (setq ang (* 2 (atan bulge)) rad (/ (distance p1 p2) (* 2 (sin ang))) ) (* rad rad (- (* 2 ang) (sin (* 2 ang)))) ) (setq elst (entget pline)) (while (setq elst (member (assoc 10 elst) elst)) (setq lst (cons (cons (cdar elst) (cdr (assoc 42 elst))) lst) elst (cdr elst) ) ) (setq lst (reverse lst) area 0.0 p0 (caar lst) ) (if (/= 0 (cdar lst)) (setq area (arcArea p0 (caadr lst) (cdar lst))) ) (setq lst (cdr lst)) (if (equal (car (last lst)) p0 1e-9) (setq lst (reverse (cdr (reverse lst)))) ) (while (cadr lst) (setq area (+ area (triangleArea p0 (caar lst) (caadr lst)))) (if (/= 0 (cdar lst)) (setq area (+ area (arcArea (caar lst) (caadr lst) (cdar lst)))) ) (setq lst (cdr lst)) ) (if (/= 0 (cdar lst)) (setq area (+ area (arcArea (caar lst) p0 (cdar lst)))) ) (/ area 2.) ) ;; isClockwise ;; Evalue si la polyligne est en sens horaire (defun isClockwise (pline) (minusp (plineSignedArea pline))) ;; reversePline ;; Inverse l'ordre des sommets de la polyligne (defun reversePline (ent / split dxfLst vrtxLst lastVrtx) (defun split (l) (if l (cons (list (car l) (cadr l) (caddr l) (cadddr l)) (split (cddddr l)) ) ) ) (setq dxfLst (entget ent)) (setq vrtxLst (reverse (split (vl-remove-if-not '(lambda (x) (member (car x) '(10 40 41 42))) dxfLst ) ) ) dxfLst (vl-remove-if '(lambda (x) (member (car x) '(10 40 41 42))) dxfLst ) ) (setq lastVrtx (last vrtxLst) lastVrtx (subst (cons 40 (cdr (assoc 41 (car vrtxLst)))) (assoc 40 lastVrtx) (subst (cons 41 (cdr (assoc 40 (car vrtxLst)))) (assoc 41 lastVrtx) (subst (cons 42 (- (cdr (assoc 42 (car vrtxLst))))) (assoc 42 lastVrtx) lastVrtx ) ) ) ) (setq vrtxLst (mapcar '(lambda (x y) (setq x (subst (cons 40 (cdr (assoc 41 y))) (assoc 40 x) (subst (cons 41 (cdr (assoc 40 y))) (assoc 41 x) (subst (cons 42 (- (cdr (assoc 42 y)))) (assoc 42 x) x ) ) ) ) ) vrtxLst (cdr vrtxLst) ) ) (if (= (logand 1 (cdr (assoc 70 dxfLst))) 1) (setq vrtxLst (append (list lastVrtx) vrtxLst)) (setq vrtxLst (append vrtxLst (list lastVrtx))) ) (setq dxfLst (append dxfLst (apply 'append vrtxLst))) (entmod dxfLst) ) ;; massoc ;; renvoie la liste de toutes les valeurs pour la clé spécifiée (defun massoc (key alst) (if (setq alst (member (assoc key alst) alst)) (cons (cdar alst) (massoc key (cdr alst))) ) ) ;; Commande de test (defun c:test (/ ss1 i pline ss2 j) ;; invite "sélection de polyligne" ;; on fait une sélection classique autocad (if (setq ss1 (ssget '((0 . "LWPOLYLINE")))) (repeat (setq i (sslength ss1)) (setq pline (ssname ss1 (setq i (1- i)))) ;; Clore les polylignes et les mettre aux sens de parcours horaires (if (zerop (getpropertyvalue pline "Closed")) (setpropertyvalue pline "Closed" 1) ) (if (not (IsClockwise pline)) (reversePline pline) ) ;; Détecter les polylignes fermées internes à d'autres (if (setq ss2 (ssget "_WP" (massoc 10 (entget pline)) '((0 . "LWPOLYLINE")) ) ) (repeat (setq j (sslength ss2)) (setq pline (ssname ss2 (setq j (1- j)))) ;; mettre ces derniers dans le sens de parcours anti-horaire. (if (IsClockwise pline) (reversePline pline) ) ) ) ) ) (princ) )1 point
-
Bonjour, Quelques liens vers des lisp permettant de savoir si une polyligne est en sens horaire ou anti-horaire : https://www.cadtutor.net/forum/topic/47024-lsp-to-set-multiple-polygons-direction-to-clockwise/?do=findComment&comment=385237 https://forums.augi.com/showthread.php?6678-Clockwise-Anti-clockwise-Polyline Olivier1 point
