Aller au contenu

Luna

Membres
  • Compteur de contenus

    1 113
  • Inscription

  • Dernière visite

  • Jours gagnés

    42

Tout ce qui a été posté par Luna

  1. Luna

    Changer de scu

    Mon programme permet simplement de ne pas utiliser la souris pour choisir le SCU. En supposant que tu as une liste de SCU comme ceci : Gauche Droite Test SCU1 SCU2 Si tu connais par coeur ta liste de SCU alors tu peux directement saisir QSCU suivi de 1 (= Gauche) ou 2 (= Droite), etc ou 0 (= SCG). Autrement dit tu as 2 saisies clavier (1 pour lancer la commande QSCU, 1 autre pour choisir le SCU à activer). Ce programme répond en parti à ton soucis mais permet d'être plus "généraliste" sur son utilisation. Pour ton cas très précis, une simple macro suffit (je ne suis pas douée en macro) car c'est une simple utilisation de commande avec une donnée précise... En lisp on peut faire chat, mais il n'y a pas de vérification sur l'existence d'un soit-disant SCU nommé "Gauche" (ou "Droite") !! (defun c:SCU-Gauche () (command "_UCS" "_Name" "_Restore" "Gauche") (princ) ) (defun c:SCU-Droite () (command "_UCS" "_Name" "_Restore" "Droite") (princ) ) Après tu affectes la commande comme bon te semble mais si le SCU "Gauche" ou le SCU "Droite" n'existe pas, cela va générer une erreur et tu devras quitter la commande manuellement !!! (vl-catch-all-apply) ne fonctionne pas sur la fonction (command) Bisous, Luna
  2. Coucou, Normalement le programme conserve le(s) nom(s) des blocs utilisés lors du dernier lancement de la commande. Donc le(s) nom(s) précédemment utilisés sont proposés par défaut mais rien n'empêche d'en choisir d'autres à la place normalement... Je regarderais chat plus en détails plus tard, mais il ne me semble pas que le programme interdise la sélection d'un autre bloc si on ne veut pas la valeur par défaut... Ce qui est sûr c'est que le soucis vient donc du (entget) car un (entsel) n'a pas réussi à récupérer le nom d'un bloc... As-tu une idée de la ligne qui génère ce bug ? sinon je regarderais chat ce we. Bisous, Luna
  3. Luna

    Changer de scu

    Je doute que tu puisses avoir plus rapide que 2 clics pour changer de SCU à ta guise perso'... Tu peux accéder à cette liste déroulante à de nombreux endroits de ton espace de travail : Au-dessous du ViewCube Depuis le ruban comme l'a montré La Lozère Depuis un raccourci de commande situé dans la barre d'outils "SCU II" Si tu ne veux pas utiliser la souris, alors je suppose qu'une simple macro de la commande SCU fera l'affaire Je peux te proposer ceci au besoin pour t'épargner l'écriture du nom du SCU pour le remplacer par un nombre en fonction de sa position dans la liste des SCU : (defun c:QSCU (/ lst i n) (defun SymbolTable->list (name / tbl lst) (if (not (vl-catch-all-error-p (setq tbl (vl-catch-all-apply 'tblnext (list name T) ) ) ) ) (while tbl (setq lst (cons (cdr (assoc 2 tbl)) lst) tbl (tblnext name) ) ) ) lst ) (initget 5 "?") (setq lst (SymbolTable->list "UCS")) (while (/= (type (setq i (getint "\nChoose the UCS number [?] : "))) 'INT) (setq n 0) (prompt (strcat "\nUCS list : " (apply 'strcat (mapcar '(lambda (u) (strcat "\n" (itoa (setq n (1+ n))) ". " u)) lst)) ) ) ) (cond ((= 0 i) (command "_UCS" "") ) ((<= i (length lst)) (command "_UCS" "_Name" "_Restore" (nth (1- i) lst)) ) ) (princ) ) Donc en terme de retour c'est relativement simple : Bisous, Luna
  4. Pas à mon nom, c'est le directeur de l'IT qui possède l'ensemble des licences AutoCAD du boulot (et je n'ai pas spécialement besoin de me créer un compte pour chat, désolée...) Bisous, Luna
  5. Coucou, Merci @lecrabe pour le partage :3 N'ayant pas directement de compte AutoDesk je ne peux pas répondre sur ce sujet mais normalement la version 2.0 (dispo ci-dessus) devrait correspondre à sa demande si je ne me trompe pas. @Steven Chat fait plaisir de voir que cette routine sert à quelque chose ♥ Bisous, Luna
  6. Luna

    PolyAddPoint et PolyDelPoint

    Coucou, Petit up sur la commande PolyAddPoint permettant un aperçu des modifications (via la fonction (grread) et (grdraw)). Il y a très certainement de nombreuses optimisations de codage mais je n'ai pas forcément le niveau pour ^^" (defun c:PolyAddPoint (/ *error* break jsel i name rd osf osm n p c pt-list pt-c pt-s pt-e p-lst get-pt-list Add-Poly2D-Point) (defun *error* (msg) (princ msg) (redraw) (sssetfirst nil nil) (prompt "\n") (exit) ) (defun get-pt-list (name / pt-list) (setq entlist (entget name)) (while (setq pt (assoc 10 entlist)) (setq pt-list (cons (cdr pt) pt-list) entlist (cdr (member pt entlist)) ) ) (reverse pt-list) ) (defun Add-Poly2D-Point (name seg pt-a / entlist pt-s pt-e) (if (and (setq entlist (entget name)) (setq pt-s (cons 10 (car seg))) (if (cdr seg) (setq pt-e (cons 10 (cdr seg))) (setq pt-e (assoc 210 entlist)) ) (member pt-s entlist) (entmod (subst (cons 90 (1+ (cdr (assoc 90 entlist)))) (assoc 90 entlist) (append (reverse (cdr (member pt-e (reverse entlist)))) (list (cons 10 pt-a) (assoc 40 (member pt-s entlist)) (assoc 41 (member pt-s entlist)) (assoc 42 (member pt-s entlist)) (assoc 91 (member pt-s entlist)) ) (member pt-e entlist) ) ) ) ) T nil ) ) (setq osf (LM:grsnap:snapfunction) osm (getvar "OSMODE") p 0 c 0 ) (if (setq jsel (ssget '((0 . "LWPOLYLINE")))) (while (not break) (setq n 0) (while (= 5 (car (setq rd (grread T 15 0)))) (redraw) (setq p-lst nil tmp-lst nil pt-c (trans (osf (cadr rd) osm) 1 0) ) (repeat (setq i (sslength jsel)) (setq name (ssname jsel (setq i (1- i))) c (rem (- (sslength jsel) i) 255) pt-list (get-pt-list name) pt-s (car (vl-sort pt-list '(lambda (pt1 pt2) (< (distance pt-c pt1) (distance pt-c pt2)) ) ) ) pt-e (cadr (member pt-s pt-list)) ) (if (not (member pt-s tmp-lst)) (progn (setq tmp-lst (cons pt-s tmp-lst)) (grdraw (trans pt-c 0 1) (trans pt-s 0 1) c 1) ) ) (if (and pt-e (not (member pt-e tmp-lst)) ) (progn (setq tmp-lst (cons pt-e tmp-lst)) (grdraw (trans pt-c 0 1) (trans pt-e 0 1) c 1) (grdraw (trans pt-s 0 1) (trans pt-e 0 1) -1 2) ) ) (setq p-lst (cons (cons name (cons pt-s pt-e)) p-lst)) ) ) (if (= 3 (car rd)) (progn (while (= 5 (car (setq rd (grread T 15 0)))) (redraw) (setq i 0 tmp-lst nil pt-c (trans (osf (cadr rd) osm) 1 0) ) (foreach lst p-lst (setq name (car lst) i (1+ i) c (rem i 255) pt-s (cadr lst) pt-e (cddr lst) ) (if (not (member pt-s tmp-lst)) (progn (setq tmp-lst (cons pt-s tmp-lst)) (grdraw (trans pt-c 0 1) (trans pt-s 0 1) c 1) ) ) (if (and pt-e (not (member pt-e tmp-lst)) ) (progn (setq tmp-lst (cons pt-e tmp-lst)) (grdraw (trans pt-c 0 1) (trans pt-e 0 1) c 1) (grdraw (trans pt-s 0 1) (trans pt-e 0 1) -1 2) ) ) ) ) (if (= 3 (car rd)) (progn (foreach lst p-lst (setq name (car lst)) (if (Add-Poly2D-Point name (cdr lst) pt-c) (setq n (1+ n)) ) ) (setq p (1+ p)) (if (> n 0) (prompt (strcat "\nPoint n°" (itoa p) " : " (itoa n) " / " (itoa (sslength jsel)) " polylignes traitées avec succès, ajout du point " (vl-princ-to-string pt-c) "." "\n" ) ) (prompt (strcat "\nPoint n°" (itoa p) " : " "Echec lors de l'ajout du point " (vl-princ-to-string pt-c) ) ) ) ) (progn (setq break T) (prompt "\nFin d'exécution de la commande.") ) ) ) (progn (setq break T) (prompt "\nFin d'exécution de la commande.") ) ) ) ) (redraw) (sssetfirst nil nil) (princ) ) Etant donné que l'accrochage aux objets peut s'avérer fort utile pour ce genre de chose, et que je n'ai pas trouvé mieux que les programmes de LeeMac (et que je n'ai pas du tout le niveau pour comprendre ou modifier un de ses programmes mais ils sont fabuleux), voici l'ensemble des fonctions nécessaires pour pouvoir utiliser l'accrochage aux objets directement avec (grread) : ;; Object Snap for grread: Snap Function - Lee Mac ;; Returns: [fun] A function requiring two arguments: ;; p - [lst] UCS Point to be snapped ;; o - [int] Object Snap bit code ;; The returned function returns either the snapped point (displaying an appropriate snap symbol) ;; or the supplied point if the snap failed for the given Object Snap bit code. (defun LM:grsnap:snapfunction ( ) (eval (list 'lambda '( p o / q ) (list 'if '(zerop (logand 16384 o)) (list 'if '(setq q (cdar (vl-sort (vl-remove-if 'null (mapcar (function (lambda ( a / b ) (if (and (= (car a) (logand (car a) o)) (setq b (osnap p (cdr a)))) (list (distance p b) b (car a)) ) ) ) '( (0001 . "_end") (0002 . "_mid") (0004 . "_cen") (0008 . "_nod") (0016 . "_qua") (0032 . "_int") (0064 . "_ins") (0128 . "_per") (0256 . "_tan") (0512 . "_nea") (2048 . "_app") (8192 . "_par") ) ) ) '(lambda ( a b ) (< (car a) (car b))) ) ) ) (list 'LM:grsnap:displaysnap '(car q) (list 'cdr (list 'assoc '(cadr q) (list 'quote (LM:grsnap:snapsymbols (atoi (cond ((getenv "AutoSnapSize")) ("5"))) ) ) ) ) (LM:OLE->ACI (if (= 1 (getvar 'cvport)) (atoi (cond ((getenv "Layout AutoSnap Color")) ("117761"))) (atoi (cond ((getenv "Model AutoSnap Color")) ("104193"))) ) ) ) ) ) '(cond ((car q)) (p)) ) ) ) ;; Object Snap for grread: Display Snap - Lee Mac ;; pnt - [lst] UCS point at which to display the symbol ;; lst - [lst] grvecs vector list ;; col - [int] ACI colour for displayed symbol ;; Returns nil (defun LM:grsnap:displaysnap ( pnt lst col / scl ) (setq scl (/ (getvar 'viewsize) (cadr (getvar 'screensize))) pnt (trans pnt 1 2) ) (grvecs (cons col lst) (list (list scl 0.0 0.0 (car pnt)) (list 0.0 scl 0.0 (cadr pnt)) (list 0.0 0.0 scl 0.0) '(0.0 0.0 0.0 1.0) ) ) ) ;; Object Snap for grread: Snap Symbols - Lee Mac ;; p - [int] Size of snap symbol in pixels ;; Returns: [lst] List of vector lists describing each Object Snap symbol (defun LM:grsnap:snapsymbols ( p / -p -q -r a c i l q r ) (setq -p (- p) q (1+ p) -q (- q) r (+ 2 p) -r (- r) i (/ pi 6.0) a 0.0 ) (repeat 12 (setq l (cons (list (* r (cos a)) (* r (sin a))) l) a (- a i) ) ) (setq c (apply 'append (mapcar 'list (cons (last l) l) l))) (list (list 1 (list -p -p) (list p -p) (list p -p) (list p p) (list p p) (list -p p) (list -p p) (list -p -p) (list -q -q) (list q -q) (list q -q) (list q q) (list q q) (list -q q) (list -q q) (list -q -q) ) (list 2 (list -r -q) (list 0 r) (list 0 r) (list r -q) (list -p -p) (list p -p) (list p -p) (list 0 p) (list 0 p) (list -p -p) (list -q -q) (list q -q) (list q -q) (list 0 q) (list 0 q) (list -q -q) ) (cons 4 c) (vl-list* 8 (list -r -r) (list r r) (list r -r) (list -r r) c) (list 16 (list p 0) (list 0 p) (list 0 p) (list -p 0) (list -p 0) (list 0 -p) (list 0 -p) (list p 0) (list q 0) (list 0 q) (list 0 q) (list -q 0) (list -q 0) (list 0 -q) (list 0 -q) (list q 0) (list r 0) (list 0 r) (list 0 r) (list -r 0) (list -r 0) (list 0 -r) (list 0 -r) (list r 0) ) (list 32 (list r r) (list -r -r) (list r q) (list -q -r) (list q r) (list -r -q) (list -r r) (list r -r) (list -q r) (list r -q) (list -r q) (list q -r) ) (list 64 '( 0 1) (list 0 p) (list 0 p) (list -p p) (list -p p) (list -p -1) (list -p -1) '( 0 -1) '( 0 -1) (list 0 -p) (list 0 -p) (list p -p) (list p -p) (list p 1) (list p 1) '( 0 1) '( 1 2) (list 1 q) (list 1 q) (list -q q) (list -q q) (list -q -2) (list -q -2) '(-1 -2) '(-1 -2) (list -1 -q) (list -1 -q) (list q -q) (list q -q) (list q 2) (list q 2) '( 1 2) ) (list 128 (list (1+ -p) 0) '(0 0) '(0 0) (list 0 (1+ -p)) (list (1+ -p) 1) '(1 1) '(1 1) (list 1 (1+ -p)) (list -p q) (list -p -p) (list -p -p) (list q -p) (list -q q) (list -q -q) (list -q -q) (list q -q) ) (vl-list* 256 (list -r r) (list r r) (list -r (1+ r)) (list r (1+ r)) c) (list 512 (list -p -p) (list p -p) (list -p p) (list p p) (list -q -q) (list q -q) (list q -q) (list -q q) (list -q q) (list q q) (list q q) (list -q -q) ) (list 2048 (list -p -p) (list p p) (list -p p) (list p -p) (list (+ p 05) -p) (list (+ p 06) -p) (list (+ p 05) -q) (list (+ p 06) -q) (list (+ p 09) -p) (list (+ p 10) -p) (list (+ p 09) -q) (list (+ p 10) -q) (list (+ p 13) -p) (list (+ p 14) -p) (list (+ p 13) -q) (list (+ p 14) -q) (list -p -p) (list p -p) (list p -p) (list p p) (list p p) (list -p p) (list -p p) (list -p -p) (list -q -q) (list q -q) (list q -q) (list q q) (list q q) (list -q q) (list -q q) (list -q -q) ) (list 8192 (list r 1) (list -r -q) (list r 0) (list -r -r) (list r q) (list -r -1) (list r r) (list -r 0)) ) ) ;; Object Snap for grread: Parse Point - Lee Mac ;; bpt - [lst] Basepoint for relative point input, e.g. @5,5 ;; str - [str] String representing point input ;; Returns: [lst] Point represented by the given string, else nil (defun LM:grsnap:parsepoint ( bpt str / str->lst lst ) (defun str->lst ( str / pos ) (if (setq pos (vl-string-position 44 str)) (cons (substr str 1 pos) (str->lst (substr str (+ pos 2)))) (list str) ) ) (if (wcmatch str "`@*") (setq str (substr str 2)) (setq bpt '(0.0 0.0 0.0)) ) (if (and (setq lst (mapcar 'distof (str->lst str))) (vl-every 'numberp lst) (< 1 (length lst) 4) ) (mapcar '+ bpt lst) ) ) ;; Object Snap for grread: Snap Mode - Lee Mac ;; str - [str] Object Snap modifier ;; Returns: [int] Object Snap bit code for the given modifier, else nil (defun LM:grsnap:snapmode ( str ) (vl-some (function (lambda ( x ) (if (wcmatch (car x) (strcat (strcase str t) "*")) (progn (princ (cadr x)) (caddr x) ) ) ) ) '( ("endpoint" " of " 00001) ("midpoint" " of " 00002) ("center" " of " 00004) ("node" " of " 00008) ("quadrant" " of " 00016) ("intersection" " of " 00032) ("insert" " of " 00064) ("perpendicular" " to " 00128) ("tangent" " to " 00256) ("nearest" " to " 00512) ("appint" " of " 02048) ("parallel" " to " 08192) ("none" "" 16384) ) ) ) ;; OLE -> ACI - Lee Mac ;; Args: c - [int] OLE Colour (defun LM:OLE->ACI ( c ) (apply 'LM:RGB->ACI (LM:OLE->RGB c)) ) ;; OLE -> RGB - Lee Mac ;; Args: c - [int] OLE Colour (defun LM:OLE->RGB ( c ) (mapcar '(lambda ( x ) (lsh (lsh (fix c) x) -24)) '(24 16 8)) ) ;; 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 ) ) ) ) ;; Application Object - Lee Mac ;; Returns the VLA Application Object (defun LM:acapp nil (eval (list 'defun 'LM:acapp 'nil (vlax-get-acad-object))) (LM:acapp) ) (vl-load-com) (princ) (Issus directement du site de LeeMac -> GrSnap !) Bisous, Luna
  7. Luna

    Lisp Select-filter

    Coucou, Bon petite refonte de ma fonction (Select-Filter) pour plus d'efficacité et de possibilité dans la gestion des filtres. De nombreux changements sur l'utilisation de la fonction mais l'ensemble des pratiques d'utilisation de la fonction sont clairement explicitées sur le fichier .lsp ci-joint, en début de programme. J'ai également ajouté un ensemble de commentaires pour faciliter sa compréhension dans la limite du raisonnable et pour permettre de la modifier en cas de nécessité :3 Ci-dessous les commentaires d'explication pour l'utilisation de la fonction avec l'explication de chaque argument et quelques exemples d'utilisation : --- Nom de la fonction []-----------------------[] Select-Filter []-----------------------[] --- Date de création > 18/02/2020 --- Dernière modification > 20/04/2021 --- Auteur(e) > Luna --- Version > 3.0.0 --- Classe > "DtSel" --- But et domaine d'application > Afin de faciliter grandement la sélection de blocs dynamiques, cette fonction a pour but de pouvoir sélectionner les blocs (ou objet) selon différents modes et ainsi retourner la composition du jeu de sélection en fonction des paramètres spécifiés. Il est ainsi possible de filtrer les blocs par rapport à leurs attributs, propriétés dynamiques, EffectiveName, liste DXF, etc Son fonctionnement est similaire à la fonction (ssget), avec quelques ajouts en plus. Le retour dans l'historique de commande permet d'avoir un décomptes des blocs et objet en fonction de leurs propriétés respectives. Attention cependant, après plusieurs essais, il semblerait que la fonction n'est pas en mesure de fonctionner correctement lors d'une sélection importante (limite du nombre d'objets à définir), générant une erreur de "Access violation ...". --- Déclaration des arguments La fonction (Select-Filter) possède 4 argument(s) : ¤ mode > 4 modes de sélection ont été programmé : "DXF" permet d'effectuer une sélection standard (ssget) en ajoutant tout de même un décompte des objets selon leurs propriétés DXF (spécifiées en argument). "BLC" permet d'effectuer une sélection à partir de l'EffectiveName de la référence de bloc, permettant ainsi de sélectionner sans encombre des blocs dynamiques et standard. Le décompte se fera donc en fonction du nom de chaque définition de bloc présente dans le jeu de sélection. Si aucune pré-sélection, utilise le mode de sélection "_X" de la fonction (ssget). "ATT" permet d'effectuer une sélection à partir du nom et/ou de la valeur d'un ou plusieurs attribut(s) de références de bloc (standard et/ou dynamique). Le décompte se fera donc en fonction du nom de l'attribut et de sa valeur. Si aucune pré-sélection, utilise le mode de sélection "_X" de la fonction (ssget). "DYN" permet d'effectuer une sélection à partir du nom et/ou valeur d'une ou plusieurs propriété(s) dynamique de références de bloc (dynamique uniquement). Le décompte se fera donc en fonction du nom de la propriété dynamique et de sa valeur. Si aucune pré-sélection, utilise le mode de sélection "_X" (ssget). (type mode) = 'STR | Ex. : "DXF", "BLC", "ATT" ou "DYN" ¤ filter > en fonction du mode de sélection, 2 possibilités : si mode = "DXF" alors filter correspond à la liste des codes DXF que l'on souhaite utiliser pour le décompte. Si un objet ne possède aucun des codes DXF spécifiés, il n'apparaîtra pas dans le décompte détaillé, mais il sera tout de même présent dans le jeu de sélection et le nombre d'objets. (type filter) = 'LST | Ex. : '(0 8), '(0), '(6 62 420), ... si mode = "BLC" alors filter correspond à la clé de recherhe concernant l'EffectiveName du bloc. Une clé de ou mode = "ATT" recherche permet l'utilisation de Wildcard Characters afin de spécifier plusieurs nom de blocs ou mode = "DYN" par exemple ou bien une recherche relative, etc. (type filter) = 'LST | Ex. : '("Module*" "PDT*,PDL*,Local*,LT*"), '("*"), '("*PVBlock"), ... ¤ arg-lst > correspond à la liste des arguments de la fonction (ssget) pour une utilisation de la fonction native dans ses pleines possibilités. Prise en compte des arguments facultatifs de (ssget) sous forme de liste ainsi faite ([sel-method] [pt1 [pt2]] [pt-list] [filter-list]). Voici une liste non-exhaustive des méthodes de sélection de la fonction (ssget), proposée par LeeMac : - "_" Non-localised mode string prefix Ensures the English version of the mode string is used in non-English versions of AutoCAD. Not strictly necessary for all mode strings, but safer to include than exclude. - "+." Point selection mode Forces ssget to remain in 'point' mode, similar to setting PICKAUTO to 0 May be combined with the ":S" single-selection mode and ":E" mode to emulate an entsel selection by avoiding implied selection windows. - "A" All Similar to the "X" mode string but excludes objects on frozen layers. Selects all objects on thawed layers. This mode string cannot be combined with graphical selection mode strings. - "B" Box Selects all objects inside or crossing a rectangle specified by 2 points If the points are specified from right to left, Box is equivalent to Crossing. Otherwise, Box is equivalent to Window. - "C" Crossing Selects objects residing within and/or crossing a rectangular area defined by two points. The supplied points should be expressed relative to the UCS, however, the crossing window will always be orthogonal to the WCS axes. Caution: Only objects visible in the drawing area at the time of selection will be selected by this method. Consider temporarily zooming to the selection window before performing the selection, and then zoom previous to restore the original screen position. - "CP" Crossing Polygon Selects objects residing within and/or crossing a polygon defined by a list of UCS points. The polygon can be any shape but cannot cross or touch itself. AutoCAD will construct the last segment of the polygon to ensure it is closed at all times. The CP mode string is not affected by the PICKADD System Variable. Caution: Only objects visible in the drawing area at the time of selection will be selected by this method. Consider temporarily zooming to the selection window before performing the selection, and then zoom previous to restore the original screen position. - ":D" Allow Duplicates Includes duplicate selected entities in the selection, else duplicates are ignored. - ":E" Everything within Aperture Allows selection of everything within the cursor's object selection pickbox. This mode may be used in conjunction with the "+." and ":S" mode strings to emulate entsel selection behaviour. - "F" Fence Selects all objects crossing a selection fence. The Fence method is similar to CP (Crossing Polygon) except that AutoCAD does not close the fence, and a fence can cross itself. Fence is not affected by the PICKADD System Variable. Caution: Only objects visible in the drawing area at the time of selection will be selected by this method. Consider temporarily zooming to the selection window before performing the selection, and then zoom previous to restore the original screen position. - "G" Groups Selects all objects within a specified group. Although a valid ssget mode string, there is no provision for passing group names as arguments to the ssget function and hence this option is only of use at the command-line during the Select objects prompt. - "I" Implied Implied selection (objects selected while PICKFIRST is in effect). - "L" Last Selects the last visible object added to the drawing database. Caution: when using the "L" selection method in an MDI environment, you cannot always count on the last object drawn to remain visible. For example, if your application draws a line, and the user subsequently minimizes or cascades the AutoCAD drawing window, the line may no longer be visible. If this occurs, ssget with the "L" option will return nil. - ":L" Exclude Locked Layers Rejects selection of objects residing on locked layers. - "M" Multiple Specifies multiple points without highlighting the objects, thus speeding up the selection process for complex objects. The Multiple method also selects two intersecting objects if the intersection point is specified twice. - ":N" Nested Call ssnamex for additional information on container blocks and transformation matrices for any entities selected during the ssget operation. This additional information is available only for entities selected via graphical selection methods such as Window, Crossing, and point picks. Unlike the other object selection methods, :N may return multiple entities with the same entity name in the selection set. For example, if the user selects a subentity of a complex entity such as a BlockReference, PolygonMesh, or old style polyline, ssget looks at the subentity that is selected when determining if it has already been selected. However, ssget actually adds the main entity (BlockReference, PolygonMesh, etc.) to the selection set. The result could be multiple entries with the same entity name in the selection set (each will have different subentity information for ssnamex to report). This ssget mode string is known to perform erratically. - "P" Previous Selects the most recent selection set. The Previous selection set is cleared by operations that delete objects from the drawing. AutoCAD keeps track of whether each selection set was specified in model space or paper space. The Previous selection set is ignored if you switch spaces. - ":P" Reject Viewports Rejects selection of Viewport objects. Equivalent to: (ssget '((0 . "~VIEWPORT"))) - ":R" Permit Long Transaction Allows entities in a long transaction to be selected. - ":S" Single Selection The user is permitted a single attempt to make a selection of objects using any available selection method. When combined with either "+." or ":E", only a single object may be selected, emulating an entsel. - ":U" Enable Subentity Selection - 2006+ Cannot be combined with the duplicate (":D") or nested (":N") selection modes. In this mode, top-level entities are selected by default, but the user can attempt to select subentities by pressing the CTRL key while making the selection. This option is supported only with interactive selection, such as window, crossing, and polygon. It is not supported for all, filtered, or group selections. - ":V" Force Subentity Selection - 2006+ Treats all interactive, graphic selections performed by the user as subentity selections. The returned selection set contains subentities only. This option cannot be combined with the duplicate (":D") or nested (":N") selection modes. This option is supported only with interactive selections, such as window and crossing. It is not supported for all, filtered, or group selections. - "W" Window Selects all objects residing completely inside a rectangle defined by 2 UCS points. Caution: Only objects visible in the drawing area at the time of selection will be selected by this method. Consider temporarily zooming to the selection window before performing the selection, and then zoom previous to restore the original screen position. - "WP" Window Polygon Selects objects completely inside a polygon defined by a list of points. The polygon can be any shape but cannot cross or touch itself. AutoCAD will construct the last segment of the polygon to ensure it is closed at all times. WPolygon is not affected by the PICKADD System Variable. Caution: Only objects visible in the drawing area at the time of selection will be selected by this method. Consider temporarily zooming to the selection window before performing the selection, and then zoom previous to restore the original screen position. - "X" Extended search (Entire Drawing Database) Iterates over the entire drawing database selection all entities matching the criteria given by the supplied filter list (if present), includes entities on layers that are off, frozen & locked, and entities outside of the visible drawing area. Voici une liste non-exhaustive des opérateurs de la liste de filtre de (ssget), proposée par LeeMac : - "*" Anything goes (always true) Example: > (ssget '((0 . "LINE") (-4 . "=,*,=") (10 1.0 0.0 1.0))) Select lines with start point passing through (1.0,*,1.0) i.e. with any Y-coordinate. - "=" Equal Example: > (ssget '((0 . "CIRCLE") (-4 . "*,*,=") (10 0.0 0.0 4.0))) Select circles with a center at an elevation of 4.0 units. - "!=" Not Equal "/=" All three listed operators are equivalent. "<>" Example: > (ssget '((0 . "CIRCLE") (-4 . "<>") (40 . 5.0))) Select circles with a radius not equal to 5.0. - "<" Less Than Example: > (ssget '((0 . "ARC") (-4 . "<") (40 . 2.0))) Select arcs with a radius less than 2.0. - "<=" Less Than or Equal to Example: > (ssget '((0 . "TEXT") (-4 . "*,<=") (11 0.0 10.0 0.0))) Select text with alignment point with Y-coordinate less than or equal to 10.0 units, with any X & Z coordinate value. - ">" Greater Than Example: > (ssget '((0 . "LINE") (-4 . ">,>") (11 3.0 3.0 0.0))) Select lines with end point passing through a point with X & Y coordinate greater than (3.0,3.0), with any Z-coordinate value. - ">=" Greater Than or Equal to Example: > (ssget '((0 . "POINT") (-4 . "<,>=,=") (10 5.0 7.0 0.0))) Select points with X-coordinate less than 5.0, Y-coordinate greater than or equal to 7.0, and with Z-coordinate equal to 0.0. - "&" Bitwise AND (integer groups only) Equivalent to: (/= 0 (logand bit filter)) Example: > (ssget '((0 . "POLYLINE") (-4 . "&") (70 . 6))) Select Polylines with either curve-fit (2) or spline-fit (4) vertices added. - "&=" Bitwise Masked Equals (Integer groups only) Equivalent to: (= filter (logand bit filter)) Example: > (ssget '((0 . "LWPOLYLINE") (-4 . "&=") (70 . 1))) Select closed LWPolylines. - "<AND...AND>" Logical AND Matches all enclosed expressions. Since the ssget filter list has an implied AND operator (matching all supplied items), this operator is mostly used in conjunction with other logical operators to form compound filters. Example: > (ssget '( (-4 . "<OR") (-4 . "<AND") (0 . "ARC") (40 . 1.5) (-4 . "AND>") (-4 . "<AND") (0 . "CIRCLE") (40 . 2.0) (-4 . "AND>") (-4 . "OR>") ) ) Selects arcs with radius 1.5 or circles with radius 2.0. - "<OR...OR>" Logical Inclusive OR Matches one or more enclosed expressions. Example: > (ssget '( (0 . "TEXT") (-4 . "<OR") (40 . 1.0) (8 . "0") (62 . 3) (-4 . "OR>") ) ) Selects text objects with text height of 1.0 or layer "0", or with colour set to 3 (green), or a combination of all of these properties. - "<XOR...XOR>" Logical Exclusive OR Matches one of two enclosed expressions. Example: > (ssget '((0 . "TEXT") (-4 . "<XOR") (40 . 1.0) (62 . 3) (-4 . "XOR>"))) Selects text with text height of 1.0 or with colour set to 3, but not both. - "<NOT...NOT>" Logical NOT Rejects objects matching the single enclosed expression. Example: > (ssget '((0 . "LINE") (-4 . "<NOT") (62 . 256) (-4 . "NOT>"))) Selects lines with colour not set to 256 (ByLayer). (type arg-lst) = 'LST | Ex. : '("_X" ((0 . "*LINE") (62 . 1) (70 . 0))), nil, ... ¤ flg-lst > correspond à la liste des attributs/propriétés sous forme de liste de paires pointées (tag . value) pour filtrer la sélection en fonction du mode spécifié. Selon le mode de sélection choisi, les paires pointées seront comparer à différentes listes possibles : - mode = "BLC" -> flg-lst est comparée à la liste des propriétés de l'objet disponibles via la fonction (vlax-dump-object) pour permettre un filtre sur des propriétés non accessibles depuis la liste DXF de l'objet (cf. filter-list (ssget)). - mode = "ATT" -> flg-lst est comparée à la liste des attributs de l'objet (get-att-list) pour permettre un filtre sur le nom et/ou la valeur d'un ou plusieurs attribut. - mode = "DYN" -> flg-lst est comparée à la liste des attributs de l'objet (get-dynprop-list) pour permettre un filtre sur le nom et/ou la valeur d'une ou plusieurs propriété dynamique. - mode = "DXF" -> flg-lst est comparée à l'ensemble des propriétés de l'objet correspondant à (append (get-att-list) (get-dynprop-list)) afin de permettre un filtre sur l'ensemble des propriétés autres que la liste DXF. (type flg-lst) = 'LST | Ex. : nil, '(("Num*" . "##") ("A" . "[0-9]")), ... ¤ flag > permet d'afficher ou non le décompte des objets (type flag) = 'SYM | Ex. : T si l'on souhaite afficher la décomposition du jeu de sélection, nil sinon. --- Liste des fonctions (définies localement par la fonction) ¤ "UtDac" ---> str2lst | v1.0.0 - ##/##/#### ((gile)) ¤ "UtDac" ---> lst2str | v1.0.0 - 19/04/2021 (Luna) ¤ "BaLst" ---> modf-ss | v1.0.0 - 19/04/2021 (Luna) ¤ "BaLst" ---> KeyList-Gen | v1.0.0 - 19/04/2021 (Luna) ¤ "BaEqc" ---> check-list | v1.0.0 - 19/04/2021 (Luna) ¤ "VlPrp" ---> vlax-dump-object->list | v#.#.# - 15/12/2016 (LeeMac) ¤ "VlPrp" ---> get-att-list | v1.1.0 - 14/09/2017 (LeeMac) ¤ "VlPrp" ---> get-DynProp-list | v1.1.0 - 14/09/2017 (LeeMac) --- Retour La fonction (Select-Filter) renvoie le jeu de sélection filtré selon les critères, ainsi que le décompte des objets dans l'historique de commande selon le mode défini en argument. Ex. : > (select-filter "BLC" '("*") nil nil t) renvoie <Selection set: 217d> ainsi que le décompte suivant dans l'historique de commande (cas d'une pré-sélection d'objets avant lancement de la fonction pour décomposer le jeu de sélection selon le nom des blocs) : Nombre d'objet(s) sélectionné(s) = 1116u Liste des bloc(s) trouvé(s) : - "Module générique F 2000x992x40" (448u - 40.14%) - "SUNGROW - Eclisse" (162u - 14.52%) - "SUNGROW - Fixation structure primaire" (16u - 1.43%) - "SUNGROW - Flotteur (Ext.)" (40u - 3.58%) - "SUNGROW - Flotteur (Int.)" (224u - 20.07%) - "SUNGROW - Structure d'arrimage (E-W)" (8u - 0.72%) - "SUNGROW - Structure d'arrimage (N-S)" (18u - 1.61%) - "SUNGROW - Structure primaire (6.37m)" (120u - 10.75%) - "SUNGROW - Structure secondaire (4.25m)" (16u - 1.43%) - "SUNGROW - Structure secondaire (6.38m)" (64u - 5.73%) > (select-filter "ATT" '("*") '("_X") '(("A" . "*")) t) renvoie <Selection set: 219d> ainsi que (sélection de la totalité des blocs possédant un attribut nommé "A", quelque soit sa valeur) : Nombre d'objet(s) sélectionné(s) = 97u Liste des attribut(s) trouvé(s) : - "A" = 01 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 02 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 03 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 04 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 05 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 06 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 07 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 08 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 09 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 1 (8u - 8.25%) -> "Repère" (8u - 100%) - "A" = 10 (7u - 7.22%) -> "Repère" (7u - 100%) - "A" = 11 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 12 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 13 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 14 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 15 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 16 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 17 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 18 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 19 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 2 (6u - 6.19%) -> "Repère" (6u - 100%) - "A" = 20 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 21 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 22 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 23 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 24 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 25 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 26 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 27 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 28 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 29 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 3 (6u - 6.19%) -> "Repère" (6u - 100%) - "A" = 30 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 31 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 32 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 33 (1u - 1.03%) -> "Repère" (1u - 100%) - "A" = 4 (6u - 6.19%) -> "Repère" (6u - 100%) - "A" = 5 (6u - 6.19%) -> "Repère" (6u - 100%) - "A" = 6 (6u - 6.19%) -> "Repère" (6u - 100%) - "A" = 7 (6u - 6.19%) -> "Repère" (6u - 100%) - "A" = 8 (6u - 6.19%) -> "Repère" (6u - 100%) - "A" = 9 (6u - 6.19%) -> "Repère" (6u - 100%) - "A" = C (2u - 2.06%) -> "Repère" (2u - 100%) > (select-filter "DXF" nil nil '((8 . "UBS-*")) T) renvoie <Selection set: 21a8> ainsi que (pré-sélection d'objet pour ne conserver que les objets présents sur des calques dont le nom commence par "UBS-") et strictement équivalent à (select-filter "DXF" '(8) '(((8 . "UBS-*"))) nil T) : Nombre d'objet(s) sélectionné(s) = 2207u Liste des propriété(s) d'objet trouvée(s) : - 8 = UBS-100-Cotation (20u - 0.91%) -> "DIMENSION" (20u - 100%) - 8 = UBS-100-Ensemble structurel (Ponton) (113u - 5.12%) -> "INSERT" (113u - 100%) - 8 = UBS-100-Modules (48u - 2.17%) -> "LWPOLYLINE" (48u - 100%) - 8 = UBS-100-Structure eclisse (32u - 1.45%) -> "INSERT" (32u - 100%) - 8 = UBS-100-Structure flottante (Ext.) (31u - 1.4%) -> "INSERT" (31u - 100%) - 8 = UBS-100-Structure flottante (Int.) (28u - 1.27%) -> "INSERT" (28u - 100%) - 8 = UBS-100-Structure primaire (6.37m) (20u - 0.91%) -> "INSERT" (20u - 100%) - 8 = UBS-100-Structure primaire (7.13m) (1u - 0.05%) -> "INSERT" (1u - 100%) - 8 = UBS-100-Structure secondaire (4.25m) (12u - 0.54%) -> "INSERT" (12u - 100%) - 8 = UBS-300-Tranchées (Coupes) (1872u - 84.82%) -> "ARC" (534u - 28.53%) -> "DIMENSION" (45u - 2.4%) -> "HATCH" (15u - 0.8%) -> "INSERT" (109u - 5.82%) -> "LWPOLYLINE" (1124u - 60.04%) -> "MTEXT" (7u - 0.37%) -> "MULTILEADER" (32u - 1.71%) -> "SOLID" (6u - 0.32%) - 8 = UBS-900-Fenêtre de Présentation (30u - 1.36%) -> "CIRCLE" (16u - 53.33%) -> "LWPOLYLINE" (13u - 43.33%) -> "MTEXT" (1u - 3.33%) > (select-filter "BLC" '("Module*") '(((8 . "0,UBS-100-*"))) nil T) renvoie <Selection set: 21bf> ainsi que (pas de pré-sélection donc seuls les blocs dont le nom commence par "Module" et qui sont situés sur les calques "0" ou commençant par "UBS-100-") : Sélectionner des objets: Spécifiez le coin opposé: 4233 trouvé(s), 9 groupes Sélectionner des objets: Nombre d'objet(s) sélectionné(s) = 4032u Liste des bloc(s) trouvé(s) : - "Module générique F 2000x992x40" (4032u - 100%) > (select-filter "BLC" '("Module*") '(((8 . "0,UBS-100-*"))) nil nil) renvoie <Selection set: 21bf> ainsi que (sélection identique à la précédente) : 4032 trouvé(s) correspondant au retour de la fonction (ssget) (donc le nombre affiché peut être différent). --- Modifications apportées par rapport à la version précédente > Refonte totale de la fonction pour permettre une utilisation plus complète et plus riche. Ajout d'un argument !!! Si jamais vous avez quelques difficultés à l'utilisation, je peux expliciter un peu mieux que chat au cas par cas au besoin ! Bisous, Luna DtSel ¤ Select-Filter (3.0.0 - 20-04-2021).lsp
  8. Coucou, La commande DEPLACER nécessite un jeu de sélection (c'est la 1ère question de la commande). Donc comme le dit bonusCAD, je pense qu'un simple : (defun c:DD40 () (command "_MOVE" (ssget) "" "0,0,0" "0,40,0") ) L'avantage de la fonction (ssget), c'est que si l'on ne spécifie pas d'argument pour la méthode de sélection (et si PICKFIRST = 1) alors tu pourras pré-sélectionner les objets avant le lancement de la commande, sinon il te faudra les sélectionner après le lancement de la commande DD40 :3 (L'AutoLISP est bien supporté sur ta machine ?) Bisous, Luna
  9. Ah... Alors dans ce cas je ne pourrais pas t'être d'une grande aide, je suis sur AutoCAD 2019 :3 Bisous, Luna
  10. Coucou, As-tu REGEN ton dessin une fois fait ? La mise à jour ne se fait pas automatiquement :3 En tout cas, cela fonctionne correctement chez moi ! Bisous, Luna
  11. Ma remarque est uniquement pour supprimer son histoire de en supprimant le masque d'arrière-plan depuis la palette de propriétés (ce qui évite de programmer un LISP pour cela). Ensuite pour l'histoire de la règle, cette largeur de MTEXT est contenue dans le code DXF 41 d'une entité MTEXT; cf. ci-dessous la sélection de la SubEntity d'une DIMENSION correspondant au texte de cote : Commande: (explore-dxf (entget (car (nentsel)) '("*")) 0 nil nil) Choix de l'objet: Explore DXF in progress from "MTEXT" (<Nom d'entité: a0175f50>) : | (-1 . <Nom d'entité: a0175f50>) | (0 . "MTEXT") | (330 . <Nom d'entité: a0175a20>) | (5 . "2AD") | (100 . "AcDbEntity") | (67 . 0) | (8 . "0") | (62 . 0) | (440 . 16777216) | (48 . 0.1) | (100 . "AcDbMText") | (10 1.0 0.226536 0.0) | (40 . 0.1) | (41 . 10.8658) | (46 . 0.0) | (71 . 5) | (72 . 1) | (1 . "\\A1;2.000") | (7 . "Standard") | (210 0.0 0.0 1.0) | (11 1.0 0.0 0.0) | (42 . 0.338813) | (43 . 0.102115) | (50 . 0.0) | (73 . 1) | (44 . 1.0) | (90 . 3) | (63 . 9) | (421 . 13158600) | (45 . 1.25) | (441 . 0) | End of exploration... Donc par exemple on remarque ici que le code DXF 41 n'est pas à 0.0 Pour accéder à cette entité, ce n'est pas faisable directement depuis la liste DXF de l'objet DIMENSION. Pour cela il faut considérer la cote comme une référence de bloc donc tu peux essayer d'accéder au MTEXT ainsi : (defun c:SetDimWidth0 (/ jsel i name ent entlist) (if (setq jsel (ssget '((0 . "DIMENSION")))) (progn (repeat (setq i (sslength jsel)) (setq name (ssname jsel (setq i (1- i))) entlist (tblsearch "BLOCK" (cdr (assoc 2 (entget name)))) ent (cdr (assoc -2 entlist)) ) (while ent (if (and (= "MTEXT" (cdr (assoc 0 (entget ent)))) (entmod (subst '(41 . 0.0) (assoc 41 (entget ent)) (entget ent) ) ) (entupd ent) ) (setq ent nil) (setq ent (entnext ent)) ) ) ) (command "_REGENALL") ) ) (princ) ) Finalement (gile) a été plus rapide (et concis), cependant en testant le programme le MTEXT ne se met pas à jour via (entupd) donc un coup de REGEN et c'est bon. :3 Bisous, Luna
  12. Coucou, N'est-il pas possible de supprimer l'arrière-plan depuis la palette de propriété "Texte>Couleur de remplissage>Aucune" en sélectionnant toutes les côtes problématique d'un seul coup ? Bisous, Luna
  13. Luna

    Lisps de gile

    oki merci pour l'info, c'est bien ce qui me semblait :3 Bisous, Luna
  14. Luna

    Lisps de gile

    @(gile), je remarque que les liens situés dans ton 1er message aboutissent sur une page "File not found". Je précise qu'il s'agit des liens (donc en souligné à la suite du mot "lien : ") et non les liens associés aux commandes en gras. Cf. exemple ci-dessous : Je ne sais pas vers quoi ces liens allaient, ni même si le soucis est récent ou non, c'est juste une remarque en passant :3 Bisous, Luna
  15. Luna

    Lisp Select-filter

    merci @didier ! je sais déjà que l'écriture de la fonction pourrait être grandement simplifiée mais je n'ai pas beaucoup de temps pour la modifier actuellement. Toute remarque sera la bienvenue et ce n'est que récemment que j'ai amélioré les commentaires en début de fichier donc il faudra que j'essaye d'ajouter quelques ligne de commentaires pour mieux expliciter les potentialités de la fonction et son fonctionnement. Bisous, Luna
  16. Luna

    Lisp Select-filter

    Coucou, Nah c'est une fonction (je n'ai pas eu le courage de la transposer sous forme de commande) donc elle possède 4 arguments (cf. les commentaires sur le .lsp) : mode -> correspond à une chaîne de caractères. 4 valeurs possibles : - "DXF" permet d'effectuer une sélection basée sur la liste DXF d'un objet donc fonctionne de la même façon que la fonction (ssget) avec la liste des filtres - "BLC" permet d'effectuer une sélection basée sur le nom de la définition de bloc (donc références de blocs uniquement) - "ATT" permet d'effectuer une sélection basée sur le nom et/ou la valeur d'un ou plusieurs attribut de bloc (donc références de blocs uniquement) - "DYN" permet d'effectuer une sélection basée sur le nom et/ou la valeur d'une ou plusieurs propriété dynamique de bloc (donc références de blocs uniquement) blocname -> correspond soit au nom de la définition de bloc (pour les modes "BLC", "ATT" et "DYN") en recherche relative (cf. Wildcard Characters) sous format string, soit à la liste des codes DXF que l'on souhaite trier (pour le mode "DXF") sous format liste. tag -> correspond soit au nom de l'attribut/propriété dynamique (pour les modes "ATT" et "DYN") en recherche relative sous format string, soit au mode de sélection de la fonction (ssget) (cf. Méthode de sélection (ssget)) sous format string (pour les modes "DXF" et "BLC") value -> correspond soit à la valeur de l'attribut/propriété dynamique (pour les modes "ATT" et "DYN") en recherche relative sous format string, soit à la liste de filtres de la fonction (ssget) (cf. Filtres de sélection) sous format liste (pour les modes "DXF" et "BLC") Quelques exemple d'utilisation : ;; Aucune pré-sélection, donc sélection de la totalité des blocs dont le nom commence par "SUNGROW" et possède la chaîne "Eclisse" Commande: (select-filter "BLC" "SUNGROW*Eclisse*" nil nil) Nombre d'objet(s) sélectionné(s) = 6410 u Liste des blocs trouvés : - SUNGROW - Eclisse (6410u - 100%) <Selection set: 2163> ;; Pré-sélection d'objets avant lancement de la fonction donc seul les blocs pré-sélectionnés sont décomptés Commande: (select-filter "BLC" "*" nil nil) Nombre d'objet(s) sélectionné(s) = 1208 u Liste des blocs trouvés : - Module générique F 2000x992x40 (448u - 37.09%) - SUNGROW - Eclisse (200u - 16.56%) - SUNGROW - Fixation structure primaire (8u - 0.66%) - SUNGROW - Flotteur (Ext.) (120u - 9.93%) - SUNGROW - Flotteur (Int.) (224u - 18.54%) - SUNGROW - Structure primaire (6.37m) (128u - 10.6%) - SUNGROW - Structure secondaire (4.25m) (16u - 1.32%) - SUNGROW - Structure secondaire (6.38m) (64u - 5.3%) <Selection set: 217d> ;; Aucune pré-sélection donc sélection de la totalité des blocs possédant un attribut nommé "A" Commande: (select-filter "ATT" "*" "A" "*") Nombre d'objet(s) sélectionné(s) = 97 u selon la recherche des propriétés : - "A" = "01" ( 1u - 1.03%) - "A" = "02" ( 1u - 1.03%) - "A" = "03" ( 1u - 1.03%) - "A" = "04" ( 1u - 1.03%) - "A" = "05" ( 1u - 1.03%) - "A" = "06" ( 1u - 1.03%) - "A" = "07" ( 1u - 1.03%) - "A" = "08" ( 1u - 1.03%) - "A" = "09" ( 1u - 1.03%) - "A" = "1" ( 8u - 8.25%) - "A" = "10" ( 7u - 7.22%) - "A" = "11" ( 1u - 1.03%) - "A" = "12" ( 1u - 1.03%) - "A" = "13" ( 1u - 1.03%) - "A" = "14" ( 1u - 1.03%) - "A" = "15" ( 1u - 1.03%) - "A" = "16" ( 1u - 1.03%) - "A" = "17" ( 1u - 1.03%) - "A" = "18" ( 1u - 1.03%) - "A" = "19" ( 1u - 1.03%) - "A" = "2" ( 6u - 6.19%) - "A" = "20" ( 1u - 1.03%) - "A" = "21" ( 1u - 1.03%) - "A" = "22" ( 1u - 1.03%) - "A" = "23" ( 1u - 1.03%) - "A" = "24" ( 1u - 1.03%) - "A" = "25" ( 1u - 1.03%) - "A" = "26" ( 1u - 1.03%) - "A" = "27" ( 1u - 1.03%) - "A" = "28" ( 1u - 1.03%) - "A" = "29" ( 1u - 1.03%) - "A" = "3" ( 6u - 6.19%) - "A" = "30" ( 1u - 1.03%) - "A" = "31" ( 1u - 1.03%) - "A" = "32" ( 1u - 1.03%) - "A" = "33" ( 1u - 1.03%) - "A" = "4" ( 6u - 6.19%) - "A" = "5" ( 6u - 6.19%) - "A" = "6" ( 6u - 6.19%) - "A" = "7" ( 6u - 6.19%) - "A" = "8" ( 6u - 6.19%) - "A" = "9" ( 6u - 6.19%) - "A" = "C" ( 2u - 2.06%) Liste des blocs trouvés : - Repère (97u - 100%) <Selection set: 219d> ;; Utilisation du précédent jeu de sélection pour décompte des blocs selon leur calque Commande: (select-filter "DXF" '(8) nil nil) Nombre d'objet(s) sélectionné(s) = 97 u Liste des entités trouvées pour le code DXF "8" : - "0" (64u - 65.98%) - "UBS-400-Zonage (Assemblage)" (33u - 34.02%) <Selection set: 21a8> ;; Sélection manuelle de blocs dont le nom commence par "Module" et qui sont situés sur le calque "0" ou les calques commençant par "UBS-100-" Commande: (select-filter "BLC" "Module*" "user" '((8 . "0,UBS-100-*"))) Seul(s) le(s) bloc(s) "Module FS 6g 2.004x1.232m", "Module générique A 1650x992x35", "Module générique B 1685x1000x42", "Module générique C 1698x1004x35", "Module générique D 1735x1010x42", "Module générique E 1757x1048x35", "Module générique F 2000x992x40", "Module générique G 2024x1004x35", "Module générique H 2108x1048x35", "Module générique J 2187x1102x30" seront pris en compte dans la sélection. Sélectionner des objets: 0 trouvé(s) Sélectionner des objets: Spécifiez le coin opposé: 5443 trouvé(s), 13 groupes, 5443 au total Sélectionner des objets: Nombre d'objet(s) sélectionné(s) = 5264 u Liste des blocs trouvés : - Module générique F 2000x992x40 (5264u - 100%) <Selection set: 21bf> Bisous, Luna
  17. Luna

    Dialogue d'ouverture de fichier.

    Coucou, @DenisHen pour en revenir à ton coup de gueule et au risque de te froisser, si on re-dirige parfois vers des forums/questions/aides similaires à tes demandes au lieu de répondre directement ce n'est aucunement pour nous défausser ! Premièrement lors de tes recherches tu es peut-être passé à côté des liens qui te sont proposés et permettrait donc de t'aider/te guider vers la solution par toi-même. Deuxièmement tu es un programmeur, donc par définition tu t'y connais en programmation et tu as donc tout intérêt d'écrire par toi-même les programmes dédiés à t'aider dans ton travail. Bien souvent lorsqu'une personne non-initiée demande un programme, les réponses qui lui sont données correspondent à des programmes fait de toutes pièces sans aucune retouche nécessaire, mais les initiés récupèrent des bout de codes, des idées, des solutions morcelées, ... parce qu'ils savent qu'il n'existe pas une seule et unique vérité/solution à un problème. Pour mieux apprendre à coder, il faut commencer par comprendre ce que l'on veut vraiment. Si tu as besoin d'un code tout beau tout propre sans modifications nécessaires alors ne morcelle pas tes questions, pose clairement les besoins et le résultat attendu et tu auras un code tout fait. Autrement, il faut savoir être patient et apprendre les choses par étape. "Fait à manger à un enfant durant 40ans et tu verras qu'adulte il ne saura pas cuire des pâtes correctement"... Je peux comprendre ton mécontentement ou ta frustration mais je doute que la faute revienne aux personnes généreuses qui donne de leur temps (et leur énergie !) pour satisfaire un grand nombre d'utilisateurs ! Les grands pontes de CadXP aident chaque jours les personnes qui sont dans le besoin sans rien demander en retour et pas une fois ils ont "renvoyé" les personnes sur Google par manque de temps. Bref, si tu le souhaites j'ai passer un peu de temps pour te pondre un programme tout fait correspondant à la demande sur ce topic (et si cela ne réponds pas à 100% de ton besoin, il faudra donner toutes les pièces du puzzle pour qu'on puisse le reconstituer... merci) Bisous, Luna
  18. Coucou, @DenisHen je peux te proposer quelque chose comme ceci en LISP (en me basant sur ton programme publié) : (defun c:ECPS_CreaCalqCourant (/ *error* maplist lt_check get-linetypes file line layer n i lst lt_lst) (defun *error* (msg /) (if file (close file)) (princ msg) ) (defun maplist (lst1 lst2 c /) (if (and lst1 lst2) (cons (cons (car lst1) (if (member (car lst1) c) (atoi (car lst2)) (car lst2))) (maplist (cdr lst1) (cdr lst2) c)) ) ) (defun lt_check (lst lt_lst /) (if (not (member (cdr (assoc 6 lst)) lt_lst)) (subst '(6 . "Continuous") (assoc 6 lst) lst) lst ) ) (defun get-linetypes (/ item lst) (vlax-for item (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'linetypes) (setq lst (cons (vla-get-name item) lst)) ) (reverse lst) ) (if (and (setq file (getfiled "Sélectionner un fichier 'Config-calque'" "" "csv" 0)) (setq file (open file "R")) (setq n 0 i 0 line (read-line file)) (setq lt_lst (get-linetypes)) ) (progn (while (setq line (read-line file)) (setq i (1+ i) layer (str2lst line ";") lst (maplist '(2 62 6 370 290 -3) layer '(62 370 290)) lst (lt_check lst lt_lst) ) (if (and (not (tblsearch "LAYER" (car layer))) (entmakex (append '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (70 . 0)) (if (or (not (assoc -3 lst)) (= "" (cdr (assoc -3 lst)))) (vl-remove (assoc -3 lst) lst) (subst (cons -3 (list (cons "AcAecLayerStandard" (list '(1000 . "") (cons 1000 (cdr (assoc -3 lst))) ) ) ) ) (assoc -3 lst) lst ) ) ) ) ) (setq n (1+ n)) (progn (foreach dxf lst (entmod (subst (if (= (car dxf) -3) (cons -3 (subst (cons "AcAecLayerStandard" (list '(1000 . "") (cons 1000 (cdr (assoc -3 lst))) ) ) (assoc "AcAecLayerStandard" (entget (tblobjname "LAYER" (car layer)) '("*"))) (cdr (assoc -3 (entget (tblobjname "LAYER" (car layer)) '("*")))) ) ) dxf ) (assoc -3 (entget (tblobjname "LAYER" (car layer)) '("*"))) (entget (tblobjname "LAYER" (car layer)) '("*")) ) ) ) (setq n (1+ n)) ) ) ) (prompt (strcat "\nUn total de " (itoa n) " / " (itoa i) " calques ont été créé ou modifiés avec succès." ) ) ) (prompt "\nAttention le fichier \"ECPS_Calques.csv\" est introuvable !") ) (setq file (close file)) (princ) ) Je l'ai testé avec le fichier .csv ci-dessous : Nom;Couleur;Type de ligne;Epaisseur de ligne;Tracer;Description; ECPS-000_BAT BETON;1;CONTINUOUS;18;1; ECPS-000_BAT ESCALIER-ASC;3;CONTINUOUS;18;1; ECPS-000_BAT FONDATION;13;CONTINUOUS;18;1; ECPS-000_BAT GAINES;52;CONTINUOUS;18;1; ECPS-000_BAT MACONNERIE;233;CONTINUOUS;18;1; ECPS-000_BAT POUTRE;40;CACHE;18;1; ECPS-010_BAT ALLEGE-ACRO;31;CONTINUOUS;18;1; ECPS-010_BAT ARRIERE PLAN;9;CONTINUOUS;18;1; ECPS-011_BAT AXES;8;AXES;18;1; ECPS-012_BAT AXES REPERES;8;CONTINUOUS;18;1; ECPS-012_BAT AXES REPERES COTE;8;CONTINUOUS;18;1; ECPS-013_BAT HACHURE PLAN;9;CONTINUOUS;18;1; ECPS-013_BAT HACHURE PORTEUR;41;CONTINUOUS;18;1; ECPS-013_BAT POCHAGE PLAN;7;CONTINUOUS;18;1; ECPS-014_BAT ASSISE COUPE;7;CONTINUOUS;18;1; ECPS-014_BAT TRAIT COUPE;7;CONTINUOUS;18;1; ECPS-015_BAT FACADE PLAN 1;60;CONTINUOUS;18;1; ECPS-015_BAT FACADE PLAN 2;63;CONTINUOUS;18;1; ECPS-015_BAT FACADE PLAN 3;251;CONTINUOUS;18;1; ECPS-015_BAT POCHAGE;57;CONTINUOUS;9;1; Soit 2 modifications par rapport à ton exemple de fichier .csv : l'option Tracer est une valeur numérique Booléenne (0 pour non imprimable et 1 pour imprimable) pour éviter les conversions par la suite et la suppression d'un séparateur inutile situé après la description (cela évite de trimbaler un "" dans chaque liste n'ayant aucune utilité) Je l'ai testé pour créer des calques, fonctionnel mais je ne l'ai pas essayé sur des calques existants donc à peaufiner au besoin. J'ai dû créer une vérification d'existence du type de ligne dans le fichier car si l'on spécifie un type de ligne invalide, le programme s'arrête sur une erreur donc c'est plus sûr de vérifier cette donnée et de la définir sur "Continuous" par défaut en cas d'erreur. Bisous, Luna
  19. Coucou, Lorsque tu parles de couches, parles-tu du calques ou bien c'est parce que tu as des imbrications de blocs ? Ensuite petite question à part mais, si l'on récupère la liste des objets après décomposition pour modifier leurs propriétés, cela signifie que l'on effectue cette même opération multipliée par le nombre de références de bloc, nan ? Je n'ai jamais travaillé sur des .dwg issus de revit ou archicad donc ces fameux "blocs" de murs, poutres, poteaux ont-ils plusieurs références dans le dessin par définition de blocs ou bien 1 définition de bloc = 1 référence de bloc ? Car s'il y a plusieurs références par définitions de blocs, cela serait peut-être moins chronophage de modifier les propriétés des objets depuis la définition de bloc pour ensuite exploser les références (donc les objets résultants auront tous la bonne propriété). Encore une fois, c'est uniquement une réflexion sur le temps d'exécution donc cela dépend uniquement du nombre de références de bloc par définition de blocs :3 Bisous, Luna
  20. @(gile) oki doki ! Perso le problème des fichiers ouverts je déclare localement la fonction (*error*) pour la redéfinir afin de fermer le fichier en cas de pépin comme chat plus de soucis de fichier encore ouvert :3 Mais il faut surtout pas oublier de déclarer la variable localement car c'est une fonction existante me semble-t-il donc la redéfinir de manière globale serait une catastrophe (enfin c'est ce que j'ai compris) ^^ @DenisHen, ou directement accessible depuis AutoCAD via la touche F1 ! Par contre j'ai remarqué que l'aide n'a pas beaucoup envie de montrer en premier résultats d'une recherche l'aide au développeurs....le nombre de fois où j'ai été obligée de filtrer la recherche sur "Developper" en cherchant (initget) car il ne voulait pas me l'afficher... Bisous, Luna
  21. Plusieurs remarques : Lorsque tu apprends à utiliser la fonction (entmake), n'hésites surtout pas à consulter des objets existants et l'aide d'AutoCAD !! Les informations que je t'ai fournies ne sortent pas d'un chapeau magique, je me suis simplement contentée d'afficher la liste DXF du calque "0" et d'ouvrir l'aide AutoCAD sur la page "LAYER (DXF)"... EDIT : +1 avec (gile) !! (entmake) comme beaucoup d'autres fonctions en vrai nécessite un minimum de recherches personnelles pour mieux comprendre leur fonctionnement et surtout comprendre que parfois, il n'y a pas de recette miracle ! Une polyligne n'aura pas besoin des mêmes codes DXF qu'un calque ou d'un bloc. Ne serait-ce qu'entre une "LWPOLYLINE" et une "POLYLINE" la création de ces deux objets pourtant proches diffère complètement !!! Et c'est d'ailleurs pour cette raison que j'ai créer la fonction (explore-dxf), parce qu'à force d'étudier des listes DXF d'objets, j'avais besoin de me faciliter la lecture :3 La variable système "CLAYER" correspond à la valeur courante (tout comme "CTAB", "CECOLOR", ...) pour les calques. Donc quittes à s'épargner les (command), il est plus simple d'utiliser (setvar "CLAYER" "0") ;; ou (setvar 'CLAYER "0") Ensuite, pourquoi faire une boucle (while) pour lire le fichier et construire une liste pour chaque ligne, pour ensuite faire une boucle (foreach) de lecture de cette liste pour créer un calque avec chacune des lignes ? As-tu essayé de grouper la création du calque pendant la lecture du fichier ? Car cela pourrait t'épargner une boucle si la lecture du fichier ne gêne pas la création d'objet sur AutoCAD. Ensuite, tu peux t'épargner le code DXF 70 (qui doit d'ailleurs être à 0 et non à 1 si tu veux qu'il soit actif, libéré, déverrouillé, etc) et le code 290 est par défaut sur 1 donc ne pas le mettre sauf si dans ton texte, tu as spécifié qu'il est non imprimable (à quoi correspond le T ? Lorsqu'il est non imprimable, quel est la lettre ?). Concernant l'épaisseur de ligne, il faut faire attention, car si l'épaisseur de ligne n'existe pas (il faut savoir que la valeur que l'on spécifie dans le code 370 c'est l'épaisseur en mm multipliée par 100, donc normalement tu as les bonnes valeurs dans ton fichier .csv car pour avoir "0.05 mm" tu as le couple DXF (370 . 5) :3) Ensuite le problème vient peut-être de ";;" car avec un essaie de (str2lst) j'ai : Commande: (str2lst "ECPS-000_BAT BETON;1;CONTINUOUS;18;T;;" ";") ("ECPS-000_BAT BETON" "1" "CONTINUOUS" "18" "T" "" "") Donc le nom du calque (code DXF 2) attend un string, la couleur (code DXF 62 pour couleurs ACI) attend un entier (positif ou négatif selon l'état du calque), le type de ligne (code DXF 6) attend un string (et il faut que la valeur existe dans le .dwg), l'épaisseur de ligne (code DXF 370) attend un entier (correspond à l'épaisseur en mm multipliée par 100), le tracé (code DXF 290) attend soit 0 (non imprimable) soit 1 (imprimable) et le commentaire apparaît sous forme de donnée étendue donc code DXF -3, puis nom d'application puis code 1000 ! Commande: (explore-dxf (entget (tblobjname "layer" "0") '("*")) 0 nil nil) Explore DXF in progress from "LAYER" (<Nom d'entité: 3fd24100>) : | (-1 . <Nom d'entité: 3fd24100>) | (0 . "LAYER") | (5 . "10") | (102 . "{ACAD_XDICTIONARY") | (360 . <Nom d'entité: 3fd231e0>) | (102 . "}") | (330 . <Nom d'entité: 3fd24020>) | (100 . "AcDbSymbolTableRecord") | (100 . "AcDbLayerTableRecord") | (2 . "0") | (70 . 0) | (62 . 7) | (6 . "Continuous") | (290 . 1) | (370 . 5) | (390 . <Nom d'entité: 3fd240f0>) | (347 . <Nom d'entité: 3fd24600>) | (348 . <Nom d'entité: 0>) | (-3 ("AcAecLayerStandard" (1000 . "") (1000 . "description"))) | End of exploration... Si avec tout chat, tu ne parviens pas à tes fins, alors il faudra reprendre l'exercice étape par étape sur un sujet plus simple pour commencer.. Bisous, Luna
  22. Vouih le code DXF 62 attend un entier compris entre 1 et 255 (théoriquement 0=DuBloc et 256=DuCalque et chat fonctionne même pour la création d'un calque mais avoir un calque de couleur "DuCalque" ne fait aucun sens) et non un string :3 Pour info, j'ai remarqué que le code 62 n'est pas uniquement destiné à définir la couleur d'un calque. Lorsque sa valeur est positive, le calque est "actif", si la valeur est négative alors le calque est "inactif". Concernant l'explore-dxf, j'ai modifié la fonction le 05/04/2021 pour intégrer directement en argument la fonction (entget) et ainsi pouvoir récupérer les données étendues d'un objet :3 Bisous, Luna
  23. comme je l'ai dit, les codes DXF essentiels sont à minima les codes 0 et 100 !! De plus, le nom d'un calque n'est pas spécifié par le code 8 dans sa liste DXF mais le code 2. Donc essaye ainsi : (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 "DenisHen") '(70 . 0) ) ) Le plus simple est de partir de la liste DXF de l'objet que tu veux créer et de supprimer les éléments facultatifs jusqu'à ne trouver que l'essentiel :3 Au départ, je suis parti de : Commande: (explore-dxf (entget (tblobjname "layer" "0")) 0 nil nil) Explore DXF in progress from "LAYER" (<Nom d'entité: 3fd24100>) : | (-1 . <Nom d'entité: 3fd24100>) | (0 . "LAYER") | (5 . "10") | (102 . "{ACAD_XDICTIONARY") | (360 . <Nom d'entité: 3fd231e0>) | (102 . "}") | (330 . <Nom d'entité: 3fd24020>) | (100 . "AcDbSymbolTableRecord") | (100 . "AcDbLayerTableRecord") | (2 . "0") | (70 . 0) | (62 . 7) | (6 . "Continuous") | (290 . 1) | (370 . -3) | (390 . <Nom d'entité: 3fd240f0>) | (347 . <Nom d'entité: 3fd24600>) | (348 . <Nom d'entité: 0>) | End of exploration... Pour ne prendre que : (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(2 . "0") ) ) Mais il s'est avéré que le code DXF 70 est indispensable à la création du calque : Le reste prend les valeurs par défaut donc si tu veux préciser sa couleur, le code 62 sera nécessaire, etc... Bisous, Luna
  24. Luna

    Bloc dynamique + champ

    Le soucis c'est que le champ dynamique pointe vers la définition d'attribut, or cette définition ne possède qu'une unique valeur qui est celle par défaut... Si l'on veut pointer vers la valeur d'un attribut d'une référence de bloc, alors il faut pointer vers la référence de bloc et choisir la propriété correspondant à l'attribut. Depuis l'éditeur de bloc ce n'est pas possible donc j'ai essayé en modifiant le bloc directement dans le dessin. On peut alors sélectionner la référence de bloc et les champs prennent les bonnes valeurs ! Par contre, impossible de quitter l'édition du bloc, car malheureusement la définition de bloc est l'entité générale (la source si on préfère) et les références de blocs sont les "enfants" de cette source donc les enfants dépendent directement de la source, mais la source ne peut aucunement dépendre de ses enfants... C'est donc faisable, mais on ne peut pas le sauvegarder donc je ne pense pas que cela soit faisable malheureusement... Bisous, Luna
  25. Luna

    Bloc dynamique + champ

    Donc pour faire simple, pourquoi utiliser un champ dynamique à la suite du "H: " au lieu de placer directement l'attribut "HAUTEUR" à cet emplacement ? Bisous, Luna
×
×
  • 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é