Aller au contenu

lisp de cotation


philsogood

Messages recommandés

hello

pour faire suite à une discussion qui avait eu lieu ici :

http://cadxp.com/index.php?/topic/36049-bloc-dynamique/page__p__197047#entry197047

j'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 cote

en 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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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")
                )
               ) ;if

Le 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")
);_ if

ou 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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

;; 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

Lien vers le commentaire
Partager sur d’autres sites

Merci (gile)

pas facile pour un néophyte de savoir comment écrire ceci ou cela... bref le code retravaillé marche à merveille

pour 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

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...

hello

je reviens sur mon lisp

comme 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 ça

problème : comment se fait-il qu'il bloque sur les coordonnées d'insertion de bloc

j'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.82

que 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ème

merci pour vos conseils.

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 reviens

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

Lien vers le commentaire
Partager sur d’autres sites

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 fait

la pose du bloc se fait

problè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! pfiouuu

je rebondis du coup sur un autre problème que je n'arrive pas à résoudre : l'édition de cotes de manière automatique

la 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

Lien vers le commentaire
Partager sur d’autres sites

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... <_<

Lien vers le commentaire
Partager sur d’autres sites

hello

merci bryce pour ce ocup de pouce

petite 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 cotes

et 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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

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 civil

le code depuis la première édition a subi plusieurs modifications

le 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

 

Phil

Dessin1.zip

Projeteur Revit Indépendant - traitement des eaux/CVC

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

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 : entier

Enregistrée dans : dessin

Valeur 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

Lien vers le commentaire
Partager sur d’autres sites

hello

@ bryce

je 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: nil

je resterais donc avec le command

j'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

Lien vers le commentaire
Partager sur d’autres sites

  • 7 mois après...

Enfin!!

j'ai enfin réussi à finaliser ce lisp... pfiou!

Ce petit progrape permet de faire des cotations altimétriques sur des coupes de batiments

le 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és

et pour finir le lisp me rajoute une charmante petite flèche NIVCS pour améliorer la visibilité de la cote

ce 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 cotes

PSS : si l'échelle d'annotation est changé on est bon pour replacer toutes les fleches NIVCS ou les supprimer

NIVCS.zip

Projeteur Revit Indépendant - traitement des eaux/CVC

Lien vers le commentaire
Partager sur d’autres sites

  • 5 mois après...

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 souhaits

bref la cote a la bonne valeur mais la fleche ne se met pas sur la "pointe" de ma cote

je 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 cotes

dans 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.jpg

Voyez-vous d'où vient le problème?

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

Lien vers le commentaire
Partager sur d’autres sites

  • 6 ans après...

Bonjour

Philsogood 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éant

Tout le monde le sait mais personne ne dit rien du tout

 

ultra Vomit

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité