Worms69 Posté(e) le 15 décembre 2006 Posté(e) le 15 décembre 2006 Bonjour à tous, (toujours aussi débutant en autolisp ;) ) Je voudrais savoir ce qu'il faut faire pour colorier par exemple un rectangle une foisqu'il a été dessiné. J'ai regardé dans l'aide, mais ca me renvoit à du VBA... Merci de votre aide
Bred Posté(e) le 15 décembre 2006 Posté(e) le 15 décembre 2006 Je ne sais pas ce qui ce passe aujourd'hui, mais j'ai du mal à comprendre les messages :P Colorier = Hachurer ou changer la couleur du rectangle ? ... pour changer la couleur (en couleur 4 = turquoise: (setq sel (entsel "\Choix de l'objet")) (command "_change" sel "" "p" "co" [b] 4 [/b]"") ou en passant par les codes dxf : (if (assoc 62 (entget (car sel))) (entmod (subst (cons 62 [b] 4[/b]) (assoc 62 (entget (car sel))) (entget (car sel)))) (entmake (append (list (cons 62 [b] 4[/b])) (entget (car sel)))) ) [Edité le 15/12/2006 par Bred] [Edité le 15/12/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Worms69 Posté(e) le 15 décembre 2006 Auteur Posté(e) le 15 décembre 2006 Je n'ai peut-être pas été clair, je recommence :j'ai dessiné un rectangle : ce rectangle est "vide", ses contours sont noirs, mais il n'est pas colorié, il a la même couleur que l'arrière-plan.je voudrais donc que l'intérieur du rectangle soit colorié d'une couleur. Merci
Bred Posté(e) le 15 décembre 2006 Posté(e) le 15 décembre 2006 Tu veux l'hachurer en solid ? [Edité le 15/12/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Worms69 Posté(e) le 15 décembre 2006 Auteur Posté(e) le 15 décembre 2006 d'après un poste de Krynn http://www.cadxp.com/sujetXForum-147.htm j'ai cherché moi aussi à dessiner des drapeaux. là, j'essaie celui du japon (= rectangle blanc avec un rond rouge au milieu) (defun C:RECTANGLE () (prompt "Nous allons dessinerle drapeau du japon!") (setq pd (getpoint "\nPremier point: ")) (setq lon (getdist pd "\nLongueur du drapeau: ")) (setq lar (/ lon 2)) (setq p2 (polar pd 0.0 lon)) (setq p3 (polar p2 (/ PI 2.0) lar)) (setq p4 (polar p3 PI lon)) (command "polylign" pd p2 p3 p4 "C" ) (setq centre (list (+ (car pd) (/ lon 2)) (+ (cadr pd) (/ lar 2)) 0.0)) (command "cercle" centre (/ lar 3))) je ne pense pas vouloir le hachurer (sauf si hachurer = colorier l'intérieur d'un objet) ;dans le code de Krynn, elle définit 4 pts puis, une fois défini, elle dit que ces 4 points sont un solide et ensuite elle le colorie avec _.fillje n'ai pas trouvé d 'aide concernant ces fonctions dans mon aide autocad (en faisant F1..) je cherche juste à colorier le cercle en rouge et a colorier le fond en blanc... comment on fait pour donner un nom à l'objet cercle que l'on vient de créer avec (command "cercle" centre (/ lar 3))j'ai essayé avec (setq c1 (command "cercle" centre (/ lar 3)))mais ca marche pas... Merci[Edité le 15/12/2006 par Worms69] [Edité le 15/12/2006 par Worms69]
Bred Posté(e) le 15 décembre 2006 Posté(e) le 15 décembre 2006 Alors :_.fill est une variable correspondant à "Remplir" en français : (voir dans l'aide) Gère le remplissage des objets tels que les hachures, les solides bidimensionnels et les polylignes étendues. L'un de lisp que tu me cites (drapeau suisse) utilise la commance "_solid" qui crée un "solide 2D à maillage"... c'est une solution...Je serais d'avis de le faire en polilygne personnellement (longueur + largeur = rectangle), et tu changes la couleur comme définis plus haut.... POur le disque solaire, je pense au hachurage.Ou tu hachures tout (ce qui te permettras d'éviter le risque de superposition du rond plein sur le rectangle..) Pour récupérer l'objet cercle : (command "cercle" centre (/ lar 3)) (setq c1 (entlast)) si tu veux je peux te faire quelque chose.... mais c'est moins rigolo !!! ;) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Worms69 Posté(e) le 15 décembre 2006 Auteur Posté(e) le 15 décembre 2006 Alors :_.fill est une variable correspondant à "Remplir" en français : (voir dans l'aide) Gère le remplissage des objets tels que les hachures, les solides bidimensionnels et les polylignes étendues. L'un de lisp que tu me cites (drapeau suisse) utilise la commance "_solid" qui crée un "solide 2D à maillage"... c'est une solution...Je serais d'avis de le faire en polilygne personnellement (longueur + largeur = rectangle), et tu changes la couleur comme définis plus haut.... dans ce cas-là, ca change juste la couleur du contour, pas le remplissage (ou alors j'ai rien compris) POur le disque solaire, je pense au hachurage.Ou tu hachures tout (ce qui te permettras d'éviter le risque de superposition du rond plein sur le rectangle..) Pour récupérer l'objet cercle : (command "cercle" centre (/ lar 3)) (setq c1 (entlast))merci, je retiens ca si tu veux je peux te faire quelque chose.... mais c'est moins rigolo !!! ;) c'est un peu frustrant : je peux faire un truc pas compliqué, et j'y arrive pas... j'ai pas encore une grosse connaissance au niveau des fonctions, je sais pas trop par où commencer...le problème (mais ce qui fait aussi son intérêt) c'est que y'a pas UNE seule solution possible pour arriver à ce qu'on veut...=> oui, je veux bien que tu fasses quelque chose, car je trouve ca de moins en moins rigolo... :(
Patrick_35 Posté(e) le 15 décembre 2006 Posté(e) le 15 décembre 2006 POur le disque solaire, je pense au hachurage. Et un anneau avec un cercle intérieur de 0 ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 15 décembre 2006 Posté(e) le 15 décembre 2006 Et un anneau avec un cercle intérieur de 0 ?aussi... oui, je veux bien que tu fasses quelque chose, car je trouve ca de moins en moins rigolo... POur cibler juste, faudrait me dire ce que tu veux en faire avant : impression Noir et Blanc? Couleur? juste vision à l'écran? Impression avec vue en 3D perspective possible ? etc.... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 15 décembre 2006 Posté(e) le 15 décembre 2006 Bon, allez, tout(trop) simple est bien expliqué... à toi de le modifier :on peut bien sûr faire mieux, mais je pense que pour apprendre c'est bien comme ça. (defun c:drapj (/ long h pt1 pt2 fond diam mil-fond) (setq long (getdist "\nLongueur du drapeau :")) ; donner longueur au clavier ou choisir 2 points (setq h (/ long 1.6)) ; hauteur drapeau (/ 1.6 ???) (setq pt1 (getpoint "\ Point d'insert :")) (setq pt1x (car pt1) ; récup coordonnées x,y et z de pt1 pt1y (cadr pt1) pt1z (cadr pt1)) (setq pt2 (list (+ pt1x long) pt1y pt1z)) ; construction pt2 (command "_pline" pt1 "la" h h pt2 "") ; polyligne (setq fond (entlast)) ; récup polyligne dans "fond" (command "_change" fond "" "p" "co" 255 "") ; change couleur de fond en blanc (255) (setq diam (* h 0.8)) ; diamètre disque (???) (setq mil-fond (list (+ pt1x (/ long 2)) pt1y pt1z)) ; Point centre polyligne (command "_donut" 0 diam mil-fond "") ; anneau (command "_change" (entlast) "" "p" "co" 1 "") ; couleur anneau en rouge (1) (princ "\nQu'il est beau mon Drapeau !!!!") ; commentaire sur ligne de commande (princ) ) ... je te laisse chercher pour le transformer en bloc ou en groupe.... [Edité le 15/12/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 15 décembre 2006 Posté(e) le 15 décembre 2006 hé hé, c'est qu'il commence à devenir bon le Bred.Dommage qu'il manque un cmdecho et _undo _start & _end ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 15 décembre 2006 Posté(e) le 15 décembre 2006 hé hé, c'est qu'il commence à devenir bon le Bred. ... on me met au défi de mieux que ça ???on me sous estime on dirait :casstet: ;) Dommage qu'il manque un cmdecho et _undo _start & _endpfff...! trop petit pour moi !!!allez, pour mes maitres de ce forum, le même en (entmake) :(nota : ça m'a fait découvrir qu'un anneau était une polyligne.... c'est bête est logique, mais je ne voyais pas ça comme ça !) (defun c:drapj2 () (setq long (getdist "\nLongueur du drapeau :") h (/ long 1.6) pt1 (getpoint "\ Point d'insert :")) (entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 62 255) (cons 43 h) (cons 90 2) (cons 10 (list (car pt1) (cadr pt1))) (cons 10 (list (+ (car pt1) long) (cadr pt1)))) ) (entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 62 1) (cons 43 (* h 0.4)) (cons 90 2) (cons 70 1) (cons 10 (list (- (+ (car pt1)(/ long 2))(* h 0.2)) (cadr pt1))) (cons 42 1.0) (cons 10 (list (+ (+ (car pt1)(/ long 2))(* h 0.2)) (cadr pt1))) (cons 42 1.0)) ) (princ "\nQu'il est beau mon Drapeau !!!!") (princ) ) Allez.... c'était un bon exo.... .... si tu me lance le défi en vl je...... verrais..... :exclam: [Edité le 16/12/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 16 décembre 2006 Posté(e) le 16 décembre 2006 on me sous estime on dirait :casstet: ;) Oh non, mais on apprecie l'évolution et le sens du partage ;) pfff...! trop petit pour moi !!! .... si tu me lance le défi en vl je...... verrais..... :exclam: Puique tu poses la question..... Encore un effort ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 17 décembre 2006 Posté(e) le 17 décembre 2006 Bon... ben là je laisse tomber....Création d'une Polyligne en vl :En vl, j'ai commencer à chercher dans l'aide.... pas clair.Puis je suis retouné sur cadXP et j'ai fait une recherche... et là, je suis tombé sur cet exemple proposé par (gile) ... qui m'a fait reculer.... Donc, pour ça, je laisse le (entmake) comme code ultime (je pense), mais je reviendrais à la charge si un post se présente pour vous démontrer que suite à l'aide des personnes de ce forum, j'ai un peu assimiler le principe du vl... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 17 décembre 2006 Posté(e) le 17 décembre 2006 Salut, Il ne faut pas se laisser rebuter. J'ai appris depuis le message que tu cites, notament avec l'utilisation de vlax-invoke qui accepte, comme argument, une liste au lieu d'un variant pour vla-add* (voir ce sujet). La liste de points à passer comme argument doit être du type : (x1 y1 x2 y2 x3 y3 ...) où les coordonnées sont définies dans ce qui sera le SCO de la polyligne (j'ai cru comprendre que tu travaillais en 3D). Pour l'utilisation de trans et du SCO je te renvoies ici et là. Voici donc un exemple plus simple, qui fonctionne quelque soit le SCU courant avec une liste de points (pt_lst) aux coordonnées définies dans le SCU courant. (vl-load-com) (setq ;; direction d'extrusion du SCU courant (SCO) norm (trans '(0 0 1) 1 0 T) ;; élévation du premier point de la liste dans le SCO elv (caddr (trans (car pt_lst) 1 norm)) ;; création de la polyligne dans l'espace objet pline (vlax-invoke (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object) ) ) 'addLightWeightPolyline ;; liste des coordonnées faite à partir de la liste de points (apply 'append (mapcar '(lambda (pt) (setq pt (trans pt 1 norm)) (list (car pt) (cadr pt)) ) pt_lst ) ) ) ) ;; mettre le polyligne à l'élévation du SCU courant (vla-put-Elevation pline elv) ;; mettre la polyligne dans le plan XY du SCU courant (vla-put-Normal pline (vlax-3d-point norm)) ;; fermer la polyligne (optionnel) (vla-put-Closed pline :vlax-true) Edit : j'oubliais, pour la largeur et les arcs (pour l'anneau, par exemple) : ;; mettre la polyligne à la largeur l (vla-put-ConstantWidth pline l) ;; faire un arc de 180° sur le premier segment (vla-setBulge pline 0 1.0) ;; faire un arc de 180° sur le second segment (vla-setBulge pline 1 1.0) [Edité le 17/12/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 17 décembre 2006 Posté(e) le 17 décembre 2006 Pfff... je suis désolé Worms69, ton post c'est transformé en une leçon pour moi (... encore !!! ;) ) ...Merci (gile), j'ai mis tes exemples en application.Tu m'avais déjà fait touché aux vlax-invoke ici. et j'avais l'intuition que l'on pouvait passer par là... mais je trouve que la manière "entmake" est plus simple, quand même !.... non ? Voici le code, donc, avec ajout des couleurs:(defun c:drapj3 () (vl-load-com) (setq Plan_Actif (vla-get-ModelSpace (vla-get-ActiveDocument(vlax-get-acad-object))) long (getdist "\nLongueur du drapeau :") h (/ long 1.6) pt1 (getpoint "\ Point d'insert :") pt_lst1 (list (list (car pt1)(cadr pt1)) (list (+ (car pt1) long)(cadr pt1))) pt_lst2 (list (list (- (+ (car pt1)(/ long 2))(* h 0.2)) (cadr pt1)) (list (+ (+ (car pt1)(/ long 2))(* h 0.2)) (cadr pt1))) norm (trans '(0 0 1) 1 0 T) elv (caddr (trans (car pt_lst) 1 norm)) pline1 (vlax-invoke Plan_Actif 'addLightWeightPolyline (apply 'append (mapcar '(lambda (pt) (setq pt (trans pt 1 norm)) (list (car pt) (cadr pt))) pt_lst1))) pline2 (vlax-invoke Plan_Actif 'addLightWeightPolyline (apply 'append (mapcar '(lambda (pt) (setq pt (trans pt 1 norm)) (list (car pt) (cadr pt))) pt_lst2))) ) (vla-put-ConstantWidth pline1 (/ long 1.6)) (vlax-put-property pline1 'Color 255) (vla-put-Elevation pline1 elv) (vla-put-Normal pline1 (vlax-3d-point norm)) (vla-put-Elevation pline2 elv) (vla-put-Normal pline2 (vlax-3d-point norm)) (vla-put-ConstantWidth pline2 (* h 0.4)) (vla-setBulge pline2 0 1.0) (vla-setBulge pline2 1 1.0) (vla-put-Closed pline2 :vlax-true) (vlax-put-property pline2 'Color 1) ) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Worms69 Posté(e) le 18 décembre 2006 Auteur Posté(e) le 18 décembre 2006 Bon, allez, tout(trop) simple est bien expliqué... à toi de le modifier :on peut bien sûr faire mieux, mais je pense que pour apprendre c'est bien comme ça. (defun c:drapj (/ long h pt1 pt2 fond diam mil-fond) (setq long (getdist "\nLongueur du drapeau :")) ; donner longueur au clavier ou choisir 2 points (setq h (/ long 1.6)) ; hauteur drapeau (/ 1.6 ???) (setq pt1 (getpoint "\ Point d'insert :")) (setq pt1x (car pt1) ; récup coordonnées x,y et z de pt1 pt1y (cadr pt1) pt1z (cadr pt1)) (setq pt2 (list (+ pt1x long) pt1y pt1z)) ; construction pt2 (command "_pline" pt1 "la" h h pt2 "") ; polyligne (setq fond (entlast)) ; récup polyligne dans "fond" (command "_change" fond "" "p" "co" 255 "") ; change couleur de fond en blanc (255) (setq diam (* h 0.8)) ; diamètre disque (???) (setq mil-fond (list (+ pt1x (/ long 2)) pt1y pt1z)) ; Point centre polyligne (command "_donut" 0 diam mil-fond "") ; anneau (command "_change" (entlast) "" "p" "co" 1 "") ; couleur anneau en rouge (1) (princ "\nQu'il est beau mon Drapeau !!!!") ; commentaire sur ligne de commande (princ) ) ... je te laisse chercher pour le transformer en bloc ou en groupe.... [Edité le 15/12/2006 par Bred] merci pour ton aide, c'est sympa.J'ai remarqué que dans ton programme, on avait une polyligne de 2 points, et cette polyligne avait une largeur et c'est cette largeur qui était colorée. On avait pas vraiment une polyligne de 4 points et une surface délimitée par ces 4 points qui est coloriée.Puis, j'ai aussi appris à utiliser les commandes "_change" et autres, qui sont en fait des commandes autocad... j'aurais pu le deviner tout seul... :P Encore merci
Worms69 Posté(e) le 19 décembre 2006 Auteur Posté(e) le 19 décembre 2006 Voilà la version finale ;Poly_rectangle; dessiner un rectangle par 4 points (defun c:poly_rect (/ pt0 pt1 pt2 pt3 longueur largeur epaisseur rectangl mil-poly pt0x pt0y pt0z) (setq pt0 (getpoint "\nPoint de départ en bas à gauche: ")) (setq pt0x (car pt0) pt0y (cadr pt0) pt0z (caddr pt0)) ; récupérer les coordonnées de pt0 (setq longueur (getdist pt0 "\nLongueur du rectangle: ")) (setq largeur (getdist pt0 "\nLargeur du rectangle: ")) (setq epaisseur (getreal "\nEpaisseur: ")) (setq pt1 (polar pt0 0.0 longueur)); point en bas a droite (setq pt2 (polar pt1 (/ PI 2) largeur)); point en haut a droite (setq pt3 (polar pt2 PI longueur)); point en haut a gauche (setvar "plinewid" epaisseur) ; affecter la vcaleur epaisseur à la variable plinewid (command "polylign" pt0 pt1 pt2 pt3 "C") ; dessiner la polyligne (setq rectangl (entlast)) ; rectangle désigne la polyligne fermée de 4 points ; hachurer le rectangle (setq mil-poly (list (+ pt0x (/ longueur 2)) (+ pt0y (/ largeur 2)) pt0z)) ; centre du rectangle, nécessaire pour le dessin des hachures et du cercle (command "fhach" mil-poly "") ; hachurer (command "_change" (entlast) "" "P" "CO" "T" "255,255,255" "") ; changer la couleur des hachures (command "_change" rectangl "" "P" "CO" "255" "") ; changer la couleur de la polyligne (de la même couleur que les hachures) ; tracer un anneau (command "anneau" 0 (/ largeur 1.5) mil-poly "") ; anneau (command "_change" (entlast) "" "p" "co" 1 "") ; couleur anneau en rouge (1)) y'a des choses qui pourraient être améliorées, mais pour l'instant, c'est un début encourageant :)
Bred Posté(e) le 19 décembre 2006 Posté(e) le 19 décembre 2006 Salut,Pourquoi faire une polyligne ? utilise la'outil rectangle ! Pour hachurer une forme, au lieu de calculer un point dans ctte forme, tu donner comme base la forme elle-même !(command "-fhach" "s" rectangl "" "") Tu peux suprimer des (setq) !(plus le code est court, mieux c'est !) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 19 décembre 2006 Posté(e) le 19 décembre 2006 Et jouer avec la variable cmdecho afin d'éviter de voir les commandes qui sont appelées par le lisp de défiler @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Worms69 Posté(e) le 19 décembre 2006 Auteur Posté(e) le 19 décembre 2006 B'red =>effectivement, pourquoi une polyligne et pas un rectangle... mais j'ai besoin d'un point qui soit à l'intersection des diagonales, pour pouvoir tracer l'anneau ensuite... donc si je trace un rectangle, je sais pas encore comment récupérer les coordonnées des 4 sommets pour pouvoir ensuitre définir un point qui sera au centre du rectangle... Patrick 35 =>en effet, faut que j'apprenne à "jouer" avec cette variable cmdecho... Merci pour vos remarques constructives
Bred Posté(e) le 19 décembre 2006 Posté(e) le 19 décembre 2006 j'ai besoin d'un point qui soit à l'intersection des diagonales je sais pas encore comment récupérer les coordonnées des 4 sommets pour pouvoir ensuitre définir un point qui sera au centre du rectangle ? Tu n'as besoin que de 2 points (voir 1 point puis les dimensions de ton rectangle)... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 19 décembre 2006 Posté(e) le 19 décembre 2006 Salut, Je viens mettre mon grain de sel. j'ai besoin d'un point qui soit à l'intersection des diagonales Sachant que les diagonales d'un rectangle sont égales et se coupent en leur milieu, le milieu des deux points spécifiés pour faire le rectangle est l'intersection des diagonales. Pour trouver le milieu de deux points, on ajoute les coordonnées X, Y et Z de chaque point et on divise chaque réssultat par 2. La fonction LISP mapcar permet de traiter des listes en appliquant à chaque élément de la (ou des) liste(s) la fonction, par exemple : (mapcar '+ '(1 2 3) '(4 5 6)) retourne (5 7 9) soit 1+4, 2+5 et 3+6 Pour diviser chaque élément de la liste par 2 on peut utiliser une fonction lambda : (mapcar '(lambda (x) (/ x 2)) '(5 7 9)) retourne (2.5 3.5 4.5) On peut donc combiner les deux exemples en une seule expression qui retourne le milieu des points p1 et p2 : (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2)) p1 p2) Si tu pense devoir te servir souvent de cette expression, tu peux définir une fonction mid-pts : (defun mid-pts (p1 p2)(mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2)) p1 p2)) (mid-pts '(1 2 3) '(4 5 6) retournera (2.5 3.5 4.5) En espérant avoir été clair. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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