Aller au contenu

Liste des échelles


(gile)

Messages recommandés

Salut,

 

J'arrive un peu après la guerre (celle qui commença avec la version 2008 et les fameuses échelles annotatives), mais je me retrouve seulement maintenant confronté à ce problème.

 

J'ai vu passer pas mal de macros et de LISP, depuis la célèbre macro :

^C^C_-scalelistedit;_r;_y;_e;

jusqu'à des LISP plus sophistiqués.

 

Mais je n'ai rien vu (j'ai pas trop cherché non plus...) de polyvalent et convivial qui permette à chacun de choisir la liste des échelles qui sera réinitialisée.

J'y suis donc allé de mes propres routines.

 

La commande SAVESCALES lance SCALELISTEDIT pour permettre de configurer sa propre listes d'échelles, puis stocke cette liste dans une variable d'environnement (registre).

 

La commandes RESTORESCALES restaure la liste stockée.

 

EDIT : ajout d'une commande PURGESCALES qui supprime toutes les échelles (sauf "1:1") qui ne sont pas utilisées par des objets annotatifs

 

EDIT : Nouvelle version, la précédent, un peu trop radicale, pouvait provoquer des dysfonctionnements (voir ici)

 

;;;============================================================;;;
;;;========================= ROUTINES =========================;;;
;;;============================================================;;;

;; gc:GetCurrentScaleList (gile)
;; Retourne une liste des échelles courantes sous forme de
;; sous listes : (NomEntree NomEchelle UnitéPapier UnitéDessin)

(defun gc:GetCurrentScaleList (/ elst result)
 (mapcar (function (lambda (x) (cons (car x) (gc:ScaleDatas (cdr x)))))
  (gc:GetDictEntries
    (dictsearch (namedobjdict) "ACAD_SCALELIST")
  )
 )
)

;;;============================================================;;;

;; gc:MakeScale (gile)
;; Retourne le nom d'entité de l'échelle créée
;;
;; Argument
;; datas : liste des données de l'échelle (NomEchelle UnitéPapier UnitéDessin)

(defun gc:MakeScale (datas)
 (entmakex
   (list
     '(0 . "SCALE")
     '(100 . "AcDbScale")
     '(70 . 0)
     (cons 300 (car datas))
     (cons 140 (cadr datas))
     (cons 141 (caddr datas))
     '(290 . 0)
   )
 )
)

;;;============================================================;;;

;; gc:SetScaleList (gile)
;; Définit la liste des échelles suivant une liste
;;
;; Argument : lst une liste de sous liste du type : (NomEntree NomEchelle UnitéPapier UnitéDessin)

(defun gc:SetScaleList (lst / dict)
 (setq	elst	(dictsearch (namedobjdict) "ACAD_SCALELIST")
dict	(cdr (assoc -1 elst))
curlst	(gc:GetCurrentScaleList)
entries	(gc:GetDictEntries elst)
 )
 (foreach e entries
   (entdel (cdr e))
   (dictremove dict (car e))
 )
 (foreach e lst
   (dictadd dict (car e) (gc:MakeScale (cdr e)))
 )
)

;;;============================================================;;;

;; gc:ScaleDatas (gile)
;; Retourne la liste (Nom UnitéPapier UnitéDessin) de l'échelle
;;
;; Argument scl (ENAME) un objet "SCALE"

(defun gc:ScaleDatas (scl / elst)
 (setq elst (entget scl))
 (list
   (cdr (assoc 300 elst))
   (cdr (assoc 140 elst))
   (cdr (assoc 141 elst))
 )
)

;;;============================================================;;;

;; gc:GetUsedScaleList (gile)
;; Retourne la liste des échelles annotatives utilisées sous forme de
;; sous listes : (Nom UnitéPapier UnitéDessin)

(defun gc:GetUsedScaleList (/ n ss ent xDict dict slst result)
 (setq n 0)
 (if (setq ss (ssget "_X"))
   (while (setq ent (ssname ss n))
     (setq n (1+ n))
     (and
(setq xDict (gc:GetExtDict ent))
(setq dict (dictsearch xDict "AcDbContextDataManager"))
(setq dict (dictsearch
	     (cdr (assoc -1 dict))
	     "ACDB_ANNOTATIONSCALES"
	   )
)
(foreach p (gc:GetDictEntries dict)
  (setq	slst   (gc:ScaleDatas (cdr (assoc 340 (entget (cdr p)))))
	result (if (not (vl-position slst result))
		 (cons slst result)
		 result
	       )
  )
)
     )
   )
 )
 result
)

;;;============================================================;;;

;; gc:GetExtDict (gile)
;; Retourne le dictionnaire d'extension de l'entité (ou nil)
;;
;; Argument : ent (ENAME)

(defun gc:GetExtDict (ent)
 (cdr
   (assoc 360
   (member '(102 . "{ACAD_XDICTIONARY") (entget ent))
   )
 )
)

;;;============================================================;;;

;; gc:GetDictEntries
;; Retourne la liste des entrées du dictionnaire
;; sous forme de paires pointées (Nom . ENAME)
;;
;; Argument : dict le dictionnaire (ENAME ou liste DXF)

(defun gc:GetDictEntries (dict / result)
 (and (= (type dict) 'ENAME) (setq dict (entget dict)))
 (while
   (setq dict (vl-member-if (function (lambda (x) (= (car x) 3))) (cdr dict)))
    (setq result (cons (cons (cdar dict) (cdadr dict)) result))
 )
 (reverse result)
)

;;;===========================================================;;;
;;;======================== COMMANDES ========================;;;
;;;===========================================================;;;

;; SAVESCALES (gile)
;; Lance la commande SCALELISTEDIT et sauvegarde le résultat
;; dans une variable d'environnement

(defun c:SaveScales ()
 (initdia)
 (vl-cmdf "_.scalelistedit")
 (while (/= (getvar 'cmdactive) 0)
   (vl-cmdf pause)
 )
 (setenv "SavedScaleList"
  (vl-prin1-to-string (gc:GetCurrentScaleList))
 )
 (princ)
)

;;;============================================================;;;

;; RESTORESCALES (gile)
;; Restaure la liste sauvegardée avec SAVESCALES
;; ou lance SCALAESAVE s'il n'y a pas de sauvegarde précédente

(defun c:RestoreScales (/ lst)
 (if (and
(setq lst (getenv "SavedScaleList"))
(setq lst (read lst))
(= 4 (length (car lst)))
     )
   (gc:SetScaleList lst)
   (c:SaveScales)
 )
 (princ)
)

;;;============================================================;;;

;; PURGESCALES (gile)
;; Supprime toutes les échelles excepté les échelles annotatives utilisées et "1:1"

(defun c:PurgeScales (/ alst cnt)
 (setq	alst (gc:GetUsedScaleList)
cnt  0
 )
 (foreach p (dictsearch (namedobjdict) "ACAD_SCALELIST")
   (and
     (= 350 (car p))
     (setq slst (gc:ScaleDatas (cdr p)))
     (/= "1:1" (car slst))
     (null (member slst alst))
     (entdel (cdr p))
     (setq cnt (1+ cnt))
   )
 )
 (princ (strcat (itoa cnt) " échelle(s) purgée(s)."))
 (princ)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut Christian,

 

En donnant ces routines (pour versions complètes, bien sûr) je voulais offrir la possibilité à l'utilisateur de n'avoir ni à subir la liste d'échelles imposée par AutoCAD (option "Redéfinir" de _-SCALELISTEDIT) ni à avoir à modifier un code ou un script pour configurer sa liste d'échelles selon ses propres désirs en utilisant la boite de dialogue de la commande native.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile)

 

GENIALISSIME :D

 

Comme d'hab.... c'est efficace et utile MERCI

 

Je vais pouvoir me débarrasser de mes scripts.

 

Je vais voir pour tester ça également avec AutoCAD MEP et Architecture qui me pose des problèmes lorsque je travaille en unité cm dans l'espace objet.

 

@plus

Jean-Philippe - Formateur / Dessinateur sur AutoCAD et MEP

http://www.git-cad.ch

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

A votre avis dans combien d'années les gens vont échanger des dessins AutoCADs utilisant les échelles d'annotations et TOUT ce que cela implique ... :exclam:

 

C'était le sondage du WE par votre devoue Decapode

le Decapode "railleur"

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut à tous,

 

 

A votre avis dans combien d'années les gens vont échanger des dessins AutoCADs utilisant les échelles d'annotations et TOUT ce que cela implique ...

 

Effectivement, ce n'est pas forcément facile d'accès.

 

Pour ceux que ça intéresse, cliquez ci-dessous, j'ai mis un lien vers une vidéo explicative dans le forum Tutoriaux.

 

http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=24716#pid

 

@plus

Jean-Philippe - Formateur / Dessinateur sur AutoCAD et MEP

http://www.git-cad.ch

Lien vers le commentaire
Partager sur d’autres sites

Hello Le Crabe,

 

J'avais déja répondu voir ici

 

Le problème c'est pour ceux qui ne sont pas encore au niveau d'une 2008 ! L'échange de tels fichiers est une catastrophe !

 

Aujourd'hui je croise encore des utilisateurs de versions 14 ou LT 97...

 

hristian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Lien vers le commentaire
Partager sur d’autres sites

Salut Gile

 

Pour la première partie, je n'ai pas rencontré de problèmes...mais concernant ce qui suit et particulierement "en ajoutant l'expression suivante dans le fichier de chargement automatique":

 

Si ces routines sont automatiquement chargées à l'ouverture de chaque dessin (valise de APPLOAD, fichier acaddoc.lsp ou MNL) et que la variable a été créée, en ajoutant l'expression suivante dans le fichier de chargement automatique, chaque dessin ouvert sera initialisé avec la liste stockée dans la variable.

 

;;;============================================================;;;
;;;====================== INITIALISATION ======================;;;
;;;============================================================;;;

;; Placé dans un fichier de chargement automatique,
;; initialise la liste des échelles suivant la liste sauvegardée

((lambda (lst)
  (and lst SetScaleList (SetScaleList (read lst)))
)
 (getenv "SavedScaleList")
)

 

là je n'y arrive pas...help? :P

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Certains fichiers contenant des expressions LISP sont automatiquement chargés au démarrage d'AutoCAD ou à l'ouverture de chaque document (nouveau ou existant)*.

Tu peux créer un fichier nommé acaddoc.lsp dans un répertoire du chemin de recherche des fichiers de support et coller toutes les routines ci dessus.

Si tu ajoutes aussi cette expression, la liste des échelles sera automatiquement réinitialisée avec la liste sauvegardée par la commande SAVESCALES dans chaque nouveau document ouvert.

 

* pour plus d'infos sur les fichiers de chargemnt automatique des routines LISP voir dans l'aide > Guide de personnalisation > Introduction aux interfaces de programmation > AutoLISP et Visual LISP > Chargement et exécution automatiques des routines AutoLISP

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é