Aller au contenu

Serge

Membres
  • Compteur de contenus

    397
  • Inscription

  • Dernière visite

Tout ce qui a été posté par Serge

  1. Serge

    [RESOLU !] FONCTION AUTOLOAD

    Bonjour lili2006, En gros, il existe plusieurs solutions à un problème. Elles ne sont pas toujours équivalentes sur le long terme. Je préconise la copie du répertoire "C:\Program Files\Autodesk\AutoCAD 2018\Support\fr-fr" sous "C:\Program Files\Autodesk\AutoCAD 2018\Support\en-us" en attendant qu'Autodesk apporte un correctif. Il y avait aussi un 2e problème mais celui-ci a été correctement résolu, soit d'ajouter le chemin "C:\_bibliotheque\..." ou "C:\_bibliotheque\bibliotheque_support\..." au chemins de confiance. À noter la présence des "..." qui indique que tous les sous-répertoires seront également traités comme des répertoire de confiance (donc le chemin le plus court est suffisant). Une autre solution, mais celle-ci n'est pas recommandée, est de fixer la variable SECURELOADà 0 (inactif) ... bien qu'avant la version 2014, peu de gens s'inquiétait de logiciels malveillants sous AutoCAD. C'est un signe des temps, il y a de plus en plus de logiciels gratuits disponibles. Je n'ai pas encore retrouvé le réflexe de revenir rapidement sur ce site :huh: . Bonne journée
  2. Serge

    [RESOLU !] FONCTION AUTOLOAD

    Bonjour à tous, Il y a longtemps que je ne suis venu dans ce forum. Je ne suis pas à la retraite :). Dans la demande initiale de lilli2006, il y avait 2 éléments: 1) Les chemins approuvés: ceci est réglé en ajoutant le répertoire qui était en dehors du répertoire "C:\Program Files" aux chemins de confiance; 2) Le problème concernant "autoload": il reste en suspens malgré les quelques suggestions que j'ai vues passer et le sentiment de sécurité que cela a pu apporter. Le problème avec la fonction "autoload" est qu'elle provient d'un fichier nommé acad2018doc.lsp et que ce fichier se trouve dans un sous répertoire dont le nom dépend de la langue d'AutoCAD, c'est-à-dire "en-us", "fr-fr", "de-de", "it-it", et ainsi de suite. Ce sous-répertoire se trouve lui-même dans "C:\Program Files\Autodesk\AutoCAD 2018\Support" si vous avez choisi le répertoire par défaut. Ceci étant dit, le problème ne se pose pas avec la version américaine (i.e. que le répertoire "en-us") et les gens d'Autodesk ne sont probablement pas au courant qu'il y a un bug avec les versions internationales. Je vais demander aux gens de mon équipe de les aviser. Le problème se pose pour les autres environnements. >>> Le seul workaround efficace est de copier le répertoire "C:\Program Files\Autodesk\AutoCAD 2018\Support\fr-fr" sous "C:\Program Files\Autodesk\AutoCAD 2018\Support\en-us", ou mutatis mutandis si vous avez une version allemande, italienne, espagnole, etc. Note: ne faites pas simplement renommer le répertoire "fr-fr" mais faites-en une copie. <<< Les 3 autres workarounds ont leur faiblesse: 1) copier le fichier acad2018doc.lsp dans son répertoire parent; 2) forcer le chargement via la commande APPLOAD (ce qui est pire car les informations sont placées dans un profil donc à risque de disparaitre en changeant de profil et on ne comprendra pas ce qui s'est passé); 3) modifier directement ou indirectement un fichier didié à l'autochargement, e.g. acad.lsp, acaddoc.lsp et surtout pas acad2018.lsp, acad2018doc.lsp qui sont réservés à AutoCAD ou encore utiliser le fichier *.mnl associé à votre menu personnalisé ou même indiquer à votre menu principal de le faire; Dans ces 3 situations, ce n'est pas une bonne solution car cela ne règlera pas le problème de chargement des autres fichiers du répertoire "fr-fr", par exemple 3d.lsp, mvsetup.lsp, etc. Aussi, si vous êtes le responsable, la solution de créer une copie sous "en-us" est beaucoup plus simple (on peut même l'ajouter au fichier *.msi) et vous êtes plus à l'abri de vos utilisateurs qui pourraient modifier leur environnement et il vous sera plus facile de gérer vos postes sur le long terme. Bonne journée à tous. Je reviendra de temps en temps. Ça me manque un peu.
  3. Félicitations et longue vie, même si longue vie en informatique, ça ne veut plus dire grand chose. Je vais suivre ce site, ça doit bien faire plus de 10 ans que je ne m'implique plus comme je le faisais et comme je le souhaiterais. Qui sait. En passant, je trouve toujours rigolo de lire des termes anglophones comme "contractor" au lieu de consultant, pigiste, occasionnel, contractuel, contractant, etc. C'est le monde à l'envers ;-).
  4. Serge

    Espace papier en X-ref

    phil_vsd, Fraid voulait dire tout ce qui est visible dans la présentation, y compris la ou les vues sur l'espace objet. Serge
  5. zizou_elec Si j'ai bien compris, les objets sont initialement de type de ligne ByLayer (DuCalque) et en les fusionnant sur un calque, tu perd la propriété d'origine (il semble que la couleur ne pose pas problème puisque tu dois avoir choisi un gris pale). Il te faudra modifier le fichier source d'abord grâce à cette routine qui forcera les propriétés. Tu pourras l'insérer par la suite. ;;; c:BylayerToByEntityProps ;;; Par Serge Camiré, 2008-12-18 (defun c:BylayerToByEntityProps ( / forceTypeLigne forceCouleur pref prop Props ) ;; Force les propriétés (couleur et type de ligne) à être par objet plutôt que par calque. (initget "TypeLigne Couleur 2") (setq pref (getkword "\nForcer les propriétés suivante [TypeLigne/Couleur/les 2] : ")) (setq forceTypeLigne (/= pref "Couleur")) (setq forceCouleur (wcmatch pref "Couleur,2")) (setq Props (GetLayerProperties)) (vlax-for ModelSpaceObject (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) (setq prop (assoc (vla-get-layer ModelSpaceObject) Props)) (if (and forceCouleur (= 256 (vla-get-Color ModelSpaceObject))) (vla-put-Color ModelSpaceObject (nth 1 prop))) (if (and forceTypeLigne (= "BYLAYER" (vla-get-Linetype ModelSpaceObject))) (vla-put-Linetype ModelSpaceObject (nth 2 prop))) ) (princ) ) (defun GetLayerProperties ( / name color linetype prop return ) ;; Retourne (list (list nomclaque1 couleur1 typeligne1) (list nomclaque2 couleur2 typeligne2)) ...) ;; de tout le dessin. (setq return nil) (vlax-for layer (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))) (setq name (vla-get-name layer)) (setq color (vla-get-Color layer)) (setq linetype (vla-get-Linetype layer)) (setq prop (list (list name color linetype))) (setq return (append return prop)) ) return ) (princ "\nTapez BylayerToByEntityProps pour forcer les propriétés.") (princ) Serge
  6. Steven, Vérifie simplement si le problème persiste, même en choisissant un autre répertoire pour tes palettes (Options -> Fichier -> Emplacement des fichiers de palettes d'outils. Si ça fonctionne, il est possible que l'ancien répertoire ou les fichiers qu'il contient sont en lecture seule. Serge
  7. Serge

    Espace papier en X-ref

    Fraid, À première vue, je ne vois pas l'utilité d'insérer une présentation d'un dessin sous forme de Xref. L'esssence de l'espace objet est d'être une conception, un design tandis que celle de l'espace papier d'être un rapport. C'est pour cela qu'AutoCAD ne donne pas cette option. Cela aurait également voulu dire que l'on fait un rapport dans un rapport. Pourquoi ne pas allé plus direct ? Pour palier à ce manque, on peut: 1) Glisser une présentation d'un dessin à l'autre ( z.B. depuis le DesignCenter). Dans certaines versions d'AutoCAD, il y a un bug lorsqu'on glisse une présentation qui contient un xref (e.g. un logo). Pour contourner le problème, on importe le logo d'abord sous forme de bloc puis, si on insiste, on le reconvertit en xref via blocktoxref des ExpressTools. 2) Utiliser des jeux de feuilles (sheets set) Serge
  8. Serge

    Bloc dynamique avec attribut

    etude0 As-tu essayé la commande FENETRES (_VPORTS) [surligneur] via l'espace objet [/surligneur]et via le menu Affichage -> Fenêtres -> Fenêtres existantes ? Essaie d'abord avec un nouveau dessin pour te familiariser avec la commande. La commande FENETRES affiche une boite de dialogue qui te permet de faire du 3D (voir le message précédent). Si tu commences avec une forme 3D simple comme un cube, tu pourras passer d'une fenêtre à l'autre et créer une cote sur chaque arête. Une fois la géométrie dessinée, tu peux passer à l'espace papier et répliquer ton agencement de fenêtre via la commande FMULT (_MVIEW), option Restaurer Commande: FMULT [Enter] Spécifiez le coin de la fenêtre ou [Actif/Inactif/Zonegraph/Tracombr/Verrou/Objet/Polygonal/Restaurer/Calque/2/3/4] : Restaurer [Enter] Entrez le nom de configuration de la fenêtre ou [?] <*Active>: [Enter] Spécifiez le premier coin ou [Zonegraph] : [Enter] Régénération du modèle. En espérant que ces quelques précisions sauront t'aider. Serge
  9. Serge

    Bloc et attribut

    ayoros Si j'ai bien compris, c'est que tu aurais disons 20 attributs et que les 10 premiers sont communs et les 10 suivants sont distincts. Ta manipulation consiste a créer un bloc de 10 attributs qui est ensuite inclus dans un super bloc qui comporte les 10 autres. Est-ce bien cela ? Serge
  10. Serge

    Bloc dynamique avec attribut

    lili2006 Merci. Je n'avais pas inclus la balise url à l'intérieur de img. J'aurais du y penser etude0 Est-ce que tu fais du vrai 3D ou de l'iso ? Pour du vrai 3D, il existe la commande FENETRES (_VPORTS) qui divisera l'écran en autant de fenêtres que requis (il ne faut pas en demander trop). Dans l'onglet "Nouvelle fenêtre", tu choisi la configuration 3D et la façon de diviser l'écran. L'idée est que dès que tu change de change de fenêtre, le SCU change donc tu as toujours le loisir de dessiner tes cotes dans la bonne vue. Serge
  11. soso83 Concernant les épaisseurs de trait, il existe différentes autres façons de le faire (et je ne les citerai pas pour ne pas rendre le sujet plus compliqué) mais de donner une épaisseur à une polyligne (comme tu le fait) demeure la façon la plus simple de s'y retrouver si on échange des dessins ou lorsqu'on imprime. Serge
  12. Serge

    Bloc dynamique avec attribut

    lili2006 Excel charge bien l'un ou l'autre (CDF et SDF). Lorsqu'on ouvre, on choisit le type de fichier "Texte" puis un assistant s'ouvre. À l'étape 1 de 3, on nous demande le type de données d'origine (on pourrait même demander d'ignorer la ligne d'entête). À l'étape 2, on choisit Tabulation ou Virgule selon SDF ou CDF (on pourrait même choisir les 2 dans 99% des cas). À l'étape 3, on clique sur Suivant. Pour ce qui est du bloc, il ne s'agit pas d'un bloc faisant partie du symbole de cote mais un bloc qui illustre une valve, une pompe, etc. Normalement, le tuyau se visse dans l'accessoire donc sa longueur réelle est supérieure à la ligne ou au rectangle qui rprésente le tuyau Je n'ai pas compris comment insérer une image alors elle se trouve ici. Très important: cette image est issue d'un dessin schématique (P&ID), ce qui est contraire à l'esprit d'un dessin en vraies grandeurs, mais je n'avais pas un dessin de vraie tuyauterie sous la main. Serge
  13. Serge

    Bloc et attribut

    lili2006 J'ai regardé (vite) LXL mais il me semble que ce soit un utilitaire d'extraction vers Excel et non un utilitaire qui synchronique les attributs de blocs. Serge
  14. Serge

    Bloc et attribut

    ayoros Désolé de ne pas avoir été plus explicite. Il n'y a aucune commande à taper. Le programme crée un réacteur qui va surveiller le dessin en temps réel. Ceci veut dire que lorsque tu utilises DDATTE ou autre commande d'édition, chaque copie sera automatiquement mise à jour. Dans les commentaires, j'écrivais que si des nouveaux blocs sont copiés, il seront surveillés. Si des blocs sont insérés (via Inserer ou un Drag & Drop), il ne seront pas surveillés si ceux-ci servent de référence à la commande DDATTE mais le seront si la référence est un bloc déjà présent au moment du chargement de la routine. Voir les commentaires pour la suite des explications. Pour ce qui est concerne ton besoin, il serait intéressant d'étudier les jeux de feuilles (Sheet Sets) ainsi que les champs (Fields). C'est un sujet trop long pour ce fil mais je t'encourage à regarder les tutoriels. Serge
  15. Serge

    Bloc dynamique avec attribut

    lili2006 Dans l'ancien code , il manquait une paire d'information qui a du se perdre en faisait un undo ou avec une mauvaise manipulation de souris. En tout cas merci d'avoir pris le temps d'examiner le code. Pour expliquer les entêtes et les résultats, j'ai inscrit des commentaires au début. J'ai modifié le code pour traiter le format de sortie CDF et SDF (2 formats polulaires pour Excel). Pour ce qui est de la première ligne du fichier, elle correspond à une entete facultative qu'on peut omettre selon une variable ( [surligneur] voir le code surligné[/surligneur]). Le fait d'avoir une ligne d'entête facilite la lecture et est facilement pris en charge par des produits comme Excel. ;;; EXTRACTDIM ;;; Dans le cas d'extraction de longueur de tuyau, on ne peut pas (ou on ne veut pas) se servir d'attributs ;;; mais plutôt de cotes. Le programme suivant permet l'extraction de ces longueurs ainsi que des blocs ;;; pouvant se trouver à chaque base de ligne d'extension. ;;; Le but de connaitre ce bloc servira éventuellement à déterminer le type d'accessoire dans lequel le tuyau ;;; est branché puis à rectifier la longueur mesurée ;;; ;;; ;;; Deux formats de sortie sont disponibles: SDF et CDF ;;; Avec ces 2 formats, il est très facile d'importer les données dans Excel ;;; [surligneur] Il est possible de choir entre écrire une ligne d'entête ou non. Voir (setq Entete t)[/surligneur] ;;; Chaque ligne comporte 6 champs: ;;; 1) Le handle de la cote ;;; 2) La longueur de la cote ;;; 3) Le handle du bloc (si détecté) au début de la cote ;;; 4) Le nom du bloc en question (ex: Valve, Pompe, Coude, etc) ;;; 5) Le handle du bloc (si détecté) à la fin de la cote ;;; 6) Le nom du bloc en question (ex: Valve, Pompe, Coude, etc) ;;; Si la cote n'est pas reliée à un bloc, apparaitra dans le champs ;;; ;;; Exemple de sortie en format SDF (String Delimited File), avec entête et "\t" comme délimiteur ;;; DimHandle Longueur HandleBlocA NomBlocA HandleBlocB NomBlocB ;;; 1F9 613.47990366 1EB Pompe 1F0 Valve ;;; 21E 774.25851188 21B Pompe 21C Valve ;;; 230 1080.50347436 22D Pompe 22E Valve ;;; 242 1317.84332738 23F Pompe 240 Valve ;;; 254 1509.24642685 251 Pompe 252 Valve ;;; 266 1807.83527069 263 Pompe 264 Valve ;;; 300 1807.83527069 2FE Pompe [i] <[/i]Aucun [i] >[/i] [i] <[/i]Aucun [i] >[/i] ;;; 311 1807.83527069 [i] <[/i]Aucun [i] >[/i] [i] <[/i]Aucun [i] >[/i] 30F Valve ;;; 322 1807.83527069 [i] <[/i]Aucun [i] >[/i] [i] <[/i]Aucun [i] >[/i] [i] <[/i]Aucun [i] >[/i] [i] <[/i]Aucun [i] >[/i] ;;; ;;; ;;; Exemple de sortie en format CDF (Coma Delimited File), avec entête ;;; "DimHandle","Longueur","HandleBlocA","NomBlocA","HandleBlocB","NomBlocB" ;;; "1F9",613.47990366,"1EB","Pompe","1F0","Valve" ;;; "21E",774.25851188,"21B","Pompe","21C","Valve" ;;; "230",1080.50347436,"22D","Pompe","22E","Valve" ;;; "242",1317.84332738,"23F","Pompe","240","Valve" ;;; "254",1509.24642685,"251","Pompe","252","Valve" ;;; "266",1807.83527069,"263","Pompe","264","Valve" ;;; "300",1807.83527069,"2FE","Pompe"," [i] <[/i]Aucun [i] >[/i]"," [i] <[/i]Aucun [i] >[/i]" ;;; "311",1807.83527069," [i] <[/i]Aucun [i] >[/i]"," [i] <[/i]Aucun [i] >[/i]","30F","Valve" ;;; "322",1807.83527069," [i] <[/i]Aucun [i] >[/i]"," [i] <[/i]Aucun [i] >[/i]"," [i] <[/i]Aucun [i] >[/i]"," [i] <[/i]Aucun [i] >[/i]" ;;; Par Serge Camiré, 2008-08-25 (defun c:extractDim ( / Entete FileName Format infos SplitChar ss ) (and (setq ss (getDimension)) (setq infos (extractDimensionInfo ss)) (setq FileName (getfiled "Fichier de sortie pour les cotes" "" "txt" (+ 1 4))) (or (initget "Sdf Cdf") (setq Format (getkword "\nFormat de sortie [CDF/SDF] : ")) (setq Format "SDF") ) (setq Format (if (= Format "Cdf") 'cdf 'sdf)) (setq SplitChar (if (= Format 'cdf) "," "\t")) ; Délimiteur (un caractère) [surligneur] (setq Entete t)[/surligneur] ; T pour écrire le nom des champs sur la première ligne (writeDimensionInfo FileName infos Entete SplitChar Format) ) (princ) ) (defun writeDimensionInfo ( FileName infos Entete SplitChar Format / fptr i info msg n ) ;; Écriture des résultats ;; Filename: Nom du fichier ;; infos: liste de liste obtenues via extractDimensionInfo ;; Entete: T pour écrire le nom des champs sur la première ligne ;; SplitChar: Caractère de séparation (un tab est suggéré) ;; Format: 'cdf ou 'sdf (setq i 0) (setq n (length infos)) (if (not (and (= Format 'sdf) SplitChar (= (type SplitChar) 'str) (/= 1 (strlen SplitChar)))) (setq SplitChar "\t")) (if (= Format 'cdf) (setq SplitChar "\",\"")) (setq fptr (open FileName "w")) (if Entete (progn (setq msg (strcat "DimHandle" SplitChar "Longueur" SplitChar "HandleBlocA" SplitChar "NomBlocA" SplitChar "HandleBlocB" SplitChar "NomBlocB")) (if (= Format 'cdf) (setq msg (strcat "\"" msg "\""))) (write-line msg fptr) )) (while (< i n) (setq msg "") (if (= Format 'cdf) (progn (setq info (nth i infos)) (setq msg (strcat "\"" (nth 0 info) "\"," (nth 1 info) ",\"" (nth 2 info) SplitChar (nth 3 info) SplitChar (nth 4 info) SplitChar (nth 5 info) "\"")) ) (progn (setq info (reverse (nth i infos))) (foreach elem info (setq msg (strcat SplitChar elem msg))) (setq msg (substr msg 2)) ; Enlever le premier caractère )) (write-line msg fptr) (setq i (1+ i)) ) (close fptr) nil ) (defun extractDimensionInfo ( ss ; Sélection de cotes / Ancrage1 Ancrage2 Blocget BlocNameA BlocNameB corner1 corner2 DimObject DimObjectGet Handle HandleA HandleB i info infos longueur n PickBoxUnits PickBoxUnitsHalf ssAncrage UnitsPerPixel ) ;; extractDimensionInfo ;; Extrait les informations relatives aux cotes dans le format ;; (list (list Handle Longueur HandleBlocA NomBlocA HandleBlocB NomBlocB)) ;; L'idée étant de savoir si des blocs sont ancrés à la base des lignes ;; d'extension (setq i 0) (setq n (sslength ss)) ;; Pour calcul d'une zone de la taille du PickBox (setq UnitsPerPixel (/ (getvar "viewsize") (cadr (getvar "screensize")))) (setq PickBoxUnits (* (getvar "pickbox") UnitsPerPixel)) (setq PickBoxUnitsHalf (* 0.5 PickBoxUnits)) (while (< i n) (setq DimObject (ssname ss i)) (setq DimObjectGet (entget DimObject)) (setq Handle (cdr (assoc 5 DimObjectGet))) (setq Ancrage1 (cdr (assoc 13 DimObjectGet))) (setq Ancrage2 (cdr (assoc 14 DimObjectGet))) (setq longueur (cdr (assoc 42 DimObjectGet))) ; Autre possibilité ;; (setq IDimObject (vlax-ename->vla-object DimObject)) ;; (setq longueur (vla-get-Measurement IDimObject)) ;; Chercher s'il y a un bloc au voisinage du point d'ancrage 1 (setq Corner1 (mapcar '- Ancrage1 (list PickBoxUnitsHalf PickBoxUnitsHalf 0))) (setq Corner2 (mapcar '+ Ancrage1 (list PickBoxUnitsHalf PickBoxUnitsHalf 0))) (setq ssAncrage (ssget "_c" Corner1 Corner2 (list (cons 0 "insert")))) (if ssAncrage (progn (setq Blocget (entget (ssname ssAncrage 0))) (setq BlocNameA (cdr (assoc 2 Blocget))) (setq HandleA (cdr (assoc 5 Blocget))) ) (progn (setq BlocNameA "") (setq HandleA "") )) ;; Chercher s'il y a un bloc au voisinage du point d'ancrage 2 (setq Corner1 (mapcar '- Ancrage2 (list PickBoxUnitsHalf PickBoxUnitsHalf 0))) (setq Corner2 (mapcar '+ Ancrage2 (list PickBoxUnitsHalf PickBoxUnitsHalf 0))) (setq ssAncrage (ssget "_c" Corner1 Corner2 (list (cons 0 "insert")))) (if ssAncrage (progn (setq Blocget (entget (ssname ssAncrage 0))) (setq BlocNameB (cdr (assoc 2 Blocget))) (setq HandleB (cdr (assoc 5 Blocget))) ) (progn (setq BlocNameB "") (setq HandleB "") )) (setq info (list Handle (rtos longueur 2 8) HandleA BlocNameA HandleB BlocNameB)) (setq infos (append infos (list info))) (setq i (1+ i)) ) (setq infos (reverse infos)) infos ) (defun getDimension ( / initgetList layerName layerNames layers methode ss ) ;; Obtenir un jeu d'objets "AcDbRotatedDimension" ;; Retourne : 'PickSet ou nil (initget "Tout Calque Sélection") (setq methode (getkword "\nExtraction des cotes [Tout/Calque/Sélection] : ")) (if (not methode) (setq methode "Sélection")) ; Précaution pour les anciennes versions d'AutoLISP (cond ((= "Tout" methode) (setq ss (ssget "_x" (list (cons 0 "dimension") (cons 100 "AcDbRotatedDimension") (cons 410 (getvar "ctab")))))) ((= "Calque" methode) ;; Construire la liste des calques (setq layers (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object)))) (setq layerNames nil) (vlax-for layer layers (setq layerNames (cons (strcase (vla-get-name layer)) layerNames))) (setq layerNames (vl-sort layerNames '<)) ;; Préparer le Initget (setq initgetList "") (foreach layerName layerNames (setq initgetList (strcat initgetList " " layerName))) (setq initgetList (substr initgetList 2)) ; Enlever le premier " " (initget "Nom ?") (setq ss (nentsel "\nMontrer un objet du calque ou [Nom/?]: ")) (cond ((= (type ss) 'list) (setq layerName (cdr (assoc 8 (entget (car ss))))) (setq ss (ssget "_x" (list (cons 0 "dimension") (cons 100 "AcDbRotatedDimension") (cons 8 layerName) (cons 410 (getvar "ctab"))))) ) ((not ss) nil) ((= ss "?") (princ "\nListe des calques du dessin:") (foreach layerName layerNames (princ (strcat "\n\t" layerName))) (initget initgetList) (setq layerName (getkword (strcat "\nNom du calque <" (strcase (getvar "clayer")) ">: "))) (if (not layerName) (setq layerName (strcase (getvar "clayer")))) ; Précaution pour les anciennes versions d'AutoLISP (setq ss (ssget "_x" (list (cons 0 "dimension") (cons 100 "AcDbRotatedDimension") (cons 8 layerName) (cons 410 (getvar "ctab"))))) ) ((= ss "Nom") (initget initgetList) (setq layerName (getkword (strcat "\nNom du calque <" (strcase (getvar "clayer")) ">: "))) (if (not layerName) (setq layerName (strcase (getvar "clayer")))) ; Précaution pour les anciennes versions d'AutoLISP (setq ss (ssget "_x" (list (cons 0 "dimension") (cons 100 "AcDbRotatedDimension") (cons 8 layerName) (cons 410 (getvar "ctab"))))) ) (t (setq ss nil)) ) ) ((= "Sélection" methode) (setq ss (ssget (list (cons 0 "dimension") (cons 100 "AcDbRotatedDimension") (cons 410 (getvar "ctab"))))) ) ) ss ) (princ "\nChargement réussi. Tapez EXTRACTDIM pour lancer la routine.") (princ) Serge
  16. soso83 Il y a quelques jours, quelqu'un a demandé si on pouvait extraire les longueur de ses tuyaux ( voir ici ). Je ne sais pas si le besoin est similaire. Quoi qu'il en soit a) Est-ce que ta fonction fait le travail ? b) Pourqu'on créer une polyligne pour un seul segment c) Un type de ligne n'aurait pas fait le travail Serge
  17. Serge

    Bloc et attribut

    ayoros Finalement, j'ai fait une solution, en espérant qu'elle corresponde au besoin. [surligneur] À modifier[/surligneur], la liste des noms de blocs à surveiller. ;;; Réacteurs permettant de synchroniser les attributs au travers de blocs homonymes ;;; Limites: AutoCAD n'empêche pas qu'un bloc ait 2 attributs portant le même nom d'étiquette (tag) ;;; Si une telle situation se présente, le texte de la première étiquette sera extraite. ;;; De plus, si de nouveaux blocs sont insérés (e.g. via _INSERT ou INSERER), les nouveaux blocs ;;; ne seront pas surveiller. On peut facilement modifier cette routine pour inclure l'événement ;;; ou encore on peut relancer (SetReactors) pour rafraichir. ;;; IMPORTANT : Vous devez corriger la liste des noms de bloc à surveiller ;;; Variable *BlockNamesToWatch* ;;; ;;; Par Serge Camiré, 2008-08-26 ;;; Déterminer la liste des noms de bloc à surveiller [surligneur] (setq *BlockNamesToWatch* (list "Bloc1" "Bloc2"))[/surligneur] ;;; ======================================================================= ;;; Ne pas modifier la suite (defun BlockReactorObjectClosed ( object calling-reactor arg-list / attributes attributesSafeArray attributesVariant BlockName infos ObjectId Occurences ) ;; BlockReactorObjectClosed ;; Fonction callback de l'événement :vlr-objectClosed. Filtre l'information puis délègue le traitement ;; à la fonction CustomModification. Les arguments proviennent du notifier. (and (not *CustomModification*) (not (vl-catch-all-error-p (setq BlockName (vl-catch-all-apply 'vla-get-name (list object))))) (setq ObjectId (vla-get-ObjectID object)) (setq Occurences (GetBlockOccurences BlockName)) (setq Occurences (vl-remove-if '(lambda (x) (= (vla-get-ObjectID x) ObjectId)) Occurences)) (setq attributesVariant (vla-GetAttributes object)) (setq attributesSafeArray (safearray-value (variant-value attributesVariant))) (foreach x attributesSafeArray (setq infos (append infos (list (cons (vla-get-TagString x) (vla-get-TextString x)))))) (progn (setq *CustomModification* t) (foreach Occurence Occurences (CustomModification Occurence infos)) (setq *CustomModification* nil) ) ) ) (defun CustomModification ( object infos / attributesSafeArray attributesVariant info tag ) ;; CustomModification ;; objet: objet à modifier ;; infos : 'LIST, (list (cons tag1 . texte1) (cons tag2 . texte2) ...) en référence (setq attributesVariant (vla-GetAttributes object)) (setq attributesSafeArray (safearray-value (variant-value attributesVariant))) (foreach x attributesSafeArray (setq tag (vla-get-TagString x)) (if (setq info (assoc tag infos)) (vla-put-TextString x (cdr info))) (vla-Update x) ) ) (defun GetAllBlockOccurences (BlockNames / AllOccurences Occurences) ;; GetAllBlockOccurences ;; Retourne tous les occurences de bloc correspondant à la liste de noms ;; BlockNames : 'LIST, (list "Nom1" "Nom2" "Nom3" ...) (setq Occurences nil) (setq AllOccurences nil) (foreach BlockName BlockNames (setq Occurences (GetBlockOccurences BlockName)) (if Occurences (setq AllOccurences (append AllOccurences Occurences)) ) ) AllOccurences ) (defun GetBlockOccurences (BlockName / BlockTable) ;; GetBlockOccurences ;; Reçoit le nom d'un bloc puis retourne la liste de toutes ses occurences en format vla (setq BlockTable (tblobjname "block" BlockName)) (if BlockTable (vl-remove-if '(lambda (x) (not x)) (mapcar 'vlax-ename->vla-object (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 331 (car x))) (entget (cdr (assoc 330 (entget BlockTable)))) ) ) ) ) ) ) (defun SetReactors ( / AllOccurences ) ;; SetReactors ;; Création d'un réacteur (un abonnement) entre une liste d'objets à surveiller ;; et des paires (événement fonctions) devant être interpellées lors du dit événement. (setq AllOccurences (GetAllBlockOccurences *BlockNamesToWatch*)) (if *BlockReactor* (vlr-remove *BlockReactor*)) (setq *BlockReactor* (vlr-object-reactor AllOccurences nil '((:vlr-objectClosed . BlockReactorObjectClosed) ) ) ) ) (SetReactors) ; Self-execute (princ) Serge
  18. Serge

    Bloc et attribut

    ayoros Avant de répondre, je voudrais mieux comprendre la question. Si je reformule : Tu disposes de 2 (ou plusieurs) blocs portant le même nom, avec les mêmes définitions d'attribut. Lorsque tu édites l'un (via une boite de dialogue ou sur la ligne de commande), que l'autre se modifie automatiquement. Est-ce bien cela ? Serge
  19. Serge

    Bloc dynamique avec attribut

    etude0, Voici un programme qui n'est pas basé sur l'extraction d'attributs mais plutôt sur l'extraction de longueur de cotes. L'idéal est de placer les cotes pertinentes sur un calque spécifique. Voir les commentaires du programme pour plus de détails sur le format de sortie des données. [surligneur] Le code a été modifié. Vu sa longueur du code et pour alléger la lecture de ce fil, il se maintenant retrouve plus loin[/surligneur] Serge [Edité le 27/8/2008 par Serge]
  20. Serge

    Bloc dynamique avec attribut

    etude0 Je ne suis pas sur de comprendre la question. Parle-t-on encore de nomenclature associée au 3D ou est-on rendu simplement du coté design ? Lorsqu'on parle de tuyauterie, on imagine des extrusions. Les commandes d'extrusion ou de 3D n'interagisse pas avec les nomenclatures (je garde un bémol que j'explique plus loin). Il y a un autre aspect non négligeable, normalement, la longueur réelle des tuyaux est plus longue que la longueur apparente puisqu'il faut une longueur additionnelle pour pouvoir l'accoupler avec les accessoires (coudes, réducteurs, coupling, robinets, etc.). La longueur de la partie insérée dans l'accessoire dépend de plusieurs facteurs dont le diamètre et le matériau. Pour ces raisons, il faut (idéalement) pouvoir accéder à une base de données pour connaître les spécifications de tout ce matériel. Le bémol de tantôt: Il existe d'autres logiciels. Du coté AutoCAD Mechanical, il existe une banque de symbole pour des profilés d'acier qui procurerait une possibilité d'associer les longueurs apparentes (mais non réelles) à une nomenclature. Malheureusement, un profilé d'acier cylindrique est loin d'être un tuyau et la tentative d'association échoue. Du coté Inventor, je ne connais pas assez le produit pour confirmer qu'il traite bien les longueurs réelles. Du coté d'AutoCAD P&ID (aka AutoCAD Plant), on peut aussi faire de la tuyauterie. Malheureusement, je l’ai désinstallé et je ne peux pas te donner d’opinion. Il existe aussi des add-on pour AutoCAD comme CAD-Pipe yw22 C'est évident qu'il existe des logiciels beaucoup plus efficace qu'AutoCAD. Même si le coût initial du logiciel peut en faire reculer quelqu’uns, le retour sur l'investissement est très rapide. Ce que j'aime avec Autodesk est que leurs solutions sont toutes compatibles (Inventor avec AutoCAD Mecanical surtout depuis la 2004 et, depuis la 2009, entre tous les produits) Tramber Merci pour les compliments. Je vois que le chèque s'est bien rendu ;) . Farce à part, je ne sais pas ce que ça veut dire d'être considéré comme le meilleur spécialiste de la francophonie. C'est comme vouloir dire qu'aux jeux olympiques, le meilleur nageur est meilleur que le meilleur sprinter ou que le meilleur décathlonien. Les 2 premiers étant des spécialistes, le dernier étant un généraliste. Je me considère comme un décathlonien ayant à toucher à presque tout (quand je dis presque tout, c'est tous les langages de programmation ou de personnalisation, plusieurs des produits verticaux, l'installation et l'optimisation, les solutions de groupes comme Vault et ProductStream, les base de données, etc.). Par contre, je suis touché par ton témoignage d'affection. Je vais citer ces paroles de la chanson " Maintenant je sais " interprétées par Jean Gabin (pour ceux qui ont mon âge) : " Le jour où quelqu'un vous aime, il fait très beau. J'peux pas mieux dire : il fait très beau ! " Merci beaucoup. (voir les paroles complètes de la chanson à http://www.paroles.net/chanson/17866.1)
  21. Serge

    Bloc dynamique avec attribut

    etude0 Désolé pour le délai. La commande porte un nom différent selon la version: 2006, 2007 : _EATTEXT (EXTATTBE) 2008, 2009 : _DATAEXTRACTION (EXTRACTDONNEES) Dans un cas comme dans l'autre, tu pourras extraire le "nom dynamique" du bloc. Le nom du bloc et le nom dynamique sont respectivement dans les champs "Nom" et "Forme" Serge
  22. bseb67 Merci pour le tuyau. Il me semble cependant avoir vu des photos à même les messages et non en référence (bien que je ne trouve pas que ce soit une bonne idée puisqu'un jour le site ne seraplus utilisable). Serge
  23. gile Je n'avais pas lu l'un de tes messages précédents qui disait que c'était un exercice de style. Avant l'arrivée de Vital Lisp (l'ancêtre de Visual Lisp), je développais des fonctions de cette façon pour le support multilingue. J'avais une liste de noms de commande en français et une autre en anglais et avec un mapcar et une fonction lambda dont le point d'intérêt était (eval (read (strcat "c:" commande))), je pouvais créer les noms locaux. Patrick_35 L'usage de l'apostrophe : a) dans le getvar, il n'y a pas trop d'intérêt. b) comme paramètre, c'est plus pratique qu'une chaine de caractères qui pourrait être sensible au majuscule (la fonction quote convertit toujours en majuscules) et ça veut dire plus ce que ça veut dire si on relit le code 5 ans plus tard. Pour le reste, un Integer aurait été tout aussi efficace (à l'époque du DOS, on aurait dit plus économe) Serge
  24. gile J'interviens rarement lorsque le thread est autonome mais j'ai remarqué ceci: a) J'utilisais normalement tilemode au lieu de cvport. Depuis la 2005, il existe la commande _VPMAX (MAXFENETRE) qui fait en sorte que les gens travaillent probablement plus au travers d'une fenêtre flottante qu'avant, ce qui rend cvport plus simple à utiliser. Il se peut aussi que si tilemode=0 et que cvport <> 1, qu'il faille quand même créer les objets dans l'espace papier puisque c'est de là que l'usager à lancer la routine. Disons que c'est une question que seul l'utilisateur peut répondre. On pourrait aussi poser la question. b) C'est curieux que (getvar 'variable) fonctionne au lieu de (getvar "variable"). Je ne suis pas certain qu'AutoLISP va toujours suppporter cette syntaxe. J'ai vérifié que ça ne fonctionnait pas en R14 mais oui depuis la 2000. c) La création de fonction de façon dynamique rend impossible l'ajout de points d'arrêt et donc le débogage impossible. De plus, il faut faire des pieds et des mains pour éviter de ne pas s'y perdre avec les apostrophes. Voici une version différente qui reprend presqu'exactement le code d'avant (que je n'ai pas testé) mais qui utilise la notion de fonction. Note: le but n'est pas de dénigrer l'ancien code mais de proposer une façon plus souple pour le débogage. (defun c:Top () (MoveTo 'ToTop) (princ)) (defun c:Bot () (MoveTo 'ToBot) (princ)) (defun MoveTo ( To / ent doc sort space ss cnt var ) (vl-load-com) (and (setq ent (car (entsel "\nSélectionnez un objet sur le calque cible: "))) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (setq space (if (= 1 (getvar "cvport")) (vla-get-paperspace doc) (vla-get-modelspace doc))) (or (not (vl-catch-all-error-p (setq sort (vl-catch-all-apply (quote vla-getobject) (list (vla-getExtensionDictionary space) "acad_sortents"))))) (setq sort (vla-addobject (vla-getExtensionDictionary space) "acad_sortents" "acdbsortentstable")) ) (progn (vla-startundomark doc) (setq ss (ssget "_x" (list (assoc 8 (entget ent))))) (setq var (vlax-make-safearray vlax-vbobject (cons 0 (1- (sslength ss)))) cnt 0) (vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc)) (vlax-safearray-put-element var cnt obj) (setq cnt (1+ cnt))) (vla-delete ss) (cond ((= 'ToTop To) (vla-MoveToTop sort (vlax-make-variant var)) ((= 'ToBot To) (vla-MoveToBottom sort (vlax-make-variant var)) (t (alert (strcat "MoveTo : paramètre incorrect" "(usage (MoveTo 'ToTop) ou (MoveTo 'ToBot)" )) ) ) (vla-EndUndoMark doc) ) ) (princ) ) Serge
  25. Serge

    modif variable

    fabdo, Désolé mais j'ai un peu de difficulté à suivre. Il y a eu quelques fils à ce sujets par le passé (juin) et je pensais que le besoin éatit comblé. a) Le plus simple est de remplacer la virgule dans (ascii ",") par un espace (comme gile l'avais déjà suggéré) b) Dans l'exemple de ce que ça faisait il y a un peu trop de virgules selon moi. Si le texte est exact, alors je n'ai rien dit, sinon c'est difficile pour les autres de deviner la bonne syntaxe.c) Lorsqu'on commence un nouveau fil, il ne faut pas supposer que les autres devineront que celui-ci constitue la suite d'un autre. d) Si le nouveau texte est "1 5000.0000 1000.0000 0.000" et que le premier chiffre représente l'attribut alors que les 3 autres, les x,y,z, on aura (while (setq str (read-line file)) ; "1 5000.0000 1000.0000 0.000" (setq str (eval (read (strcat "(list " str ")")))) ; (list 1 5000.0 1000.0 0.0) (setq mat (car str)) ; 1 (setq ins (cdr str)) ; (list 5000.0 1000.0 0.0) (setq ref (vla-InsertBlock Space (vlax-3d-point ins) bloc 1.0 1.0 1.0 0.0)) (mapcar '(lambda (x y) (vla-put-TextString x y)) etc e) Dans les autres fils, il était question d'afficher des nombres avec une certaine précision. Est-ce que ça tient encore. Le problème est que je ne commais pas le bloc qui va recevoir les attributs, je ne suis pas certain de la syntaxe des lignes du fichiers, etc. Serge
×
×
  • 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é