Aller au contenu

help selection blocs


Invité -=micka=-

Messages recommandés

Invité -=micka=-
Posté(e)

Bonjour,

 

je viens de nouveau faire appel à vous cadxpiens, car j'ai quelques soucis:

 

J'aimerais savoir comment faire pour faire une fenêtre de sélection dans un dessin et non pas devoir sélectionner chaque bloc un a un.

 

en fait mon but est d'obtenir le nombre de certains blocs connus (que j'ai créé) qui se trouveront dans cette fenêtre (ça aussi je ne sais pas comment faire, il me semble que c'est avec de commandes "visual-lisp" et ça je ne m'y connait pas du tout)

 

et une dernière chose aussi comment faire pour attribuer le nombre de ces blocs dans un autre bloc avec attributs que j'ai crée aussi!!

 

Merci pour votre aide

 

 

Posté(e)

coucou

 

rien de visual

pour faire un jeu de sélection avec sélection "par fenêtre"

(setq p1 (getpoint"\nCoin 1 de la fenêtre\n")
     p2 (getpoint"\nCoin 2 de la fenêtre\n")
     )

(setq jeusel (ssget
       "_W"
       p1
       p2
       (list
	 (cons 0 "INSERT")
	 (cons 2 "NomDuBloc")
	 )
       )
     )
      

maintenant tu peux aussi choisir tes coordonnées de p1 et p2 dans le programme

en donnant des valeurs connues sans passer par un (getpoint).

 

regarde déjà ça, on verra le reste plus tard

essaie d'éviter de copier-coller, tape ton propre code

tu le "sentiras" mieux.

 

amicalement

 

 

Invité -=micka=-
Posté(e)

salut,

 

Merci didier pour ta réponse,

je vais voir si je peux l'adapter.

 

 

Je cherche désespérément un moyen d'extraire toutes les valeurs identiques d'une liste, pour m'en servir mais je n'arrive pas a trouver.

 

 

 

Sinon mon but n'est pas de faire du copier-coller, mais c'est plus facile de partir d'exemples pour constituer son propre code, c'est ce que j'ai demandé...

 

 

merci pour votre aide

 

[Edité le 7/9/2011 par -=micka=-]

Posté(e)

Bonjour mickael

 

En sélectionnant les blocs avec la méthode de didier, Si ce que tu veux c'est savoir combien il y a de blocs dans ton jeu de sélection il suffit de :

 

 
(setq nombredebloc (sslength jeusel))

 

puis tu réitére ta sélection et ton comptage pour chacun de tes noms de blocs.

 

Bon courage.

Posté(e)

Bonjour -=micka=-

 

Je vais essayer de te faire une réponse le plus détaillé possible (hélas en temps limité) et espérant compléter les réponses précédentes, sans ajouter de confusion ( et dire trop d’ânerie).

 

J'aimerais savoir comment faire pour faire une fenêtre de sélection dans un dessin et non pas devoir sélectionner chaque bloc un a un.

 

Pour faire une sélection, d’une façon général c’est la fonction ( ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list]).

 

La fonction (ssget) sans argument permet les modes de sélection suivant (A tester sur la ligne de commande) :

Commande: (ssget)

Choix des objets: ?

*Sélection non valable*

Attend un point ou

Fenêtre/Dernier/Capture/BOîte/TOUT/Trajet/SPolygone/CPolygone/Groupe/Ajouter/Sup

primer/Multiple/Précédent/annUler/AUto/uniQue

 

 

Pour forcer un mode de sélection, il suffit de le spécifier en argument de la fonction [sel-method] [pt1 [pt2]], exemple pour une fenêtre de sélection :

(ssget "_W"
      (setq pt (getpoint "\nSpécifiez le premier coin: "))
      (getcorner pt "Spécifiez le coin opposé: ")
)

 

 

Pour filtrer un type spécifique d’entité, une fois de plus il suffit de spécifier en argument de la fonction ssget une liste de filtre [filter-list] basé sur la nomenclature des codes DXF.

 

Exemple pour sélectionner une(ou plusieurs) référence du bloc (code 0) nommé TOTO1 (code 2).

 (ssget '((0 . "INSERT") (2 . "TOTO1")))

 

Exemple pour sélectionner un ensemble de blocs (code 0) nommés TOTO1, TOTO2, TOTO3 (code 2).

 (ssget '((0 . "INSERT") (2 . "TOTO1,TOTO2,TOTO3")))

Ou

 (ssget '((0 . "INSERT") (2 . "TOTO*")))

 

(Notes : Dans la construction du code 2 toutes les syntaxes admises par la fonction wcmatch sont supportées. Par convention j’ai spécifié le code 0, même si dans ce cas il peut être omis.

 

 

Le mode de sélection et la liste de filtre de sélection peuvent être combinés, si la liste de filtre est composée de variables ces dernières ne doivent pas être quoté ( '), exemples :

(setq Nom-Blk "TOTO1,TOTO2,TOTO3")
(ssget "_W"
      (setq pt (getpoint "\nSpécifiez le premier coin: "))
      (getcorner pt "Spécifiez le coin opposé: ")
      (list '(0 . "INSERT") (cons 2 Nom-Blk))
)

 

Personnellement si les coordonnées de la sélection ne sont pas spécifié par programmation, je préfère ne pas préciser le mode de sélection car même si cela demande un clic de plus (celui de la validation de la sélection), cela laisse la possibilité d’ajout/suppression d’élément dans la constitution du jeu de sélection.

 

 

 

en fait mon but est d'obtenir le nombre de certains blocs connus (que j'ai créé) qui se trouveront dans cette fenêtre

 

La fonction ssget retourne un jeu de sélection référençant les entités sélectionnées ou nil (absence de sélection valide),

_$ (ssget)

$ (type (ssget))
PICKSET

 

 

La fonction sslength renvoie un entier contenant le nombre d'objets (entités) dans un jeu de sélection. Exemple d’une fonction qui retournerait le nombre de bloc TOTO1, TOTO2, TOTO3 sélectionnés :

(if (setq jss (ssget '((0 . "INSERT") (2 . "TOTO1,TOTO2,TOTO3"))))
 (sslength jss)
 0
)

 

 

 

et une dernière chose aussi comment faire pour attribuer le nombre de ces blocs dans un autre bloc avec attributs que j'ai crée aussi!!

 

Pour cette dernière demande j’espère que quelqu’un d’autre pourra compléter, sinon j’essayerai de le faire ultérieurement, à l’occasion de plus de disponibilité…

 

A+ Bruno

 

 

Apprendre => Prendre => Rendre

Invité -=micka=-
Posté(e)

@ Frédéric et Bruno,

 

merci beaucoup, je vais me pencher sur (ssget) qui m'a l'air bien utile!! ^^

par contre après la lecture de tes explications Bruno, (je sais pas si j'ai bien saisi) il faudrait que l'utilisateur du lisp fasse une nouvelle sélection dans le dessin pour chaque type de blocs? :s

 

en tout cas elle ta réponse était déjà très détaillée.

Merci

 

mickael

Posté(e)

Re,

 

après la lecture de tes explications Bruno, (je sais pas si j'ai bien saisi) il faudrait que l'utilisateur du lisp fasse une nouvelle sélection dans le dessin pour chaque type de blocs?

 

Non ça c’était plus la proposition fredbross, personnellement j’avais plutôt suggéré de les regrouper dans le code de groupe 2 pour n’avoir qu’un seul jeu de sélection a traiter.

 

 (ssget '((0 . "INSERT") (2 . "TOTO1,TOTO2,TOTO3")))

 

Cas de 3 blocs respectivement nommé TOTO1, TOTO2 et TOTO3

 

A+ Bruno

 

 

Apprendre => Prendre => Rendre

Invité -=micka=-
Posté(e)

bonjour,

 

j'ai réussi a faire marcher le "ssget" avec mes blocs mon, soucis maintenant c'est que je n'arrive pas à en sortir le décompte de ces blocs, j'aimerais avoir le nombre de chaque bloc pour pouvoir l'envoyer dans une nomenclature.

j'ai chercher dans les manipulations des listes mais j'ai pas trouvé de fonction qui pourrait résoudre ce soucis.

 

merci

 

Micka

Posté(e)

Bonsoir Micka,

 

j'ai réussi a faire marcher le "ssget" avec mes blocs mon, soucis maintenant c'est que je n'arrive pas à en sortir le décompte de ces blocs,

 

Je n’avais pas percuté que tu souhaitais effectué un décompte par type de blocs, deux approches possibles :

 

 

La première en reprenant l’idée évoqué par fredbross , ce qui pourrait ce coder comme ceci :

;; CompteBloc
;; Retourne une liste de paire pointées ((Bloc1 . Nbr1) (Bloc2 . Nbr2) ...)
;;
;; Arguments
;; Pt1    : 1er coin de la fenête de sélection
;; Pt2    : 2ème coin de la fenête de sélection
;; LstBloc : Une liste des noms de blocs à comptabiliser
(defun CompteBloc (Pt1 Pt2 LstBloc)
 (mapcar
   '(lambda (x / ss)
      (cons x
     (if (setq ss (ssget "_W" Pt1 Pt2 (list '(0 . "INSERT") (cons 2 x))))
       (sslength ss)
       0
     )
      )
    )
    LstBloc
 )
)

 

 

Pour tester par exemple sur une fenêtre sélectionnant 1 bloc nommé TOTO1, 3 blocs nommé TOTO2 et 5 blocs nommé TOTO3

 

(CompteBloc
 (setq pt (getpoint "\nSpécifiez le premier coin: "))
 (getcorner pt "Spécifiez le coin opposé: ")
 '("TOTO1" "TOTO2" "TOTO3")
)

 

 

La fonction retourne

(("TOTO1" . 1) ("TOTO2" . 3) ("TOTO3" . 5))

 

 

 

La seconde méthode consisterait à ne faire qu’une seule sélection (pour éviter de devoir filtrer plusieurs fois la base de donné) comme expliqué précédemment, puis à parcourir la sélection avec la fonction ssname afin de comptabiliser les différents types de blocs composant la sélection.

 

 

Cordialement,

 

 

Edite du 13/09: Modifié le code en exemple pour tenir compte des sélections vides

Apprendre => Prendre => Rendre

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é