Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    209

Tout ce qui a été posté par (gile)

  1. Tu trouveras ici un exemple pour une extraction d'attributs de blocs vers ut table de données (DataTable) facilement transformable en tableau AutoCAD, feuille Excel ou, bien sûr une table de base de données.
  2. Je crains de ne toujours pas comprendre ce que tu cherches à faire. Brièvement. BlockTable : table des blocs, sommairement la collections des définitions de blocs (BlockTableRecord) du dessin (comme LayerTable est la collection des calques du dessin). Il y a obligatoirement une et une seule table des blocs par dessin (tout comme pour les autres "tables"). BlockTableRecord : définition de bloc ou espace (l'espace objet et tous les espaces papier sont le type BlockTableRecord), sommairement une collection d'entité (objet non graphique). Les objets de type BlockTableRecord appartiennent tous à la table des blocs du dessin. BlockReference : référence de bloc, une entité graphique (comme les lignes, cercles, polylignes, etc.) insérée dans un objet de type BlockTableRecord (espace objet, espace papier ou définition de bloc). Une référence de bloc est une représentation géométrique des entités contenues dans la définition de bloc. Donc, dans un jeu de sélection (SelectionSet), il ne peut y avoir que des références de bloc (objets de type BlockReference) qui sont des références à une définition de bloc (objet de type BlockTableRecord) qui est obligatoirement contenue dans la table des blocs (objet de type BlockTable). private List<string> GetBlockNames(Database database, SelectionSet selectionSet) { List<string> blockList = new List<string>(); try { using (Transaction transaction = database.TransactionManager.StartTransaction()) { foreach (ObjectId selectedObject in selectionSet.GetObjectIds()) { var blockReference = (BlockReference)transaction.GetObject(selectedObject, OpenMode.ForRead); var blockName = blockReference.Name; if (blockReference.IsDynamicBlock) { var blockRecord = (BlockTableRecord)transaction.GetObject(blockReference.DynamicBlockTableRecord, OpenMode.ForRead); blockName += $" ({blockRecord.Name})"; } if (!blockList.Contains(blockName)) { blockList.Add(blockName); } } } } catch (System.Exception ex) { Active.WriteMessage(ex.Message); } return blockList; }
  3. Salut, Est-ce que tu pourrais essayer de reformuler, je ne comprends pas la demande :
  4. (gile)

    Continuer une polyligne

    Salut, PPL devrait marcher avec les polylignes et les polylignes 3d (defun c:ppl (/ *error* err echo ptyp pl elst lw ent pt) (vl-load-com) (defun *error* (msg) (if msg (progn (or (equal ent (entlast)) (entdel (entlast))) (or (= msg "Fonction annulée") (princ (strcat "\nErreur: " msg)) ) ) ) (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)) ) (setvar "CMDECHO" echo) (setvar "PLINETYPE" ptyp) (princ) ) (setq echo (getvar "CMDECHO") ptyp (getvar "PLINETYPE") ent (entlast) ) (if (and (setq pl (entsel "\nSélectionnez la polyligne à prolonger: ") ) (setq elst (entget (car pl))) (or (setq lw (= (cdr (assoc 0 elst)) "LWPOLYLINE")) (and (= (cdr (assoc 0 elst)) "POLYLINE") (= 8 (logand 8 (cdr (assoc 70 elst)))) ) ) (zerop (logand 1 (cdr (assoc 70 elst)))) ) (progn (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)) ) (setq pt (trans (osnap (cadr pl) "_nea") 1 0)) (if (< (- (vlax-curve-getDistAtPoint (car pl) (vlax-curve-getEndPoint (car pl)) ) (vlax-curve-getDistAtPoint (car pl) pt) ) (vlax-curve-getDistAtPoint (car pl) pt) ) (setq pt (trans (vlax-curve-getEndPoint (car pl)) 0 1)) (setq pt (trans (vlax-curve-getStartPoint (car pl)) 0 1)) ) (setvar "CMDECHO" 1) (setvar "PLINETYPE" 2) (if lw (command "_.pline" pt) (command "_.3dpoly" pt) ) (while (/= 0 (getvar "CMDACTIVE")) (command pause) ) (setvar "CMDECHO" 0) (or (equal ent (entlast)) (command "_.pedit" pl "_j" (entlast) "" "") ) (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)) ) ) ) (*error* nil) )
  5. Une toute petite rectification à l'excellente réponse de zebulon_: La fonction princ (comme prin1) appelée sans argument retourne aussi une valeur (un symbole) mais cette valeur est invisible (aucun caractère dans le symbole). Essayer : (type (princ)) (vl-symbol-name (princ)) En conclusion: TOUTES les fonction LISP retourne une valeur.
  6. Bonjour, Si tu es "complètement novice en LISP", tu as mis la barre trop haut. Pour débuter, il faut commencer en choisissant des objectifs plus abordables. Mais si tu attends une solution "clés en main", précise le en décrivant le plus clairement possible tous les tenants et aboutissants et, si une âme charitable a le temps et l'envie de s'y atteler, elle te fournira les LISP "clés en main". Maintenant, si c'est un besoin impérieux, tu peux me contacter, je te ferais un devis.
  7. (gile)

    Version OEM avec LISP ?

    Denis, Je ne suis pas sûr qu'il s'agisse d'options d'installation accessibles à l'utilisateur final. ATLOG veut développer un logiciel spécifique : Land2Map. Ils achètent à Autodesk une licence AutoCAD EOM avec uniquement les fonctionnalités dont ils ont besoin pour leur servir de base au développement de Land2Map (le prix de la licence dépend, bien sûr, fonction des fonctionnalités choisies). Si, dans la licence AutoCAD OEM qu'ils ont pris, il n'y a pas (comme dans une version LT) l'accès au LISP pour l'utilisateur final, il ne sera pas possible de l'installer a posteriori.
  8. Salut, Pour accéder aux propriétés dynamiques des blocs en LISP, l'API COM/ActiveX (Visual LISP) est incontournable. Un exemple : ;; obtenir l'espace objet du dessin courant (setq modelSpace (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))) ;; insérer le bloc (setq block (vla-InsertBlock modelSpace (vlax-3d-point (list (atof X) (atof Y) 0.0)) ; <- X et Y issus du fichier nom_du_bloc ; <- issu du fichier 1.0 1.0 1.0 (angtof rotation) ; <- rotation issue du fichier (utilise atof si radians) ) ) ;; modifier les propriétés dynamiques (foreach prop (vlax-invoke block 'GetDynamicBlockProperties) (cond ((= (vla-get-PropertyName prop) nom_du_parametre_1) ; <- nom_du_parametre_1 issue du fichier (vla-put-Value prop valeur_du_parametre_1) ; <- valeur_du_parametre_1 issue du fichier (attention au type) ) ((= (vla-get-PropertyName prop) nom_du_parametre_2) ; <- nom_du_parametre_2 issue du fichier (vla-put-Value prop valeur_du_parametre_2) ; <- valeur_du_parametre_2 issue du fichier (attention au type) ) ) ) Faire attention au type des valeurs de propriétés dynamiques. Il faudra les convertir si ce ne sont pas de chaînes.
  9. (gile)

    Version OEM avec LISP ?

    Salut, Il me semble bien que les licences AutoCAD EOM correspondent à un AutoCAD de base avec des modules optionnels (dont peut-être l'interpréteur LISP (amis ça m'étonne) ou, inversement, le système de bridage du LISP des versions LT). Un AutoCAD EOM sert de base au développement d'un logiciel spécifique qui bénéficiera donc donc de certaines fonctionnalités d'AutoCAD.
  10. Salut, Pour automatiser le processus, le problème, c'est de traduire ça de manière algorithmique non équivoque :
  11. Salut, Chapitre 11 Affichage de texte (prompt prin1 princ print alert textscr graphscr) Chapitre 14 Chaînes de caractères et fichiers ASCII - 14.1 Chaînes de caractères(strcat strlen strcase substr vl-string* read) - 14.2 Conversions (itoa atoi rtos atof distof angtos angtof ascii chr vl-string->list vl-list->string float fix cvunit)
  12. (gile)

    Version OEM avec LISP ?

    AutoCAD EOM est une base pour développer des versions personnalisées d'AutoCAD et supporte donc les différents environnements de programmations (LISP, NET, ObjectARX). Par contre, il n'y a pas forcément toutes les commandes d'un AutoCAD classique.
  13. (gile)

    Version OEM avec LISP ?

    Salut, Essaye une expression LISP en ligne de commande...
  14. (gile)

    Calque bloc INCATT

    Salut, Tu peux utiliser cette version en remplaçant "0" par le nom du calque que tu veux (vers la fin de la routine). L'inconvénient c'est que quel que soit le bloc inséré, il le sera toujours sur ce calque, c'est pourquoi j'avais préféré laisser le calque courant qu'on ne manque pas d'établir avant d'utiliser ce genre de commande. (defun c:incatt (/ space name lst tmp file dcl_id scl rot tag val inc pref suff ins blk ) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))) ) (setq space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace *acdoc*) (vla-get-ModelSpace *acdoc*) ) ) (if (setq name (getblock nil)) (progn (or (tblsearch "BLOCK" name) (vla-delete (vla-InsertBlock space (vlax-3d-point '(0 0 0)) name 1 1 1 0 ) ) ) (setq name (vl-filename-base name)) (vlax-for e (vla-item (vla-get-Blocks *acdoc*) name) (if (and (= (vla-get-ObjectName e) "AcDbAttributeDefinition") (= (vla-get-Constant e) :vlax-false) ) (setq lst (cons (vla-get-TagString e) lst)) ) ) (if (setq lst (reverse lst)) (progn (setq tmp (vl-filename-mktemp "Tmp.dcl") file (open tmp "w") ) (write-line (strcat "incins:dialog{" "label=\"Attribut incémenté\";" ":boxed_column{" "label=\"Bloc\";" ":edit_box{" "label=\"Echelle globale\";key=\"scl\";edit_width=5;}" ":edit_box{" "label=\"Rotation\";key=\"rot\";edit_width=5;}} " ":boxed_column{" "label=\"Attribut\";" ":popup_list{" "label=\"Etiquette\";key=\"tag\";edit_width=16;}" ":edit_box{" "label=\"Valeur de départ\";key=\"val\";edit_width=5;allow_accept=true;}" ":edit_box{" "label=\"Incrément\";key=\"inc\";edit_width=5;allow_accept=true;}" ":edit_box{" "label=\"Préfixe\";key=\"pref\";edit_width=16;allow_accept=true;}" ":edit_box{" "label=\"Suffixe\";key=\"suff\";edit_width=16;allow_accept=true;}}" "ok_cancel;}" ) file ) (close file) (setq scl 1.0 rot 0.0 val "1" inc 1 pref "" suff "" dcl_id (load_dialog tmp) ) (if (not (new_dialog "incins" dcl_id)) (exit) ) (start_list "tag") (mapcar 'add_list lst) (end_list) (set_tile "scl" (rtos scl)) (set_tile "rot" (rtos rot)) (set_tile "val" val) (set_tile "inc" (itoa inc)) (action_tile "scl" "(if (and (distof $value) (< 0 (distof $value))) (setq scl (distof $value)) (progn (alert \"Nécessite un nombre réel strictement positif\") (set_tile \"scl\" (rtos scl)) (mode_tile \"scl\" 2)))" ) (action_tile "rot" "(if (numberp (angtof $value)) (setq rot (angtof $value)) (progn (alert \"Nécessite une valeur d'angle valide\") (set_tile \"rot\" (angtos rot)) (mode_tile \"rot\" 2)))" ) (action_tile "inc" "(if (and (numberp (read $value)) (<= 0 (read $value))) (setq inc (atoi $value)) (progn (alert \"Nécessite un entier positif\") (set_tile \"inc\" (itoa inc)) (mode_tile \"inc\" 2))))" ) (action_tile "val" "(if (wcmatch $value \"~*.*\") (setq val $value) (progn (alert \"Nécessite uniquement des caractères alphabétiques et/ou numériques\") (set_tile \"val\" val) (mode_tile \"val\" 2))))" ) (action_tile "pref" "(setq pref $value)") (action_tile "suff" "(setq suff $value)") (action_tile "accept" "(setq tag (atoi (get_tile\"tag\"))) (done_dialog)" ) (action_tile "cancel" "(setq tag nil)") (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) (if tag (progn (while (setq ins (getpoint "\nSpécifiez le point d'insertion: ") ) (vla-put-Textstring (nth tag (vlax-invoke (setq blk (vla-InsertBlock space (vlax-3d-point (trans ins 1 0)) name scl scl scl rot ) ) 'getAttributes ) ) (strcat pref val suff) ) (vla-put-Layer blk "0") ; <- remplacer par le nom du calque (setq val (incsuff val inc 7)) ) ) ) ) (princ "\nCe bloc ne contient pas d'attributs.") ) ) ) (princ) )
  15. Oui, PropertyTypeCode = 5 vaut pour les paramètres de visibilité et de consultation, c'est pour ça que le nom de la propriété est plus fiable.
  16. Si, la classe .NET DynamicBlockReferenceProperty a une propriété PropertyTypeCode qui vaut 5 pour un paramètre de visiblité. [CommandMethod("CountByVis")] public void CountByVis() { var doc = Application.DocumentManager.MdiActiveDocument; var db = doc.Database; var ed = doc.Editor; var options = new PromptStringOptions("\nEntrez le nom du bloc: "); options.AllowSpaces = true; var result = ed.GetString(options); if (result.Status != PromptStatus.OK) return; var blockName = result.StringResult; try { var visibilities = CountByVisibilityState(db, blockName); if (visibilities.Count == 0) ed.WriteMessage($"\nLe bloc '{blockName}' n'a pas d'états de visibilité."); else foreach (var item in visibilities) { ed.WriteMessage($"\n{item.Key} : {item.Value}"); } } catch (System.Exception ex) { ed.WriteMessage($"\nErreur: {ex.Message}"); } } private Dictionary<string, int> CountByVisibilityState(Database db, string blockName) { using (var tr = db.TransactionManager.StartOpenCloseTransaction()) { var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); if (!bt.Has(blockName)) throw new ArgumentException($"Le bloc '{blockName}' est introuvable."); var btr = (BlockTableRecord)tr.GetObject(bt[blockName], OpenMode.ForRead); if (!btr.IsDynamicBlock) throw new InvalidOperationException($"Le bloc '{blockName} n'est pas un bloc dynamique."); var blockRefs = new List<BlockReference>(); foreach (ObjectId brId in btr.GetBlockReferenceIds(true, false)) { blockRefs.Add((BlockReference)tr.GetObject(brId, OpenMode.ForRead)); } foreach (ObjectId anonymBtrId in btr.GetAnonymousBlockIds()) { var anonymBtr = (BlockTableRecord)tr.GetObject(anonymBtrId, OpenMode.ForRead); foreach (ObjectId brId in anonymBtr.GetBlockReferenceIds(true, false)) { blockRefs.Add((BlockReference)tr.GetObject(brId, OpenMode.ForRead)); } } return blockRefs .SelectMany(br => br.DynamicBlockReferencePropertyCollection .Cast<DynamicBlockReferenceProperty>() .Where(prop => prop.PropertyTypeCode == 5)) // <- filtre la propriété "état de visibilité" .ToLookup(prop => (string)prop.Value) .ToDictionary(grp => grp.Key, grp => grp.Count()); } } Par contre, en LISP (ActiveX) il me semble qu'il n'existe pas d'équivalent (voir ici).
  17. Salut, Le code que j'ai posté est une méthode qui collecte tous les blocs du dessin dont le nom correspond à l'argument blockName, les regroupe par valeur égale pour la propriété correspond à l'argument propName et retourne un dictionnaire avec une entrée par groupe dont la valeur est le nombre d’occurrences de blocs ayant cette valeur pour cette propriété. Un exemple de commande qui appelle cette méthode. [CommandMethod("TEST", CommandFlags.UsePickSet)] public void Test() { var doc = Application.DocumentManager.MdiActiveDocument; var db = doc.Database; var ed = doc.Editor; var options = new PromptStringOptions("\nEntrez le nom du bloc: "); options.AllowSpaces = true; var result = ed.GetString(options); if (result.Status != PromptStatus.OK) return; var blockName = result.StringResult; options.Message = "\nEntrez le nom de la propriété: "; result = ed.GetString(options); if (result.Status != PromptStatus.OK) return; var propName = result.StringResult; try { foreach (var item in CountByDynamicPropertyValue(db, blockName, propName)) { ed.WriteMessage($"\n{item.Key} : {item.Value}"); } } catch(System.Exception ex) { ed.WriteMessage($"\nErreur: {ex.Message}"); } }
  18. Salut, Si j'ai bien compris la question /// <summary> /// Compte les blocs dynamiques groupés par valeur de la propriété spécifiée. /// </summary> /// <param name="db">Base de données du dessin dans lequel s'appliquela méthode.</param> /// <param name="blockName">Nom du bloc.</param> /// <param name="propertyName">Nom de la propriété.</param> /// <returns>Un dictionnaire de paires clé/valeur : valeur de la propriété/nombre d'occurences.</returns> private Dictionary<object, int> CountByDynamicPropertyValue(Database db, string blockName, string propertyName) { using (var tr = db.TransactionManager.StartOpenCloseTransaction()) { var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); if (!bt.Has(blockName)) throw new ArgumentException($"Le bloc '{blockName}' est introuvable."); var btr = (BlockTableRecord)tr.GetObject(bt[blockName], OpenMode.ForRead); if (!btr.IsDynamicBlock) throw new InvalidOperationException($"Le bloc '{blockName} n'est pas un bloc dynamique."); var blockRefs = new List<BlockReference>(); foreach (ObjectId brId in btr.GetBlockReferenceIds(true, false)) { blockRefs.Add((BlockReference)tr.GetObject(brId, OpenMode.ForRead)); } foreach (ObjectId anonymBtrId in btr.GetAnonymousBlockIds()) { var anonymBtr = (BlockTableRecord)tr.GetObject(anonymBtrId, OpenMode.ForRead); foreach (ObjectId brId in anonymBtr.GetBlockReferenceIds(true, false)) { blockRefs.Add((BlockReference)tr.GetObject(brId, OpenMode.ForRead)); } } return blockRefs .SelectMany(br => br.DynamicBlockReferencePropertyCollection .Cast<DynamicBlockReferenceProperty>() .Where(prop => prop.PropertyName == propertyName)) .ToLookup(prop => prop.Value) .ToDictionary(grp => grp.Key, grp => grp.Count()); } }
  19. On peut toujours utiliser Autodesk screencast pour enregistrer et stocker les vidéos sur leur serveur et mettre ensuite le lien su CADxp.
  20. (initget "Oui Non") (if (setq choix (getkword (strcat "\nEffacer l'ancien bloc [Oui/Non] ? <" (cond ((vlax-ldata-get "DenisH" "EffAncBlk")) ((vlax-ldata-put "DenisH" "EffAncBlk" "Oui")) ; <- initialisation au premier appel ) ">: " ) ) ) (vlax-ldata-put "DenisH" "EffAncBlk" choix) (setq choix (vlax-ldata-get "DenisH" "EffAncBlk")) )
  21. Salut, Avec juste un peu de logique et la syntaxe qui génèrera un affichage cohérent aussi bien en invite de commande qu'avec la saisie dynamique : (initget "Oui Non") (if (/= (getkword "\nEffacer l'ancien bloc [Oui/Non]? <Oui>: ") "Non") (alert "On efface !") ; remplacer par : (entdel ancienBloc) (alert "On n'efface pas !") )
  22. Salut, S'il n'y a pas de majuscules dans les mots clés initialisés avec initget ce sont les chiffres qui tiennent lieu de raccourci. Donc, ceci est suffisant : (initget "a1 a2") (if (not (setq rep (getkword "\nType de bordure [A1/A2] <A1> : "))) (setq rep "a1") ) ou, plus élégamment : (initget "a1 a2") (setq rep (cond ((getkword "\nType de bordure [A1/A2] <A1> : ")) ("a1") ) )
  23. (gile)

    Sélection dernier multiple

    Salut, L'option Dernier (_Last) récupère la dernière entité créée. L'option Précédent (_Previous) récupère la sélection précédente.
  24. Salut, Ci-dessous trois façons d'écrire ce LISP avec des techniques différentes. Toutes trois fonctionnent chez moi et il serait étonnant que ce ne soit pas le cas ailleurs (excepté sur MAC où la technique "Visual LISP" ne peut pas fonctionner). Toutes trois utilisent les noms d'étiquette tels que définis dans le bloc "Info20" (minuscules accentuées). J'ai ajouté un contrôle de validité des blocs sélectionnés. AutoLISP classique (entget, entnext, entmod) (defun c:COPATTRIB (/ source target elst aire perim) (if (and (setq source (car (entsel "\nSélectionnez le bloc source: "))) (= (cdr (assoc 0 (setq elst (entget source)))) "INSERT") (= (cdr (assoc 2 elst)) "Info20") (setq target (car (entsel "\nSélectionnez le bloc cible: "))) (= (cdr (assoc 0 (setq elst (entget target)))) "INSERT") (= (cdr (assoc 2 elst)) "Nom_Local_GHdC" ) ) (progn (while (and (setq source (entnext source)) (= (cdr (assoc 0 (setq elst (entget source)))) "ATTRIB") ) (cond ((= (cdr (assoc 2 elst)) "Aire") (setq aire (cdr (assoc 1 elst))) ) ((= (cdr (assoc 2 elst)) "Périmètre") (setq perim (cdr (assoc 1 elst))) ) ) ) (while (and (setq target (entnext target)) (= (cdr (assoc 0 (setq elst (entget target)))) "ATTRIB") ) (cond ((= (cdr (assoc 2 elst)) "AIRE") (entmod (subst (cons 1 aire) (assoc 1 elst) elst)) ) ((= (cdr (assoc 2 elst)) "PERIMETRE") (entmod (subst (cons 1 perim) (assoc 1 elst) elst)) ) ) ) ) ) (princ) ) Visual LISP (interface COM avec fonction vla-* et vlax-*) (defun c:COPATTRIB (/ source target aire perim) (vl-load-com) (if (and (setq source (car (entsel "\nSélectionnez le bloc source: "))) (= (vla-get-ObjectName (setq source (vlax-ename->vla-object source))) "AcDbBlockReference") (= (vla-get-EffectiveName source) "Info20") (setq target (car (entsel "\nSélectionnez le bloc cible: "))) (= (vla-get-ObjectName (setq target (vlax-ename->vla-object target))) "AcDbBlockReference") (= (vla-get-EffectiveName target) "Nom_Local_GHdC") ) (progn (foreach att (vlax-invoke source 'GetAttributes) (if (= (vla-get-TagString att) "Aire") (setq aire (vla-get-TextString att)) ) (if (= (vla-get-TagString att) "Périmètre") (setq perim (vla-get-TextString att)) ) ) (foreach att (vlax-invoke target 'GetAttributes) (if (= (vla-get-TagString att) "AIRE") (vla-put-TextString att aire) ) (if (= (vla-get-TagString att) "PERIMETRE") (vla-put-TextString att perim) ) ) ) ) (princ) ) Fonction AutoLISP MAC (getpropertyvalue et setporpertyvalue) (defun c:COPATTRIB (/ source target) (if (and (setq source (car (entsel "\nSélectionnez le bloc source: "))) (= (getpropertyvalue source "LocalizedName") "Référence de bloc") (= (getpropertyvalue (getpropertyvalue source "BlockTableRecord") "Name") "Info20") (setq target (car (entsel "\nSélectionnez le bloc cible: "))) (= (getpropertyvalue target "LocalizedName") "Référence de bloc") (= (getpropertyvalue (getpropertyvalue target "BlockTableRecord") "Name") "Nom_Local_GHdC") ) (progn (setpropertyvalue target "AIRE" (getpropertyvalue source "Aire")) (setpropertyvalue target "PERIMETRE" (getpropertyvalue source "Périmètre")) ) ) (princ) )
  25. Si tu ouvres le bloc dans l'éditeur de bloc (_BEDIT) pour accéder à sa définition, tu peux sélectionner une définition d'attribut et renommer son étiquette dans la palette de propriétés avec des minuscules (ou des majuscules) accentuées. C'est le comportement de la fonction AutoLISP strcase, mais je ne dirais pas que c'est NORMAL (mais plutôt qu'on a pu s'y habituer), car ça n'est pas vrai avec .NET par exemple : ("Périmètre").ToUpper(); retourne "PÉRIMÈTRE". Et, curieusement en AutoLISP : (strcase "PÉRIMÈTRE" T) retourne "périmètre"... Donc pourquoi le passage de minuscules en majuscules supprime les accents alors que l'inverse ne le fait pas ? L'histoire de l'encodage des caractères est longue est complexe. Pour faire court et simple, au début, il n'y a qu'une norme : ASCII à 7 bits soit 128 caractères et aucune lettre accentuée. Pour palier à ça, le codage est ensuite étendu à 8 bits (256 caractères) mais ça reste insuffisant pour coder toutes les lettres accentuées (pas seulement celles qu'on utilise français), on va donc multiplier les normes en fonctions des besoins qui diffèrent d'une langue à l'autre. Dans un premier temps toutes conservent les 128 premiers caractères mais diffèrent pour les caractères 128 à 255 suivant la norme (ANSI est une de ces norme). Enfin, pour palier à la multiplication des normes on a créé le code Unicode dont les 256 premiers caractères sont ceux du code ANSI et les suivants pour les alphabets non latins et idéogrammes (voir ici).
×
×
  • 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é