fiesta13310 Posté(e) le 28 août 2012 Posté(e) le 28 août 2012 Bonjour à tous! je créé un programme de rotation de banches qui pourra être appliquable sur n'importe quel chantier. Pour cela, nous disposons déjà d'un fichier .dwg "modèle" dans lequel j'insère mon plan en Xref. Ainsi, tous mes calques et mes présentations sont déjà créés à l'avance dans ce fichier modèle. Mon programme de rotation de banches fonctionne en 2 partie : -D'abort il créé une polyligne avec uns hachure pleine, -ensuite il insère mes blocs banches autour de cette polyligne. Une rotation de banche se fait au quotidien. Pour chaque jour, nous avons créé une présentation dans lesquels les calques du jour en cours apparraissent ou non.Ainsi, nous avons créé 2 familles de calques : les calques pour les polylignes, et les calques pour les blocs banches.Dans chaque famille, un claque est créé pour un jour. Autrement dit, nous avons : ..........................calques blocs :.....................calques polyligne: JOUR 01........_meth encomb jour 01............_meth jour 01JOUR 02........_meth encomb jour 02............_meth jour 02JOUR 03........_meth encomb jour 03............_meth jour 03....JOUR(J+1)......_meth encomb jour 0(J+1)........_meth jour 0(J+1)...etc etc... Voici donc mon problème. Dans mon programme, j'ai créé une fonction "hachures" pour créer ma polyligne et la hachure pleineL'utilisateur devra lui même se mette dans le calque bloc du jour en cours.Je voudrais donc dire à mon programme que :Si le calque courant = _meth encomb jour 01alors ma fonction "hachures" sera dans le calque _meth jour 01Si le calque courant = _meth encomb jour 02alors ma fonction "hachures" sera dans le calque _meth jour 02...ect ect... Je voudrais le faire avec une fonction cond, mais comment on l'écrit?? comme ceci? (cond((= calque _meth encomb jour 01) (...je bloque...))) Merci d'avance...
VDH-Bruno Posté(e) le 28 août 2012 Posté(e) le 28 août 2012 Salut,Il existe plusieurs moyen d’arriver, à ce que tu veux, sans trop entrer dans le détail je vais te donner celui qui me semble le plus simple, basé sur une liste de calque prédéfinie (il aurait également possible d’écrire une routine au lieu de créer une liste). Juste après la création de ta hachure teste ce code il devrai placer ton entité sur le bon calque, si il y correspondance dans la liste de calque : ((lambda (ent lstcalque / nouvcalque) (if (setq nouvcalque (cdr (assoc (cdr (assoc 8 ent)) lstcalque))) (entmod (subst (cons 8 nouvcalque) (assoc 8 ent) ent)) ) ) ;; revoie les codes dxf de la dernière entité dessiné (entget (entlast)) ;; liste de correspondance de calques (bloc . polyligne) '(("_meth encomb jour 01" . "_meth jour 01") ("_meth encomb jour 02" . "_meth jour 02") ("_meth encomb jour 03" . "_meth jour 03") ("_meth encomb jour 04" . "_meth jour 04") ("_meth encomb jour 05" . "_meth jour 05") )) A+ Apprendre => Prendre => Rendre
fiesta13310 Posté(e) le 28 août 2012 Auteur Posté(e) le 28 août 2012 Non je suis désolée, mais rien ne marche... C'est une fonction? je comprend rien la...je peux meme pas le faire tourner.
Tramber Posté(e) le 28 août 2012 Posté(e) le 28 août 2012 A toi plutôt de publier ton code, même en partie....ca sera plus simple. B) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
fiesta13310 Posté(e) le 28 août 2012 Auteur Posté(e) le 28 août 2012 Bonsoir! et bien ce n'est pas si simple que ca...j'ai a peu près 20 pages de codes...je vais essayé de m'expliquer plus clairement. avant de faire tourner mon programme, je vais me placer dans le calque "_meth encombr jour 01" et c'est dans ce calque que mes blocs s'insèreront.Mon programme va commencer par me demander le point d'insertion de mes blocs, la longueur et l'épaisseur de mon mur et l'angle d'orientation.en fonction de ces données, il connait donc le point de départ de ma polyligne (le point d'insertion),la longueur et la largeur. il pourra don faire le contour de mon mur avec une polyligne et hachurer celui-ci. donc pour ca, voici mon code : (defun hachures () (if (= rep "o") (progn (setq pt1bis (polar pt1 ang0 20)) (if (= choice "Pg2") (setq pt2 (polar pt1bis ang0 long)) (setq pt2 (polar pt1 ang0 long)) );fin du if (setq pt3 (polar pt2 (+ ang0 (/ pi -2)) larg)) (setq pt4 (polar pt3 (- ang0 pi) long)) (if (= choice "Pg2") (command "polylign" pt1bis pt2 pt3 pt4 "cl") (command "polylign" pt1 pt2 pt3 pt4 "cl") );fin du if (command "hachures" "Solid" "d" "") ) (progn (setq pt1bis (polar pt1 ang0 20)) (if (= choice "Pg2") (setq pt2 (polar pt1bis (+ ang0 pi) (- 0 long))) (setq pt2 (polar pt1 (+ ang0 pi) (- 0 long))) );fin du if (setq pt3 (polar pt2 (+ ang0 (/ pi 2)) larg)) (setq pt4 (polar pt3 ang0 (- 0 long))) (if (= choice "Pg2") (command "polylign" pt1bis pt2 pt3 pt4 "cl") (command "polylign" pt1 pt2 pt3 pt4 "cl") );fin du if (command "hachures" "Solid" "d" "") ) );fin du if ); fin de la fonction hachures Mais le problème, c'est que vu que je suis dans le calque "_meth encombr jour 01", cette polyligne va aussi être dans ce calque. et moi je voudrais qu'elle soit créé dans un autre calque qui serait "_meth jour 01". Pour plus d'explications, on créé 2 calques différents car "_meth jour 01" restera actif dans toutes mes présentation, et "_meth encombr jour 01" sera actif uniquement dans la présentation correspondant au jour1. j'ai a peut près une vingtaine de jour. Et j'aurai voulu créer une fonction qui dit que si initialement je suis placé dans le calque "_meth encombr jour 01", alors ma polyligne se créera dans le calque "_meth jour 01".Si je suis placé dans le calque "_meth encombr jour 02", alors ma polyligne se créera dans le calque "_meth jour 02", et ainsi de suite.... et j'aurai voulu un truc qui ressemble à ca :si calcque actif = 01, créer polyligne+hachure dans calque Asi calcque actif = 02, créer polyligne+hachure dans calque Bsi calcque actif = 03, créer polyligne+hachure dans calque C...ect ect... est-ce possible? merci,
bryce Posté(e) le 28 août 2012 Posté(e) le 28 août 2012 Bonsoir, Avec (cond) : (cond ((= (getvar "clayer") "_meth encomb jour 01") (setvar "clayer" "_meth jour 01") ; ou (command "_-layer" "_m" "_meth jour 01" "") ) ((= (getvar "clayer") "_meth encomb jour 02") (setvar "clayer" "_meth jour 02") ) ((= (getvar "clayer") "_meth encomb jour 03") (setvar "clayer" "_meth jour 03") ) ((= (getvar "clayer") "_meth encomb jour 04") (setvar "clayer" "_meth jour 03") ) ) mais c'est un peu fastidieux...Tu peux aussi faire quelque chose comme ça : (setq nomcalque (getvar "clayer")) (command "_-layer" "_m" (strcat "_meth jour " (substr nomcalque (- (strlen nomcalque) 1))) "") ou si tu es sûr que le calque à rendre courant existe déjà : (setq nomcalque (getvar "clayer")) (setvar "clayer" (strcat "_meth jour " (substr nomcalque (- (strlen nomcalque) 1)))) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
fiesta13310 Posté(e) le 28 août 2012 Auteur Posté(e) le 28 août 2012 ha voilà, je m'attendais plus a un truc comme ca!! :)oui mes calques existe déjà. j'ai plus qu'à mettre ce qu'il faut où il faut!je vais essayer ça demain, merci beaucoup!!
VDH-Bruno Posté(e) le 28 août 2012 Posté(e) le 28 août 2012 Bonsoir, C'est une fonction? je comprend rien la...je peux meme pas le faire tourner.Pour tester il te suffit de le copier coller sur la ligne de commande d’AutoCAD, et par exemple si le dernier élément de ton dessin est défini sur le calque _meth encomb jour 02, il se trouve transféré sur le calque _meth jour 02 et le crée dans le cas ou celui-ci n’existe pas. Mais si le code te donne trop de fil à tordre, il vaut peut être mieux dans un premier temps te tourner vers les solutions données par Bryce. A+ Apprendre => Prendre => Rendre
fiesta13310 Posté(e) le 29 août 2012 Auteur Posté(e) le 29 août 2012 ben je l'ai copié collé, mais j'ai un message d'erreur qui apparait et qui me dit : no fonction definition...bon, je vais reessayer, j'ai peut être fait une mauvaise manipulation.¨Par contre, mon calque existe bien déjà, il va pas me le créer 2 fois?
fiesta13310 Posté(e) le 29 août 2012 Auteur Posté(e) le 29 août 2012 Bon, en fait, ce qui ne marche pas, c'est cette partie là : '(("_meth encomb jour 01" . "_meth jour 01") ("_meth encomb jour 02" . "_meth jour 02") ("_meth encomb jour 03" . "_meth jour 03") ("_meth encomb jour 04" . "_meth jour 04") ("_meth encomb jour 05" . "_meth jour 05") )) c'est quoi le point?
fiesta13310 Posté(e) le 29 août 2012 Auteur Posté(e) le 29 août 2012 C'est bon, j'ai réussi. je me suis basée sur ce que vous m'avez dit, et j'ai combiné à ma façon.Par contre, je veux quand même savoir ce que c'est le point VDH-Bruno stp? Merci beaucoup en tout cas!
bonuscad Posté(e) le 29 août 2012 Posté(e) le 29 août 2012 Le point dans une liste à deux élément s'appelle une paire pointée.Les éléments qu'elle contient sont directement accessible par (car): 1er élément et (cdr): 2ème élément. A la différence d'une liste classique où le (cdr) ne te retournera pas un atome mais la liste du second élément. Donc c'est une manière de construire une liste à 2 éléments seulement, pour laquelle il sera très rapide d'accéder aux atomes.Pour une liste classique pour accéder au deuxième atome tu est obligé de faire (cadr '(1 2)) ce qui est la contraction de deux fonctions (car) et (cdr) alors que pour une paire pointée (cdr '(1 . 2)) suffira, ce qui sera plus rapide. Tu pourras remarqué que la plupart des données interne retourné par (entget) sont sous cette forme: (clé DXF . donnée) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
VDH-Bruno Posté(e) le 29 août 2012 Posté(e) le 29 août 2012 En complément des précisions de bonuscad, je t’invite à prendre connaissance de ce lien cela traite des listes en lisp. http://cadxp.com/index.php?/topic/29314-ces-listes-qui-nen-sont-pas/ A+ Apprendre => Prendre => Rendre
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