lecrabe Posté(e) le 2 mars 2021 Auteur Partager Posté(e) le 2 mars 2021 Hello Luna Voila ce qui "sort" de la commande ATTOUT pour 6 Blocs "TRIODE" ayant 2 attributs : PVALUE et PNAME >>HANDLE BLOCKNAME PVALUE PNAME'1A2 TRIODE 6SN7 V91'1A6 TRIODE 6SN7 V91'212 TRIODE 6SN7 V11'216 TRIODE 6SN7 V11'280 TRIODE 6SN7 V01'284 TRIODE 6SN7 V01>> Au fait c le caractere special TAB qui separe les colonnnes et non pas un Blanc/Espace ! Donc on monte ce fichier TXT dans Excel ...On ne touche surtout pas aux 2 premieres colonnes et on modifie "a volonte" le contenu des colonnes 3 et 4 ...On re-enregistre le fichier TXT ... Puis ATTIN, et les attributs eventuellement modifies dans Excel, sont "re-injectes" dans les Blocs ... C Tip-Top ! A imaginer avec des attributs contenant : X , Y , Z , XYZSCALE (ou XSCALE / YSCALE / ZSCALE) , ROTATION En effet ROTATION pose "probleme" !A mon avis, le plus simple : imposer le fait que le DWG courant est en Mode Trigo-Math :Zero a l Est, sens inverse des aiguilles d une montre, etc ... Demander au debut simplement si le contenu de l attribut ROTATION est :- soit en Mode Trigo-Math et imperativement en Degres decimaux (0-360 degres)- soit en Mode Geometre donc imperativement en Grades (Zero au Nord et sens des aiguilles, 0-400 grades) La Sante, Bye, lecrabe "fatigue" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
Luna Posté(e) le 5 mars 2021 Partager Posté(e) le 5 mars 2021 (modifié) Coucou, Bon du coup j'ai bien avancé sur la généralisation de la demande avec la commande ATTPROPERTIES : ;; CODE INCORRECT cf. post#32 ;; Donc si une âme charitable était en mesure de me faire cette fonction inverse chat serait vraiment instructif ! <3Autrement, la commande ci-dessus fonctionne correctement chez moi, mais je n'ai pas forcément le temps de la tester en profondeur et encore moins de la pousser dans ses retranchements pour en déterminer ses limites donc si jamais cela vous intéresse, un petit backup m'aiderait beaucoup ! Je vais essayer de générer une Aide un peu plus fournie pour déterminer les valeurs acceptables par le programme pour fonctionner et également si vous avez des remarques sur d'éventuelles informations supplémentaires (voire fonctionnalités supplémentaires) n'hésitez pas !! Bisous,Luna Modifié le 5 mars 2021 par Luna Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 5 mars 2021 Auteur Partager Posté(e) le 5 mars 2021 Hello Luna WAOUH tu bosses a 01h-02H du matin ! Donc tu es aux Antilles en Mode Cool / Zen ... Main droite tu degustes un Ananas ... Main gauche une Pina Colada !? Je vais essayer de te faire un retour des que possible ... MERCI, La Sante, Bye, lecrabe "fatigue" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
Luna Posté(e) le 5 mars 2021 Partager Posté(e) le 5 mars 2021 Coucou, Disons que l'exercice était vraiment intéressant sur de nombreux points alors mon cerveau moulinait beaucoup trop pour pouvoir dormir correctement et ayant beaucoup de travail, fallait bien trouver des heures libres xDMais maintenant chat va beaucoup mieux ! D'ailleurs je n'étais pas bien réveillée hier soir car j'ai complètement raté l'utilisation de la fonction (dcl_PAtoCI) et sur la génération de la BdL donc j'ai corrigé le programme (encore) pour qu'il n'y ait plus de soucis :3 Bon après pour le principe, elle reste encore incomplète sur certains point et notamment la définition des valeurs d'attribut, je ne sais pas si les valeurs que j'ai autorisée sont correctes ou bien si l'on peut générer des erreurs.Donc merci pour vos retours ! <3 Bisous,Luna Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 5 mars 2021 Auteur Partager Posté(e) le 5 mars 2021 Hello Luna 1) Voir mon DWG de Test joint ... Multiples Blocs CLASSIC (NON Dynamic) avec multiples attributs pour tester des cas differents ! 2) Soit je ne sais pas utiliser ton Lisp, soit il y a un autre truc !? 3) SVP tu regardes en haut a gauche les Blocs nommes : C_XY , C_XYZ , C_XY_XSCYSCavec les attributs qui vont bien, remplis par des valeurs numeriques ... 4) Je selectionne un Bloc de Reference puis LES Blocs concernes ...ET malheureusement, il ne se passe RIEN !! Au fait je suis avec AutoCAD 2022 Beta RC US/English et IDEM avec AutoCAD MAP 2021 French ... >>Command: ATTPROPERTIES[]============= LANCEMENT DE ATTPROPERTIES =============[]Initialisation en cours...Selectionner le bloc referent [ Nom ] :Veuillez selectionner les blocs du nom de "C_XY_XSCYSC", ENTER pour selectionner toutes les occurrences.Select objects: Specify opposite corner: 2 foundSelect objects:ATTSYNC complete.Fin de l'execution...Un total de 2 bloc(s) denommes "C_XY_XSCYSC" ont ete traites a partir des attributs suivants : - X - XSCALE - Y - YSCALE>> MERCI, La Sante, Bye, lecrabe "fatigue"Bloc_Luna_0.zip Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 5 mars 2021 Auteur Partager Posté(e) le 5 mars 2021 Hello J ai progresse ... Mauvaise utilisation de ta routine !Je coche dans la colonne de gauche, les ATTRs a traiter ...Puis des que je coche dans la colonne centrale la 1ere propriete correspondante : bad argument type: stringp nil La Sante, Bye, lecrabe "fatigue" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
Luna Posté(e) le 5 mars 2021 Partager Posté(e) le 5 mars 2021 (modifié) Vui, tout était fonctionnel hier soir, puis j'ai eu une soudaine envie de simplifier le code sans re-tester ensuite avant de le publier sur CADxp >w< Pour couronner le tout, j'ai un bug d'incrémentation de variable pour le moins étrange donc il m'est impossible de tester mon programme correctement... ;--- Nom de la commande []-----------------------[] AttProperties []-----------------------[] ; ;--- Date de création > 02/03/2021 ; ;--- Dernière modification > 05/03/2021 ; ;--- Auteur(e) > Luna ; ;--- Version > 1.0.3 ; ;--- Classe > "DtObj" ; ; ; ;--- But et domaine d'application ; ; > En raison du nombre important de demandes pour modifier les propriétés des blocs standards et/ou dynamiques à partir des valeurs contenues dans des attributs, il s'est avéré utile de généraliser ces multiples demandes ; ; en une unique commande. Cette commande se doit d'être suffisamment intuitive, simple d'utilisation, complète dans son domaine d'exécution et rapide. Le principe de la commande est simple puisqu'après avoir sélectionner un ; ; bloc référent (possédant des attributs), il suffit de définir les attributs ayant une relation directe avec une propriété modifiable depuis la liste DXF d'une référence de bloc et de lui associer la propriété adéquate via ; ; une boîte de dialogue. Grâce à la variable globale *BdD-Return*, le nom de la définition de bloc ainsi que les données paramétrées dans la boîte de dialogue sont conservée pour la session et par dessin. Cela permet de ; ; lancer plusieurs fois la commande sans devoir paramétrer de nouveau l'ensemble des données. ; ; Cette commande est applicable dans de nombreux domaines comme par exemple l'attribut "ALT" ayant un lien direct avec la position Z de chaque point topo. ; ; ; ;--- Fonctionnement global ; ; > La commande se décompose en 3 temps : ; ; - Sélection d'un bloc référent selon certains critères ; ; Aucune distinction entre un bloc standard ou dynamique (exclusion des réseaux grâces à la présence obligatoire d'attributs) et une boucle est définie pour s'assurer d'une sélection, sans mettre fin à ; ; l'exécution du programme prématurément. En fonction de la première exécution ou non de la commande, une valeur par défaut sera disponible pour s'épargner la sélection d'un bloc (dessin ou liste). ; ; Ainsi, au premier lancement, la sélection autorisée d'un bloc référent se fera soit par sélection d'un bloc visible dans l'espace de travail du dessin en cours, soit au travers d'une liste à choix unique ; ; parmi l'ensemble des définitions de blocs présentes dans le dessin en cours (= option "Nom"). ; ; Pour les exécutions suivantes, les mêmes choix seront disponibles ainsi qu'une valeur par défaut (= ENTER à vide) correspondant à la précédente définition de bloc utilisée par le programme. ; ; ; ; - Définition des relations entre valeur d'attribut et propriétés ; ; Une boîte de dialogue découpée en 3 colonnes va permettre l'attribution des propriétés en fonction du nom de l'attribut. Ainsi la première colonne correspond à la liste des attributs du bloc référent, qui ; ; se présente sous la forme d'une liste de cases à cocher ou décocher pour déterminer si oui ou non le programme devra travailler avec cet attribut. La seconde colonne permet donc de définir la liaison ou ; ; l'association entre chaque attribut sélectionné et une propriété de la référence de bloc. La dernière colonne permet uniquement d'apporter des informations complémentaires en fonction de la propriété choisie.; ; Il est tout à fait possible de sélectionner un ou plusieurs attributs mais chaque attribut ne peut être lié qu'à une seule propriété. Il est également possible d'affecter une même propriété à plusieurs ; ; attributs différents, bien que cela ne vaudra qu'à définir la propriété via la dernière occurrence fonctionnelle parmi la liste. ; ; Il est possible de mettre fin au programme en sélectionnant le bouton "Cancel". Une "Aide" est disponible au besoin (en cours d'édition pour plus d'information). Pour continuer, il suffit de "valider". ; ; ; ; - Sélection des références de blocs devant être mises à jour ; ; Pour cela, 2 niveaux de sélection sont définis par le programme. Si le 1er niveau est vide, le 2nd niveau sera alors exécuté et si le 2nd niveau est vide également, le programme s'arrête. ; ; Le niveau 1 correspond à une sélection manuelle des blocs (la pré-sélection est possible au besoin) qui sera alors filtrée de telle sorte que seuls les blocs possédant des attributs et portant le nom du bloc ; ; référent (+ blocs anonymes dynamiques) soient autorisés. Si l'utilisateur appuie sur ENTER, le 2nd niveau s'enclenche pour cette fois-ci sélectionner la totalité des références portant ce nom-là. ; ; Chaque référence sera alors modifiée en fonction de la valeur des attributs spécifiés auparavant pour mettre à jour les propriétés. Certaines propriétés nécessitent des informations supplémentaires comme par ; ; exemple il est possible de mettre un bloc uniformément à l'échelle en ne définissant qu'un seul attribut grâce au complément d'information "Echelle uniforme". Attention également à la propriété de couleur ou ; ; aux unités choisies pour la rotation (l'axe 0 et le sens angulaire sont différents entre des angles en degrés ou en grades !). ; ; ; ;--- Modifications apportées par rapport à la version précédente ; ; > Correction de bugs mineurs et reprise de la version 1.0.1 en raison d'un bug récurent insolvable ! ; ; ; (defun c:ATTPROPERTIES (/ *error* flt_tbl get-att-list ListBox dcl_accept dcl_help dcl_PAtoCI LM:RGB->True LM:RGB->ACI LM:acapp ;--- Définition locale de fonctions ;; jsel ;--- Variables locales pour jeux de sélection ;; name file ;--- Variables locales pour nom d'entités ;; lst att-list tmp-list ;--- Variables locales pour listes ;; att tag value filename p ;--- Variables locales pour chaînes de caractères ;; i n dcl_ID r g b ;--- Variables locales pour valeurs numériques ;; input x v a ;--- Variables locales pour entrées utilisateur ;; ; *BdD-Return* ;--- Variables globales pour conservations des données ;; ) (prompt (strcat "\n[]============= LANCEMENT DE ATTPROPERTIES =============[]" "\nInitialisation en cours..." "\n" ) ) ;; Début de la définition de la fonction (*error*), qui est une fonction AutoCAD existante donc impérativement la déclarer en variable locale ! ;; (defun *error* (msg) (if file (setq file (close file))) ;--- Ferme le fichier .dcl si ouvert ;; (if filename (setq filename (vl-file-delete filename))) ;--- Supprime le fichier .dcl si existant ;; (prompt msg) ;--- Affiche l'erreur qu'AutoCAD a enregistré en dernier ;; (princ) ) ; End of (defun *error*) ;; ;; Début de la définition de la fonction (flt_tbl) ;; (defun flt_tbl (tbl search / lst name) (while (setq name (tblnext tbl (not name))) (if (wcmatch (strcase (setq name (cdr (assoc 2 name)))) (strcase search)) (setq lst (cons name lst)) ) ) lst ) ; End of (defun flt_tbl) ;; ; Début de la définition de la fonction (get-att-list) ;; (defun get-att-list (name / ent att-list) (if (= (cdr (assoc 0 (entget name))) "BLOCK") (progn (setq ent (cdr (assoc -2 (entget name)))) (while ent (if (= (cdr (assoc 0 (entget ent))) "ATTDEF") (setq att-list (cons (cdr (assoc 2 (entget ent))) att-list)) ) (setq ent (entnext ent)) ) ) ) att-list ) ; End of (defun get-att-list) ;; ;--- LISP de bonusCAD publié sur CADXP.com le 11/01/2016 11:34 ;; ;--- Version modifiée de la fonction (ListBox), possède 5 arguments ;; ;--- title correspond à l'entête de la boîte de dialogue ;; ;--- msg correspond au message affiché au dessus de la liste ;; ;--- lst correspond à la liste à afficher ;; ;--- value correspond à la valeur définie par défaut ;; ;--- flag correspond au type de liste souhaitée ;; ; flag = 0 -> liste déroulante (choix unique) ;; ; flag = 1 -> liste avec barre de défilement (choix unique) ;; ; flag = 2 -> liste avec barre de défilement (choix multiple) ;; ; Renvoie la liste des calques ayant été sélectionnés ;; (defun ListBox (title msg lst value flag / str2lst tmp file DCL_ID choice) ;--- LISP de bonusCAD publié sur CADXP.com le 11/01/2016 11:34 ;; ;--- Nécessaire au bon fonctionnement de la fonction (ListBox) ci-dessus ;; (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) ; End of (defun str2lst) ;; (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "ListBox:dialog{width=" (itoa (+ (apply 'max (mapcar 'strlen (mapcar 'vl-princ-to-string lst))) 5)) ";label=\"" title "\";") file ) (if (and msg (/= msg "")) (write-line (strcat ":text{label=\"" msg "\";}") file) ) (write-line (cond ((= 0 flag) "spacer;:popup_list{key=\"lst\";") ((= 1 flag) "spacer;:list_box{height=15;key=\"lst\";") (t "spacer;:list_box{height=15;key=\"lst\";multiple_select=true;") ) file ) (write-line "}spacer;ok_cancel;}" file) (close file) (setq DCL_ID (load_dialog tmp)) (if (not (new_dialog "ListBox" DCL_ID)) (exit) ) (start_list "lst") (mapcar 'add_list lst) (end_list) (set_tile "lst" (if (member value lst) (itoa (vl-position value lst)) (itoa 0))) (action_tile "accept" "(or (= (get_tile \"lst\") \"\") (if (= 2 flag) (progn (foreach n (str2lst (get_tile \"lst\") \" \") (setq choice (cons (nth (atoi n) lst) choice)) ) (setq choice (reverse choice)) ) (setq choice (nth (atoi (get_tile \"lst\")) lst)) ) ) (done_dialog)" ) (start_dialog) (unload_dialog DCL_ID) (vl-file-delete tmp) choice ) ; End of (defun ListBox) ;; ;; Début de la définition de la fonction (dcl_accept) ;; (defun dcl_accept (att-list lst / a r) (foreach a (reverse att-list) (if (= (get_tile a) "1") (setq r (cons (list a (nth (atoi (get_tile (strcat "pa:" a))) (mapcar 'car lst)) (atoi (get_tile (strcat "ci:" a)))) r)) ) ) r ) ; End of (defun dcl_accept) ;; ;; Début de la définition de la fonction (dcl_help) ;; (defun dcl_help (/ p) (alert (strcat "La commande ATTPROPERTIES permet l'édition de certaines propriétés à partir de la valeur des attributs spécifiés pour chaque référence de bloc." "\nPour se faire, il suffit de renseigner les attributs à prendre en compte et de leur relation avec les propriétés via cette boîte de dialogue." "\nElle se décompose en 3 colonnes distinctes :" "\n[]**********************************************************************[]" "\n \"Liste des attributs\" :" "\n Permet de sélectionner le(s) attributs que l'on souhaite utiliser pour redéfinir les propriétés des références de blocs." " Pour cela, une simple case à cocher/décocher permet d'activer ou non la relation vers la propriété." "\n[]**********************************************************************[]" "\n \"Propriété associée\" :" "\n Permet de sélectionner dans une liste déroulante l'une des propriétés modifiable que l'on souhaite redéfinir en fonction de la valeur de l'attribut situé à sa gauche." " Pour cela, choisir la propriété adaptée à notre besoin dans la liste des choix possibles (cf. ci-dessous). Attention à bien sélectionner les propriétés pour déclencher la 3ème colonne type !" "\n[]**********************************************************************[]" "\n \"Compléments d'information\" :" "\n Certaines propriétés peuvent s'avérer plus complexes que d'autres et nécessitent un certain formatage ou d'informations supplémentaires pour fonctionner correctement." " En fonction du nom de la propriété, ces informations complémentaires seront requises autrement la liste déroulante sera grisée." "\n" "\nVoici la liste actuelle des propriétés définies :" (apply 'strcat (mapcar '(lambda (p) (strcat "\n - " (car p))) lst)) "\n" "\n***L'aide concernant la définition des valeurs acceptées par le programme en fonction des propriétés est en cours d'édition !***" "\n" "\nAuteur(e) : Luna" "\nDate : 05/03/2021" "\nVersion : 1.0.2" ) ) ) ; End of (defun dcl_help) ;; ;; Début de la définition de la fonction (dcl_PAtoCI) ;; (defun dcl_PAtoCI (v a /) (cond ((= v "0") (mode_tile (strcat "ci:" a) 0) (start_list (strcat "ci:" a)) (mapcar 'add_list '("AutoCAD Color Index" "RGB")) (end_list) ) ((member v '("9" "10" "11")) (mode_tile (strcat "ci:" a) 0) (start_list (strcat "ci:" a)) (mapcar 'add_list '("Echelle non uniforme" "Echelle uniforme")) (end_list) ) ((= v "12") (mode_tile (strcat "ci:" a) 0) (start_list (strcat "ci:" a)) (mapcar 'add_list '("Degrés" "Grades")) (end_list) ) (t (mode_tile (strcat "ci:" a) 1) (start_list (strcat "ci:" a)) (mapcar 'add_list '("")) (end_list) ) ) ) ; End of (defun dcl_PAtoCI) ;; ;; RGB -> True - Lee Mac ;; ;; Args: r,g,b - [int] Red, Green, Blue values ;; (defun LM:RGB->True ( r g b ) (logior (lsh (fix r) 16) (lsh (fix g) 8) (fix B)) ) ; End of (defun LM:RGB->True) ;; ;; RGB -> ACI - Lee Mac ;; ;; Args: r,g,b - [int] Red, Green, Blue values ;; (defun LM:RGB->ACI ( r g b / c o ) (if (setq o (vla-getinterfaceobject (LM:acapp) (strcat "autocad.accmcolor." (substr (getvar 'acadver) 1 2)))) (progn (setq c (vl-catch-all-apply '(lambda ( ) (vla-setrgb o r g B) (vla-get-colorindex o)))) (vlax-release-object o) (if (vl-catch-all-error-p c) (prompt (strcat "\nError: " (vl-catch-all-error-message c))) c ) ) ) (defun LM:acapp nil (eval (list 'defun 'LM:acapp 'nil (vlax-get-acad-object))) (LM:acapp) ) ) ; End of (defun LM:RGB->ACI) ;; ;; ;; ;; Définition de la liste de correspondance entre les noms de propriété et le code DXF référent ;; ;; ;; (setq lst (list ;;; "Général" ; "General" ;; '("Couleur" 62) ; '("Color" 62) ;; '("Calque" 8) ; '("Layer" 8) ;; '("Type de ligne" 6) ; '("Linetype" 6) ;; '("Epaisseur de ligne" 370) ; '("Lineweight" 370) ;; '("Transparence" 440) ; '("Transparency" 440) ;; ;;; "Visualisation 3D" ; "3D Visualization" ;; '("Matériau" 347) ; '("Material" 347) ;; ;;; "Géométrie" ; "Geometry" ;; '("Position X" 10) ; '("Position X" 10) ;; '("Position Y" 10) ; '("Position Y" 10) ;; '("Position Z" 10) ; '("Position Z" 10) ;; '("Echelle X" 41) ; '("Scale X" 41) ;; '("Echelle Y" 42) ; '("Scale Y" 42) ;; '("Echelle Z" 43) ; '("Scale Z" 43) ;; ;;; "Divers" ; "Miscs" ;; '("Rotation" 50) ; '("Rotation" 50) ;; ) ) (setq tmp-list (flt_tbl "BLOCK" "*") ;--- Génère la liste de l'ensemble des définitions de blocs du dessin courant ;; ) ;; ;; ;; Définitition obligatoire d'un bloc de référence et récuperation de l'EffectiveName du bloc ainsi que la liste des attributs de ce dernier ;; ;; ;; (while (not (and (cond ( (and *BdD-Return* ; Dans le cas d'un second lancer, permet d'utiliser l'ancienne valeur par défaut ;; (not (progn (initget "Nom") (setq input (entsel (strcat "\nSélectionner le bloc référent [ Nom ] <" (car *BdD-Return*) "> : "))) ) ) ) (setq input (car *BdD-Return*)) ) ( (and (not *BdD-Return*) ; Dans le cas du premier lancement de la commande, aucune valeur par défaut ;; (progn (initget "Nom") (setq input (entsel "\nSélectionner le bloc référent [ Nom ] : ")) ) ) input ) (input t) ) (cond ((= input "Nom") ; Si l'on choisi le keyword "Nom", permet de sélectionner un nom de bloc via BdD ;; (setq input (ListBox "Sélection du bloc de référence" "Veuillez choisir le nom du bloc de référence" tmp-list nil 1 ) ;--- Génération d'une boîte de dialogue pour la sélection d'un bloc de référence ;; ) ) ((listp input) ; Si l'utilisateur a sélectionné un objet dans le dessin et non un keyword ;; (setq input (car input)) (if (and (= (cdr (assoc 0 (entget input))) "INSERT") ;--- Vérifie qu'il s'agit d'un bloc ;; (assoc 66 (entget input)) ;--- Vérifie qu'il possède des attributs ;; ) (setq input (getpropertyvalue input "BlockTableRecord/Name")) ;--- Récupération de l'EffectiveName ;; (setq input nil) ;--- Retour dans la boucle car objet incorrect ;; ) ) ((= (type input) 'STR) input) ; Si l'utilisateur utilise la valeur par défaut, déjà fonctionnelle auparavant ;; ) (setq name (tblobjname "BLOCK" input)) ; Vérification de l'existance d'un bloc portant ce nom ;; (setq att-list (get-att-list name)) ; Récupération de la liste de l'ensemble des noms d'attributs de la définition de bloc ;; )) ; End of (not (and [...] ) ) ;; (prompt "\nSélection invalide.") ) ; End of (while [...] ) destiné à la sélection obligatoire d'un bloc de référence pour récupérer le nom et la liste des attributs du bloc ;; ;; ;; ;; Ecriture du fichier .dcl temporaire et lancement de la boîte de dialogue pour la bonne exécution du programme ;; ;; ;; (if (and (setq filename (vl-filename-mktemp "DCL-ATTPROPERTIES.dcl")) (setq file (open filename "W")) (mapcar '(lambda (l) (write-line l file)) (list (strcat "BdDAttProperties:dialog {label=\"Boîte de dialogue : Attribution des propriétés de \\\"" input "\\\"\";") (strcat " :row {") (strcat " :boxed_column {") (strcat " label= \"Liste des attributs\";") (strcat " fixed_width= true;") (strcat " width= " (itoa (+ (apply 'max (mapcar 'strlen att-list)) 5)) ";") (apply 'strcat (mapcar '(lambda (a) (strcat " :toggle{" "\n" " label= \"\\\"" a "\\\"\";" "\n" " key= \"" a "\";" "\n" " }" ) ) (vl-sort att-list '<) ) ; End of (mapcar [...]) destiné à générer une case à cocher pour chaque attribut ;; ) ; End of (apply [...]) pour l'adaptativité de la boîte de dialogue en fonction des attributs du bloc référent ;; (strcat " }") (strcat " :boxed_column {") (strcat " label= \"Propriété associée\";") (strcat " fixed_width= true;") (strcat " width= " (itoa (+ (apply 'max (mapcar 'strlen (mapcar 'car lst))) 5)) ";") (apply 'strcat (mapcar '(lambda (p) (strcat " :popup_list{" "\n" " key= \"pa:" p "\";" "\n" " }" ) ) (vl-sort att-list '<) ) ; End of (mapcar [...]) destiné à générer une liste déroulante pour chaque attribut ;; ) ; End of (apply [...]) pour l'adaptativité de la boîte de dialogue en fonction des attributs du bloc référent ;; (strcat " }") (strcat " :boxed_column {") (strcat " label= \"Complément d'information\";") (strcat " fixed_width= true;") (strcat " width= " (itoa 30) ";") (apply 'strcat (mapcar '(lambda (c) (strcat " :popup_list{" "\n" " label= \"Type \";" "\n" " key= \"ci:" c "\";" "\n" " }" ) ) (vl-sort att-list '<) ) ; End of (mapcar [...]) destiné à générer une liste déroulante pour chaque attribut ;; ) ; End of (apply [...]) pour l'adaptativité de la boîte de dialogue en fonction des attributs du bloc référent ;; (strcat " }") (strcat " }") (strcat " :spacer{}") (strcat " ok_cancel_help;") (strcat "}") ) ; End of (list [...]) déterminant chaque ligne à écrire dans le fichier .dcl ;; ) ; End of (mapcar [...]) destiné à l'écriture adaptative de la boîte de dialogue en fonction des attributs du bloc référent ;; (null (close file)) (> (setq dcl_ID (load_dialog filename)) 0) (new_dialog "BdDAttProperties" dcl_ID) ) ; End of (and [...]) destiné à la création, écriture et chargement du fichier .dcl temporaire ;; (progn (foreach att (setq att-list (vl-sort att-list '<)) (start_list (strcat "pa:" att)) (mapcar 'add_list (mapcar 'car lst)) (end_list) (set_tile att "0") (if (and *BdD-Return* (= (car *BdD-Return*) input) (member att (mapcar 'car (cdr *BdD-Return*))) ) (progn (set_tile att "1") (set_tile (strcat "pa:" att) (itoa (vl-position (cadr (assoc att (cdr *BdD-Return*))) (mapcar 'car lst)))) (mode_tile (strcat "pa:" att) 0) (dcl_PAtoCI (itoa (vl-position (cadr (assoc att (cdr *BdD-Return*))) (mapcar 'car lst))) att) (set_tile (strcat "ci:" att) (itoa (last (assoc att (cdr *BdD-Return*))))) ) (progn (mode_tile (strcat "pa:" att) 1) (mode_tile (strcat "ci:" att) 1) ) ) (action_tile att (strcat "(if (= \"1\" $value) (progn (mode_tile \"pa:" att "\" 0) (mode_tile \"ci:" att "\" 0) ) (progn (mode_tile \"pa:" att "\" 1) (mode_tile \"ci:" att "\" 1) ) )" ) ) (action_tile (strcat "pa:" att) (strcat "(cond ((= $value \"0\") (mode_tile (strcat \"ci:" att "\") 0) (start_list (strcat \"ci:" att "\")) (mapcar 'add_list '(\"AutoCAD Color Index\" \"RGB\")) (end_list) ) ((member $value '(\"9\" \"10\" \"11\")) (mode_tile (strcat \"ci:" att "\") 0) (start_list (strcat \"ci:" att "\")) (mapcar 'add_list '(\"Echelle non uniforme\" \"Echelle uniforme\")) (end_list) ) ((= $value \"12\") (mode_tile (strcat \"ci:" att "\") 0) (start_list (strcat \"ci:" att "\")) (mapcar 'add_list '(\"Degrés\" \"Grades\")) (end_list) ) (t (mode_tile (strcat \"ci:" att "\") 1) (start_list (strcat \"ci:" att "\")) (mapcar 'add_list '(\"\")) (end_list) ) )" ) ) ) (action_tile "accept" "(setq att-list (dcl_accept att-list lst)) (done_dialog 1)") (action_tile "cancel" "(setq att-list nil) (done_dialog 0)") (action_tile "help" "(dcl_help)") (start_dialog) (unload_dialog dcl_ID) (setq filename (vl-file-delete filename)) (if (and att-list (setq *BdD-Return* (cons input att-list)) ; Conservation des données paramétrées dans la BdD ;; (null (prompt (strcat "\nVeuillez sélectionner les blocs du nom de \"" input "\", ENTER pour sélectionner toutes les occurrences."))) (or (setq jsel (ssget (list '(0 . "INSERT") '(66 . 1) (cons 2 (strcat input ",`*U*"))))) ; Sélection Niveau 1 -> Sélection manuelle filtrée sur des blocs avec attributs et nom correct (ou dyn) ;; (setq jsel (ssget "_X" (list '(0 . "INSERT") '(66 . 1) (cons 2 (strcat input ",`*U*"))))) ; Sélection Niveau 2 -> Sélection totale filtrée sur les blocs avec attributs et nom correct (ou dyn) ;; ) ) (progn (repeat (setq i (sslength jsel)) (setq name (ssname jsel (setq i (1- i)))) (if (= input (getpropertyvalue name "BlockTableRecord/Name")) ; Vérification de l'EffectiveName avec le bloc référent pour la prise en compte des blocs dynamiques ;; (mapcar '(lambda (att / tag property info value n) (setq tag (car att) property (cadr att) info (caddr att) value (getpropertyvalue name tag) n -1 ) (cond ((= property (car (nth 0 lst))) ; Propriété "Color" ;; (cond ( (and (= info 1) ; Type "R,G,B" ;; (wcmatch value "*`,*`,*") (setq p (vl-string-position (ascii ",") value)) (setq r (substr value 1 p)) (setq g (substr value (+ 2 p) (- (vl-string-position (ascii ",") value nil t) (1+ p)))) (setq b (substr value (+ 2 (vl-string-position (ascii ",") value nil t)))) (apply 'and (mapcar '(lambda (c) (and (>= (atoi c) 0) (<= (atoi c) 256))) '(r g B))) ) (if (assoc 62 (entget name)) ; Code DXF "ACI Color" (facultatif) ;; (entmod (subst (cons 62 (LM:RGB->ACI (atoi r) (atoi g) (atoi B))) (assoc 62 (entget name)) (entget name))) (entmod (append (entget name) (list (cons 62 (LM:RGB->ACI (atoi r) (atoi g) (atoi B)))))) ) (if (assoc 420 (entget name)) ; Code DXF "TrueColor" (facultatif) ;; (entmod (subst (cons 420 (LM:RGB->True (atoi r) (atoi g) (atoi B))) (assoc 420 (entget name)) (entget name))) (entmod (append (entget name) (list (cons 420 (LM:RGB->True (atoi r) (atoi g) (atoi B)))))) ) ) ((and (= info 0) (distof value) (>= (atoi value) 0) (<= (atoi value) 256)) ; Type "AutoCAD Color Index (ACI)" ;; (if (assoc 62 (entget name)) ; Code DXF "ACI Color" (facultatif) ;; (entmod (subst (cons 62 (atoi value)) (assoc 62 (entget name)) (entget name))) (entmod (append (entget name) (list (cons 62 (atoi value))))) ) ) ) ) ; End of "Color" property ;; ((= property (car (nth 1 lst))) ; Propriété "Layer" ;; (entmod (subst (cons (cadr (nth 1 lst)) value) (assoc (cadr (nth 1 lst)) (entget name)) (entget name))) ) ; End of "Layer" property ;; ( (and (= property (car (nth 2 lst))) ; Propriété "Linetype" ;; (member (strcase value) (mapcar 'strcase (append (flt_tbl "LTYPE" "*") '("DuCalque" "ByLayer" "DuBloc" "ByBlock")))) ) (if (assoc (cadr (nth 2 lst)) (entget name)) ; Code DXF (facultatif) ;; (entmod (subst (cons (cadr (nth 2 lst)) value) (assoc (cadr (nth 2 lst)) (entget name)) (entget name))) (entmod (append (entget name) (list (cons (cadr (nth 2 lst)) value)))) ) ) ; End of "Linetype" property ;; ( (and (= property (car (nth 3 lst))) ; Propriété "Lineweight" ;; (distof value) ) (if (assoc (cadr (nth 3 lst)) (entget name)) ; Code DXF (facultatif) ;; (entmod (subst (cons (cadr (nth 3 lst)) (atoi value)) (assoc (cadr (nth 3 lst)) (entget name)) (entget name))) (entmod (append (entget name) (list (cons (cadr (nth 3 lst)) (atoi value))))) ) ) ; End of "Lineweight" property ;; ( (and (= property (car (nth 4 lst))) ; Propriété "Transparency" ;; (distof value) ; ATTENTION LA TRANSPARENCE EST ACTUELLEMENT NON FONCTIONNELLE ! ;; (>= (atoi value) -2) ; ATTENTION LA TRANSPARENCE EST ACTUELLEMENT NON FONCTIONNELLE ! ;; (<= (atoi value) 90) ; ATTENTION LA TRANSPARENCE EST ACTUELLEMENT NON FONCTIONNELLE ! ;; ) ) ; End of "Transparency" property ;; ( (and (= property (car (nth 5 lst))) ; Propriété "Material" ;; (not (setq tmp-list nil)) (member (strcase value) (mapcar '(lambda (x) (strcase (car x)) ) (vlax-for x (vla-get-materials (vla-get-activedocument (vlax-get-acad-object))) (setq tmp-list (cons (cons (vlax-get-property x 'Name) (vlax-vla-object->ename x)) tmp-list)) ) ) ) (setq value (cdr (assoc value tmp-list))) ) (if (assoc (cadr (nth 5 lst)) (entget name)) ; Code DXF (facultatif) ;; (entmod (subst (cons (cadr (nth 5 lst)) value) (assoc (cadr (nth 5 lst)) (entget name)) (entget name))) (entmod (append (entget name) (list (cons (cadr (nth 5 lst)) value)))) ) ) ; End of "Material" property ;; ( (and (= property (car (nth 6 lst))) ; Propriété "Position_X" ;; (distof value) (setq value (list (distof value) (caddr (assoc (cadr (nth 6 lst)) (entget name))) (last (assoc (cadr (nth 6 lst)) (entget name))))) ) (entmod (subst (cons (cadr (nth 6 lst)) value) (assoc (cadr (nth 6 lst)) (entget name)) (entget name))) ) ; End of "Position_X" property ;; ( (and (= property (car (nth 7 lst))) ; Propriété "Position_Y" ;; (distof value) (setq value (list (cadr (assoc (cadr (nth 7 lst)) (entget name))) (distof value) (last (assoc (cadr (nth 7 lst)) (entget name))))) ) (entmod (subst (cons (cadr (nth 7 lst)) value) (assoc (cadr (nth 7 lst)) (entget name)) (entget name))) ) ; End of "Position_Y" property ;; ( (and (= property (car (nth 8 lst))) ; Propriété "Position_Z" ;; (distof value) (setq value (list (cadr (assoc (cadr (nth 8 lst)) (entget name))) (caddr (assoc (cadr (nth 8 lst)) (entget name))) (distof value))) ) (entmod (subst (cons (cadr (nth 8 lst)) value) (assoc (cadr (nth 8 lst)) (entget name)) (entget name))) ) ; End of "Position_Z" property ;; ( (and (= property (car (nth 9 lst))) ; Propriété "Scale_X" ;; (distof value) ) (cond ((= info 1) ; Type "Echelle uniforme" ;; (entmod (subst (cons (cadr (nth 9 lst)) (distof value)) (assoc (cadr (nth 9 lst)) (entget name)) (entget name))) ; X ;; (entmod (subst (cons (cadr (nth 10 lst)) (distof value)) (assoc (cadr (nth 10 lst)) (entget name)) (entget name))) ; Y ;; (entmod (subst (cons (cadr (nth 11 lst)) (distof value)) (assoc (cadr (nth 11 lst)) (entget name)) (entget name))) ; Z ;; ) ((= info 0) ; Type "Echelle non uniforme" ;; (entmod (subst (cons (cadr (nth 9 lst)) (distof value)) (assoc (cadr (nth 9 lst)) (entget name)) (entget name))) ; X ;; ) ) ) ; End of "Scale_X" property ;; ( (and (= property (car (nth 10 lst))) ; Propriété "Scale_Y" ;; (distof value) ) (cond ((= info 1) ; Type "Echelle uniforme" ;; (entmod (subst (cons (cadr (nth 9 lst)) (distof value)) (assoc (cadr (nth 9 lst)) (entget name)) (entget name))) ; X ;; (entmod (subst (cons (cadr (nth 10 lst)) (distof value)) (assoc (cadr (nth 10 lst)) (entget name)) (entget name))) ; Y ;; (entmod (subst (cons (cadr (nth 11 lst)) (distof value)) (assoc (cadr (nth 11 lst)) (entget name)) (entget name))) ; Z ;; ) ((= info 0) ; Type "Echelle non uniforme" ;; (entmod (subst (cons (cadr (nth 10 lst)) (distof value)) (assoc (cadr (nth 10 lst)) (entget name)) (entget name))) ; Y ;; ) ) ) ; End of "Scale_Y" property ;; ( (and (= property (car (nth 11 lst))) ; Propriété "Scale_Z" ;; (distof value) ) (cond ((= info 1) ; Type "Echelle uniforme" ;; (entmod (subst (cons (cadr (nth 9 lst)) (distof value)) (assoc (cadr (nth 9 lst)) (entget name)) (entget name))) ; X ;; (entmod (subst (cons (cadr (nth 10 lst)) (distof value)) (assoc (cadr (nth 10 lst)) (entget name)) (entget name))) ; Y ;; (entmod (subst (cons (cadr (nth 11 lst)) (distof value)) (assoc (cadr (nth 11 lst)) (entget name)) (entget name))) ; Z ;; ) ((= info 0) ; Type "Echelle non uniforme" ;; (entmod (subst (cons (cadr (nth 11 lst)) (distof value)) (assoc (cadr (nth 11 lst)) (entget name)) (entget name))) ; Z ;; ) ) ) ; End of "Scale_Z" property ;; ( (and (= property (car (nth 12 lst))) ; Propriété "Rotation" ;; (distof value) ) (cond ((= info 1) ; Type "Grades" (0g = Nord | sens = non-trigo) ;; (entmod (subst (cons (cadr (nth 12 lst)) (/ (* (- 100.0 (distof value)) pi) 200.0)) (assoc (cadr (nth 12 lst)) (entget name)) (entget name))) ) ((= info 0) ; Type "Degrés" (0g = Est | sens = trigo) ;; (entmod (subst (cons (cadr (nth 12 lst)) (/ (* (distof value) pi) 180.0)) (assoc (cadr (nth 12 lst)) (entget name)) (entget name))) ) ) ) ; End of "Rotation" property ;; ) ) att-list ) (setq jsel (ssdel name jsel)) ; Dans le cas d'un bloc dynamique, supprime l'entité du jeu de sélection si l'EffectiveName est différent ;; ) ) (command "_ATTSYNC" "N" input) ; Pour mettre à jour la position des attributs ne se mettant pas à jour obligatoirement après modification de la liste DXF ;; (prompt (strcat "\nFin de l'exécution..." "\nUn total de " (itoa (sslength jsel)) " bloc(s) dénommés \"" input "\" ont été traités à partir des attributs suivants :" (apply 'strcat (mapcar '(lambda (a) (strcat "\n - " (car a))) att-list)) ) ) ) ) ) (exit) ) (princ) ) Essaye avec cela mais si tu as également la variable n qui s'incrémente à chaque évaluation quelconque, je ne sais pas d'où vient le soucis >n<(j'ai littéralement un (setq n -1) et mon espion est en mesure de me dire n = 1, et si j'ai (setq n -1 i 0 lst nil) alors n = 4 !!?!) Bon je vais abandonner la variable n, elle me plante tout...j'ai corrigé le code qui avait un bug sur la position Z.. Bisous,Luna Modifié le 5 mars 2021 par Luna Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 5 mars 2021 Auteur Partager Posté(e) le 5 mars 2021 Hello OK Merci, je regarde cet AM... Avec mon DWG spécial Test... La Santé, Bye, lecrabe "fatigué" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 5 mars 2021 Auteur Partager Posté(e) le 5 mars 2021 Hello WAOUH cela fonctionne sur mon DWG special test !sur les Proprietes : X , Y , Z , XSCALE, YSCALE Apres il faudra que je "corse" un peu plus mes tests ! Au fait est il necessaire que je teste avec des Blocs dynamiques ??Ou bien es tu relativement sure de toi a ce niveau !? Au fait pas encore teste le fameux probl de la ROTATION !? La Santé, Bye, lecrabe "fatigué" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
Luna Posté(e) le 5 mars 2021 Partager Posté(e) le 5 mars 2021 Coucou, J'ai remarqué l'existence d'un code très intéressant, le code DXF 66 !66Variable attributes-follow flag (optional; default = 0); if the value of attributes-follow flag is 1, a series of attribute entities is expected to follow the insert, terminated by a seqend entityJe n'avais pas bien fait attention à ceci mais si un bloc possède des attributs, ce code 66 vaut 1, sinon ce code 66 n'existe pas. Autrement dit, pour un programme qui nécessite obligatoirement de bloc avec attributs ce code est du pain béni car il supprime de ce fait les réseaux anonymisés mais conserve les blocs dynamiques ! Bref j'ai tout de même filtre le nom des blocs comme avant (l'effectiveName + les blocs dynamiques) pour ne conserver que les blocs standard avec la bonne dénomination ou tous les blocs dynamique pour vérifier ensuite.Mais en éjectant les réseaux, je n'ai plus de problème d'erreur sur la récupération de l'EffectiveName donc normalement de ce côté-ci, aucun problème ! Je suis actuellement en train de fournir davantage d'informations utile via le bouton "Help" pour justement savoir le formatage autorisé en fonction des propriétés. Cela permettra d'y voir un peu plus clair ^^" Est-il utile de récupérer une liste beaucoup plus détaillée sur les blocs modifiés (comme par exemple, pour chaque bloc marquer si la liste n'a été mise à jour par rapport à telle propriété pour telle valeur ?) ou cela est suffisant ?Je suis un peu une maniaque des retours sur ligne de commandes donc c'est toujours bien d'avoir un avis externe pour le coup xD Ravie que cette version fonctionne (enfin) même si du coup chat m'a fait de nombreux ctrl+z >w< Bisous,Luna Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 5 mars 2021 Auteur Partager Posté(e) le 5 mars 2021 Hello Suggestions : - Eventuellement signaler le nombre de Blocs selectionnes et le Nombre de Blocs modifies (Au moins UNE propriete !) ---- Poser eventuellement 2 questions au debut ---- - Voulez vous marquer les Blocs modifies (O/N) Defaut = N- Si OUI: Couleur de marquage des Blocs modifies (1-255) Defaut = 11 (Rose) Ainsi cela me parait fort interessant ... Au fait pas encore teste le fameux probl de la ROTATION !? La Santé, Bye, lecrabe "fatigué" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
Luna Posté(e) le 5 mars 2021 Partager Posté(e) le 5 mars 2021 Coucou, Merci pour tes retours !Vouih actuellement je n'ai défini aucune vérification sur la modification réussi ou échouée sur les blocs donc aucun compteur réel de blocs modifiés... J'ai prévu de le rajouter (lorsque j'aurais compris mon problème de n, sûrement un (setq n (1+ n)) en dehors d'un (defun) sur un fichier autoload...) mais je voulais justement savoir si un simple "88 /105 blocs ont été modifiés avec succès" ou si je devais ajouter "Bloc ... (Handle_ID : ...), échec de la modification de propriété \"...\" pour la valeur d'attribut \"...\"" pour chaque erreur rencontrée en gros ^^" Pour la visualisation des blocs modifiés (une fois la vérification de modification réussie), je ne pense pas qu'une couleur forcée soit la solution car cela serait contradictoire avec la propriété "Couleur" redéfinissable...En revanche, ce que je fais très souvent sur mes programmes c'est de rendre active la sélection finale afin de pouvoir les isoler ensuite pour un check-up plus rapide :3 Concernant la propriété de rotation, j'ai pris comme hypothèse tes commentaires- soit en Mode Trigo-Math et imperativement en Degres decimaux (0-360 degres)- soit en Mode Geometre donc imperativement en Grades (Zero au Nord et sens des aiguilles, 0-400 grades)Donc je ne tiens absolument pas compte des unités angulaires du dessin (je pourrais pour la valeur par défaut dans la liste), et si on choisi l'option "Degrés" alors on a l'axe à 0° vers l'Est et sens trigo alors que l'option "Grades" on aura l'axe à 0g vers le Nord et sens inverse trigo (donc angle différent entre les propriétés et la valeur d'attribut) Je commence également à me poser la question sur le fait que les propriétés dynamiques d'un bloc pourrait également servir de redéfinition de certaines propriétés... (je pense notamment à une boussole ayant une propriété angulaire qui pourrait définir sa rotation) mais bon, il s'agit là de version 2.0 voire 3.0 ! faudrait déjà que je termine la 1.0 xD Bisous,Luna Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 5 mars 2021 Auteur Partager Posté(e) le 5 mars 2021 Hello YES : un simple "88 / 105 blocs ont été modifiés avec succès" me semble suffisant ! YES alors proposer la question :Voulez vous avoir en Sortie, un jeu de selection avec les Blocs modifies (Au moins UNE Propriete) O/N - Defaut = O Encore MERCI pour ton "Devouement", La Sante, Bye, lecrabe "fatigue" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 5 mars 2021 Auteur Partager Posté(e) le 5 mars 2021 Hello Je pensais à un truc important ! Il faudrait une autre routine Lisp "Prop2Att" qui "injecte / copie" les Proprietes CHOISIES dans les Attributs préparés... Ainsi on sera "PRET" pour ta superbe Routine ! Mais surtout pour un ATTOUT ... Tripatouillage dans Excel ... ATTIN ... Puis en phase finale, ta superbe Routine ! Vois tu ce que je veux dire ?! La Santé, Bye, lecrabe "fatigué" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
Luna Posté(e) le 5 mars 2021 Partager Posté(e) le 5 mars 2021 Je vois vouih, cependant je ne vois pas vraiment l'intérêt de faire "Prop2Att" > "ATTOUT" > modification > "ATTIN" > "AttProperties"...Mais autrement je comprends parfaitement l'utilité d'une fonction reverse, c'est toujours utile ! N'ayant pas cette utilisation des blocs dans mon travail, j'ai un peu de mal à voir les cas concrets d'utilisation de ces commandes mais au vu de la demande, je suppose qu'il y en a plusieurs :3 Bon du coup j'ai corrigé quelques bugs que j'ai pu rencontrer et (bon le message d'aide il va falloir que je regarde pour une list_box avec scroller mais mes compétences en DCL sont trop limitées... ;--- Nom de la commande []-----------------------[] AttProperties []-----------------------[] ; ;--- Date de création > 02/03/2021 ; ;--- Dernière modification > 05/03/2021 ; ;--- Auteur(e) > Luna ; ;--- Version > 1.1.0 ; ;--- Classe > "DtObj" ; ; ; ;--- But et domaine d'application ; ; > En raison du nombre important de demandes pour modifier les propriétés des blocs standards et/ou dynamiques à partir des valeurs contenues dans des attributs, il s'est avéré utile de généraliser ces multiples demandes ; ; en une unique commande. Cette commande se doit d'être suffisamment intuitive, simple d'utilisation, complète dans son domaine d'exécution et rapide. Le principe de la commande est simple puisqu'après avoir sélectionner un ; ; bloc référent (possédant des attributs), il suffit de définir les attributs ayant une relation directe avec une propriété modifiable depuis la liste DXF d'une référence de bloc et de lui associer la propriété adéquate via ; ; une boîte de dialogue. Grâce à la variable globale *BdD-Return*, le nom de la définition de bloc ainsi que les données paramétrées dans la boîte de dialogue sont conservée pour la session et par dessin. Cela permet de ; ; lancer plusieurs fois la commande sans devoir paramétrer de nouveau l'ensemble des données. ; ; Cette commande est applicable dans de nombreux domaines comme par exemple l'attribut "ALT" ayant un lien direct avec la position Z de chaque point topo. ; ; ; ;--- Fonctionnement global ; ; > La commande se décompose en 3 temps : ; ; - Sélection d'un bloc référent selon certains critères ; ; Aucune distinction entre un bloc standard ou dynamique (exclusion des réseaux grâces à la présence obligatoire d'attributs) et une boucle est définie pour s'assurer d'une sélection, sans mettre fin à ; ; l'exécution du programme prématurément. En fonction de la première exécution ou non de la commande, une valeur par défaut sera disponible pour s'épargner la sélection d'un bloc (dessin ou liste). ; ; Ainsi, au premier lancement, la sélection autorisée d'un bloc référent se fera soit par sélection d'un bloc visible dans l'espace de travail du dessin en cours, soit au travers d'une liste à choix unique ; ; parmi l'ensemble des définitions de blocs présentes dans le dessin en cours (= option "Nom"). ; ; Pour les exécutions suivantes, les mêmes choix seront disponibles ainsi qu'une valeur par défaut (= ENTER à vide) correspondant à la précédente définition de bloc utilisée par le programme. ; ; ; ; - Définition des relations entre valeur d'attribut et propriétés ; ; Une boîte de dialogue découpée en 3 colonnes va permettre l'attribution des propriétés en fonction du nom de l'attribut. Ainsi la première colonne correspond à la liste des attributs du bloc référent, qui ; ; se présente sous la forme d'une liste de cases à cocher ou décocher pour déterminer si oui ou non le programme devra travailler avec cet attribut. La seconde colonne permet donc de définir la liaison ou ; ; l'association entre chaque attribut sélectionné et une propriété de la référence de bloc. La dernière colonne permet uniquement d'apporter des informations complémentaires en fonction de la propriété choisie.; ; Il est tout à fait possible de sélectionner un ou plusieurs attributs mais chaque attribut ne peut être lié qu'à une seule propriété. Il est également possible d'affecter une même propriété à plusieurs ; ; attributs différents, bien que cela ne vaudra qu'à définir la propriété via la dernière occurrence fonctionnelle parmi la liste. ; ; Il est possible de mettre fin au programme en sélectionnant le bouton "Cancel". Une "Aide" est disponible au besoin (en cours d'édition pour plus d'information). Pour continuer, il suffit de "valider". ; ; ; ; - Sélection des références de blocs devant être mises à jour ; ; Pour cela, 2 niveaux de sélection sont définis par le programme. Si le 1er niveau est vide, le 2nd niveau sera alors exécuté et si le 2nd niveau est vide également, le programme s'arrête. ; ; Le niveau 1 correspond à une sélection manuelle des blocs (la pré-sélection est possible au besoin) qui sera alors filtrée de telle sorte que seuls les blocs possédant des attributs et portant le nom du bloc ; ; référent (+ blocs anonymes dynamiques) soient autorisés. Si l'utilisateur appuie sur ENTER, le 2nd niveau s'enclenche pour cette fois-ci sélectionner la totalité des références portant ce nom-là. ; ; Chaque référence sera alors modifiée en fonction de la valeur des attributs spécifiés auparavant pour mettre à jour les propriétés. Certaines propriétés nécessitent des informations supplémentaires comme par ; ; exemple il est possible de mettre un bloc uniformément à l'échelle en ne définissant qu'un seul attribut grâce au complément d'information "Echelle uniforme". Attention également à la propriété de couleur ou ; ; aux unités choisies pour la rotation (l'axe 0 et le sens angulaire sont différents entre des angles en degrés ou en grades !). ; ; ; ;--- Modifications apportées par rapport à la version précédente ; ; > Premier jet pour l'aide de la boîte de dialogue et ajout du taux de réussite des définitions de bloc. ; ; ; (defun c:ATTPROPERTIES (/ *error* flt_tbl get-att-list ListBox dcl_accept dcl_help dcl_PAtoCI LM:RGB->True LM:RGB->ACI LM:acapp ;--- Définition locale de fonctions ;; jsel ;--- Variables locales pour jeux de sélection ;; name file ;--- Variables locales pour nom d'entités ;; lst att-list tmp-list ;--- Variables locales pour listes ;; att tag value filename p ;--- Variables locales pour chaînes de caractères ;; i n c dcl_ID r g b e s ;--- Variables locales pour valeurs numériques ;; input x v a ;--- Variables locales pour entrées utilisateur ;; ; *BdD-Return* ;--- Variables globales pour conservations des données ;; ) (prompt (strcat "\n[]============= LANCEMENT DE ATTPROPERTIES =============[]" "\nInitialisation en cours..." "\n" ) ) ;; Début de la définition de la fonction (*error*), qui est une fonction AutoCAD existante donc impérativement la déclarer en variable locale ! ;; (defun *error* (msg) (if file (setq file (close file))) ;--- Ferme le fichier .dcl si ouvert ;; (if filename (setq filename (vl-file-delete filename))) ;--- Supprime le fichier .dcl si existant ;; (prompt msg) ;--- Affiche l'erreur qu'AutoCAD a enregistré en dernier ;; (princ) ) ; End of (defun *error*) ;; ;; Début de la définition de la fonction (flt_tbl) ;; (defun flt_tbl (tbl search / lst name) (while (setq name (tblnext tbl (not name))) (if (wcmatch (strcase (setq name (cdr (assoc 2 name)))) (strcase search)) (setq lst (cons name lst)) ) ) lst ) ; End of (defun flt_tbl) ;; ;; Début de la définition de la fonction (vla-collection->list) ;; (defun vla-collection->list (collection / lst) (vlax-for item collection (setq lst (cons (cons (vla-get-name item) (vlax-vla-object->ename item)) lst)) ) (reverse lst) ) ; End of (defun vla-collection->list) ;; ; Début de la définition de la fonction (get-att-list) ;; (defun get-att-list (name / ent att-list) (if (= (cdr (assoc 0 (entget name))) "BLOCK") (progn (setq ent (cdr (assoc -2 (entget name)))) (while ent (if (= (cdr (assoc 0 (entget ent))) "ATTDEF") (setq att-list (cons (cdr (assoc 2 (entget ent))) att-list)) ) (setq ent (entnext ent)) ) ) ) att-list ) ; End of (defun get-att-list) ;; ;--- LISP de bonusCAD publié sur CADXP.com le 11/01/2016 11:34 ;; ;--- Version modifiée de la fonction (ListBox), possède 5 arguments ;; ;--- title correspond à l'entête de la boîte de dialogue ;; ;--- msg correspond au message affiché au dessus de la liste ;; ;--- lst correspond à la liste à afficher ;; ;--- value correspond à la valeur définie par défaut ;; ;--- flag correspond au type de liste souhaitée ;; ; flag = 0 -> liste déroulante (choix unique) ;; ; flag = 1 -> liste avec barre de défilement (choix unique) ;; ; flag = 2 -> liste avec barre de défilement (choix multiple) ;; ; Renvoie la liste des calques ayant été sélectionnés ;; (defun ListBox (title msg lst value flag / str2lst tmp file DCL_ID choice) ;--- LISP de bonusCAD publié sur CADXP.com le 11/01/2016 11:34 ;; ;--- Nécessaire au bon fonctionnement de la fonction (ListBox) ci-dessus ;; (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) ; End of (defun str2lst) ;; (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "ListBox:dialog{width=" (itoa (+ (apply 'max (mapcar 'strlen (mapcar 'vl-princ-to-string lst))) 5)) ";label=\"" title "\";") file ) (if (and msg (/= msg "")) (write-line (strcat ":text{label=\"" msg "\";}") file) ) (write-line (cond ((= 0 flag) "spacer;:popup_list{key=\"lst\";") ((= 1 flag) "spacer;:list_box{height=15;key=\"lst\";") (t "spacer;:list_box{height=15;key=\"lst\";multiple_select=true;") ) file ) (write-line "}spacer;ok_cancel;}" file) (close file) (setq DCL_ID (load_dialog tmp)) (if (not (new_dialog "ListBox" DCL_ID)) (exit) ) (start_list "lst") (mapcar 'add_list lst) (end_list) (set_tile "lst" (if (member value lst) (itoa (vl-position value lst)) (itoa 0))) (action_tile "accept" "(or (= (get_tile \"lst\") \"\") (if (= 2 flag) (progn (foreach n (str2lst (get_tile \"lst\") \" \") (setq choice (cons (nth (atoi n) lst) choice)) ) (setq choice (reverse choice)) ) (setq choice (nth (atoi (get_tile \"lst\")) lst)) ) ) (done_dialog)" ) (start_dialog) (unload_dialog DCL_ID) (vl-file-delete tmp) choice ) ; End of (defun ListBox) ;; ;; Début de la définition de la fonction (dcl_accept) ;; (defun dcl_accept (att-list lst / a r) (foreach a (reverse att-list) (if (= (get_tile a) "1") (setq r (cons (list a (nth (atoi (get_tile (strcat "pa:" a))) (mapcar 'car lst)) (atoi (get_tile (strcat "ci:" a)))) r)) ) ) r ) ; End of (defun dcl_accept) ;; ;; Début de la définition de la fonction (dcl_help) ;; (defun dcl_help (/ p) (alert (strcat "La commande ATTPROPERTIES permet l'édition de certaines propriétés à partir de la valeur des attributs spécifiés pour chaque référence de bloc." "\nPour se faire, il suffit de renseigner les attributs à prendre en compte et de leur relation avec les propriétés via cette boîte de dialogue." "\nElle se décompose en 3 colonnes distinctes :" "\n[]**********************************************************************[]" "\n \"Liste des attributs\" :" "\n Permet de sélectionner le(s) attributs que l'on souhaite utiliser pour redéfinir les propriétés des références de blocs." " Pour cela, une simple case à cocher/décocher permet d'activer ou non la relation vers la propriété." "\n[]**********************************************************************[]" "\n \"Propriété associée\" :" "\n Permet de sélectionner dans une liste déroulante l'une des propriétés modifiable que l'on souhaite redéfinir en fonction de la valeur de l'attribut situé à sa gauche." " Pour cela, choisir la propriété adaptée à notre besoin dans la liste des choix possibles (cf. ci-dessous). Attention à bien sélectionner les propriétés pour déclencher la 3ème colonne type !" "\n[]**********************************************************************[]" "\n \"Compléments d'information\" :" "\n Certaines propriétés peuvent s'avérer plus complexes que d'autres et nécessitent un certain formatage ou d'informations supplémentaires pour fonctionner correctement." " En fonction du nom de la propriété, ces informations complémentaires seront requises autrement la liste déroulante sera grisée." "\n" "\nVoici la liste actuelle des propriétés définies :" (apply 'strcat (mapcar '(lambda (p) (strcat "\n - " (car p) ", acceptant les valeurs comme suit :" (caddr p))) lst)) "\n***L'aide concernant la définition des valeurs acceptées par le programme en fonction des propriétés est en cours d'édition !***" "\n" "\nAuteur(e) : Luna" "\nDate : 05/03/2021" "\nVersion : 1.1.0" ) ) ) ; End of (defun dcl_help) ;; ;; Début de la définition de la fonction (dcl_PAtoCI) ;; (defun dcl_PAtoCI (v a /) (cond ((= v "0") (mode_tile (strcat "ci:" a) 0) (start_list (strcat "ci:" a)) (mapcar 'add_list '("AutoCAD Color Index" "RGB")) (end_list) ) ((member v '("9" "10" "11")) (mode_tile (strcat "ci:" a) 0) (start_list (strcat "ci:" a)) (mapcar 'add_list '("Echelle non uniforme" "Echelle uniforme")) (end_list) ) ((= v "12") (mode_tile (strcat "ci:" a) 0) (start_list (strcat "ci:" a)) (mapcar 'add_list '("Degrés" "Grades")) (end_list) ) (t (mode_tile (strcat "ci:" a) 1) (start_list (strcat "ci:" a)) (mapcar 'add_list '("")) (end_list) ) ) ) ; End of (defun dcl_PAtoCI) ;; ;; RGB -> True - Lee Mac ;; ;; Args: r,g,b - [int] Red, Green, Blue values ;; (defun LM:RGB->True ( r g b ) (logior (lsh (fix r) 16) (lsh (fix g) 8) (fix B)) ) ; End of (defun LM:RGB->True) ;; ;; RGB -> ACI - Lee Mac ;; ;; Args: r,g,b - [int] Red, Green, Blue values ;; (defun LM:RGB->ACI ( r g b / c o ) (if (setq o (vla-getinterfaceobject (LM:acapp) (strcat "autocad.accmcolor." (substr (getvar 'acadver) 1 2)))) (progn (setq c (vl-catch-all-apply '(lambda ( ) (vla-setrgb o r g B) (vla-get-colorindex o)))) (vlax-release-object o) (if (vl-catch-all-error-p c) (prompt (strcat "\nError: " (vl-catch-all-error-message c))) c ) ) ) (defun LM:acapp nil (eval (list 'defun 'LM:acapp 'nil (vlax-get-acad-object))) (LM:acapp) ) ) ; End of (defun LM:RGB->ACI) ;; ;; ;; ;; Définition de la liste de correspondance entre les noms de propriété et le code DXF référent ;; ;; ;; (setq lst (list ;;; "Général" ; "General" ;; (list "Couleur" ; "Color" ;; 62 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute valeur numérique dont sa partie entière est comprise entre 0 et 256 (= option \"ACI\")" ; ;; "\n| ou bien une suite de 3 nombres répondant au même critère précédent et séparés par une \",\" (= Option \"RGB\", aucun espace toléré !)." ; ;; "\n| Exemples :" ; ;; "\n| Option AutoCAD Color Index (ACI) -> \"0\", \"256\", \"144\", \"10\", \"12.3\", \"7\", ..." ; ;; "\n| Option Red,Green,Blue (RGB) -> \"0,0,0\", \"255,122,74\", ... (si un autre séparateur est utilisé, la couleur ne pourra pas être redéfinie)" ; ;; "\n| Les valeurs \"DuCalque\" et \"DuBloc\" sont respectivement \"256\" et \"0\" en option ACI, toutes autres valeurs ne seront pas fonctionnelles." ; ;; ) ; ;; ) ; End of "Color" ;; (list "Calque" ; "Layer" ;; 8 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter tout type de valeur à l'exception des caractères spéciaux (\"#\", \"@\", \".\", \"*\", \"?\", \"~\", \"`\", ...)." ; ;; "\n| Si le nom de calque n'existe pas dans la liste de calques du dessin courant, un nouveau calque portant ce nom sera alors créé avec les propriétés par défaut." ; ;; "\n| Exemples :" ; ;; "\n| -> \"0\", \"Calque n°1\", \"144\", ..." ; ;; ) ; ;; ) ; End of "Layer" ;; (list "Type de ligne" ; "Linetype" ;; 6 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute chaîne de caractères appartenant à la liste suivante, correspondant à la liste des types de lignes du dessin :" ; ;; "\n| " ; ;; (vl-string-right-trim "\", " (apply 'strcat (mapcar '(lambda (l) (strcat "\"" (car l) "\", ")) ; ;; (vla-collection->list (vla-get-linetypes (vla-get-activedocument (vlax-get-acad-object))))))) ; ;; "\n| Des valeurs n'appartenant pas à la liste ci-dessus ne seront pas fonctionnelles !" ; ;; ) ; ;; ) ; End of "Linetype" ;; (list "Epaisseur de ligne" ; "Lineweight" ;; 370 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute valeur numérique correspondant à l'épaisseur en mm multipliée par 100 (entiers uniquement)." ; ;; "\n| Exemples :" ; ;; "\n| -> \"0.13 mm\" correspond à une valeur de \"13\", \"1.58 mm\" correspond à une valeur de \"158\", ..." ; ;; "\n| Les valeurs \"DuCalque\", \"DuBloc\" et \"Par Défaut\" sont respectivement \"-1\", \"-2\" et \"-3\", toutes autres valeurs ne seront pas fonctionnelles." ; ;; ) ; ;; ) ; End of "Lineweight" ;; (list "Transparence" ; "Transparency" ;; 440 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute valeur numérique dont sa partie entière est comprise entre 0 et 90." ; ;; "\n| Exemples :" ; ;; "\n| -> \"0\", \"14\", \"88\", ..." ; ;; "\n| Les valeurs \"DuCalque\" et \"DuBloc\" sont respectivement \"\" et \"100\", toutes autres valeurs ne seront pas fonctionnelles." ; ;; ) ; ;; ) ; End of "Transparency" ;; ;;; "Visualisation 3D" ; "3D Visualization" ;; (list "Matériau" ; "Material" ;; 347 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute chaîne de caractères appartenant à la liste suivante, correspondant à la liste des matériaux du dessin :" ; ;; "\n| " ; ;; (vl-string-right-trim "\", " (apply 'strcat (mapcar '(lambda (l) (strcat "\"" (car l) "\", ")) ; ;; (vla-collection->list (vla-get-materials (vla-get-activedocument (vlax-get-acad-object))))))) ; ;; "\n| Des valeurs n'appartenant pas à la liste ci-dessus ne seront pas fonctionnelles !" ; ;; ) ; ;; ) ; End of "Material" ;; ;;; "Géométrie" ; "Geometry" ;; (list "Position X" ; "Position X" ;; 10 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute valeur numérique positive ou négative et correspondant au coordonnées absolues dans le repère SCG." ; ;; "\n| Exemples :" ; ;; "\n| -> \"0.000\", \"43.4856\", \"-453.4865\", ..." ; ;; ) ; ;; ) ; End of "Position X" ;; (list "Position Y" ; "Position Y" ;; 10 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute valeur numérique positive ou négative et correspondant au coordonnées absolues dans le repère SCG." ; ;; "\n| Exemples :" ; ;; "\n| -> \"0.000\", \"43.4856\", \"-453.4865\", ..." ; ;; ) ; ;; ) ; End of "Position Y" ;; (list "Position Z" ; "Position Z" ;; 10 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute valeur numérique positive ou négative et correspondant au coordonnées absolues dans le repère SCG." ; ;; "\n| Exemples :" ; ;; "\n| -> \"0.000\", \"43.4856\", \"-453.4865\", ..." ; ;; ) ; ;; ) ; End of "Position Z" ;; (list "Echelle X" ; "Scale X" ;; 41 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute valeur numérique positive ou négative et correspondant à une coefficient d'échelle." ; ;; "\n| Il est possible de choisir l'option \"Echelle uniforme\" pour affecter la même valeur d'échelle dans l'axe X, Y et Z." ; ;; "\n| Exemples :" ; ;; "\n| -> \"1.000\", \"0.4856\", \"-5.72\", ..." ; ;; "\n| Un bloc ayant été créé en échelle uniforme (propriétés de mise à l'échelle Y et Z grisées) peut tout de même posséder des valeurs d'échelle non uniforme." ; ;; ) ; ;; ) ; End of "Scale X" ;; (list "Echelle Y" ; "Scale Y" ;; 42 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute valeur numérique positive ou négative et correspondant à une coefficient d'échelle." ; ;; "\n| Il est possible de choisir l'option \"Echelle uniforme\" pour affecter la même valeur d'échelle dans l'axe X, Y et Z." ; ;; "\n| Exemples :" ; ;; "\n| -> \"1.000\", \"0.4856\", \"-5.72\", ..." ; ;; "\n| Un bloc ayant été créé en échelle uniforme (propriétés de mise à l'échelle Y et Z grisées) peut tout de même posséder des valeurs d'échelle non uniforme." ; ;; ) ; ;; ) ; End of "Scale Y" ;; (list "Echelle Z" ; "Scale Z" ;; 43 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute valeur numérique positive ou négative et correspondant à une coefficient d'échelle." ; ;; "\n| Il est possible de choisir l'option \"Echelle uniforme\" pour affecter la même valeur d'échelle dans l'axe X, Y et Z." ; ;; "\n| Exemples :" ; ;; "\n| -> \"1.000\", \"0.4856\", \"-5.72\", ..." ; ;; "\n| Un bloc ayant été créé en échelle uniforme (propriétés de mise à l'échelle Y et Z grisées) peut tout de même posséder des valeurs d'échelle non uniforme." ; ;; ) ; ;; ) ; End of "Scale Z" ;; ;;; "Divers" ; "Miscs" ;; (list "Rotation" ; "Rotation" ;; 50 ; ;; (strcat "\n| Cette propriété est en mesure d'accepter toute valeur numérique positive ou négative et correspondant à un angle de rotation." ; ;; "\n| Deux options sont alors possibles pour déterminer le type d'angle souhaité (en fonction du domaine d'application), qui sont \"Degrés\" et \"Grades\"." ; ;; "\n| Exemples :" ; ;; "\n| Option Degrés -> Le programme considère l'axe de 0° dans la direction Est du SCG et une rotation dans le sens trigonométrique." ; ;; "\n| \"90\", \"21.14\", \"-5.72\", ... l'angle spécifié correspond ainsi à l'angle d'AutoCAD affiché" ; ;; "\n| Option Grades -> Le programme considère l'axe de 0g dans la direction Nord du SCG et une rotation dans le sens des aiguilles d'une montre." ; ;; "\n| \"90\", \"21.14\", \"-5.72\", ... l'angle spécifié correspond ainsi à l'angle d'AutoCAD affiché" ; ;; "\n| Le programme ne prend pas en compte les unités angulaires actuellement formatés dans le dessin en cours." ; ;; ) ; ;; ) ; End of "Rotation" ;; ) ) ; End of (list [...]) servant de base pour l'écriture du fichier ;; (setq tmp-list (flt_tbl "BLOCK" "*") ;--- Génère la liste de l'ensemble des définitions de blocs du dessin courant ;; ) ;; ;; ;; Définitition obligatoire d'un bloc de référence et récuperation de l'EffectiveName du bloc ainsi que la liste des attributs de ce dernier ;; ;; ;; (while (not (and (cond ( (and *BdD-Return* ; Dans le cas d'un second lancer, permet d'utiliser l'ancienne valeur par défaut ;; (not (progn (initget "Nom") (setq input (entsel (strcat "\nSélectionner le bloc référent [ Nom ] <" (car *BdD-Return*) "> : "))) ) ) ) (setq input (car *BdD-Return*)) ) ( (and (not *BdD-Return*) ; Dans le cas du premier lancement de la commande, aucune valeur par défaut ;; (progn (initget "Nom") (setq input (entsel "\nSélectionner le bloc référent [ Nom ] : ")) ) ) input ) (input t) ) (cond ((= input "Nom") ; Si l'on choisi le keyword "Nom", permet de sélectionner un nom de bloc via BdD ;; (setq input (ListBox "Sélection du bloc de référence" "Veuillez choisir le nom du bloc de référence" tmp-list nil 1 ) ;--- Génération d'une boîte de dialogue pour la sélection d'un bloc de référence ;; ) ) ((listp input) ; Si l'utilisateur a sélectionné un objet dans le dessin et non un keyword ;; (setq input (car input)) (if (and (= (cdr (assoc 0 (entget input))) "INSERT") ;--- Vérifie qu'il s'agit d'un bloc ;; (assoc 66 (entget input)) ;--- Vérifie qu'il possède des attributs ;; ) (setq input (getpropertyvalue input "BlockTableRecord/Name")) ;--- Récupération de l'EffectiveName ;; (setq input nil) ;--- Retour dans la boucle car objet incorrect ;; ) ) ((= (type input) 'STR) input) ; Si l'utilisateur utilise la valeur par défaut, déjà fonctionnelle auparavant ;; ) (setq name (tblobjname "BLOCK" input)) ; Vérification de l'existance d'un bloc portant ce nom ;; (setq att-list (get-att-list name)) ; Récupération de la liste de l'ensemble des noms d'attributs de la définition de bloc ;; )) ; End of (not (and [...] ) ) ;; (prompt "\nSélection invalide.") ) ; End of (while [...] ) destiné à la sélection obligatoire d'un bloc de référence pour récupérer le nom et la liste des attributs du bloc ;; ;; ;; ;; Ecriture du fichier .dcl temporaire et lancement de la boîte de dialogue pour la bonne exécution du programme ;; ;; ;; (if (and (setq filename (vl-filename-mktemp "DCL-ATTPROPERTIES.dcl")) (setq file (open filename "W")) (mapcar '(lambda (l) (write-line l file)) (list (strcat "BdDAttProperties:dialog {label=\"Boîte de dialogue : Attribution des propriétés de \\\"" input "\\\"\";") (strcat " :row {") (strcat " :boxed_column {") (strcat " label= \"Liste des attributs\";") (strcat " fixed_width= true;") (strcat " width= " (itoa (+ (apply 'max (mapcar 'strlen att-list)) 5)) ";") (apply 'strcat (mapcar '(lambda (a) (strcat " :toggle{" "\n" " label= \"\\\"" a "\\\"\";" "\n" " key= \"" a "\";" "\n" " }" ) ) (vl-sort att-list '<) ) ; End of (mapcar [...]) destiné à générer une case à cocher pour chaque attribut ;; ) ; End of (apply [...]) pour l'adaptativité de la boîte de dialogue en fonction des attributs du bloc référent ;; (strcat " }") (strcat " :boxed_column {") (strcat " label= \"Propriété associée\";") (strcat " fixed_width= true;") (strcat " width= " (itoa (+ (apply 'max (mapcar 'strlen (mapcar 'car lst))) 5)) ";") (apply 'strcat (mapcar '(lambda (p) (strcat " :popup_list{" "\n" " key= \"pa:" p "\";" "\n" " }" ) ) (vl-sort att-list '<) ) ; End of (mapcar [...]) destiné à générer une liste déroulante pour chaque attribut ;; ) ; End of (apply [...]) pour l'adaptativité de la boîte de dialogue en fonction des attributs du bloc référent ;; (strcat " }") (strcat " :boxed_column {") (strcat " label= \"Complément d'information\";") (strcat " fixed_width= true;") (strcat " width= " (itoa 30) ";") (apply 'strcat (mapcar '(lambda (c) (strcat " :popup_list{" "\n" " label= \"Type \";" "\n" " key= \"ci:" c "\";" "\n" " }" ) ) (vl-sort att-list '<) ) ; End of (mapcar [...]) destiné à générer une liste déroulante pour chaque attribut ;; ) ; End of (apply [...]) pour l'adaptativité de la boîte de dialogue en fonction des attributs du bloc référent ;; (strcat " }") (strcat " }") (strcat " :spacer{}") (strcat " ok_cancel_help;") (strcat "}") ) ; End of (list [...]) déterminant chaque ligne à écrire dans le fichier .dcl ;; ) ; End of (mapcar [...]) destiné à l'écriture adaptative de la boîte de dialogue en fonction des attributs du bloc référent ;; (null (close file)) (> (setq dcl_ID (load_dialog filename)) 0) (new_dialog "BdDAttProperties" dcl_ID) ) ; End of (and [...]) destiné à la création, écriture et chargement du fichier .dcl temporaire ;; (progn (foreach att (setq att-list (vl-sort att-list '<)) (start_list (strcat "pa:" att)) (mapcar 'add_list (mapcar 'car lst)) (end_list) (set_tile att "0") (if (and *BdD-Return* (= (car *BdD-Return*) input) (member att (mapcar 'car (cdr *BdD-Return*))) ) (progn (set_tile att "1") (set_tile (strcat "pa:" att) (itoa (vl-position (cadr (assoc att (cdr *BdD-Return*))) (mapcar 'car lst)))) (mode_tile (strcat "pa:" att) 0) (dcl_PAtoCI (itoa (vl-position (cadr (assoc att (cdr *BdD-Return*))) (mapcar 'car lst))) att) (set_tile (strcat "ci:" att) (itoa (last (assoc att (cdr *BdD-Return*))))) ) (progn (mode_tile (strcat "pa:" att) 1) (mode_tile (strcat "ci:" att) 1) ) ) (action_tile att (strcat "(if (= \"1\" $value) (progn (mode_tile \"pa:" att "\" 0) (mode_tile \"ci:" att "\" 0) ) (progn (mode_tile \"pa:" att "\" 1) (mode_tile \"ci:" att "\" 1) ) )" ) ) (action_tile (strcat "pa:" att) (strcat "(cond ((= $value \"0\") (mode_tile (strcat \"ci:" att "\") 0) (start_list (strcat \"ci:" att "\")) (mapcar 'add_list '(\"AutoCAD Color Index\" \"RGB\")) (end_list) ) ((member $value '(\"9\" \"10\" \"11\")) (mode_tile (strcat \"ci:" att "\") 0) (start_list (strcat \"ci:" att "\")) (mapcar 'add_list '(\"Echelle non uniforme\" \"Echelle uniforme\")) (end_list) ) ((= $value \"12\") (mode_tile (strcat \"ci:" att "\") 0) (start_list (strcat \"ci:" att "\")) (mapcar 'add_list '(\"Degrés\" \"Grades\")) (end_list) ) (t (mode_tile (strcat \"ci:" att "\") 1) (start_list (strcat \"ci:" att "\")) (mapcar 'add_list '(\"\")) (end_list) ) )" ) ) ) (action_tile "accept" "(setq att-list (dcl_accept att-list lst)) (done_dialog 1)") (action_tile "cancel" "(setq att-list nil) (done_dialog 0)") (action_tile "help" "(dcl_help)") (start_dialog) (unload_dialog dcl_ID) (setq filename (vl-file-delete filename)) (if (and att-list (setq *BdD-Return* (cons input att-list)) ; Conservation des données paramétrées dans la BdD ;; (null (prompt (strcat "\nVeuillez sélectionner les blocs du nom de \"" input "\", ENTER pour sélectionner toutes les occurrences."))) (or (setq jsel (ssget (list '(0 . "INSERT") '(66 . 1) (cons 2 (strcat input ",`*U*"))))) ; Sélection Niveau 1 -> Sélection manuelle filtrée sur des blocs avec attributs et nom correct (ou dyn) ;; (setq jsel (ssget "_X" (list '(0 . "INSERT") '(66 . 1) (cons 2 (strcat input ",`*U*"))))) ; Sélection Niveau 2 -> Sélection totale filtrée sur les blocs avec attributs et nom correct (ou dyn) ;; ) ) (progn (repeat (setq c 0 n 0 s 0 e 0 i (sslength jsel)) (setq name (ssname jsel (setq i (1- i)))) (if (and (= input (getpropertyvalue name "BlockTableRecord/Name")) (setq c (1+ c))); Vérification de l'EffectiveName avec le bloc référent pour la prise en compte des blocs dynamiques ;; (mapcar '(lambda (att / tag property info value) (setq tag (car att) property (cadr att) info (caddr att) value (getpropertyvalue name tag) ) (cond ((= property (car (nth 0 lst))) ; Propriété "Color" ;; (cond ( (and (= info 1) ; Type "R,G,B" ;; (wcmatch value "*`,*`,*") (setq p (vl-string-position (ascii ",") value)) (setq r (substr value 1 p)) (setq g (substr value (+ 2 p) (- (vl-string-position (ascii ",") value nil t) (1+ p)))) (setq b (substr value (+ 2 (vl-string-position (ascii ",") value nil t)))) (apply 'and (mapcar '(lambda (c) (and (>= (atoi c) 0) (<= (atoi c) 256))) '(r g B))) ) (if (assoc 62 (entget name)) ; Code DXF "ACI Color" (facultatif) ;; (if (entmod (subst (cons 62 (LM:RGB->ACI (atoi r) (atoi g) (atoi B))) (assoc 62 (entget name)) (entget name))) (setq n (+ n 0.5)) ) (if (entmod (append (entget name) (list (cons 62 (LM:RGB->ACI (atoi r) (atoi g) (atoi B)))))) (setq n (+ n 0.5)) ) ) (if (assoc 420 (entget name)) ; Code DXF "TrueColor" (facultatif) ;; (if (entmod (subst (cons 420 (LM:RGB->True (atoi r) (atoi g) (atoi B))) (assoc 420 (entget name)) (entget name))) (setq n (+ n 0.5)) ) (if (entmod (append (entget name) (list (cons 420 (LM:RGB->True (atoi r) (atoi g) (atoi B)))))) (setq n (+ n 0.5)) ) ) ) ((and (= info 0) (distof value) (>= (atoi value) 0) (<= (atoi value) 256)) ; Type "AutoCAD Color Index (ACI)" ;; (if (assoc 62 (entget name)) ; Code DXF "ACI Color" (facultatif) ;; (if (entmod (subst (cons 62 (atoi value)) (assoc 62 (entget name)) (vl-remove (assoc 420 (entget name)) (entget name)))) (setq n (1+ n)) ) (if (entmod (append (entget name) (list (cons 62 (atoi value))))) (setq n (1+ n)) ) ) ) ) ) ; End of "Color" property ;; ((= property (car (nth 1 lst))) ; Propriété "Layer" ;; (if (entmod (subst (cons (cadr (nth 1 lst)) value) (assoc (cadr (nth 1 lst)) (entget name)) (entget name))) (setq n (1+ n)) ) ) ; End of "Layer" property ;; ( (and (= property (car (nth 2 lst))) ; Propriété "Linetype" ;; (member (strcase value) (mapcar 'strcase (append (flt_tbl "LTYPE" "*") '("DuCalque" "ByLayer" "DuBloc" "ByBlock")))) ) (if (assoc (cadr (nth 2 lst)) (entget name)) ; Code DXF (facultatif) ;; (if (entmod (subst (cons (cadr (nth 2 lst)) value) (assoc (cadr (nth 2 lst)) (entget name)) (entget name))) (setq n (1+ n)) ) (if (entmod (append (entget name) (list (cons (cadr (nth 2 lst)) value)))) (setq n (1+ n)) ) ) ) ; End of "Linetype" property ;; ( (and (= property (car (nth 3 lst))) ; Propriété "Lineweight" ;; (distof value) ) (if (assoc (cadr (nth 3 lst)) (entget name)) ; Code DXF (facultatif) ;; (if (entmod (subst (cons (cadr (nth 3 lst)) (atoi value)) (assoc (cadr (nth 3 lst)) (entget name)) (entget name))) (setq n (1+ n)) ) (if (entmod (append (entget name) (list (cons (cadr (nth 3 lst)) (atoi value))))) (setq n (1+ n)) ) ) ) ; End of "Lineweight" property ;; ( (and (= property (car (nth 4 lst))) ; Propriété "Transparency" ;; (distof value) ; ATTENTION LA TRANSPARENCE EST ACTUELLEMENT NON FONCTIONNELLE ! ;; (>= (atoi value) -2) ; ATTENTION LA TRANSPARENCE EST ACTUELLEMENT NON FONCTIONNELLE ! ;; (<= (atoi value) 90) ; ATTENTION LA TRANSPARENCE EST ACTUELLEMENT NON FONCTIONNELLE ! ;; ) ) ; End of "Transparency" property ;; ( (and (= property (car (nth 5 lst))) ; Propriété "Material" ;; (member value (setq tmp-list (vla-collection->list (vla-get-materials (vla-get-activedocument (vlax-get-acad-object)))))) (setq value (cdr (assoc value tmp-list))) ) (if (assoc (cadr (nth 5 lst)) (entget name)) ; Code DXF (facultatif) ;; (if (entmod (subst (cons (cadr (nth 5 lst)) value) (assoc (cadr (nth 5 lst)) (entget name)) (entget name))) (setq n (1+ n)) ) (if (entmod (append (entget name) (list (cons (cadr (nth 5 lst)) value)))) (setq n (1+ n)) ) ) ) ; End of "Material" property ;; ( (and (= property (car (nth 6 lst))) ; Propriété "Position_X" ;; (distof value) (setq value (list (distof value) (caddr (assoc (cadr (nth 6 lst)) (entget name))) (last (assoc (cadr (nth 6 lst)) (entget name))))) ) (if (entmod (subst (cons (cadr (nth 6 lst)) value) (assoc (cadr (nth 6 lst)) (entget name)) (entget name))) (setq n (1+ n)) ) ) ; End of "Position_X" property ;; ( (and (= property (car (nth 7 lst))) ; Propriété "Position_Y" ;; (distof value) (setq value (list (cadr (assoc (cadr (nth 7 lst)) (entget name))) (distof value) (last (assoc (cadr (nth 7 lst)) (entget name))))) ) (if (entmod (subst (cons (cadr (nth 7 lst)) value) (assoc (cadr (nth 7 lst)) (entget name)) (entget name))) (setq n (1+ n)) ) ) ; End of "Position_Y" property ;; ( (and (= property (car (nth 8 lst))) ; Propriété "Position_Z" ;; (distof value) (setq value (list (cadr (assoc (cadr (nth 8 lst)) (entget name))) (caddr (assoc (cadr (nth 8 lst)) (entget name))) (distof value))) ) (if (entmod (subst (cons (cadr (nth 8 lst)) value) (assoc (cadr (nth 8 lst)) (entget name)) (entget name))) (setq n (1+ n)) ) ) ; End of "Position_Z" property ;; ( (and (= property (car (nth 9 lst))) ; Propriété "Scale_X" ;; (distof value) ) (cond ( (and (= info 1) ; Type "Echelle uniforme" ;; (entmod (subst (cons (cadr (nth 9 lst)) (distof value)) (assoc (cadr (nth 9 lst)) (entget name)) (entget name))) ; X ;; (entmod (subst (cons (cadr (nth 10 lst)) (distof value)) (assoc (cadr (nth 10 lst)) (entget name)) (entget name))) ; Y ;; (entmod (subst (cons (cadr (nth 11 lst)) (distof value)) (assoc (cadr (nth 11 lst)) (entget name)) (entget name))) ; Z ;; ) (setq n (1+ n)) ) ((= info 0) ; Type "Echelle non uniforme" ;; (if (entmod (subst (cons (cadr (nth 9 lst)) (distof value)) (assoc (cadr (nth 9 lst)) (entget name)) (entget name))) ; X ;; (setq n (1+ n)) ) ) ) ) ; End of "Scale_X" property ;; ( (and (= property (car (nth 10 lst))) ; Propriété "Scale_Y" ;; (distof value) ) (cond ( (and (= info 1) ; Type "Echelle uniforme" ;; (entmod (subst (cons (cadr (nth 9 lst)) (distof value)) (assoc (cadr (nth 9 lst)) (entget name)) (entget name))) ; X ;; (entmod (subst (cons (cadr (nth 10 lst)) (distof value)) (assoc (cadr (nth 10 lst)) (entget name)) (entget name))) ; Y ;; (entmod (subst (cons (cadr (nth 11 lst)) (distof value)) (assoc (cadr (nth 11 lst)) (entget name)) (entget name))) ; Z ;; ) (setq n (1+ n)) ) ((= info 0) ; Type "Echelle non uniforme" ;; (if (entmod (subst (cons (cadr (nth 10 lst)) (distof value)) (assoc (cadr (nth 10 lst)) (entget name)) (entget name))) ; Y ;; (setq n (1+ n)) ) ) ) ) ; End of "Scale_Y" property ;; ( (and (= property (car (nth 11 lst))) ; Propriété "Scale_Z" ;; (distof value) ) (cond ( (and (= info 1) ; Type "Echelle uniforme" ;; (entmod (subst (cons (cadr (nth 9 lst)) (distof value)) (assoc (cadr (nth 9 lst)) (entget name)) (entget name))) ; X ;; (entmod (subst (cons (cadr (nth 10 lst)) (distof value)) (assoc (cadr (nth 10 lst)) (entget name)) (entget name))) ; Y ;; (entmod (subst (cons (cadr (nth 11 lst)) (distof value)) (assoc (cadr (nth 11 lst)) (entget name)) (entget name))) ; Z ;; ) (setq n (1+ n)) ) ((= info 0) ; Type "Echelle non uniforme" ;; (if (entmod (subst (cons (cadr (nth 11 lst)) (distof value)) (assoc (cadr (nth 11 lst)) (entget name)) (entget name))) ; Z ;; (setq n (1+ n)) ) ) ) ) ; End of "Scale_Z" property ;; ( (and (= property (car (nth 12 lst))) ; Propriété "Rotation" ;; (distof value) ) (cond ( (and (= info 1) ; Type "Grades" (0g = Nord | sens = non-trigo) ;; (entmod (subst (cons (cadr (nth 12 lst)) (/ (* (- 100.0 (distof value)) pi) 200.0)) (assoc (cadr (nth 12 lst)) (entget name)) (entget name))) ) (setq n (1+ n)) ) ( (and (= info 0) ; Type "Degrés" (0g = Est | sens = trigo) ;; (entmod (subst (cons (cadr (nth 12 lst)) (/ (* (distof value) pi) 180.0)) (assoc (cadr (nth 12 lst)) (entget name)) (entget name))) ) (setq n (1+ n)) ) ) ) ; End of "Rotation" property ;; ) ; End of (cond [...]) destiné à redéfinir les propriétés ;; ) att-list ) (setq jsel (ssdel name jsel)) ; Dans le cas d'un bloc dynamique, supprime l'entité du jeu de sélection si l'EffectiveName est différent ;; ) (cond ((= (rtos n) (rtos (length att-list))) (setq s (1+ s))) ((and (< n (length att-list)) (> n 0)) (setq e (1+ e))) ((= n 0) (setq jsel (ssdel name jsel))) ) ) (command "_ATTSYNC" "N" input) ; Pour mettre à jour la position des attributs ne se mettant pas à jour obligatoirement après modification de la liste DXF ;; (prompt (strcat "\nFin de l'exécution..." "\nUn total de " (if (and (= s 0) (> e 0)) "" (strcat (itoa s) " / " (itoa c) " bloc(s) traité(s) avec succès" ) ) (if (or (= 0 s e) (and (> s 0) (> e 0))) " et " "" ) (if (= s c) "" (strcat (itoa e) " / " (itoa c) " bloc(s) ont été partiellement traité(s)" ) ) ", dénommé(s) \"" input "\" à partir des attributs suivants :" (apply 'strcat (mapcar '(lambda (a) (strcat "\n - " (car a))) att-list)) ) ) (sssetfirst nil jsel) ) ) ) (exit) ) (princ) ) Avec cela, je prends en compte tes remarques donc désormais les blocs ayant fonctionné totalement ou partiellement seront sélectionnés à la fin, tu as un retour plus précis sur la réussite ou non de la commande par rapport au nombre de blocs portant le bon nom dans la sélection ! Bon il reste toujours ce soucis de transparence que je n'arrive pas à inverser...Mise à part cela, je pense que cette version est relativement stable (si on fait abstraction du message d'aide qui n'est pas lisible dans sa globalité...) Bisous,Luna Lien vers le commentaire Partager sur d’autres sites More sharing options...
MASB Posté(e) le 8 mars 2021 Partager Posté(e) le 8 mars 2021 Bonjour, Wouah!! C'est incroyable, c'est vraiment une super commande.Dans mon gabarit .dwt j'ai plusieurs noms de blocs.Avec ce lisp, il faut que je fasse la manip pour chaque "nom" de blocs, pensez-vous qu'il soit possible dans la fenêtre sélection du bloc de pouvoir cocher certains noms de blocs ou tous les noms de blocs différents afin d'exécuter ce lisp à l'ensemble des blocs du dessin ? Cordialement,MASB Lien vers le commentaire Partager sur d’autres sites More sharing options...
Luna Posté(e) le 8 mars 2021 Partager Posté(e) le 8 mars 2021 Coucou, Le soucis actuel c'est que l'écriture de la BdD se fait sur une liste d'attribut récupérée à partir d'un bloc, donc si l'on sélectionne plusieurs blocs, comment construire cette liste ? Faut-il prendre uniquement les attributs en communs, ou bien tous les attributs de tous les blocs ? La sélection de plusieurs blocs ne permettra probablement pas la conservation des données et donc le remplissage par défaut lors de la sélection du bloc référent ou du remplissage de la BdD... Je peux essayer de creuser le sujet mais je vais avoir besoin d'infos sur le rendu attendu et les modifications acceptables :3 Bisous,Luna Lien vers le commentaire Partager sur d’autres sites More sharing options...
MASB Posté(e) le 9 mars 2021 Partager Posté(e) le 9 mars 2021 Coucou, En fait le chemin que j'essaie de faire est de récupérer de la donnée de type SIG exportée en .SHP que j'importe dans autocad map 3d à partir d'un modèle .dwt contenant tous mes blocs. Actuellement le soucis est que je n'arrive pas à récupérer pour l'ensemble des blocs la valeur z, la rotation, et la mise à l'échelle en x et en y dans les paramètres géométrie qui gère le bloc. Chacune de ces valeurs (z, rotation, echelle x et y )sont contenues dans la table attributaire (sig) ET dans les attributs de mes blocs dans le .dwt. Il est vrai que certains blocs ont des attributs supplémentaires, mais tous contiennent (z, rotation ,echelle x et y) en attributs de blocs avec pour objectif que cela puisse servir à les dimensionner correctement. L'idée est que une fois le .shp importé dans le .dwt de pouvoir en une passe redimensionner tous les blocs en (z, rotation, echelle x et y). J'espère avoir était suffisamment clair dans mon explication. Cordialement, Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 9 mars 2021 Auteur Partager Posté(e) le 9 mars 2021 Hello Je connais bien cette problematique car ma specialite c AutoCAD MAP 20XX ( Je pratique AutoCAD MAP depuis 1994 )et j adore les problemes SIG et les belles cartes !! Dans ton cas, je passe par des fichiers Excel parfaitement prepares pour la fabuleuse routine IXL de notre regrette Patrick_35 SVP tu regardes bien l Image JPG jointe ...Elle illuste parfaitement comment dois etre le fichier Excel ! Depuis les Coords XYZ et les parametres ANGLE et ECHELLE de multiples Blocs arrivent sur de multiples calques avec les attributs REMPLIS !! Alors ca t'interesse !? La Sante, Bye, lecrabe "fatigue" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
MASB Posté(e) le 9 mars 2021 Partager Posté(e) le 9 mars 2021 Hello, Bien sûr, cela m'intéresse. Je suis curieux de savoir comment faire.Cela suppose de pouvoir exporter depuis la .gdb en .xls pour l'importer dans un .dwt ?De conserver les couleurs liées aux claques du .dwt et les attributs de chacun en plus de la géométrie avec de échelles non uniformes ... C'est une autre piste qui m'intéresse également. Cordialement, Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 9 mars 2021 Auteur Partager Posté(e) le 9 mars 2021 Hello PERSO: il y a 10 ans environ, avec IXL, j ai "explose" un acteur important d Internet sur une Agglo (200 000 Habs environ) ! Il avait en Excel ses 15000 chambres (Telephone et Fibre et Telecom) avec de multiples donnes attributaires et bien sur les Coords XYLe plus long (1 heure environ) a ete de remanier le fichier XLS pour qu il correspondent parfaitement a l image jointe dans mon message precedent ... ET 1 heure plus tard, grace a IXL, il avait les 15000 chambres (Blocs en faits) avec toutes les donnees attributaires en attributssur son magnifique cadastre de l'Agglo ! Je dois avouer que ce jour la, j ai pris mon pied !!!Surtout que les intervenants / spectateurs ne juraient que par ESRI !!!ET que AutoCAD (comme ils disaient), c juste bon pour faire du dessin de Meca, Archi, Schematique, etc ... RAPPEL : IXL ne necessite pas forcement AutoCAD MAP (ou AutoCAD CIVIL), un simple AutoCAD (mais pas AutoCAD LT) lui suffit ... DONC SVP tu regardes bien CE sujet : https://forums.autodesk.com/t5/autocad-tous-produits-francais/exporter-positions-bloc-x-y-et-z-excel-vers-autocad/td-p/9946079Et mon message No 9 du 2020-12-19 05:42 PM ...Et eventuellement le message No 11 ...Tu as en ZIP TOUT ce qu il faut, y compris un Micro-Exemple ... J ose esperer que tu sais "sortir" depuis ESRI pour des objets ponctuels XY/XYZ, un fichier XLS !? ATTENTION: il y a UN SEUL facteur d echelle gere - DONC ECHELLE agit sur toutes les echelles !HUMOUR: mais je crois "connaitre" une routine Lisp qui pourrait agir "APRES" sur les 2/3 facteurs d echelle si tu as 2/3 attributs XSCALE, YSCALE, ZSCALE ... La Sante, Bye, lecrabe "fatigue" PS1: je te previens, je suis un Vieux Venal !Donc cela te coutera une bouteille d un excellent whisky single malt ! PS2: Ne pas oublier Luna ! Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 9 mars 2021 Auteur Partager Posté(e) le 9 mars 2021 Hello Luna J espere que je vais t economiser du "travail" !? Encore MERCI pour tes contributions !! La Sante, Bye, lecrabe "fatigue" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
Luna Posté(e) le 9 mars 2021 Partager Posté(e) le 9 mars 2021 Hihi ♥ Une fois que je suis lancée, j'ai bien du mal à m'arrêter donc je vais tout de même regarder la possibilité de prendre en compte plusieurs blocs différents, j'ai un peu peur dans le cas où, le nombre d'attributs est trop important et les dimensions de la BdD dépassent des limites visibles de l'écran (j'ai le même problème avec ma fenêtre "help") et du coup je ne sais pas comment ajouter un scroller sur une BdD (mais l'exercice est intéressant ^^) Donc nah, je vais tout de même essayer d'améliorer un peu ce programme :3Pour la fonctionnalité inverse, à voir si j'ai le courage de le faire >o<Mais merci beaucoup de te préoccuper de ma petite personne, c'est gentil ! :) Bisous,Luna Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 9 mars 2021 Auteur Partager Posté(e) le 9 mars 2021 Hello Luna 1) Si tu te lances sur N Blocs, je te conseille de RESTREINDRE les possibilites ! 2) Donc ne traiter que :X, Y, Z, XSCALE, YSCALE, ZSCALE, ROTATION et peut etre COLOR (1-255) pour marquer visuellement un Bloc 3) PERSO: je vois la routine comme cela : - Selection des N Blocs a traiter ...- Parcours des Blocs pour ne montrer / retenir QUE les attributs COMMUNS- Choix Attribut --> Propriete- Traitement 4) Qu 'en penses tu ? La Sante, Bye, lecrabe "fatigue" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
MASB Posté(e) le 10 mars 2021 Partager Posté(e) le 10 mars 2021 Hello, Effectivement, cela m'intéresse de pouvoir aller au bout de la démarche entreprise par Luna. Cordialement, Lien vers le commentaire Partager sur d’autres sites More sharing options...
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