chti52 Posté(e) le 31 août 2008 Posté(e) le 31 août 2008 Bonjour à tousJe suis novice avec le LISP aussi je m'adresse à vous pour m'aiguiller.Lorsque je veux saisir tous les objets d'un calque, par exemple, j'écris: [surligneur](setq a (ssegt "x" '((8 . "nom du calque"))))[/surligneur]de même pour les polylignes avec le code 6 et le nom du type de ligne ; pour çà pas de problème, mais lorsque que je veux sélectionner toutes les lignes ayant la même longueur, là je n'y arrive pas. Quelqu'un aurait t'il la solution ? merci d'avance.
(gile) Posté(e) le 1 septembre 2008 Posté(e) le 1 septembre 2008 Salut, Dans un filtre de sélection, on ne peut utiliser que les données DXF. La longueur d'une ligne ne fait pas parti des données DXF de la ligne (voir Aide aux développeurs >Référence DXF > Section ENTITIES. Il faut donc a près avoir fait ton jeu de sélection, le parcourir pour en supprimer les lies lignes qui n'auraient pas la longueur voulue ;; sélection de toutes les lignes (setq a (ssget "_X" '((0 . "LINE")))) ;; mise à 0 du compteur (setq n 0) ;; tant qu'il reste une ligne dans le jeu de sélection (while (setq l (ssname a n)) ;; si la longuer de la ligne est égale à 100.0 ... (if (= (distance (cdr (assoc 10 (entget l))) (cdr (assoc 11 (entget l))) ) 100.0 ) ;; ... on ajoute 1 au compteur (setq n (1+ n)) ;; sinon, on supprime la ligne du jeu de sélection (ssdel l a) ) ) NOTA : tu peux utiliser equal à la place de = et ajouter une tolérance dans la comparaison. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chti52 Posté(e) le 1 septembre 2008 Auteur Posté(e) le 1 septembre 2008 Merci GileJ'aurais pu chercher longtemps, je n'aurais jamais penser à une conditionnelle.Merci encore
bonuscad Posté(e) le 1 septembre 2008 Posté(e) le 1 septembre 2008 Si ton besoin est de ne sélectionner que par leur longueur, la commande SELECTRAP (_QSELECT) permet de faire ce type de sélection. Si ton besoin est une sélection dans une routine lisp, la boite de dialogue de _QSelect devient gênante et la méthode en ligne de code est indispensable. Il y avait aussi ce sujet similaire Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
chti52 Posté(e) le 1 septembre 2008 Auteur Posté(e) le 1 septembre 2008 Merci encore pour vos réponses aussi rapide. Ce que j'essaie de faire est un travail fastidieux que je voudrais rendre moins pénible avec une seule commande. Je reçois chaque année de l'Hôtel des impôts des fichiers de toutes les sections cadastrales de notre communauté de commune et je dois transformer ceux-ci en changeant les couleurs des calques, les types de ligne et ajouter des hachures sur les bâtiments. Pour ces dernières j'ai un Lisp qui fonctionne très bien car il m'oriente ces hachures à 45° par rapport à chaque bâtiment à l'aide du SCU. Le problème est qu'avec ces planches cadastrales le SCU ne tourne pas et j'ai découvert pourquoi. Lorsque je décompose les polylignes des bâtiments je me retrouve, pour un bâti rectangulaire, avec 5 lignes dont une de longueur 0 et c'est ce dernier segment qui fait perdre la boule au SCU. Après l'avoir supprimé, je reforme mes polylignes avec la commande Pedit et seulement à ce moment là le SCU refonctionne. Toutes ces manips me prennent du temps et je voudrais exécuter un programme qui me fasse tout d'un seul clic. J'ai commencé à faire quelques petites manips qui fonctionnent seules mais je n'arrive pas à les assembler pour ne faire qu'une seule commande.D'abord je créé un nom pour ma commande[surligneur](defun c:NOM() [/surligneur] Je charge tous les types de ligne [surligneur](command"-typeligne""ch" "*" """""""")[/surligneur]puis je fais un ZOOM étendu [surligneur](command "zoom""et")[/surligneur] je sélectionne tous les objets du calque "3BATIDUR" en l'occurence des polylignes puisqu'il n'y a que çà dans cette couche. [surligneur](setq a(ssget "X" '((8 . "3BATIDUR"))))[/surligneur]que je décompose [surligneur](command "decompos" a)[/surligneur]Ensuite je sélectionne toutes les lignes de longueurs égales à 0 (programme que Gile m'a gentiment réalisé et dont j'ai modifié la longueurs. [surligneur](setq a (ssget "_X" '((0 . "LINE"))))(setq n 0)(while (setq l (ssname a n))(if (= (distance (cdr (assoc 10 (entget l)))(cdr (assoc 11 (entget l))))0)(setq n (1+ n))(ssdel l a)))[/surligneur]puis je les supprime[surligneur](command "del" a)[/surligneur]Je resélectionne à nouveau les lignes du calque 3BATIDUR que je retransforme en polyligne.[surligneur](setq a(ssget "X" '((8 . "3BATIDUR"))))(commad "pedit" "m" a "j" "" "t")[/surligneur]Je change la couleur des couches[surligneur](setvar "CLAYER" "3BATIDUR")(command "calque""couleur""7""""")[/surligneur]et je créé la couche 3HACHURES avec sa couleur[surligneur](command "calque" "N""3HACHURES""")(setvar "CLAYER" "3HACHURES")(command "calque""couleur""8""""ch""0""")[/surligneur]Je trace mes hachures sur le bati[surligneur](setq objsel (ssget "X" '((8 . "3BATIDUR"))))(setq calquecourant (getvar "CLAYER"))(setvar "CLAYER" "3HACHURES")(setq n 0)(repeat (sslength objsel)(setq nomobj (ssname objsel n))(command "scu" "ob" nomobj)(command "hachures""U""50""0.7" "n" nomobj "")(setq n (+ 1 n)))(command "scu" "g")(setvar "CLAYER" calquecourant)[/surligneur]puis je purge le dessin du superflu[surligneur](command "purge" "tout")[/surligneur]Enfin j'ajoute un prompt pour le chargement de l'application[surligneur](princ "\nTaper «NOM» pour lancer l'éxécution du programme.")(princ)[/surligneur]Tous ces prog fonctionnent indépendemment mais lorsque je veux les assembler, bien que le chargement de l'application s'effectue correctement, çà ne veux pas aller jusqu'au bout. Le chargement des types de ligne et le Zoom s'effectuent correctement puis plus rien .Pourriez-vous me dégrossir ce truc car je n'arrive pas à comprendre d'où vient l'erreur. Je rappelle que je suis novice Une nouvelle fois Merci d'avance.
bonuscad Posté(e) le 1 septembre 2008 Posté(e) le 1 septembre 2008 Pour hachurer tes contours je peux te proposer de voir ce post . Il est prévu pour traiter des polylignes seulement fermées. Si tu peux isoler tes contours pour les sélectionner d'un seul coup, je peut te proposer une légère modification du code (suppression du code 70 dans le filtre de sélection) pour que cela fonctionne avec tes polylignes fermées par un segment de longueur nul, sans que tu sois obligé de les traiter avec une décomposition, suppression du segment nul et recomposition du contour. Donc essayes ce code, j'espère qu'il fonctionnera, s'il fonctionne les défaut de paramétrage (s'il y en a) seront facile a adapter. (defun c:multi_hatch-45 ( / js n model_hatch scale_hatch ang_hatch ent dxf_ent lst_pt lst_d where alpha) (setq js (ssget '((0 . "LWPOLYLINE")))) (cond (js (setq n -1 model_hatch (getvar "HPNAME") scale_hatch (getvar "HPSCALE") ang_hatch (getvar "HPANG") ) (setvar "HPNAME" "ANSI31") (setvar "HPSCALE" (* (getvar "HPSCALE") (getvar "DIMSCALE"))) (repeat (sslength js) (setq ent (ssname js (setq n (1+ n))) dxf_ent (entget ent) lst_pt (mapcar '(lambda (x) (trans x ent 0)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent))) lst_d (mapcar 'distance lst_pt (cons (last lst_pt) lst_pt)) where (- (length lst_pt) (length (member (apply 'max lst_d) lst_d))) alpha (angle (if (zerop where) (last lst_pt) (nth (1- where) lst_pt)) (nth where lst_pt)) ) (setvar "HPANG" (angle (trans '(0 0 0) 0 1) (trans (polar '(0 0 0) alpha scale_hatch) 0 1))) (command "_.HATCH" "" "" "" ent "") ) (setvar "HPNAME" model_hatch) (setvar "HPSCALE" scale_hatch) (setvar "HPANG" ang_hatch) ) (T (princ "\nAucune LWPOLYLINE fermée trouvé !")) ) (princ) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
philous2 Posté(e) le 2 septembre 2008 Posté(e) le 2 septembre 2008 Slt bruno, c'est quoi le code de ta macro car j'ai essayé " multi_hatch-45 " et ça marche pas [surligneur] (defun c:multi_hatch-45 ( / js n model_hatch scale_hatch ang_hatch ent dxf_ent lst_pt lst_d where alpha)(setq js (ssget '((0 . "LWPOLYLINE"))))(cond(js(setqn -1model_hatch (getvar "HPNAME")scale_hatch (getvar "HPSCALE")ang_hatch (getvar "HPANG"))(setvar "HPNAME" "ANSI31")(setvar "HPSCALE" (* (getvar "HPSCALE") (getvar "DIMSCALE")))(repeat (sslength js)(setqent (ssname js (setq n (1+ n)))dxf_ent (entget ent)lst_pt (mapcar '(lambda (x) (trans x ent 0)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent)))lst_d (mapcar 'distance lst_pt (cons (last lst_pt) lst_pt))where (- (length lst_pt) (length (member (apply 'max lst_d) lst_d)))alpha (angle (if (zerop where) (last lst_pt) (nth (1- where) lst_pt)) (nth where lst_pt)))(setvar "HPANG" (angle (trans '(0 0 0) 0 1) (trans (polar '(0 0 0) alpha scale_hatch) 0 1)))(command "_.HATCH" "" "" "" ent ""))(setvar "HPNAME" model_hatch)(setvar "HPSCALE" scale_hatch)(setvar "HPANG" ang_hatch))(T (princ "\nAucune LWPOLYLINE fermée trouvé !")))(princ))[/surligneur]
bonuscad Posté(e) le 2 septembre 2008 Posté(e) le 2 septembre 2008 c'est quoi le code de ta macro car j'ai essayé " multi_hatch-45 " et ça marche pas Le code que j'ai proposé était destiné au cas particulier de chti52 qui a (d'après ce que j'ai compris) des polylignes ouvertes mais dessiné de manière fermées (option "Clore" non utilisé) et comportant en plus à l'endroit de la fermeture un segment de longueur nulle. Une plaie quoi ! Donc ici le filtre n'est pas bon pour un usage général, car hachurer un contour ouvert rique fort de ne pas fonctionner. Si tu veux l'essayer, regarde plutôt le code ORIGINAL Vérifie aussi que la variable DIMSCALE soit différente de 0.0 Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
chti52 Posté(e) le 2 septembre 2008 Auteur Posté(e) le 2 septembre 2008 Bonsoirj'ai essayé multi_hatch-45 mais çà ne fonctionne qu'avec une seule entité à la fois. Lorsque je saisis toutes les polylignes en même temps j'ai ce message Aucune LWPOLYLINE fermée trouvé ! Je te remercie BonusCad pour cette aide mais ma commande fonctionne très bien, il faut simplement que je décompose les polylignes et les recrée après avoir supprimé les vecteurs nuls avant de la mettre en application. Si je ne les décompose pas, le prog me trace toutes les hachures à 45° dans le SCU général.Le but de ma requête je l'ai expliqué plus haut, c'est de charger mes types de ligne, de faire un zoom étendu car je n'ai pas le dessin à l'écran lorsque je l'ouvre, de saisir toutes les polylignes du calque, de les décomposer, de saisir les lignes de longueur nulle, de recréer les polylignes fermées, de changer la couleur et le type de ligne de certains calques, d'en créer un pour les hachures, de hachurer les polylignes fermées qui iront directement se mettre dans le calque hachures, de purger le tout et enfin de faire une sauvegarde, tout çà avec un seul programme car étant donné le nombre important de planches cadastrales à modifier je ne serai pas au bout de mes peines d'autant que je dois remettre çà tous les ans.J'essaie quand même de mon coté de monter ce prog.Je vous suis très reconnaissant pour l'aide que vous m'apportez.
bonuscad Posté(e) le 2 septembre 2008 Posté(e) le 2 septembre 2008 J'essaie quand même de mon coté de monter ce prog. Bravo, c'est tout à ton honneur, et c'est comme cela qu'on progresse. Pour ma routine tu m'intrigues, peut être veut tu traiter des anciennes polylignes et non des polylignes optimisées (POLYLINE au lieu de LWPOLYLINE) Le chargement des types de ligne et le Zoom s'effectuent correctement puis plus rien . Donc pour revenir a ton problème, cela vient peut être d'ici: [surligneur](command "decompos" a) [/surligneur] Suivant la valeur de la variable QAFLAGS (non documenté), la commande "decompos" n'explose pas un jeux de sélection, mais seulement une entité. Soit du fait une boucle pour décomposer une à une tes entités, soit tu changes la variables QAFLAGS temporairement.Je te conseille plutôt la 1ère solution, utiliser une variable non-documenté peut se révéler dangereux sur le comportement d'autocad. Fait une recherche sur le forum au sujet de QAFLAGS si tu veux plus d'informations. Bon montage de ton code ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
chti52 Posté(e) le 3 septembre 2008 Auteur Posté(e) le 3 septembre 2008 Bonsoir BonusCadC'est bien des POLYLINE et non des LWPOLYLINE . Cà n'est pas grave car ton lisp me servira pour d'autres dessins.En effet tu as vu juste pour la commande "décompos", elle n'explose qu'une entité et arrête le prog. Je vais faire comme tu as dis, je vais les exploser en boucle.Merci encore.
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