#1 Mon 28 October 2013 11:21
- Dylan
- Participant occasionnel
- Date d'inscription: 14 Jan 2013
- Messages: 19
Accrocher extrémité d'une polyligne au centre d'un bloc
Bonjour,
J'utilise depuis quelques temps ce lisp qui me permet de raccrocher les extrémités des polylignes proche d'un bloc ( en précisant le rayon d'action ) au centre de celui-ci : ( Un grand merci à Gile pour ce lisp )
Code:
; ACO (gile) ;;; Accroche l'extémité des objets (ligne, polyligne) située ;;; en deçà de la distance spécifiée au centre du cercle, point d'insertion ;;; du bloc, ou point sélectionné. (defun c:aco (/ dist ent elst ucszdir elev cen circle ss nlst pt_lst) (initget 7) (setq dist (getdist "\nSpécifiez le rayon du cercle d'acrrochage: ")) (while (setq ent (car (entsel))) (setq elst (entget ent)) (if (member (cdr (assoc 0 elst)) '("CIRCLE" "POINT" "INSERT")) (progn (setq ucszdir (trans '(0 0 1) 1 0 T) elev (caddr (trans (getvar "ucsorg") 0 ucszdir)) ) (if (= (cdr (assoc 0 elst)) "POINT") (setq cen (trans (cdr (assoc 10 elst)) 0 ucszdir)) (setq cen (trans (cdr (assoc 10 elst)) ent ucszdir)) ) (if (equal (caddr cen) elev 1e-9) (progn (setq ang 0.0 circle nil ) (repeat 50 (setq circle (cons (polar cen ang dist) circle) ang (+ ang (/ pi 25)) ) ) (setq ss (ssget "_CP" circle '((0 . "LINE,LWPOLYLINE"))) ) (if ss (foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) (setq nlst (entget n)) (cond ((and (= (cdr (assoc 0 nlst)) "LINE") (equal (caddr (trans (cdr (assoc 10 nlst)) 0 ucszdir)) elev 1e-9 ) (equal (caddr (trans (cdr (assoc 11 nlst)) 0 ucszdir)) elev 1e-9 ) ) (if (<= (distance cen (trans (cdr (assoc 10 nlst)) 0 ucszdir) ) dist ) (entmod (subst (cons 10 (trans cen ucszdir 0)) (assoc 10 nlst) (entget n) ) ) ) (if (<= (distance cen (trans (cdr (assoc 11 nlst)) 0 ucszdir) ) dist ) (entmod (subst (cons 11 (trans cen ucszdir 0)) (assoc 11 nlst) (entget n) ) ) ) ) ((and (= (cdr (assoc 0 (entget n))) "LWPOLYLINE") (equal (cdr (assoc 210 nlst)) ucszdir 1e-9) (equal (cdr (assoc 38 nlst)) elev 1e-9) ) (setq pt_lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) nlst ) ) ) (if (<= (distance cen (car pt_lst)) dist) (entmod (subst (cons 10 (list (car cen) (cadr cen))) (assoc 10 nlst) nlst ) ) ) (if (<= (distance cen (last pt_lst)) dist) (entmod (subst (cons 10 (list (car cen) (cadr cen))) (assoc 10 (reverse nlst)) nlst ) ) ) ) ) ) ) ) (alert "\nL'objet sélectionné n'est pas\ndans le plan XY du SCU." ) ) ) (alert "\nL'objet sélectionné n'est pas\nun point, un cecle ou un bloc." ) ) ) (princ) ) ;;; RAC_OB (gile) ;;; Raccorde les objets (ligne, polyligne) situés en deçà ;;; de la distance spécifiée au centre du cercle, point d'insertion ;;; du bloc, ou point sélectionné. (defun c:rac_ob (/ dist ent elst ucszdir elev cen circle ss nlst) (vl-load-com) (initget 7) (setq dist (getdist "\nSpécifiez le rayon du cercle d'accrochage: ")) (while (setq ent (car (entsel))) (setq elst (entget ent)) (if (member (cdr (assoc 0 elst)) '("CIRCLE" "POINT" "INSERT")) (progn (setq ucszdir (trans '(0 0 1) 1 0 T) elev (caddr (trans (getvar "ucsorg") 0 ucszdir)) ) (if (= (cdr (assoc 0 elst)) "POINT") (setq cen (trans (cdr (assoc 10 elst)) 0 ucszdir)) (setq cen (trans (cdr (assoc 10 elst)) ent ucszdir)) ) (if (equal (caddr cen) elev 1e-9) (progn (setq ang 0.0 circle nil ) (repeat 50 (setq circle (cons (polar cen ang dist) circle) ang (+ ang (/ pi 25)) ) ) (setq ss (ssget "_CP" circle '((0 . "LINE,LWPOLYLINE"))) ) (if ss (foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) (setq nlst (entget n)) (if (or (and (= (cdr (assoc 0 nlst)) "LINE") (equal (caddr (trans (cdr (assoc 10 nlst)) 0 ucszdir)) elev 1e-9 ) (equal (caddr (trans (cdr (assoc 11 nlst)) 0 ucszdir)) elev 1e-9 ) ) (and (= (cdr (assoc 0 (entget n))) "LWPOLYLINE") (equal (cdr (assoc 210 nlst)) ucszdir 1e-9) (equal (cdr (assoc 38 nlst)) elev 1e-9) ) ) (entmake (list '(0 . "LINE") (cons 10 (trans cen ucszdir 0)) (cons 11 (vlax-curve-getClosestPointTo (vlax-ename->vla-object n) (trans cen ucszdir 0) ) ) ) ) ) ) ) ) (alert "\nL'objet sélectionné n'est pas\ndans le plan XY du SCU." ) ) ) (alert "\nL'objet sélectionné n'est pas\nun point, un cercle ou un bloc." ) ) ) (princ) )
Il fonctionne à merveille, mais j'aimerais modifier ce LISP de manière à pouvoir sélectionner plusieurs bloc en même temps avec la fonction de sélection pointeur d'autocad ( Le lisp actuellement fonctionne avec une sélection manuelle unique d'un bloc ) Je suis bloqué, quelqu'un aurait- une idée ?
merci à tous !
Hors ligne