philsogood Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 hellopour faire suite à une discussion qui avait eu lieu ici :http://cadxp.com/index.php?/topic/36049-bloc-dynamique/page__p__197047#entry197047j'avais commencé à faire un code pour la cotation altimétrique automatiqueça marchait mais je souhaite rajouter comme le dit topic une fléche pour ma coteen reagéardant un lisp de zebulon j'avauis réussi à modifier mon lisp comme ceci (defun c:ni (/point_zero zero base pos_cot rot) (setq point_zero (getpoint "\nIndiquer le point de repère")) (initget 1) (setq zero (getdist "\nIndiquer l'altimétrie de ce repère : ")) (command "_ucs" "_o" (list (car point_zero) (- (cadr point_zero) (* 1000 zero)) ;supprimer le 1000 si dessin en mètre ; modifier par 100 si dessin en centimètre ) ) (sav_para) ;;modif des paramètres pour une cotation conforme (setvar "clayer" "68 COTES DE NIVEAU") (setvar "cecolor" "bylayer") (setvar "celtype" "bylayer") (command "_celweight" "-1") (while T ;; t=true la boucle se répétera tant que l'on n'en sortira pas avec un echap (setq base (getpoint "\nPositionner la base de la cote")) (setq pos_cot (getpoint "\nPositionner le texte de la cote")) (if (> (cadr pos_cot) (cadr base)) (progn (setq ROT "0") ) (T (setq ROT "180") ) ) ;if (command "_INSERT" "NIVCS" ;nom du bloc (flèche) (list (car pos_cot) (cadr base)) ;coordonnées "1" ;echelle X (car annotatif) "1" ;echelle Y (car annotatif) ROT ;rotation du bloc si nécessaire ) (command "_dimordinate" base pos_cot) (command "_ddedit" "_l" "") ) ;while ) (defun c:nin(/base pos_cot rot) (sav_para) ;;modif des paramètres pour une cotation conforme (setvar "clayer" "68 COTES DE NIVEAU") (setvar "cecolor" "bylayer") (setvar "celtype" "bylayer") (command "_celweight" "-1") (while T (setq base (getpoint "\nPositionner la base de la cote")) (setq pos_cot (getpoint "\nPositionner le texte de la cote")) (if (> (cadr pos_cot) (cadr base)) (progn (setq ROT "0") ) (T (setq ROT "180") ) ) ;if (command "_INSERT" "NIVCS" ;nom du bloc (flèche) (list (car pos_cot) (cadr base)) ;coordonnées "1" ;echelle X (car annotatif) "1" ;echelle Y (car annotatif) ROT ;rotation du bloc si nécessaire ) (command "_dimordinate" base pos_cot) (command "_ddedit" "_l" "") ) ) (defun *error*(err) (retour_para) ) ;;=================================================================== ;; enregistrement des anciens paramètres (defun sav_para() (setq OLDLAYER (getvar "clayer")) (setq OLDCOLOR (getvar "cecolor")) (setq OLDCELTYPE (getvar "celtype")) (setq OLDWEIGHT (getvar "celweight")) (setq OLDSTYLE (getvar "dimstyle")) ) ;;rétablissement des anciens paramètres ;;même lorsque l'on sort du programme de manière sauvage (ou non) (defun retour_para() (setvar "clayer" oldlayer) (setvar "cecolor" oldcolor) (setvar "celtype" oldceltype) (setvar "celweight" oldweight) (command "_dimstyle" "_r" oldstyle) ) mais AutoCAD pas content me sort cela :ni ; erreur: une erreur est survenue dans la fonction *erreur*paramètre de la variable AutoCAD rejeté: "clayer" nil Je touche au but mais... ça bugge... pourtant ce qu'il y a des frustrant c'est que quand je fais tourner le programme "pas à pas" (en chargeant le prog par bloc pour voir si tu fonctionne RAS)Phil Nota : Pour ce lisp il faut juste créer un style de cote superposée et un bloc nivcs qui compose la fleche de ma cote... Projeteur Revit Indépendant - traitement des eaux/CVC
(gile) Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 ni ; erreur: une erreur est survenue dans la fonction *erreur*paramètre de la variable AutoCAD rejeté: "clayer" nil Ça veut dire que tu as un LISP chargé dans lequel la fonction *error* est redéfinie mais n'est pas déclarée localement. Elle est donc redéfinie globalement et tente d'utiliser une variable nommée "clayer" qui elle devait être locale à la fonction et est donc à nil quand ton code appelle *error*... Il faut savoir, qu'un Echap est considéré comme une erreur en LISP et appelle donc la fonction *error*. L'utilisation de (while T ...) qui nécéssite de faire Echap pour sortir de la boucle n'est pas, à mon avis une bonne pratique en LISP (d'autres langages permettent de sortir "proprement" d'une boucle avant la condition d'arrêt, si elle existe). Il vaudrait mieux faire :(while (and (setq base (getpoint "\nPositionner la base de la cote")) (setq pos_cot (getpoint "\nPositionner le texte de la cote")) ) ; ici le code )et sortir de la boucle en faisant Entrée, Espace ou clic droit au lieu de spécifier un point. Dans tous les cas, essaye de retrouver le LISP dans le quel *error* est redéfinie sans être déclarée localement. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 Re, À regarder ton code de plus près, il y aurait plusieurs choses à revoir. (if (> (cadr pos_cot) (cadr base)) (progn (setq ROT "0") ) (T (setq ROT "180") ) ) ;ifLe progn est inutile. On utilise progn pour regrouper plusieurs expressions LISP en une seule, ici tu n'as qu'une expression.(T (setq ROT "180")) devrait provoquer une erreur parce que T n'est pas une fonction valide. On peut écrire simplement :(if (> (cadr pos_cot) (cadr base)) (setq ROT "0") (setq ROT "180") );_ ifou encore :(setq ROT (if (> (cadr pos_cot) (cadr base)) "0" "180" ) ) ;_ if L'autre soucis que je vois explique peut-être la cause du message d'erreur que tu as eu.La fonction *error* est une fonction fournie par AutoCAD pour être redéfinie localement pour des gestions d'erreurs spécifique à une fonction. En la redéfinissant globalement (hors de toute fonction), tu masques la définition originale et toute erreur issue d'un LISP exécutera donc cette fonction redéfinie. Dans la même veine, la fonction sav_para définit nombre de variables globales utilisée ensuite dans retour_para (donc dans *error* qui appelle retour_para). Tout ça illustre, à mon sens, très bien ce qu'il ne faut pas faire avec les déclarations de variables et de fonctions. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 Voilà à quoi pourrait ressembler la commande NI avec une gestion plus sûre des variables et des erreurs (pas testé) : (defun c:ni (/ *error* oldlayer oldcolor oldceltype oldweight oldstyle point_zero zero base pos_cot rot) ;; socker les valeurs initiales dans des variables LOCALES (setq oldlayer (getvar "clayer") oldcolor (getvar "cecolor") oldceltype (getvar "celtype") oldweight (getvar "celweight") oldstyle (getvar "dimstyle") ) ;; Redéfinition LOCALE de *error* au début de la routine ;; Restaure les valeurs initiales des variables (defun *error* (msg) (if msg (princ (strcat "\nErreur: " msg)) ) (setvar "clayer" oldlayer) (setvar "cecolor" oldcolor) (setvar "celtype" oldceltype) (setvar "celweight" oldweight) (command "_dimstyle" "_r" oldstyle) (princ) ) ;; modif des paramètres pour une cotation conforme (setvar "clayer" "68 COTES DE NIVEAU") (setvar "cecolor" "bylayer") (setvar "celtype" "bylayer") (command "_celweight" "-1") (setq point_zero (getpoint "\nIndiquer le point de repère")) (initget 1) (setq zero (getdist "\nIndiquer l'altimétrie de ce repère : ")) (command "_ucs" "_o" (list (car point_zero) (- (cadr point_zero) (* 1000 zero)) ;supprimer le 1000 si dessin en mètre ; modifier par 100 si dessin en centimètre ) ) (while (and (setq base (getpoint "\nPositionner la base de la cote")) (setq pos_cot (getpoint "\nPositionner le texte de la cote")) ) (if (> (cadr pos_cot) (cadr base)) (setq ROT "0") (setq ROT "180") ) ;_ if (command "_INSERT" "NIVCS" ;nom du bloc (flèche) (list (car pos_cot) (cadr base)) ;coordonnées "1" ;echelle X (car annotatif) "1" ;echelle Y (car annotatif) ROT ;rotation du bloc si nécessaire ) (command "_dimordinate" base pos_cot) (command "_ddedit" "_l" "") ) ;_ while ;; Appel de la fonction locale *error* avec nil comme paramètre ;; pour restaurer les valeurs initiales des variables (*error* nil) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
VDH-Bruno Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 ;; Appel de la fonction locale *error* avec nil comme paramètre ;; pour restaurer les valeurs initiales des variables (*error* nil) Magnifique (gile), écrit comme cela c’est une évidence, pourtant il me semble que je suis toujours passé à coté. Tes codes en plus d’être formateur sont toujours très agréable à lire.A+ et merci. Apprendre => Prendre => Rendre
philsogood Posté(e) le 9 octobre 2012 Auteur Posté(e) le 9 octobre 2012 Merci (gile)pas facile pour un néophyte de savoir comment écrire ceci ou cela... bref le code retravaillé marche à merveillepour le if je savais que je n'avais aps la bonne syntaxe mais je ne savais aps comment écrire sans progn. vu!petite question : pourquoi mettre un and devant le while, c'est pour sortir de la boucle proprement si on ne renseigne pas le getpoint?dernier point : esk'on peut renseigner un variable à travers un "command"?ex : (command "_dimordinate" (setq base (getpoint "\nPositionner la base de la cote")) (getpoint "\nPositionner le texte de la cote")) tout ça afin de placer d'abord la cote (et de la visualiser) avant de placer le bloc fleche++Phil Projeteur Revit Indépendant - traitement des eaux/CVC
philsogood Posté(e) le 6 novembre 2012 Auteur Posté(e) le 6 novembre 2012 helloje reviens sur mon lispcomme je le disais je préfère placer la cote avant de rajouter le bloc flèche (command "_dimordinate" pause "_y" pause) (command "_ddedit" "_l" "") (setq x1 (atof (cadr (assoc 13 (entget (entlast))))) ;;base de la cote y1 (atof (caddr (assoc 13 (entget (entlast)))));;base de la cote x2 (atof (cadr (assoc 14 (entget (entlast))))) ;;texte de la cote y2 (atof (caddr (assoc 14 (entget (entlast)))));;texte de la cote ) ;setq (if (> y2 y1) (setq ROT "0") (setq ROT "180") ) ;_ if (command "_INSERT" "NIVCS" ;nom du bloc (flèche) (list (x1 y2)) ;coordonnées "1" ;echelle X (car annotatif) "1" ;echelle Y (car annotatif) ROT ;rotation du bloc si nécessaire )ça donne çaproblème : comment se fait-il qu'il bloque sur les coordonnées d'insertion de blocj'ai essayé de convertir le les coordonnées X1, Y1, X2 et Y2 en alphanumérique mais AutoCAD me jete en me disant ; erreur: type d'argument incorrect: stringp 8259.82que faut-il comprendre? 8259 n'est pas un stringp avant la transfo?quelle petit test peut on faitre pour connaitre la nature d'une entité (string, integer...)ce que je souhaite c'est un coup de pouce pas une résolution de mon problèmemerci pour vos conseils.Phil Projeteur Revit Indépendant - traitement des eaux/CVC
(gile) Posté(e) le 6 novembre 2012 Posté(e) le 6 novembre 2012 que faut-il comprendre? 8259 n'est pas un stringp avant la transfo?Oui. quelle petit test peut on faitre pour connaitre la nature d'une entité (string, integer...)Regarde la fonction LISP type, sinon les les codes de groupe DXF renseignent aussi sur le type d'objet (regarde l'aide aux développeurs > Manuel d'utilisation DXF > Format DXF > Types de valeur des codes de groupe). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
philsogood Posté(e) le 6 novembre 2012 Auteur Posté(e) le 6 novembre 2012 bon je progresse,les valeurs des x et y sont bien des réels donc utilisables en tant que tel pour la définition d'un point (un problème de moins, merci (gile))je me suis rendu compte que j'avais mis des paranthèses en trop sur ma liste! (un autre problème de moins)j'avance, j'avance...je fais mes petites expériences et je reviensPhil Projeteur Revit Indépendant - traitement des eaux/CVC
philsogood Posté(e) le 6 novembre 2012 Auteur Posté(e) le 6 novembre 2012 on avance, on avance, c'est une évidence... //music (command "_dimordinate" pause "_y" pause) (command "_ddedit" "_l" "") (setq xscu (cadr (assoc 10 (entget (entlast)))) ;;point zero cote yscu (caddr (assoc 10 (entget (entlast)))) ;;point zero cote xbase (cadr (assoc 13 (entget (entlast)))) ;;base de la cote ybase (caddr (assoc 13 (entget (entlast)))) ;;base de la cote xtxt (cadr (assoc 14 (entget (entlast)))) ;;texte de la cote ytxt (caddr (assoc 14 (entget (entlast)))) ;;texte de la cote xbloc (- xtxt xscu) ;;bloc fleche ybloc (- ybase yscu) ;;bloc fleche ) ;setq (if (> ytxt ybase) (setq ROT "0") (setq ROT "180") ) ;_ if (command "_INSERT" "NIVCS" ;nom du bloc (flèche) "_r" ROT ;rotation du bloc si nécessaire (list xbloc ybloc) ;coordonnées 1 ;echelle bloc X 1 ;echelle bloc Y 1 ;echelle bloc Z ) la création de la cote se faitla pose du bloc se faitproblème entre les deux j'ai une édition de mon cote et ça bug!!!pk!! ben je ne sais aps... ma commande est _ddedit et sur ma ligne de commande sous l'édition de la cote je vois : Commande: _dimordinate Indiquez la position de l'objet: Indiquez une extrémité de la ligne de repère ou [Abscisse/Ordonnée/textMult/TExte/aNgle]: _y Indiquez une extrémité de la ligne de repère ou [Abscisse/Ordonnée/textMult/TExte/aNgle]: Texte de cote = 25.00 [color="#FF0000"]Commande: _dimstyle[/color] Style de cote courant: COTES$6 Annotatif: Oui Entrez une option de style de cote [ANnotatif/Sauvegrd/Restaurer/Etat/Variables/Appliquer/?] <Restaurer>: _r Entrez le nom d'un style de cote, [?] ou <sélectionnez une cote>: COTES$6 Style de cote courant: COTES Annotatif: Oui Remplacement de la cote courante: DIMASZ 0.00 DIMDEC 2 DIMDLI 0.00 DIMDSEP . DIMEXO 0.00 DIMGAP 1.00 DIMLFAC 0.00 DIMTDEC 2 DIMZIN 1 pk le AutoCAD ne lit-il pas la bonne commande!! c'est à n'y rien comprendre!!j'ai fait des essais en mode manuel _dimordinate "_l" "" et je peux très bien éditer ma cote mais le lisp lui ne fonctionne pas! pfiouuuje rebondis du coup sur un autre problème que je n'arrive pas à résoudre : l'édition de cotes de manière automatiquela problématique a déjà été abordé sur d'autres posts mais là je touche le problème du bout des doigts!!j'ai écrit ce truc : (if (< ybase yscu) ;condition qui fait que la cote sera négative (command "_ddedit" "_l" "-") ;insertion d'un signe négatif devant la cote et fin de l'édition ) ;if mais ça doit pas tout à fait être ça... il me manque quelque chose, une idée? Projeteur Revit Indépendant - traitement des eaux/CVC
bryce Posté(e) le 6 novembre 2012 Posté(e) le 6 novembre 2012 Bonjour, j'ai écrit ce truc : (if (< ybase yscu) ;condition qui fait que la cote sera négative (command "_ddedit" "_l" "-") ;insertion d'un signe négatif devant la cote et fin de l'édition ) ;if mais ça doit pas tout à fait être ça... il me manque quelque chose, une idée? Essaie avec la commande COTEDIT (_DIMEDIT) : (if (< ybase yscu) ;condition qui fait que la cote sera négative (command "_dimedit" "_n" "-<>" "_l" "") ;insertion d'un signe négatif devant la cote et fin de l'édition ) ;if Je n'ai pas compris les autres questions... <_< Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
philsogood Posté(e) le 7 novembre 2012 Auteur Posté(e) le 7 novembre 2012 hello merci bryce pour ce ocup de poucepetite question du coup : pourquoi utiliser plutot _dimedit que _ddedit, ça revient à la même chose, non? ces fonctions ont la même utilité (pour renommer du texte!) mon autre problème c'est que dans mon lisp j'utilise la commande (command "_ddedit" "_l" "") pour "préfixer" mes coteset lors de l'exécution de mon lisp j'ai la commande -dimstyle qui sort... comment ça se fait? merci des éclaircissements.Phil Projeteur Revit Indépendant - traitement des eaux/CVC
bryce Posté(e) le 8 novembre 2012 Posté(e) le 8 novembre 2012 Bonjour, DDEDIT affiche l'éditeur de texte, qui suspend l'exécution du Lisp, et tu es alors obligé de taper le signe "-" manuellement devant ton texte de cote.La commande DIMEDIT, elle, s'exécute sans afficher l'éditeur de texte, et donc sans interrompre le programme. Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
philsogood Posté(e) le 9 novembre 2012 Auteur Posté(e) le 9 novembre 2012 merci pour les éclaircissementsPhil Projeteur Revit Indépendant - traitement des eaux/CVC
philsogood Posté(e) le 11 janvier 2013 Auteur Posté(e) le 11 janvier 2013 Re... viens de loin (je)bon j'ai un peu de temps du coup j'essaie de me remettre sur mon lisp qui me servira a faire ma cotation altimétrique d'ouvrage génie civille code depuis la première édition a subi plusieurs modificationsle voici : (defun c:ni (/ *error* oldlayer oldcolor oldceltype oldweight oldstyle point_zero zero rot xscu yscu xbase ybase xtxt ytxt) ;; socker les valeurs initiales dans des variables LOCALES (setq oldlayer (getvar "clayer") oldcolor (getvar "cecolor") oldceltype (getvar "celtype") oldweight (getvar "celweight") oldstyle (getvar "dimstyle") ) ;; Redéfinition LOCALE de *error* au début de la routine ;; Restaure les valeurs initiales des variables (defun *error* (msg) (if msg (princ (strcat "\nErreur: " msg)) ) (setvar "clayer" oldlayer) (setvar "cecolor" oldcolor) (setvar "celtype" oldceltype) (command "celweight" oldweight) (command "_dimstyle" "_r" oldstyle) (princ) ) ;; modif des paramètres pour une cotation conforme (setvar "clayer" "68 COTES DE NIVEAU") (setvar "cecolor" "bylayer") (setvar "celtype" "bylayer") (command "_celweight" "-1") (command "_-dimstyle" "_r" "superposees") (setq point_zero (getpoint "\nIndiquer le point de repère")) (initget 1) (setq zero (getdist "\nIndiquer l'altimétrie de ce repère : ")) (command "_ucs" "_o" (list (car point_zero) (- (cadr point_zero) (* 1000 zero)) ;supprimer le 1000 si dessin en mètre ; modifier par 100 si dessin en centimètre ) ) (while (command "_dimordinate" pause "_y" pause) (setq xscu (cadr (assoc 10 (entget (entlast)))) ;;coordonnées alti zéro yscu (caddr (assoc 10 (entget (entlast)))) ;;coordonnées alti zéro xbase (cadr (assoc 13 (entget (entlast)))) ;;base de la cote ybase (caddr (assoc 13 (entget (entlast)))) ;;base de la cote xtxt (cadr (assoc 14 (entget (entlast)))) ;;texte de la cote ytxt (caddr (assoc 14 (entget (entlast)))) ;;texte de la cote ) ;setq (if (< ybase yscu) (command "_dimedit" "_n" "- <>" "_l" "") ) ;if (command "_ddedit" "_l" "") (if (> ytxt ybase) (setq ROT "0") (setq ROT "180") ) ;_ if (command "_INSERT" "NIVCS" ;nom du bloc (flèche) "_r" ROT ;rotation du bloc si nécessaire (list xtxt ybase) ;coordonnées 1 ;echelle bloc X 1 ;echelle bloc Y 1 ;echelle bloc Z ) ) ;_ while ;; Appel de la fonction locale *error* avec nil comme paramètre ;; pour restaurer les valeurs initiales des variables (*error* nil) (princ) ) Je bute sur un problème lorsque je lance le lisp : après la création mon nouveau point d'origine (SCU) je peux tracer une cote maid ça marche plus après... il me parle de DIMSTYLE et de CELWEIGHT mais quand je lis la suite du programme il n'est aps question de ça... je suis perplexe Je vous joins le ficheier sur lequel je fais mes tests pour que vous ayez les même éléments que moi Merci pour votre aide PhilDessin1.zip Projeteur Revit Indépendant - traitement des eaux/CVC
bonuscad Posté(e) le 12 janvier 2013 Posté(e) le 12 janvier 2013 Hello, Je n'ai pas essayé avec ton dessin... mais à la lecture du code, j'ai l'impression que c'est juste un oubli typographique. C'est bien d'internationaliser un code, mais il ne faut pas en oublier en route.Dans le fonction *error* tu as:(command "celweight" oldweight)alors qu'il faudrait:(command "_celweight" oldweight) en version française cela ne peut aboutir (commande inconnue) et se répercute sur la commande suivante _dimstyle dans le code. Donc un petit underscore "_" devrait résoudre ton problème. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bryce Posté(e) le 13 janvier 2013 Posté(e) le 13 janvier 2013 Bonjour, La commande CELWEIGHT existe bien, sur la 2013 en tout cas.Mais pourquoi ne pas modifier directement la variable avec (setvar), plutôt que de passer par (command) ? Il manque une condition d'arrêt à ton (while) je pense, par exemple: (while T (command "_dimordinate" pause "_y" pause) Chez moi ça a l'air de fonctionner sans erreur... Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
lecrabe Posté(e) le 13 janvier 2013 Posté(e) le 13 janvier 2013 Hello Juste une micro-Info en passant ... CELWEIGHT existe depuis AutoCAD 2000, du moins je le suppose !? car ca marche avec mon AutoCAD LT 2004 ! lecrabe Voici d'ailleurs l'aide d'AutoCAD LT 2004 a ce sujet >>> Type : entierEnregistrée dans : dessinValeur initiale : -1 Définit l'épaisseur de ligne des nouveaux objets. -1 Définit l'épaisseur de ligne sur "DUCALQUE". -2 Définit l'épaisseur de ligne sur "DUBLOC". -3 Définit l'épaisseur de ligne sur "DEFAUT". "DEFAUT" est déterminée par la variable système LWDEFAULT. Les autres épaisseurs de ligne autorisées (exprimées en centièmes de millimètre) sont 0, 5, 9, 13, 15, 18, 20, 25, 30, 35, 40, 50, 53, 60, 70, 80, 90, 100, 106, 120, 140, 158, 200 et 211. Toutes les valeurs doivent être entrées en centièmes de millimètre. Pour convertir en centièmes de millimètre une valeur exprimée en pouces, multipliez-la par 2540. Autodesk Expert Elite Team
philsogood Posté(e) le 16 janvier 2013 Auteur Posté(e) le 16 janvier 2013 hello@ bryceje suis en V2010 et je rencontre ce problème:Commande: (setvar "_celweight" "-1") ; erreur: paramètre de la variable AutoCAD rejeté: "_celweight" "-1" Commande: (command "_celweight" "-1") _celweight Entrez une nouvelle valeur pour CELWEIGHT <-1>: -1 Commande: nilje resterais donc avec le commandj'ai encore un dernier truc à débugger : l'insertion du bloc NIVCS, je ne sais aps pourquoi mais il me fait l'insertion du bloc à partir du SCG et non du SCU... je me suis d'ailleurs rendu compte que je perdu mon SCU une fois le lisp fini (et quittant avec escape)affaire à suivre Projeteur Revit Indépendant - traitement des eaux/CVC
VDH-Bruno Posté(e) le 16 janvier 2013 Posté(e) le 16 janvier 2013 Salut, Essaye ceci: (setvar "celweight" -1)Ou(setvar 'celweight -1) A+ Apprendre => Prendre => Rendre
philsogood Posté(e) le 10 septembre 2013 Auteur Posté(e) le 10 septembre 2013 Enfin!!j'ai enfin réussi à finaliser ce lisp... pfiou!Ce petit progrape permet de faire des cotations altimétriques sur des coupes de batimentsle calque sur lequel est créé la cote est présélectionnée (à modifier dans le lisp si votre calque n'a pas le même nom que le mien "58_COTES_DE_NIVEAU")le style de cote a également été prédéfini "cotes"Il intègre également les valeurs inférieures à 0.00 (elles auront un "-" comme préfixe)j'ai choisis de pouvoir rajouter un préfixe à ce préfixe suivant les cas (point haut, point bas, radier, TN...) ça c'est manuel car ça dépend des objets cotéset pour finir le lisp me rajoute une charmante petite flèche NIVCS pour améliorer la visibilité de la cotece lisp fonctionne sur les unités suivantes : m, cm, mm (en sachant que toutes les cotes alti seront données en m)N'hésitez pas à le testez et à me faire suivre vos commentaires ;; créé par philsogood avec l'aide de rebcao, (gile), VDH-bruno, bryce, bonuscad, patrick35 & much more (defun c:niv (/ *error* oldlayer oldcolor unite echelle oldceltype oldweight oldstyle point_zero zero rot xscu yscu xbase ybase xtxt ytxt) ;; stocker les valeurs initiales dans des variables LOCALES (setq oldlayer (getvar "clayer") oldcolor (getvar "cecolor") oldceltype (getvar "celtype") oldweight (getvar "celweight") oldstyle (getvar "dimstyle") unite (getvar "insunits") ) ;; Redéfinition LOCALE de *error* au début de la routine ;; Restaure les valeurs initiales des variables (defun *error* (msg) (if msg (princ (strcat "\nErreur: " msg)) ) (setvar "clayer" oldlayer) (setvar "cecolor" oldcolor) (setvar "celtype" oldceltype) (command "_celweight" oldweight) (command "_-dimstyle" "_r" oldstyle) (princ) ) ;; prise en compte de l'unité de travail (cond ((= unite 4) (setq echelle 1000)) ((= unite 5) (setq echelle 100)) ((= unite 6) (setq echelle 1)) ) ;cond ;; modif des paramètres pour une cotation conforme (setvar "clayer" "58_COTES_DE_NIVEAU") (setvar "cecolor" "bylayer") (setvar "celtype" "bylayer") (command "_celweight" "-1") (command "_-dimstyle" "_r" "COTES") (setq point_zero (getpoint "\nIndiquer le point de repère")) (initget 1) (setq zero (getdist "\nIndiquer l'altimétrie de ce repère (en mètre) : ")) (command "_ucs" "_o" (list (car point_zero) (- (cadr point_zero) (* 1000 zero)) ) ) (while T (command "_dimordinate" pause "_y" pause) (setq x_scu (cadr (assoc 10 (entget (entlast)))) ;;coordonnées alti zéro y_scu (caddr (assoc 10 (entget (entlast)))) ;;coordonnées alti zéro x_basecot (cadr (assoc 13 (entget (entlast)))) ;;base de la cote y_basecot (caddr (assoc 13 (entget (entlast)))) ;;base de la cote x_txtcot (cadr (assoc 14 (entget (entlast)))) ;;texte de la cote y_txtcot (caddr (assoc 14 (entget (entlast)))) ;;texte de la cote ) ;setq ;ajout d'un signe négatif pour des valeurs en dessous de 0.00 (if (< y_basecot y_scu) (command "_dimedit" "_n" "- <>" "_l" "") ) ;if ;édition de la cote (rajout d'un préfixe manuel (command "_ddedit" "_l" "") ;rajout du bloc fleche (if (> y_txtcot y_basecot) (setq ROT "0") (setq ROT "180") ) ;_ if (command "_INSERT" "NIVCS" ;nom du bloc (flèche) "_r" ROT ;rotation du bloc si nécessaire (list (- x_txtcot x_scu) (- y_basecot y_scu)) ;coordonnées "1" ;echelle bloc X "1" ;echelle bloc Y ) ) ;while ;; Appel de la fonction locale *error* avec nil comme paramètre ;; pour restaurer les valeurs initiales des variables (*error* nil) (princ) ) PS : mes cotes/blocs sont annotatifs, in conviendra de se mettre à la bonne échelle d'annotation avant d'éditer les cotesPSS : si l'échelle d'annotation est changé on est bon pour replacer toutes les fleches NIVCS ou les supprimerNIVCS.zip Projeteur Revit Indépendant - traitement des eaux/CVC
philsogood Posté(e) le 17 février 2014 Auteur Posté(e) le 17 février 2014 pas content!! :/mon lisp bug dans les cas ou je tourne mon SCU (_SCU _z ) ; chose que je fais souvent couplé avec la fontion _plan pour orienter mes plans en fonction de mes souhaitsbref la cote a la bonne valeur mais la fleche ne se met pas sur la "pointe" de ma coteje ne comprends pas d'où provient le problème d'autant plus que je ne vois pas le rapport qu'il peut y avoir entre le point d'insertion de mon bloc (la pointe de la fleche), le nouveau point d'origine du SCG(en bleu sur le plan) et les coordonnées de la cotesdans mon exemple ci-dessous (j'ai tracé une grille pour faciliter la visibilité) j'ai relié avec un rectangle jaune la cote tracée et le positionnement du bloc qui se place suite à la création de la cote (pour savoir quelle cote créée insère quel bloc)sur mon exemple j'ai fait quatre tests et je patauge complement car je ne vois pas avec quelles coordonnées le bloc est inséré.http://nsa20.casimages.com/img/2014/02/17/mini_140217064619841526.jpgVoyez-vous d'où vient le problème?Phil Projeteur Revit Indépendant - traitement des eaux/CVC
Big666 Posté(e) le 15 mai 2020 Posté(e) le 15 mai 2020 BonjourPhilsogood ce poste date de 2014 depuis a tu réussi a faire fonctionner ton lisp.peut être que ta la amélioré.je recherche un lisp réalisant une cotation altimétrique.donc si tu veux le partager .merci Nous vivons tous dans le ventre d'un chien géantTout le monde le sait mais personne ne dit rien du tout ultra Vomit
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