Aller au contenu

parcourir une polyligne pour trouver un bloc


Messages recommandés

Posté(e)

bonjour ,

j'ai comme presenté dans l'image ci-dessous une polyligne et deux blocs un qui represente une fleche l'autre qui me donne le diametre

ce que je voudrais c'est parcourir la polyligne pour trouver "si il y est" le bloc qui me donne le diametre, l'autre bloc n'est pas important

http://nsa23.casimages.com/img/2010/10/21/101021081953320121.png

Posté(e)

Salut,

 

Avec une sélection par trajet : (ssget "_F" liste_sommets ...) et la liste des sommets de la polyligne (coordonnées SCU courant) si le bloc est biensur la polyligne et que celle-ci ne contient que des segments droits.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

pour le moment je fais ca :

 
(defun getdiam (ent)
 (setq entComp (entget ent)
p1 (cdr (assoc 10 entComp))
p2 (cdr (assoc 11 entComp))
 )
 (setq objects (ssget "_F" (list p1 p2)))
)

mais il me retourne l'erreur suivante : "erreur: liste de points incorrecte"

mes variables contienent:

ent =

entComp = ((-1 . ) (0 . "LWPOLYLINE") (5 . "3F0A") (102 . "{ACAD_XDICTIONARY") (360 . ) (102 . "}") (330 . ) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 2) (70 . 128) (43 . 0.0) (38 . 0.0) (39 . 0.0) ( 10 874899.0 160848.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 874863.0 160867.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0))

p1 = (874863.0 160867.0)

p2 = nil

 

 

edit :oups je vien de voir pourquoi : p2 (cdr (assoc 11 entComp))

mais alors commend recuperer le (10 874863.0 160867.0)

 

 

[Edité le 21/10/2010 par arcuce]

Posté(e)

Les sommets d'une polyligne optimisée (LWPOLYLINE) correspondent aux code 10 (une entrée par sommet) de la liste DXF de cette polyligne.

Il sont exprimés en coordonnées SCO (le SCO de la polylignes est égal au SCG si le plan de la polyigne est parallèle au plan du SCG)

 

Pour récupérer ces sommets (sujet maintes fois abordé) tu peux utiliser la "célèbre" expression :

(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent)))

 

ou utiliser une fonction générique qui retourne toutes les entrées d'un même code de groupe d'une liste d'association ; cette routine est généralement appelée massoc, une recherche sur CADxp avec ce mot devrait te permettre d'en trouver plusieurs versions, voici la mienne :

 

(defun massoc (key alst)
 (if (setq alst (member (assoc key alst) alst))
   (cons (cdar alst) (massoc key (cdr alst)))
 )
)

 

Il est ensuite plus prudent de transformer ces points en coordonnées SCU courant au cas où celui-ci serait différent du SCG au moment où est lancée la routine.

 

Il est aussi préférable de faire un filtre de sélection pour ne sélectionner que le bloc concerné (remplacer "NomDuBloc" par le vrai nom du bloc entre guillemets).

 

(setq pts_lst (mapcar '(lambda (x) (trans x ent 1)) (massoc 10 (entget ent))))
(setq objects (ssget "_F" pts_lst '((0 . "INSERT") (2 . "NomDuBloc"))))

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é