revox31 Posté(e) le 1 septembre 2005 Posté(e) le 1 septembre 2005 Bonsoir a tous,Je souhaite dessiner des croisillons de batis leger, mais vu le nombre de batiment ......pffff y suisencore en 2006.Existe t-il un remplissage comme pour les hachures?Bon en attendant j'continue donc mes polylignes.....
bonuscad Posté(e) le 1 septembre 2005 Posté(e) le 1 septembre 2005 Essayes les "Superhachures" des ExpressTools, je suis sur que cela pourrait faire l'affaire pour ce type de hachures. Il te suffit de faire un bloc d'un extrait de ce que tu as déjà dessiné en t'assurant que la répétition de ton motif ce fasse au bon endroit Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
fabcad Posté(e) le 2 septembre 2005 Posté(e) le 2 septembre 2005 revox31,ayant eu le meme souci j'ai develloppe en lisp cette fonction,elle ne fonctionne qu'avec des lwpolylignes de 4 sommets çà reduit le travailà enregistrer sous croix-hangars.lspet à charger par appload (defun c:croix-hangars (/ m c1 i);recuperation des variables(setq var-accrobj (getvar "osmode"))(setq var-cmddia (getvar "cmddia"))(setq var-cmdecho (getvar "cmdecho")) (setvar "osmode" 0)(setvar "cmddia" 0)(setvar "cmdecho" 0) (setq ent (car (entsel "\nChoisir le Hangar : "))) (if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")(progn (setq nbr-som (cdr (assoc 90 (entget ent)))) (setq lst-ent (entget ent)) (setq lng-lst (length lst-ent)) (setq i 0) (setq list-a-remplir '()) (setq lst-pts '()) (while (<= i lng-lst) (if (= (car (nth i lst-ent)) 10) (progn (setq p-en-cours (cdr (nth i lst-ent))) (setq lst-pts (append (list p-en-cours) lst-pts)) );fin progn );fin if (setq i (+ i 1)) ); fin while(setq lst-pts (reverse lst-pts))(cond ((= nbr-som 4) (progn (command "polylign" (nth 0 lst-pts) (nth 2 lst-pts) "") (command "polylign" (nth 1 lst-pts) (last lst-pts) "") ) );fin condition 1 (progn (print "\n Nombre de sommets incompatibles ") ;retour a la normale des variables utilisées (setvar "cmddia" var-cmddia) (setvar "osmode" var-accrobj) (setvar "cmdecho" var-cmdecho) );fin progn);fin 1 cond );fin progn(prompt "\n Cet objet n'est pas une LWPOLYLINE !!! Utilisez CONVERT pour la transformer !!!"));fin if ;retour a la normale des variables utilisées(setvar "cmddia" var-cmddia)(setvar "osmode" var-accrobj)(setvar "cmdecho" var-cmdecho)(princ));fin defun bonne utilisationfabcad
corail59 Posté(e) le 2 septembre 2005 Posté(e) le 2 septembre 2005 Thanks m'en vais voir ca tout de suite.Peuvent pas tous construire de batis rectangulaire non!!!B on ca m'avancera deja pas malMERCI ENCORE.
kallain Posté(e) le 2 septembre 2005 Posté(e) le 2 septembre 2005 Salut Fabcad sympa cette routine mais malgré ceci ;recuperation des variables(setq var-accrobj (getvar "osmode"))(setq var-cmddia (getvar "cmddia"))(setq var-cmdecho (getvar "cmdecho")) (setvar "osmode" 0)(setvar "cmddia" 0)(setvar "cmdecho" 0) ;retour a la normale des variables utilisées(setvar "cmddia" var-cmddia)(setvar "osmode" var-accrobj)(setvar "cmdecho" var-cmdecho) les variables ne reviennent pas à la normale.Pourquoi ? PS : Je suis nul en Lisp bien-sur
gile Posté(e) le 2 septembre 2005 Posté(e) le 2 septembre 2005 Salut, les variables ne reviennent pas à la normale.Pourquoi ? Je me permet de répondre à la place de fabcad La routine ne contient pas de code pour la gestion des erreurs, donc en cas d'erreur ou d'échap les variables système ne sont pas restaurées à leur valeur initiale. Pour remédier à cela, il faudrait charger, avec la routine, un truc du genre (defun croix-hangars-err (msg) (if (or (= msg "Fonction annulée") (= msg "quitter / sortir abandon") ) (princ) (princ (strcat "\nErreur: " msg)) ) (setvar "cmddia" var-cmddia) (setvar "osmode" var-accrobj) (setvar "cmdecho" var-cmdecho) (setq *error* m:err m:err nil ) (princ) ) Et ajouter ceci au début de la routine -avant la sauvegarde des variables- pour redéfinir la fonction *error* standard : (setq m:err *error* *error* croix-hangars-err ) et ceci à la fin -avant le dernier (princ)- pour restaurer le *error* original : (setq *error* m:err m:err nil )
fabcad Posté(e) le 2 septembre 2005 Posté(e) le 2 septembre 2005 Merci GILE,Je ne sais pas comment fonctionne les erreurs mais je vais appronfondir...mais j'ai modifié mon programme avec tes conseils. (defun croix-hangars-err (msg)(if (or(= msg "Fonction annulée")(= msg "quitter / sortir abandon"))(princ)(princ (strcat "\nErreur: " msg)))(setvar "cmddia" var-cmddia)(setvar "osmode" var-accrobj)(setvar "cmdecho" var-cmdecho)(setq *error* m:errm:err nil)(princ));fin defun croix-hangars-err (defun c:croix-hangars (/ m c1 i) (setq m:err *error* *error* croix-hangars-err) ;recuperation des variables(setq var-accrobj (getvar "osmode"))(setq var-cmddia (getvar "cmddia"))(setq var-cmdecho (getvar "cmdecho")) (setvar "osmode" 0)(setvar "cmddia" 0)(setvar "cmdecho" 0) (setq ent (car (entsel "\nChoisir le Hangar : "))) (if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")(progn (setq nbr-som (cdr (assoc 90 (entget ent)))) (setq lst-ent (entget ent)) (setq lng-lst (length lst-ent)) (setq i 0) (setq list-a-remplir '()) (setq lst-pts '()) (while (<= i lng-lst) (if (= (car (nth i lst-ent)) 10) (progn (setq p-en-cours (cdr (nth i lst-ent))) (setq lst-pts (append (list p-en-cours) lst-pts)) );fin progn );fin if (setq i (+ i 1)) ); fin while(setq lst-pts (reverse lst-pts))(cond ((= nbr-som 4) (progn (command "polylign" (nth 0 lst-pts) (nth 2 lst-pts) "") (command "polylign" (nth 1 lst-pts) (last lst-pts) "") ) );fin condition 1 (progn (print "\n Nombre de sommets incompatibles ") ;retour a la normale des variables utilisées (setvar "cmddia" var-cmddia) (setvar "osmode" var-accrobj) (setvar "cmdecho" var-cmdecho) );fin progn);fin 1 cond );fin progn(prompt "\n Cet objet n'est pas une LWPOLYLINE !!! Utilisez CONVERT pour la transformer !!!"));fin if ;retour a la normale des variables utilisées(setvar "cmddia" var-cmddia)(setvar "osmode" var-accrobj)(setvar "cmdecho" var-cmdecho)(setq *error* m:err m:err nil)(princ));fin defun Bonne utilisationfabcad
corail59 Posté(e) le 2 septembre 2005 Posté(e) le 2 septembre 2005 Scusez-moi je suis celui qui a posé la question (revox31)pas vu que je repondais sous "corail59"Donc une polyligne oui mais une "lwpolyligne? c quoi?En fait je bosse sous microstation, et trop peu de connaissance sous autocadComment transformer une polyligne fermée en lwpolyligne, par la commande convert?marche pas.....En attendant je cherche....
kallain Posté(e) le 2 septembre 2005 Posté(e) le 2 septembre 2005 J'ai essayé.... mais pas réussi à faire la manip de gile :P Comme dab... à la barbare, j'ai supprimé les variables et ça marche aussi bien. :D PS: Mais j'ai compris le principe et je suis persuadé de son intérêt. Merci Fabcad pour cette nouvelle version ;) Bon week-end.
bonuscad Posté(e) le 2 septembre 2005 Posté(e) le 2 septembre 2005 J'me suis complétement planté sur le sens de la question :mad: Maintenant que j'ai vu la routine de Fabcad, j'ai compris :) Il y aurait peut être moyen d'adapter pour une polyligne à + de 4 sommets.Je ferais le (boundingbox) de celle ci, puis chercherais les 4 sommets les plus proches des 4 coins de cette boite englobante Si j'ai le temps et l'envie.... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bonuscad Posté(e) le 11 septembre 2005 Posté(e) le 11 septembre 2005 Bon le temps étant morose et l'envie au rendez-vous ;) J'ai planché un peu sur le problème, ce n'est pas aussi simple que je le pensais :casstet: Mais voici déjà une approche qui peut être encore amélioré.Le résulat sera convenable si les polyligne ont des contours proche de ce qu'on peut trouver comme contour de bati.Bien sur si on a des contour très tortueux avec des formes en "U" (concave) le résultat ne sera pas celui escompté. Concluant ou pas ? (defun C:croisillons ( / ent ptlst di_lst pt_sco pt_nxt pt_tmp ptscu p_min p_max pt_box l_near d_near p_near) (setvar "cmdecho" 0) (while (not ent) (setq ent (entsel "\nSélectionner une Polyligne:")) (if ent (progn (setq ent (entget(car ent))) (if (/= (cdr(assoc 0 ent)) "LWPOLYLINE") (progn (prompt "\nEntitée sélectionée n'est pas une Polyligne. Réessayer") (setq ent nil) ) ) ) (prompt "\nAucune sélection. Réessayer") ) ) (setq ptlst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) ent))) (setq di_lst (mapcar '(lambda (x y) (distance x y)) ptlst (append (cdr ptlst) (list (car ptlst))))) (setq pt_sco (nth (- (length di_lst) (length (member (eval (cons 'max di_lst)) di_lst))) ptlst)) (setq pt_nxt (nth (- (1+ (length di_lst)) (length (member (eval (cons 'max di_lst)) di_lst))) (append ptlst (list (car ptlst))))) (setq pt_tmp (polar pt_sco (+ (angle pt_sco pt_nxt) (/ pi 2)) (distance pt_sco pt_nxt))) (setvar "osmode" (+ 16384 (rem (getvar "osmode") 16384))) (command "_.ucs" "_3point" pt_sco pt_nxt pt_tmp) (setq ptscu (mapcar '(lambda (x) (trans x 0 1)) ptlst)) (setq p_min (list (apply 'min (mapcar 'car ptscu)) (apply 'min (mapcar 'cadr ptscu)) ) p_max (list (apply 'max (mapcar 'car ptscu)) (apply 'max (mapcar 'cadr ptscu)) ) ) (setq pt_box (list p_min (list (car p_max) (cadr p_min)) p_max (list (car p_min) (cadr p_max)))) (setq l_near '()) (repeat 4 (setq d_near (mapcar '(lambda (x) (distance (car pt_box) x)) ptscu)) (setq p_near (nth (- (length d_near) (length (member (eval (cons 'min d_near)) d_near))) ptscu)) (cond ((not (member p_near l_near)) (setq l_near (cons p_near l_near)) ) (T (setq d_near (mapcar '(lambda (x) (distance (car pt_box) x)) (vl-remove p_near ptscu))) (setq p_near (nth (- (length d_near) (length (member (eval (cons 'min d_near)) d_near))) (vl-remove p_near ptscu))) (setq l_near (cons p_near l_near)) ) ) (setq pt_box (cdr pt_box)) ) (command "_.line" (car l_near) (caddr l_near) "" "_.line" (cadr l_near) (cadddr l_near) "") (command "_.ucs" "_previous") (setvar "osmode" (rem (getvar "osmode") 16384)) (setvar "cmdecho" 1) (princ) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
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