Invité -=micka=- Posté(e) le 6 septembre 2011 Posté(e) le 6 septembre 2011 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
didier Posté(e) le 6 septembre 2011 Posté(e) le 6 septembre 2011 coucou rien de visualpour 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 programmeen donnant des valeurs connues sans passer par un (getpoint). regarde déjà ça, on verra le reste plus tardessaie d'éviter de copier-coller, tape ton propre codetu le "sentiras" mieux. amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Invité -=micka=- Posté(e) le 7 septembre 2011 Posté(e) le 7 septembre 2011 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=-]
fredbross Posté(e) le 7 septembre 2011 Posté(e) le 7 septembre 2011 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.
VDH-Bruno Posté(e) le 7 septembre 2011 Posté(e) le 7 septembre 2011 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/Supprimer/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) le 7 septembre 2011 Posté(e) le 7 septembre 2011 @ 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
VDH-Bruno Posté(e) le 7 septembre 2011 Posté(e) le 7 septembre 2011 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) le 8 septembre 2011 Posté(e) le 8 septembre 2011 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
VDH-Bruno Posté(e) le 12 septembre 2011 Posté(e) le 12 septembre 2011 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
Patrick_35 Posté(e) le 14 septembre 2011 Posté(e) le 14 septembre 2011 Salut Cela me rappel ce Challenge @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant