Aller au contenu

Créer un jeu de sélection de tous les blocks contenus dans un polygone


Messages recommandés

Posté(e)

Bonjour à tous,

 

je tiens tout d'abord à remercier tout ceux qui participent à ce site, c'est vraiment très enrichissant.

 

Je suis novice dans la programation Lisp, je souhaiterai créer une routine en 2 clicks afin de faire un quantitatif de tous les blocks contenus dans un polygone .

 

1er click : choisir le polygone

 

2er click : cliquer sur un block BLK-QTE ayant un attribut ATT-QTE, afin de reporter les informations sur ce dernier

 

 

Ps: actuellement je suis partis dans la piste suivante (ssget "WP"...

 

Merci d' avance

Posté(e)

Bonjour,

 

le polygone a choisir est une polyligne 2d ? Si oui, peut-on se contenter de récupérer les sommets pour faire le ssget ou est-il possible qu'il y ait des segments courbes ?

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Bonjour Vincent,

 

Je te remercie d'avoir pris la peine de répondre, le polygone est bien en 2D, egalement on peut se contenter des sommets du polygone (je ne recherche pas une très grande précision).

 

Cordialement

Karym

Posté(e)

(defun listpt (ptsList / NewList I)
 (setq I 0)
 (repeat (/ (length ptsList) 2)
   (setq NewList (cons (trans (list (nth I ptsList) (nth (+ I 1) ptsList)) 0 1) NewList))
   (setq I (+ I 2))
 )
 (reverse NewList)
)

(defun modif_attrib (E ETIQ VALEUR / LATT ATT)
 (setq LATT (vlax-invoke E 'getAttributes))
 (foreach ATT LATT
   (if (= (strcase (vla-get-TagString ATT)) (strcase ETIQ))
     (vla-put-TextString ATT VALEUR)
   )
 )
)

(defun zoom_ent (obj / util obj minpoint maxpoint)
 (setq util 
   (vla-get-utility
     (vla-get-activedocument 
       (vlax-get-acad-object)
     )
   )
 )
 (vla-GetBoundingBox obj 'minpoint 'maxpoint)

 (setq minpoint (trans (vlax-safearray->list minpoint) 0 1))
 (setq maxpoint (trans (vlax-safearray->list maxpoint) 0 1))

 (command "_zoom" "_w" "_non" minpoint "_non" maxpoint)
)

(defun c:selbloc (/ e lst ss NB BL BLMODEL)
 (vl-load-com)
 (setq e (entsel "\nSaisir polyligne :"))
 (if e
   (progn
     (setq e (vlax-ename->vla-object (car e)))
     (if (= "AcDbPolyline" (vla-get-Objectname e))
       (progn
         (setq BLMODEL (entsel "\nSaisir bloc à compter : "))
         (if BLMODEL
           (progn
             (setq BLMODEL (vlax-ename->vla-object (car BLMODEL)))
             (if (= (vla-get-objectname BLMODEL) "AcDbBlockReference")
               (progn
                 (zoom_ent e)
                 (setq NOMBL (vla-get-name BLMODEL))
                 (setq lst (listpt (vlax-get e 'coordinates)))
                 (setq ss 
                   (ssget "_WP" 
                     lst 
                     (list '(0 . "INSERT") (cons 2 NOMBL))
                   )
                 )
                 (if ss
                   (progn
                     (setq NB (sslength ss))
                     (sssetfirst nil ss)
                   )
                   (setq NB 0)
                 )
                 (alert (strcat "Il y a " (itoa NB) " blocs " NOMBL))
                 (setq bl (entsel "\nSélectionner le bloc BLK-QTE : "))
                 (if bl
                   (progn
                     (setq bl (vlax-ename->vla-object (car bl)))
                     (if (= (vla-get-objectname bl) "AcDbBlockReference")
                       (modif_attrib bl "ATT-QTE" NB)
                     )
                   )
                 )
               )
             )
           )
         )
       )
     )
   )
 )
 (princ)
)

 

Amicalement

Vincent

 

[Edité le 11/5/2010 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Gripper depuis la sélection

avec un (sssetfirst nil ss)

 

tous les blocs identiques

en utilisant les possibilités de filtrage du ssget

(setq ss (ssget "_WP" lst '((0 . "INSERT") (2 . "NOM_DU_BLOC"))))

 

et il faudrait cliquer au préalable sur un "représentant" des blocs qu'on voudrait comptabiliser pour en récupérer son nom et pouvoir l'injecter dans ssget.

 

Est-ce que j'ai bien compris la demande ?

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Bonsoir à tous,

 

Mille merci Vincent, c'est exactement ce que je souhaitais, si je peux t' être utile en quoi que soit, n'hésite pas (pas encore dans la programmation <acronym class=dict title=).

 

A plus

Cordialement

Karym

Posté(e)

Re,

 

j'ai changé le lisp pour que cela réponde aux demandes pertinentes de lili... et pour corriger une grossière erreur : il fallait changer les coordonnées générales obtenues par vlax-get coordinates en coordonnées locales avant de les injecter dans (ssget). Sinon, le lisp ne fonctionne bien qu'en SCG.

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Par contre les blocs comptés et sélectionnés varient en fonction du zoom "écran"et non pas seulement du contour de sélection,...

 

Un petit coup de boundingbox pour zoomer sur la polyligne, ça devrait le faire. J'ai modifié le message ci-dessus.

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

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é