phil_vsd Posté(e) le 22 février 2008 Posté(e) le 22 février 2008 Mesdames, Messieurs, Je suis à la bourre sur un lisp... Je me suis perdu. http://xs124.xs.to/xs124/08085/acadbloc173.png J'ai des présentations avec cadre, fenêtres et cartouche. Sur la même présentation j'ai aussi sur la droite de l'écran un petit cadre qui contient la liste de touts les plans et une copie du bloc cartouche précédement cité. Quand j'imprime le A3 j'imprime aussi le A4 que je joins. Mon bloc qui me sert de cartouche est appelé "SGAD" dont le point d'insertion est (397 , 3 ). Je voudrais qu'il se copie au sein de la même présentation au point d'insertion (700 , 200). A l'intérieur de ce bloc il y a des attributs propres à la présentation que je voudrais garder d'un bloc à l'autre. Il faut donc : - ouvrir une par une les présentations- copier le bloc SGAD qui se trouve aux coordonnées citées plus haut vers les nouvelles coordonnées.- Attention, s'il y a déjà un bloc copié à cet endroit là il faut qu'il soit effacé afin de le remplacer car les informations évoluent. Ou alors copier tous les attributs du premier vers le clone...- Lancer une impression dont la mise en page s'appelle "Cartouche A4 PDF" (Cette mise en page est déjà mémorisée dans mon DWT.)- Passer à la suivante. Merci pour votre coup de main. (Gile) je me suis inspiré de tes conseils mais je patine à mort sur ce coup là... Je manque de temps. "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
(gile) Posté(e) le 22 février 2008 Posté(e) le 22 février 2008 Salut, ;; pour chaque élément de la liste des présentations (foreach p (layoutlist) ;; on active la présentation (setvar "CTAB" p) ;; si on sélectionne un bloc nommé "SGAD" en 397,3... (if (setq ss (ssget '(397 3) '((0 . "INSERT") (2 . "SGAD")))) ;; ...on le copie en 700,200 (command "_.copy" ss "" '(397 3) '(700 200)) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
phil_vsd Posté(e) le 22 février 2008 Auteur Posté(e) le 22 février 2008 re... J'ai plusieurs messages d'erreur. Certains peuvent être corrigés par rajout de parenthèse mais d'autres apparaissent. Je crois que c'est dans la liste que ça coince. ; error : invalid-identifier <(COMMAND "_.copy" SS "" '(397 3) '(700 200))> ; expected at [sETQ] J'ai ça dans mon lisp : (defun c:ccart )(foreach p (layoutlist)(setvar "CTAB" p)(if (setq ss (ssget '(397 3) '((0 . "INSERT") (2 . "SGAD"))))(command "_.copy" ss "" '(397 3) '(700 200)))) Je ne vois pas quoi qui coince... "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
(gile) Posté(e) le 22 février 2008 Posté(e) le 22 février 2008 Salut, Il manque une parenthèse ouvrante pour la liste (vide) des arguments, après (defun c:ccart ...), et donc, une fermante à la fin. (defun c:ccart [surligneur]([/surligneur]) (foreach p (layoutlist) (setvar "CTAB" p) (if (setq ss (ssget '(397 3) '((0 . "INSERT") (2 . "SGAD")))) (command "_.copy" ss "" '(397 3) '(700 200)) ) ) [surligneur])[/surligneur] PS : utilise l'éditeur Visual LISP et les outils de mise en forme, ils aident à détecter ce type d'erreurs. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
phil_vsd Posté(e) le 22 février 2008 Auteur Posté(e) le 22 février 2008 Bizarre rien ne se passe... Le bloc ne se copie pas. J'avais déjà imprimé ton cours sur le visual mais au travail on vole sur une LT qui va perdre une aile dans pas longtemps. On vole pas en visuel, tout au bloc-note version old-school Je ne comprend pas la condition "if", elle veut dire "Si dans cette page courante il y a un bloc nommé SGAD aux coordonnées 397 3 alors le copier vers 700 200" ? Qu'il n'y ai qu'une présentation ou plusieur, il les passe en revue mais ne copie pas les blocs demandés. J'y retourne... "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
(gile) Posté(e) le 22 février 2008 Posté(e) le 22 février 2008 Tu peux essayer de faire des tests avec les différentes expressions. Tu te mets dans une présentation qui a le cartouche inséré en 397 3 et tu essayes : (setq ss (ssget '(397 3) '((0 . "INSERT") (2 . "SGAD")))) ensuite tu interroges la variable ss : !ss si le retour est nil c'est que la sélection n'a pas fonctionné sinon tu devarit avoir un retour du style : Si la sélection a fonctionné, essaye l'expression suivante : (command "_.copy" ss "" '(397 3) '(700 200)) si la sélection est nil, essaye de cette façon : (setq ss (ssget "_C" '(397 3) '(397 3) '((0 . "INSERT") (2 . "SGAD")))) [Edité le 22/2/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
phil_vsd Posté(e) le 23 février 2008 Auteur Posté(e) le 23 février 2008 Hello, Sur une versoin FULL, je fais fichier Nouveau, je créé unbloc SGAD que j'insère aux coordonnée ( 397 3 ) ce lisp marche sans problème : (defun c:ccart () ;Finalisé sur version FULL (foreach p (layoutlist) (setvar "CTAB" p) (if (setq ss (ssget '(397 3) '((0 . "INSERT") (2 . "SGAD")))) (command "_.copy" ss "" '(397 3) '(700 200)) ) ) ) Et celui-ci aussi (defun c:ccart2 () ;Finalisé sur version FULL (foreach p (layoutlist) (setvar "CTAB" p) (setq ss (ssget "_C" '(397 3) '(397 3) '((0 . "INSERT") (2 . "SGAD")))) (command "_.copy" ss "" '(397 3) '(700 200)) ) ) Par contre, sur un DWT existant dont je me sert tous les jours, le premier ne marche pas, mais le second oui... Le premier se charge, teste les présentations mais ne sélectionne rien ni ne copie. Je me suis dit que cela viens du fait que les variables sont les même d'un programme à l'autre. Alors je resteste les prog avec des variables renommées. Donc 1er lisp : (defun c:ccart () ;Finalisé sur version FULL marche pas sur gabarit SGAD(foreach p (layoutlist)(setvar "CTAB" p)(if (setq s1 (ssget '(397 3) '((0 . "INSERT") (2 . "SGAD"))))(command "_.copy" s1 "" '(397 3) '(700 200))))) et le deuxième : (defun c:ccart2 () ;Finalisé sur version FULL sur DWT de la sgad(foreach p (layoutlist)(setvar "CTAB" p)(setq s2 (ssget "_C" '(397 3) '(397 3) '((0 . "INSERT") (2 . "SGAD"))))(command "_.copy" s2 "" '(397 3) '(700 200)))) Résultats : Sur mon fichier gabarit le 1er copie rien (NIL en sélection) mais le 2ème marche correctement. Sur fichier nouveau (acad.dwt) : les deux marchent... Je reteste lundi sur la version LT. Merci à bientôt. PS : Le visual lisp est génial ! [Edité le 23/2/2008 par phil_vsd] "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
(gile) Posté(e) le 23 février 2008 Posté(e) le 23 février 2008 Je me suis dit que cela viens du fait que les variables sont les même d'un programme à l'autre. Alors je resteste les prog avec des variables renommées. Non, ça ne vient pas des variables. Elles sont redéfinies à chaque nouvel appel de la fonction. Par contre il est préférable de la déclarer pour qu'elle soit remise à nil à la fin, surtout dans ce cas où il s'agit de jeu de sélection (le nombre de jeu de sélection est limité à 128 dans une session). La différence de fonctionnement vient du mode de sélection : un mode de sélection par capture (même si le rectangle de capture se limite à un point) semble mieux fonctionner qu'une sélection par point. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
phil_vsd Posté(e) le 23 février 2008 Auteur Posté(e) le 23 février 2008 (setq ss (ssget "_C" '(397 3) '(397 3) '((0 . "INSERT") (2 . "SGAD"))))(command "_.copy" ss "" '(397 3) '(700 200))) Donc la traduction de la première ligne est Mettre dans la variable "ss" tout les blocs insérés dont le nom est SGAD et qui se trouveront dans le rectangle de sélection qui va de (397 3) à (397 3). Exceptionnellement ce "rectangle se réduit à un point. La deuxième ligne est : Copier tout ce qui a été sélectionné en "ss" de (397 3) 'vers (700 200) (Gile), t'as un lien qui explique la syntaxe de ces trucs là : (0 . "INSERT") (2 . "SGAD"). Ce sont des code DXF ? Apparement cela sert à sélectionner des entités en fonctions de certaines conditions. Ici, des bloc insérés dont le nom est... Si nous avions voulu sélectionner des plines dans un espace plus grand dont la couleur est rouge nous aurions mis : (setq ss (ssget "_C" '(0 0) '(9999 9999) '((0 . "pline") (2 . "1")))) Quelle est la fonctionnalité de (ssget "_x" etc..) ? Le X sert à étendre la sélection à tout l'espace ? PS : Je me sert de AIDACAD mais les DXF ne sont pas si bien expliqué, combien de DXF à la suite on peut mettre pour affiner sa sélection ? Merci ! [Edité le 23/2/2008 par phil_vsd] "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
(gile) Posté(e) le 23 février 2008 Posté(e) le 23 février 2008 Salut, Si tu as accès à une version pleine, regarde la fonction ssget dans l'aide aux développeurs > AutoLISP Reference > AutoLISP Functions. ssget peut avoir plusieurs arguments (optionnels) : - des modes de sélections "_X" pour tout le document, "_A" pour tous les objets sur les calques non gelés dans tout le document, "_L" pour dernier objet créé, "_P" pour jeu de sélection précédent etc... - des points (1 seul sans mode de sélection ou 2 pour les modes "_C" capture et "_W" fenêtre) ou des listes de points (pour les modes "_CP" capture polygonale, "_WP" fenêtre polygonale, "_F" trajet) - un filtre sous forme de liste basé sur les codes DXF (voir les références DXF dans l'aide aux développeur). Ce filtre permet de reproduire toutes les possibilité offerte par la commande FILTER. Les valeurs des codes de groupes DXF qui sont des chaînes (type d'entité, calque, nom de bloc...) peuvent être cumulés en les séparant par des virgules et acceptent les caractères génériques ex :(ssget '((0 . "LINE,CIRCLE") (8 . "A1*") pour filtrer les cercles et lignes sur tous les calques dont le nom commence par "A1". On peut utiliser des test relationnels (= etc...) pour les valeurs numériques ex :(ssget '((0 . "CIRCLE") (-4 . ">") (40 . 50))) pour filtrer tous les cercles dont le rayon est supérieur à 50 On peut aussi utiliser des opérateurs logiques (or, and, xor, not) ex :(ssget '((-4 . "") (-4 . "OR>")))pour filtrer les cercles et les polylignes fermées. Si une des valeurs est une variable, la liste devra être évalué, il faut alors utiliser les fonctions list et cons ex :(ssget (list '(0 . "INSERT") (cons 2 nom_du_bloc))) pour filtrer les blocs dont le nom est stocké dans la variable nom_du_bloc Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
phil_vsd Posté(e) le 23 février 2008 Auteur Posté(e) le 23 février 2008 Salut, Si tu as accès à une version pleine, regarde la fonction ssget dans l'aide aux développeurs > AutoLISP Reference > AutoLISP Functions. Qué couillon je suis. A force de chercher partout on oublie qu'il y a l'aide là juste sous la main. Bien. Merci pour tout j'ai assez à faire maintenant pour mouliner tout seul dans mon coin. Pas mal ton site ! Très Pythagoricien l'index. Check mine : http:// www.provencedesign.fr A+ [Edité le 23/2/2008 par phil_vsd] "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
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