-
Compteur de contenus
1 113 -
Inscription
-
Dernière visite
-
Jours gagnés
42
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Luna
-
Personnalisation des commandes dans une palette
Luna a répondu à un(e) sujet de Netparty dans AutoCAD 2020-2024
Coucou, Essaye avec la variable système CLAYER (comme tu l'as fait pour PLINEWID) soit ^C^CPLINEWID;50;_PLINE;\;CLAYER;"0"; ? Bisous, Luna -
@JPhil, En programmation c'est simple, puisqu'il suffirait d'utiliser la fonction (LM:roundm) ci-dessous : ;; Round Multiple - Lee Mac ;; Rounds 'n' to the nearest multiple of 'm' (defun LM:roundm ( n m ) (* m (fix ((if (minusp n) - +) (/ n (float m)) 0.5))) ) Cependant s'il faut agir hors programmation, le jeu se complexifie car comme le suppose @srault, il faudrait que AutoCAD puisse faire la différence entre un nombre entier et un nombre décimal... Ou tout simplement que la précision que l'on choisi ne soit pas un simple format d'affichage mais un réel arrondi de la valeur réelle. J'avais également pensé à une formule DIESEL mais cela ne fonctionne pas non plus malheureusement (ou bien je n'ai pas trouvé une solution en DIESEL)... Cependant, on peut éventuellement trouver une solution via la commande RECHERCHER. Bon j'ai testé, et cela ne fonctionne pas, évidemment... Désolée... Bisous, Luna
-
Coucou, Ce '+' est-il nécessaire pour la compréhension du résultat ou bien est-ce pour une autre raison ? Car d'un point de vu compréhension, l'écriture fractionnaire s'écrit forcément sous forme d'addition, autrement dit il n'est pas possible d'avoir une écriture avec une soustraction. Donc l'écriture est simplifiée car le '+' est implicite. La méthode des Préfixe/Suffixe ne peut pas fonctionner car la part fractionnée est indivisible de la part entière. Il existe cependant un moyen d'arrondir un nombre à un multiple mais le souci c'est que l'on ne peut pas forcer l'arrondi d'un nombre via le format...La solution que je t'aurais proposé était : Champn°1 : m x a Avec m = 0.25 (le multiple) et a un second champ tel que : a = n/m + 0.5 Cependant pour que cela fonctionne il faut que 'a' utilisé dans le champ n°1 corresponde à sa partie entière et non un nombre décimal. Or même si l'on utilise la précision de 0 (donc partie entière), le calcul considère tout de même la partie décimale... Donc cela ne fonctionne pas, désolée.. Bisous, Luna
-
Coucou, Un .dwg d'exemple faciliterait la compréhension du problème. En effet je le comprends comme (gile), et comme pour toutes les propriétés d'un calque, les valeurs "ByBlock" et "ByLayer" ne sont visibles que pour les entités graphiques, pas pour les calques. Après tout se serait quelque peu paradoxal d'avoir un calque ayant une couleur "ByLayer" (ou toute autre propriété). D'où la question de @DenisHen qui est surpris de trouver un calque ayant un type de ligne "ByLayer", ce qui est théoriquement impossible ! Il est en effet possible d'affecter la valeur "ByLayer" ou "ByBlock" pour le type de lignes (ne fonctionne pas pour la couleur par exemple) via (entmod) mais du coup AutoCAD utilise la valeur par défaut : "Continuous" pour tracer les lignes. Donc la réponse est non, ce n'est pas normal et je pense qu'il s'agit d'une erreur de programmation car je vois difficilement comment AutoCAD peut générer une erreur de ce genre (la valeur "DuCalque" par exemple n'est pas acceptée, alors que "ByLayer" oui...). Bisous, Luna
-
Coucou, La commande DECALER n'est pas capable de fonctionner lorsque des sommets sont superposés. Cela peut paraître assez chiant au départ mais au final cela permet aussi de pointer des erreurs qui ne devraient pas exister donc c'est pas plus mal. Il ne me semble en effet pas avoir vu la commande DECALER ne pas fonctionner avec les éléments courbes. Bisous, Luna
-
Coucou, Pour info tu n'as pas besoin de cette ligne si tu l'intègres directement dans ton filtre de sélection (cela permettra à ton programme d'aller plus vite également), comme ci-dessous : (setq ss (ssget "_X" '((0 . "INSERT") (66 . 1)))) Tu peux même trier tes blocs en fonction de leur nom. Car actuellement tous tes blocs possédant des attributs sont modifiés mais si tu veux ne modifier que certaines définition de blocs, tu peux filtrer suivant le code DXF 2 comme suit : (setq ss (ssget "_X" '((0 . "INSERT") (66 . 1) (2 . "NomBloc1,NomBloc2,NomBloc3")))) Il faut savoir que les wild-card characters sont autorisés dans la liste des filtres de sélection autrement dit tu peux avoir un filtre comme ceci pour ton code DXF 2 : (setq ss (ssget "_X" '((0 . "INSERT") (66 . 1) (2 . "*Bloc*")))) Ici, tous les blocs dont leur nom contient la chaîne "Bloc" sont pris en compte. Si tu désires spécifier le nom via une variable, la fonction ' (= (quote)) ne fonctionne plus et il te faudra utiliser la fonction (list) et (cons) comme ceci : (setq var1 "NomBloc1,TCPoint*,*Bloc*" ss (ssget "_X" (list '(0 . "INSERT") '(66 . 1) (cons 2 var1)))) Je te conseille également de déclarer tes variables localement pour ne pas être emmerdé plus tard ! Je te conseille le site de (gile) et didier concernant ce point pour mieux comprendre le fonctionnement et le pourquoi. Bisous, Luna
-
Coucou, Pour celles et ceux que chat intéresse, j'utilise très souvent la fonction (ListBox) de @(gile) mais légèrement remaniée pour récupérer des infos utilisateurs de manière simple. Ce n'est que récemment que je me suis dit que l'on pouvait améliorer la fonction une nouvelle fois en ajoutant un filtre de recherche (= edit_box) à la boîte de dialogue. Cela permet à l'utilisateur de filtrer la liste affichée si celle-ci est un peu longue. Ci-dessous le code remanié de la fonction (ListBox) : ;--- Nom de la fonction []-----------------------[] ListBox []-----------------------[] ;--- Date de création > 15/04/2007 ;--- Dernière modification > 13/12/2021 ;--- Auteur(e) > Luna ;--- Version > 3.0.0 ;--- Classe > "DbLst" ;--- But et domaine d'application ; ; > Permet de générer un fichier temporaire .dcl pour une boîte de dialogue de sélection unique/multiple d'éléments dans une liste; ; passée en argument. ; ; ; ;--- Déclaration des arguments ; ; La fonction (ListBox) possède 5 argument(s) : ; ; ¤ title > correspond au titre de la boîte de dialogue. ; ; (type title) = 'STR | Ex. : "Sélection des calques", "VP-RADPURGE : Sélection des présentations", "", nil ; ; ¤ msg > correspond au message que l'on souhaite afficher au-dessus de la popup-list. ; ; (type msg) = 'STR | Ex. : "Choix multiple :", "Sélectionner un calque", "", nil ; ; ¤ lst > correspond à la liste que l'on souhaite afficher dans la popup-list. ; ; (type lst) = 'LST | Ex. : '(label1 label2 ...), ... ; ; ¤ value > correspond à la valeur par défaut que l'on souhaite sélectionner à l'ouverture de la BdL. ; ; (type value) = 'SYM | Ex. : (getvar "CLAYER"), 1, ... ; ; ¤ flag > correspond au type de popup-list entre une liste déroulante, une liste à choix unique ou multiple. ; ; (type flag) = 'INT | Ex. : 0 = Liste déroulante, 1 = Liste à choix unique, 2 = Liste à choix multiple ; ; ; ;--- Liste des fonctions dépendantes ; ; ¤ "UtDac" ---> str2lst | v1.0.0 - 15/04/2007 ((gile)) ; ; ¤ "BaLst" ---> vl-list-search | v1.0.0 - 13/12/2021 (Luna) ; ; ; ;--- Retour ; ; La fonction (ListBox) renvoie la valeur (flag = 0 ou 1) ou la liste des valeurs (flag = 2) choisie(s) par l'utilisateur ; ; Ex. : (ListBox "Présentation" "Choisir une présentation" (layoutlist) (getvar "CTAB") 1) ; ; ; ;--- Modifications apportées par rapport à la version précédente ; ; > Ajout d'une edit_box ajoutant la possibilité de filter la liste à partir d'une recherche (cf. (wcmatch) wildcard characters). ; ; Pour afficher la liste complète, il faut mettre un "*" dans la barre de recherche. Le nombre d'éléments affichés ainsi que le ; ; total d'éléments de la liste sont affichés sous la liste en guise d'information. Ajout d'une variable locale 'tlst pour ne pas ; ; perdre les données de la liste originelle tout en renvoyant les bons résultats en cas d'application d'un filtre. Ajout de la ; ; fonction (vl-list-search) dans le fonctionnement de la fonction (ListBox). ; ; ; (defun ListBox (title msg lst value flag / tmp file DCL_ID choice tlst) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") tlst lst ) (write-line (strcat "ListBox:dialog{width=" (itoa (+ (apply 'max (mapcar 'strlen (mapcar 'vl-princ-to-string lst))) 5)) ";label=\"" title "\";") file ) (write-line ":edit_box{key=\"filter\";}" file ) (if (and msg (/= msg "")) (write-line (strcat ":text{label=\"" msg "\";}") file) ) (write-line (cond ((= 0 flag) "spacer;:popup_list{key=\"lst\";}") ((= 1 flag) "spacer;:list_box{height=15;key=\"lst\";}") (t "spacer;:list_box{height=15;key=\"lst\";multiple_select=true;}") ) file ) (write-line ":text{key=\"count\";}" file) (write-line "spacer;ok_cancel;}" file) (close file) (setq DCL_ID (load_dialog tmp)) (if (not (new_dialog "ListBox" DCL_ID)) (exit) ) (set_tile "filter" "*") (set_tile "count" (strcat (itoa (length lst)) " / " (itoa (length lst)))) (start_list "lst") (mapcar 'add_list lst) (end_list) (set_tile "lst" (if (member value lst) (itoa (vl-position value lst)) (itoa 0))) (action_tile "filter" "(start_list \"lst\") (mapcar 'add_list (setq tlst (vl-list-search $value lst))) (end_list) (set_tile \"count\" (strcat (itoa (length tlst)) \" / \" (itoa (length lst))))" ) (action_tile "accept" "(or (= (get_tile \"lst\") \"\") (if (= 2 flag) (progn (foreach n (str2lst (get_tile \"lst\") \" \") (setq choice (cons (nth (atoi n) tlst) choice)) ) (setq choice (reverse choice)) ) (setq choice (nth (atoi (get_tile \"lst\")) tlst)) ) ) (done_dialog)" ) (start_dialog) (unload_dialog DCL_ID) (vl-file-delete tmp) choice ) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) (defun vl-list-search (p l) (vl-remove-if-not '(lambda (x) (wcmatch x p)) l ) ) Attention tout de même car la fonction originelle utilise une liste d'association '((key1 . label1) (key2 . label2) ...) et renvoie la clé (flag = 0 ou 1) ou la liste des clés (flag = 2) sélectionné(s). Ici la fonction utilise une liste d'atomes '(atom1 atom2 atom3 ...) et renvoie l'atome (flag = 0 ou 1) ou la liste des atomes (flag = 2) sélectionné(s). Donc l'argument concernant la liste change légèrement. Lors de ma version 2.0.0 j'ai également ajouté un argument 'value pour permettre de définir une valeur par défaut si besoin pour la liste (ex. : (getvar "CLAYER")). Je la poste car cela peut servir aussi bien dans un programme que comme exemple sur la mise à jour d'un élément d'une boîte de dialogue à partir d'une saisie utilisateur (permettant d'avoir une boîte de dialogue dynamique et adaptative). Et merci à @(gile) qui écrit toujours des fonctions épurées et générales dans leur utilisation ! Bisous, Luna
-
Convert dump functions in List format
Luna a répondu à un(e) sujet de Luna dans Pour aller plus loin en LISP
Bon j'ai fini par trouver une solution (cependant la liste correspondant aux Item n'est pas une liste d'association, ce qui m'embête quelque peu donc j'essaierai de trouver une solution...). Je n'ai pas vraiment testé si cela fonctionne de manière universelle et je suis persuadée que l'on peut simplifier l'écriture mais bon, ci-dessous mon code : (defun dumpallproperties->list (name / *error* get-key&value filename lmf cme file c n k-p line lst sub tmp i dap) (defun *error* (msg) (if file (setq file (close file)) ) (if lmf (setvar "LOGFILEMODE" lmf) (setvar "LOGFILEMODE" 0) ) (if cme (setvar "CMDECHO" cme) (setvar "CMDECHO" 1) ) (princ msg) ) (defun get-key&value (l s p name a / key value) (cons (setq key (substr l s (- (vl-string-search p l) s))) (if (not (or (vl-catch-all-error-p (setq value (vl-catch-all-apply 'getpropertyvalue (append (list name) a (list key))))) (null value) )) value (if (or (not (wcmatch l "* = *")) (= (setq value (substr l (+ 1 (strlen " = ") (vl-string-search " = " l)))) "Failed to get value" ) ) "" value ) ) ) ) (setq filename (getvar "LOGFILENAME") lmf (getvar "LOGFILEMODE") cme (getvar "CMDECHO") ) (vl-file-delete filename) (setvar "CMDECHO" 0) (setvar "LOGFILEMODE" 1) (dumpallproperties name) (setvar "LOGFILEMODE" 0) (setvar "CMDECHO" 1) (setq filename (getvar "LOGFILENAME") file (open filename "R") c 1 n 5 k-p "(type:" ) (while (setq line (read-line file)) (setq lst (cons line lst)) ) (close file) (setq lst (vl-remove-if '(lambda (l) (= l "")) (reverse lst) ) ) (while (and lst (not (wcmatch (car lst) "*Begin dumping object*")) ) (setq lst (cdr lst)) ) (setq lst (reverse (cdr lst))) (while (and lst (not (wcmatch (car lst) "End object dump")) ) (setq lst (cdr lst)) ) (setq lst (reverse (cdr lst))) (while (and lst (setq l (car lst))) (setq dap (cons (cond ( (and (not (wcmatch l "* = *")) (wcmatch (cadr lst) "Item #*:") ) (cons (setq sub nil l (substr l c (- (vl-string-search k-p l) c))) (while (wcmatch (cadr lst) "Item #*:") (setq sub (append sub (list (setq tmp nil i (atoi (vl-string-trim (apply 'strcat (wildcard-trim "~#")) (car (setq lst (cdr lst)))))) (while (wcmatch (cadr lst) " ?*") (setq tmp (append tmp (list (get-key&value (car (setq lst (cdr lst))) n k-p name (list l i))) ) ) ) ) ) ) ) ) ) (T (get-key&value l c k-p name nil) ) ) dap ) lst (cdr lst) ) ) (reverse dap) ) (defun wildcard-trim (w / i lst a) (repeat (setq i 256) (if (wcmatch (setq a (chr (setq i (1- i)))) w) (setq lst (cons a lst)) ) ) lst ) Si des âmes charitables souhaitent tester, je ne suis pas contre ! ♥w♥ Bisous, Luna- 6 réponses
-
- 1
-
-
- (entget)
- (dumpallproperties)
-
(et 1 en plus)
Étiqueté avec :
-
Convert dump functions in List format
Luna a répondu à un(e) sujet de Luna dans Pour aller plus loin en LISP
Coucou, Du coup la méthode du LOGFILEMODE semble fonctionner correctement, en revanche j'ai un léger soucis. En effet le programme que j'ai écrit permet de récupérer les key et value renvoyés par (dumpallproperties) pour les mettre sous forme de liste de paires pointées. Mais certains objets possèdent des propriétés "Item #:" qui possèdent des sous-propriétés. Cela pose donc un peu problème étant donné qu'il faut du coup avoir des imbrications de listes de paires pointées pour ces entités. De plus le fichier journal possède toutes les value sous format 'STR (string), donc je me suis dit que pour récupérer les value, il serait préférable de passer par (getpropertyvalue) mais il me retourne forcément une erreur "Demande ADS erronée" lorsque j'essaye de récupérer ces données. Je suis tombée sur le post de @(gile) à propos des "Vertices" d'une polyligne qui fonctionne justement avec ce système d'item. Mais je n'arrive pas à récupérer les valeurs donc je me demande si l'écriture (getpropertyvalue pline "Vertices" 0 "IsA") est la bonne ou pas... Choix de l'objet: Begin dumping object (class: AcDbPolyline) Annotative (type: bool) (LocalName: Annotatif) = Failed to get value AnnotativeScale (type: AcString) (RO) (LocalName: Echelle annotative) = Failed to get value Area (type: double) (RO) (LocalName: Aire) = 604869.004505 BlockId (type: AcDbObjectId) (RO) = 2a3d74c31f0 CastShadows (type: bool) = 0 ClassName (type: AcString) (RO) = Closed (type: bool) (LocalName: Fermé) = 0 CollisionType (type: AcDb::CollisionType) (RO) = 1 Color (type: AcCmColor) (LocalName: Couleur) = DUCALQUE ConstantWidth (type: double) (LocalName: Largeur globale) = 0.000000 Elevation (type: double) (LocalName: Elévation) = 0.000000 EndParam (type: double) (RO) = 5.000000 EndPoint/X (type: double) (RO) (LocalName: Extrémité X) = Failed to get value EndPoint/Y (type: double) (RO) (LocalName: Extrémité Y) = Failed to get value EndPoint/Z (type: double) (RO) (LocalName: Extrémité Z) = Failed to get value ExtensionDictionary (type: AcDbObjectId) (RO) = 0 Handle (type: AcDbHandle) (RO) = 5ef HasBulges (type: bool) (RO) = 0 HasFields (type: bool) (RO) = 0 HasSaveVersionOverride (type: bool) = 0 HasWidth (type: bool) (RO) = 0 Hyperlinks (type: AcDbHyperlink*) IsA (type: AcRxClass*) (RO) = AcDbPolyline IsAProxy (type: bool) (RO) = 0 IsCancelling (type: bool) (RO) = 0 IsEraseStatusToggled (type: bool) (RO) = 0 IsErased (type: bool) (RO) = 0 IsModified (type: bool) (RO) = 0 IsModifiedGraphics (type: bool) (RO) = 0 IsModifiedXData (type: bool) (RO) = 0 IsNewObject (type: bool) (RO) = 0 IsNotifyEnabled (type: bool) (RO) = 0 IsNotifying (type: bool) (RO) = 0 IsObjectIdsInFlux (type: bool) (RO) = 0 IsOnlyLines (type: bool) (RO) = 1 IsPeriodic (type: bool) (RO) = 0 IsPersistent (type: bool) (RO) = 1 IsPlanar (type: bool) (RO) = 1 IsReadEnabled (type: bool) (RO) = 1 IsReallyClosing (type: bool) (RO) = 1 IsTransactionResident (type: bool) (RO) = 0 IsUndoing (type: bool) (RO) = 0 IsWriteEnabled (type: bool) (RO) = 0 LayerId (type: AcDbObjectId) (LocalName: Calque) = 2a3d74c3100 Length (type: double) (RO) (LocalName: Longueur) = 3141.549965 LineWeight (type: AcDb::LineWeight) (LocalName: Epaisseur de ligne) = -1 LinetypeId (type: AcDbObjectId) (LocalName: Type de ligne) = 2a3d74c3150 LinetypeScale (type: double) (LocalName: Echelle du type de ligne) = 1.000000 LocalizedName (type: AcString) (RO) = Polyligne MaterialId (type: AcDbObjectId) (LocalName: Matériau) = 2a3d74c36c0 MergeStyle (type: AcDb::DuplicateRecordCloning) (RO) = 1 Normal/X (type: double) = 0.000000 Normal/Y (type: double) = 0.000000 Normal/Z (type: double) = 1.000000 ObjectId (type: AcDbObjectId) (RO) = 2a426666ef0 OwnerId (type: AcDbObjectId) (RO) = 2a3d74c31f0 Plinegen (type: bool) (LocalName: Génération du type de ligne) = 0 PlotStyleName (type: AcString) (RO) (LocalName: Style de tracé) = ParCouleur ReceiveShadows (type: bool) = 0 ShadowDisplay (type: AcDb::ShadowFlags) (RO) (LocalName: Affichage des ombres) = Failed to get value StartParam (type: double) (RO) = 0.000000 StartPoint/X (type: double) (RO) (LocalName: Départ X) = Failed to get value StartPoint/Y (type: double) (RO) (LocalName: Départ Y) = Failed to get value StartPoint/Z (type: double) (RO) (LocalName: Départ Z) = Failed to get value Thickness (type: double) (LocalName: Epaisseur) = 0.000000 Transparency (type: AcCmTransparency) (LocalName: Transparence) = 0 Vertices (type: AcDbPolylineVertex) Item 0: Bulge (type: double) = Failed to get value ClassName (type: AcString) (RO) = EndWidth (type: double) (LocalName: Largeur du segment de fin) = Failed to get value Id (type: int) = Failed to get value IsA (type: AcRxClass*) (RO) = AcRxBoxedValueOnStack LocalizedName (type: AcString) (RO) = Position/X (type: double) (LocalName: Sommet X) = Failed to get value Position/Y (type: double) (LocalName: Sommet Y) = Failed to get value StartWidth (type: double) (LocalName: Largeur du segment de départ) = Failed to get value Item 1: Bulge (type: double) = Failed to get value ClassName (type: AcString) (RO) = EndWidth (type: double) (LocalName: Largeur du segment de fin) = Failed to get value Id (type: int) = Failed to get value IsA (type: AcRxClass*) (RO) = AcRxBoxedValueOnStack LocalizedName (type: AcString) (RO) = Position/X (type: double) (LocalName: Sommet X) = Failed to get value Position/Y (type: double) (LocalName: Sommet Y) = Failed to get value StartWidth (type: double) (LocalName: Largeur du segment de départ) = Failed to get value Item 2: Bulge (type: double) = Failed to get value ClassName (type: AcString) (RO) = EndWidth (type: double) (LocalName: Largeur du segment de fin) = Failed to get value Id (type: int) = Failed to get value IsA (type: AcRxClass*) (RO) = AcRxBoxedValueOnStack LocalizedName (type: AcString) (RO) = Position/X (type: double) (LocalName: Sommet X) = Failed to get value Position/Y (type: double) (LocalName: Sommet Y) = Failed to get value StartWidth (type: double) (LocalName: Largeur du segment de départ) = Failed to get value Item 3: Bulge (type: double) = Failed to get value ClassName (type: AcString) (RO) = EndWidth (type: double) (LocalName: Largeur du segment de fin) = Failed to get value Id (type: int) = Failed to get value IsA (type: AcRxClass*) (RO) = AcRxBoxedValueOnStack LocalizedName (type: AcString) (RO) = Position/X (type: double) (LocalName: Sommet X) = Failed to get value Position/Y (type: double) (LocalName: Sommet Y) = Failed to get value StartWidth (type: double) (LocalName: Largeur du segment de départ) = Failed to get value Item 4: Bulge (type: double) = Failed to get value ClassName (type: AcString) (RO) = EndWidth (type: double) (LocalName: Largeur du segment de fin) = Failed to get value Id (type: int) = Failed to get value IsA (type: AcRxClass*) (RO) = AcRxBoxedValueOnStack LocalizedName (type: AcString) (RO) = Position/X (type: double) (LocalName: Sommet X) = Failed to get value Position/Y (type: double) (LocalName: Sommet Y) = Failed to get value StartWidth (type: double) (LocalName: Largeur du segment de départ) = Failed to get value Item 5: Bulge (type: double) = Failed to get value ClassName (type: AcString) (RO) = EndWidth (type: double) (LocalName: Largeur du segment de fin) = Failed to get value Id (type: int) = Failed to get value IsA (type: AcRxClass*) (RO) = AcRxBoxedValueOnStack LocalizedName (type: AcString) (RO) = Position/X (type: double) (LocalName: Sommet X) = Failed to get value Position/Y (type: double) (LocalName: Sommet Y) = Failed to get value StartWidth (type: double) (LocalName: Largeur du segment de départ) = Failed to get value Visible (type: AcDb::Visibility) = 0 End object dump Sinon tant pis et je repasse en version 'STR pour les value. Bisous, Luna- 6 réponses
-
- (entget)
- (dumpallproperties)
-
(et 1 en plus)
Étiqueté avec :
-
FICHIER LISTANT LES LISP CHARGES AU DEMARAGE
Luna a répondu à un(e) sujet de PHILPHIL dans AutoCAD 2020-2024
Coucou, Sur le site de @(gile) tu as ceci, donc il est en effet possible de fonctionner de la sorte. Cela te permettra de charger dans l'ordre souhaité tes fichiers du coup, il faut juste mettre à jour le fichier AutoCAD.lsp ou acaddoc.lsp à chaque nouveau .lsp créé. Je vais p'tet faire pareil au final, cela sera plus simple que de générer un fichier de synthèse qui du coup créé des doublons avec chaque fichier de fonctions... Bisous, Luna -
FICHIER LISTANT LES LISP CHARGES AU DEMARAGE
Luna a répondu à un(e) sujet de PHILPHIL dans AutoCAD 2020-2024
Coucou, N'as-tu pas moyen de regrouper tous tes fichiers en un seul fichier et de le charger pour voir à quelle ligne il coince ? Cela te permettra de voir rapidement quel(s) fichier(s) posent problème. Tu es seul à utiliser tes fichiers .lsp au bureau ou bien tes collègues doivent ajouter à chaque fois que tu crées un nouveau fichier le chemin dans les applications chargées au début ? Car j'ai un peu ce problème-ci donc la seule solution que j'ai trouvé c'est de n'avoir qu'un seul fichier chargé au démarrage avec l'ensemble des fonctions et commandes ! Comme cela j'ai juste à modifier le fichier, enregistrer et aucune manip' n'est requise pour les collègues. Par contre la gestion des historiques et le classement des fonctions / commandes est un véritable bordel avec cette méthode... Bisous, Luna -
Coucou, J'ai vu la vidéo de présentation ce matin, est bien que perplexe sur le début de la vidéo plus proche d'un film d'animation que d'un jeu vidéo (beaucoup d'action cinématique), la fin m'a complètement bluffée de voir un open world avec des graphismes aussi impressionnant !! Affaire à suivre pour sûr car j'aimerais éviter d'avoir un flop similaire à CyberPunk 2077 qui s'annonçait impressionnant mais s'est révélé être bourré de bugs... En revanche j'aimerais beaucoup connaître la config' nécessaire pour faire tourner un jeu comme celui-ci avec suffisamment de FPS sur un PC. Car j'ai peur que la technologie informatique n'arrive pas à suivre les prouesses techniques de modélisation promises dans ce trailer ! Et je pense que la commu' des jeux SF attendent également avec impatience de voir des jeux SF sortir avec ce Unreal Engine 5 ! Déjà lorsqu'on voit la qualité des graphiques de Star Citizen, on ne peut qu'espérer de voir poindre une nouvelle aire dans le monde du jeu vidéo et films d'animation incessamment sous peu. Le film Ready Player One avait peut-être raison de prévoir un futur virtuel dès 2045 finalement. On y sera peut-être même plus tôt... Cordialement,
-
Convert dump functions in List format
Luna a répondu à un(e) sujet de Luna dans Pour aller plus loin en LISP
Intéressant, je ne connaissais pas cette variable système. Je vais étudier cela pour voir si c'est viable 🙂 Merci ! Bisous, Luna- 6 réponses
-
- (entget)
- (dumpallproperties)
-
(et 1 en plus)
Étiqueté avec :
-
Coucou, Je me pose la question suivante : Est-il possible d'accéder à l'intégralité des propriétés d'un objet et de les récupérer sous forme de liste ? A ce jour, je connais 3 "listes" de propriétés accessibles pour un objet : (entget) permet d'afficher sous forme de liste l'ensemble des propriétés DXF d'un objet (dumpallproperties) permet d'afficher dans l'historique de la fenêtre de texte (F2) l'ensemble des propriétés génériques d'un objet (vlax-dump-object) permet d'afficher dans l'historique de la fenêtre de texte (F2) l'ensemble des propriétés Visual LISP d'un objet Autrement dit, sur les 3 méthodes de récupération d'information, seule une renvoie une liste exploitable dans un programme LISP. Pour chacune de ces méthodes, il existe des fonctions pour récupérer la valeur d'une propriété et/ou la modifier : (assoc) et (entmod) pour la fonction (entget) (getpropertyvalue) et (setpropertyvalue) pour la fonction (dumpallproperties) (vlax-get) et (vlax-put) et l'ensemble de leur écriture dérivée pour la fonction (vlax-dump-object) Cependant il faut connaître le nom de la propriété pour en récupérer la valeur puisque seule la fonction (entget) retourne une liste exploitable par un programme. Du coup j'ai regardé s'il existait un moyen de récupérer une liste pour les fonction (dumpallproperties) et (vlax-dump-object) et j'ai trouvé les fonctions suivantes sur le site de LeeMac : http://www.lee-mac.com/dumpobject.html. Cette fonction utilise la fonction (atoms-family) pour récupérer la totalité des fonctions/commandes AutoCAD enregistrée dans le dessin et utilise le principe de simplification d'écriture de la fonction (vlax-get) pour récupérer toutes les fonctions Visual dont le nom commence par "VLA-GET-". Cela permet ainsi d'obtenir habilement le nom de l'ensemble des propriétés existantes en Visual LISP, puis filtre les propriétés disponible pour l'objet sélectionné via (vlax-property-available-p). Cela permet ainsi d'obtenir le résultat de (vlax-dump-object) sous format d'une liste. On arrive donc à avoir (entget) et (vlax-dump-object) sous forme de liste mais en revanche, la méthode employée par LeeMac ne fonctionne pas pour (dumpallproperties) puisqu'il n'y a pas ces dérivés d'écriture pour les fonctions associées. Pensez-vous qu'il soit possible d'obtenir le résultat de (dumpallproperties) sous forme de liste ou bien est-ce la fameuse exception à la règle ? Peut-on avoir accès à l'historique de la fenêtre de texte ou bien est-elle intouchable en programmation ? Désolée si je n'ai pas été assez claire... Bisous, Luna
- 6 réponses
-
- (entget)
- (dumpallproperties)
-
(et 1 en plus)
Étiqueté avec :
-
Modifier le calque des étiquette d'attribut dans un bloc
Luna a répondu à un(e) sujet de nen dans Débuter en LISP
Coucou, F2 correspond à la touche de fonction permettant d'afficher l'historique des commandes (juste au dessus de la ligne de commande, sinon en format fenêtre windows via CTRL+F2). Ce que t'as suggérer (gile) c'est de copier (dumpallproperties (car (nentsel))) dans ta ligne de commande, et tu cliques sur un de tes attributs de blocs (en étant dans l'espace objet, pas besoin d'être dans l'éditeur de bloc). Cela va te donner dans l'historique de commande l'ensemble des propriétés accessibles via (getpropertyvalue) et (setpropertyvalue). Cela va renvoyer quelque chose comme ceci : Choix de l'objet: Begin dumping object (class: AcDbAttribute) AlignmentPoint/X (type: double) (RO) (LocalName: Alignement du texte X) = Failed to get value AlignmentPoint/Y (type: double) (RO) (LocalName: Alignement du texte Y) = Failed to get value AlignmentPoint/Z (type: double) (RO) (LocalName: Alignement du texte Z) = Failed to get value Annotative (type: bool) (LocalName: Annotatif) = 0 AnnotativeScale (type: AcString) (RO) (LocalName: Echelle annotative) = Failed to get value BlockId (type: AcDbObjectId) (RO) = 27906925980 CastShadows (type: bool) = 0 ClassName (type: AcString) (RO) = CollisionType (type: AcDb::CollisionType) (RO) = 1 Color (type: AcCmColor) (LocalName: Couleur) = DUCALQUE ExtensionDictionary (type: AcDbObjectId) (RO) = 0 FieldLength (type: int) = 0 FlowDirection (type: AcDbMText::FlowDirection) (RO) (LocalName: Direction) = 5 Handle (type: AcDbHandle) (RO) = 3212b2 HasFields (type: bool) (RO) = 0 HasSaveVersionOverride (type: bool) = 0 Height (type: double) (LocalName: Hauteur) = 1.000000 HorizontalMode (type: AcDb::TextHorzMode) = 1 Hyperlinks (type: AcDbHyperlink*) Invisible (type: bool) (RO) (LocalName: Invisible) = 0 IsA (type: AcRxClass*) (RO) = AcDbAttribute IsAProxy (type: bool) (RO) = 0 IsCancelling (type: bool) (RO) = 0 IsDefaultAlignment (type: bool) (RO) = 0 IsEraseStatusToggled (type: bool) (RO) = 0 IsErased (type: bool) (RO) = 0 IsMTextAttribute (type: bool) (RO) (LocalName: Lignes multiples) = 0 IsMirroredInX (type: bool) (LocalName: Symétrie horizontale) = 0 IsMirroredInY (type: bool) (LocalName: Symétrie verticale) = 0 IsModified (type: bool) (RO) = 0 IsModifiedGraphics (type: bool) (RO) = 0 IsModifiedXData (type: bool) (RO) = 0 IsNewObject (type: bool) (RO) = 0 IsNotifyEnabled (type: bool) (RO) = 0 IsNotifying (type: bool) (RO) = 0 IsObjectIdsInFlux (type: bool) (RO) = 0 IsPersistent (type: bool) (RO) = 1 IsPlanar (type: bool) (RO) = 1 IsPreset (type: bool) (RO) = 0 IsReadEnabled (type: bool) (RO) = 1 IsReallyClosing (type: bool) (RO) = 1 IsTransactionResident (type: bool) (RO) = 0 IsUndoing (type: bool) (RO) = 0 IsVerifiable (type: bool) (RO) = 0 IsWriteEnabled (type: bool) (RO) = 0 Justify (type: AcDbText::AcTextAlignment) (LocalName: Justifier) = 7 LayerId (type: AcDbObjectId) (LocalName: Calque) = 2790eb09940 LineWeight (type: AcDb::LineWeight) (LocalName: Epaisseur de ligne) = -1 LinetypeId (type: AcDbObjectId) (LocalName: Type de ligne) = 279119e8150 LinetypeScale (type: double) (LocalName: Echelle du type de ligne) = 0.100000 LocalizedName (type: AcString) (RO) = Attribut LockPositionInBlock (type: bool) (RO) (LocalName: Verrouiller la position) = 1 MTextJustify (type: AcDbAttDef::MTextJustity) (LocalName: Justifier) = Failed to get value MatchOrientationToLayout (type: bool) (LocalName: Faire correspondre l'orientation à la présentation) = Failed to get value MaterialId (type: AcDbObjectId) (LocalName: Matériau) = Failed to get value MergeStyle (type: AcDb::DuplicateRecordCloning) (RO) = 1 ModelTextHeight (type: double) (LocalName: Hauteur du texte 3D) = Failed to get value Normal/X (type: double) = 0.000000 Normal/Y (type: double) = 0.000000 Normal/Z (type: double) = 1.000000 ObjectId (type: AcDbObjectId) (RO) = 2790696aa20 Oblique (type: double) (LocalName: Inclinaison) = 0.000000 OwnerId (type: AcDbObjectId) (RO) = 2790696a9b0 PaperTextHeight (type: double) (LocalName: Hauteur du texte sur le papier) = Failed to get value PlotStyleName (type: AcString) (RO) (LocalName: Style de tracé) = ParCouleur Position/X (type: double) (RO) (LocalName: Position X) = Failed to get value Position/Y (type: double) (RO) (LocalName: Position Y) = Failed to get value Position/Z (type: double) (RO) (LocalName: Position Z) = Failed to get value ReceiveShadows (type: bool) = 0 Rotation (type: double) (LocalName: Rotation) = 0.000000 ShadowDisplay (type: AcDb::ShadowFlags) (RO) (LocalName: Affichage des ombres) = Failed to get value Tag (type: AcString) (RO) (LocalName: Etiquette) = REPERE TextString (type: AcString) = G37 - P11 TextStyleId (type: AcDbObjectId) (LocalName: Style) = 279119e1050 Thickness (type: double) (LocalName: Epaisseur) = Failed to get value Transparency (type: AcCmTransparency) (LocalName: Transparence) = Failed to get value Value (type: AcString) (LocalName: Valeur) = G37 - P11 VerticalMode (type: AcDb::TextVertMode) = 3 Visible (type: AcDb::Visibility) = 0 Width (type: double) (RO) (LocalName: Largeur du texte multiligne) = 0.000000 WidthFactor (type: double) (LocalName: Facteur de largeur) = 1.000000 End object dump Je te laisse chercher les propriétés dont tu as besoin dans la liste et ensuite tu as compris le fonctionnement de (setpropertyvalue). Attention tout de même car certaines propriétés utilise l'ID et non le nom souhaité (par exemple la propriété correspondant au calque est "LayerID" donc tu n'as pas simplement le nom du calque). Dans ces cas-là, il faut vérifier si ces infos ne sont pas récupérable dans la liste DXF de l'objet dispo via (entget (car (nentsel))) Cela te donnera à peu près un résultat comme ceci (je l'ai mis en forme histoire que cela soit plus lisible) : Explore DXF in progress from "ATTRIB" (<Nom d'entité: 2790696aa20>) : | (-1 . <Nom d'entité: 2790696aa20>) | (0 . "ATTRIB") | (330 . <Nom d'entité: 2790696a9b0>) | (5 . "3212B2") | (100 . "AcDbEntity") | (67 . 0) | (8 . "UBS-900-Texte (Poteau)") | (48 . 0.1) | (100 . "AcDbText") | (10 115.601 0.0103753 1.79366e-43) | (40 . 1.0) | (1 . "G37 - P11") | (50 . 3.83476e-17) | (41 . 1.0) | (51 . 3.83476e-17) | (7 . "UBS - Defaut - Verdana") | (71 . 0) | (72 . 1) | (11 119.094 1.01038 1.79366e-43) | (210 0.0 0.0 1.0) | (100 . "AcDbAttribute") | (280 . 0) | (2 . "REPERE") | (70 . 0) | (73 . 0) | (74 . 3) | (280 . 1) | End of exploration... Il te suffit ensuite d'ouvrir l'aide AutoCAD et de chercher ce qui est écrit dans la paire pointée 0 (ici c'est ATTRIB) et d'ajouter DXF dans la barre de recherche (donc si tu cherches "ATTRIB DXF") et tu obtiens l'aide suivante : ATTRIB (DXF) Les codes de groupe suivants s'appliquent aux entités attrib (attributs). Codes de groupe attrib Code de groupe Description 100 Marqueur de sous-classe (AcDbText) 39 Epaisseur (facultatif, valeur par défaut = 0) 10 Point de départ du texte (dans le SCO) DXF : valeur X ; APP : point 3D 20, 30 DXF : valeurs Y et Z du point de départ du texte (dans le SCO) 40 Hauteur du texte 1 Valeur par défaut (chaîne) 100 Marqueur de sous-classe (AcDbAttribute) 280 Numéro de version : 0 = 2010 2 Etiquette d'attribut (chaîne ; ne peut contenir d'espaces) 70 Drapeaux d'attribut : 1 = Attribut invisible (non affiché) 2 = Attribut constant 4 = Vérification de la saisie de l'attribut 8 = Attribut prédéfini (aucune invite pendant l'insertion) 73 Longueur de champ (facultatif ; par défaut = 0) (rarement utilisée) 50 Rotation de texte (facultatif, valeur par défaut = 0). 41 Facteur d'échelle relative (largeur) de l'axe des X (facultatif ; valeur par défaut = 1). Cette valeur est également adaptée si l'on utilise un texte de type ajusté 51 Angle d'inclinaison (facultatif, valeur par défaut = 0) 7 Nom du style de texte (facultatif ; valeur par défaut = STANDARD) 71 Drapeaux de génération de texte (facultatif ; valeur par défaut = 0). Voir TEXT, codes de groupe 72 Justification horizontale du texte (facultatif ; valeur par défaut = 0). Voir TEXT, codes de groupe 74 Type de justification horizontale du texte (facultatif ; valeur par défaut = 0). Voir le code de groupe 73 à la section TEXT 11 Point d'alignement (dans le SCO) (facultatif) DXF : valeur X ; APP : point 3D Présent seulement si le groupe 72 ou 74 est présent et non nul 21, 31 DXF : valeurs Y et Z du point d'alignement (dans le SCO) (facultatif) 210 Direction d'extrusion. Présent seulement si la direction d'extrusion de l'entité n'est pas parallèle à l'axe des Z dans le SCG (facultatif, par défaut = 0, 0, 1) DXF : valeur X ; APP : vecteur 3D 220, 230 DXF : valeurs Y et Z de la direction d'extrusion (facultatif) 280 Verrouiller le drapeau de position Verrouille la position de l'attribut dans la référence du bloc 100 Marqueur de sous-classe (AcDbXrecord) 280 Drapeau de clonage d'enregistrement dupliqué (indique comment fusionner les entrées en double) : 1 = Conserver l'élément existant 70 Indicateur textmult : 2 = attribut de texte multiligne 4 = définition d'attribut de texte multiligne de constante 70 Indicateur isReallyLocked : 0 = déverrouillé 1 = verrouillé 70 Nombre d'attributs secondaires de définitions d'attributs 340 Id de pointeur matériel d'attribut secondaire ou de définition d'attribut 10 Point d'alignement de l'attibut ou de la définition d'attribut DXF : valeur X ; APP : point 3D 20,30 DXF : valeurs Y et Z du point d'insertion 40 échelle d'annotation courante 2 contenu de l'étiquette de l'attribut ou de la définition d'attribut 0 Type d'entité (TEXTMULT) 100 Marqueur de sous-classe (AcDbEntity) 67 Absent ou zéro indique que l'entité est dans l'espace objet. 1 indique que l'entité est dans l'espace papier (facultatif) 8 Nom du calque 100 Marqueur de sous-classe (AcDbMText) 10 Point d'insertion DXF : valeur X ; APP : point 3D 20,30 DXF : valeurs Y et Z du point d'insertion 40 Hauteur de texte nominale (initiale) 41 Largeur du rectangle de référence 46 Hauteur d'annotation définie 71 Point d'attache : 1 = En haut à gauche ; 2 = En haut au centre ; 3 = En haut à droite 4 = Au milieu à gauche ; 5 = Au milieu au centre ; 6 = Au milieu à droite 7 = En bas à gauche ; 8 = En bas au centre ; 9 = En bas à droite 72 Direction du dessin : 1 = De gauche à droite 3 = De haut en bas 5 = Par style (la direction est héritée du style de texte associé) 1 Chaîne de texte Si la chaîne de texte est inférieure à 250 caractères, tous les caractères apparaissent dans le groupe 1. Si elle est supérieure à 250 caractères, la chaîne est divisée en 250 blocs de caractères, lesquels apparaissent dans un ou plusieurs des codes de groupe 3. Si l'on utilise des codes de groupe 3, le dernier groupe est un groupe 1 et contient moins de 250 caractères. 3 Texte supplémentaire (toujours en blocs de 250 caractères) (facultatif) 7 DXF : valeur X ; APP : nom de style vectText 3D (STANDARD si non fourni) (facultatif) 210 Direction d'extrusion (facultatif ; valeur par défaut = 0, 0, 1) DXF : valeur X ; APP : vecteur 3D 220,230 DXF : valeurs Y et Z de la direction d'extrusion (facultatif) 11 Vecteur de direction de l'axe des X (dans le SCG) DXF : valeur X ; APP : vecteur 3D 21,31 DXF : valeurs Y et Z du vecteur de direction de l'axe des X (dans le SCG) 42 Largeur horizontale des caractères qui constituent l'entité mtext. Cette valeur doit être inférieure ou égale à celle du code de groupe 41 (lecture seule, valeur ignorée si entrée). 43 Hauteur verticale de l'entité mtext (lecture seule, valeur ignorée si entrée). 50 Angle de rotation en radians 73 Style d'espacement des lignes de l'entité MTEXT (facultatif) : 1 = Minimum (les caractères de taille plus grande sont prioritaires) 2 = Exactement (les caractères de taille plus grande ne sont pas prioritaires) 44 Facteur d'espacement des lignes de l'entité MTEXT (facultatif) : Pourcentage de l'espacement par défaut (3 sur 5) à appliquer. Les valeurs admises vont de 0,25 à 4 90 Configuration du remplissage d'arrière-plan : 0 = Remplissage d'arrière-plan désactivé 1 = Utiliser la couleur du remplissage d'arrière-plan 2 = Utiliser la couleur de la fenêtre de dessin comme couleur de remplissage d'arrière-plan 63 Couleur d'arrière-plan (si numéro d'index des couleurs) 420-429 Couleur d'arrière-plan (si couleur RVB) 430-439 Couleur d'arrière-plan (si nom de la couleur) 45 Echelle de la zone de remplissage (facultatif) : Détermine le type de bordure entourant le texte. 63 Couleur de remplissage d'arrière-plan (facultatif) : Couleur à utiliser pour le remplissage d'arrière-plan lorsque le code de groupe 90 est 1. 441 Transparence de la couleur de remplissage d'arrière-plan (non appliquée) Si les valeurs de groupe 72 et/ou 74 sont différentes de zéro, les valeurs du point d'insertion de texte sont ignorées et AutoCAD calcule de nouvelles valeurs à partir du point d'alignement du texte, ainsi que de la longueur et de la hauteur de la chaîne de texte proprement dite (après application du style de texte). Si les valeurs 72 et 74 sont égales à zéro ou manquantes, le point d'alignement du texte est ignoré et recalculé à partir du point d'insertion du texte et de la longueur de la chaîne de texte elle-même (après application du style de texte). Pour modifier les propriétés accessible via (dumpallproperties (car (nentsel))), il faut utiliser la fonction (setpropertyvalue ename "PropertyName" value) où ename correspond au nom d'entité de l'objet, "PropertyName" correspond au nom de la propriété défini par (dumpallproperties) et value la valeur souhaité (attention au format attendu !). Pour modifier les propriétés accessible via (entget (car (nentsel))), il faut utiliser la fonction (entmod (subst (cons # value) (assoc # (entget ename)) (entget ename))) où # correspond au code DXF défini par l'aide AutoCAD, value la valeur souhaitée (attention au format attendu !) et ename le nom d'entité de l'objet. J'espère que c'est assez claire désormais. Je ne pourrais pas vraiment faire grand chose de plus... Bisous, Luna -
Coucou, Que signifie cela ? Que tes polylignes sont purement verticales ? Si c'est le cas et pour la totalité de tes polylignes 3D, alors peut-être est-ce possible en prenant comme hypothèse que au même titre que l'outil DECALER utilise le plan XY comme plan de référence, on peut prendre le plan XZ ou YZ comme plan de référence (uniquement si les coordonnées XY sont identiques pour les deux sommets de ta polyligne 3D). Bisous, Luna
-
Coucou, Le soucis c'est que l'on ne peut pas vraiment décaler une polyligne 3D. L'outil DECALER permet uniquement de créer une polyligne 2D coplanaire à une distance spécifique de la première. Dans le cas d'une polyligne 3D, il n'y a pas de notion de coplanéité car un plan est défini par 3 points, or chaque segment de la polyligne appartiennent à leur propre plan et ne sont définis que par 2 points. Donc impossible de "fixer" un plan pour ces segments et donc de les décaler de manière coplanaire (il y a une infinité de plan possible pour chaque segment). Donc je dirais que mathématiquement parlant, il n'est pas possible de DECALER une polyligne 3D. Bisous, Luna
-
Transparence d'un objet d'une xref sans modifier la xref
Luna a répondu à un(e) sujet de sylarr dans AutoCAD 2020-2024
Coucou @sylarr, La variable système VISRETAIN = 1 permet de gérer les propriétés des calques de la XRef directement dans le dessin dans lequel elle est référencée sans modifier le fichier de référence. Par exemple, si tu as besoin de griser l'ensemble des calques dans une fenêtre de présentation pour faire ressortir les informations que tu veux, tu peux utiliser dans le gestionnaire de calque les remplacements de propriétés de la fenêtre sans avoir besoin d'ouvrir le fichier XRef, modifier la couleur des calques et recharger la XRef. Cependant, cela ne fonctionne que pour les objets ayant des propriétés définies sur "DuCalque" étant donné que l'on modifie uniquement les propriétés des calques et non des objets. C'est pour cela qu'il y a la variable système XREFOVERRIDE = 1 qui force l'ensemble des propriétés de la totalité des objets de l'XRef sur DuCalque. Donc même si dans le fichier de référence, certains objets avaient une couleur forcée, elle ne sera pas prise en compte dans le fichier dans lequel elle est référencée. Cela est cependant à double tranchant car certaines personnes ou certains logiciels travaillent régulièrement avec les couleurs forcées (je pense par exemple aux heatmap de terrassement générée par MENSURA). Bisous, Luna -
---- Message INDESIRABLES ----
Luna a répondu à un(e) sujet de rebcao dans CADxp, comment ça marche?
Si jamais vous avez besoin d'aide, se serait avec plaisir de lever les boucliers pour faire face aux forces de Sauron ! Bisous, Luna -
---- Message INDESIRABLES ----
Luna a répondu à un(e) sujet de rebcao dans CADxp, comment ça marche?
N'existe-il pas un moyen de "supprimer" ou empêcher de publier des messages lorsqu'ils contiennent des mots spécifiques ? Car j'ai l'impression que la plupart des spams ont de nombreux mots en communs et qui n'ont pas lieu d'être sur le forum (donc pas de risque de supprimer un message n'étant pas un spam. Bisous, Luna -
---- Message INDESIRABLES ----
Luna a répondu à un(e) sujet de rebcao dans CADxp, comment ça marche?
Coucou, Est-ce moi ou le nombre de messages indésirables ne cesse d'augmenter ces derniers temps ? En tous cas, bon courage pour l'ensemble de l'équipe de modérateurs qui fait un travail remarquable ! Bisous, Luna -
[Résolu] Récuperation adresses Outlook Liste semi-automatique
Luna a répondu à un(e) sujet de mathieu dans CAO, généralités
Coucou, Je n'ai pas bien saisi ta demande à mon avis mais bon.. Si tu veux accéder à la liste de tous tes contacts, il te suffit de cliquer sur le bouton "à" justement il me semble. Cela ouvre une fenêtre pop-up avec la liste des contacts. Cette fenêtre est également accessible via le ruban depuis le menu "Message", onglet "Noms" et icône "Carnet d'adresse". Autrement, je pense que la solution si cela est récurrent est de créer un groupe : Microsoft office OUTLOOK - Créer un groupe. Bisous, Luna -
Il est vrai que par "quantité de blocs" j'ai entendu "faire le quantitatif pour chaque définition de blocs référencée" et non "donner le nombre de références de blocs". Donc en effet le résultat diffère un peu. Encore une fois je me suis laissée emportée par les mots... Bisous, Luna
-
Coucou, Je peux éventuellement te suggérer ce programme (il s'agit d'une fonction et non d'une commande !). Il te faut dl le fichier .lsp et le charger (via la commande APPLOAD) dans ton dessin. Pour pouvoir l'utiliser il faut dans un premier temps copier/coller le programme pour récupérer les coordonnées des sommets de la polyligne : (defun vlax-curve-getPolylineCoordinates (pl / i pts) (repeat (setq i (if (vlax-curve-isClosed pl) (fix (vlax-curve-getEndParam pl)) (1+ (fix (vlax-curve-getEndParam pl))) ) ) (setq pts (cons (vlax-curve-getPointAtParam pl (setq i (1- i))) pts)) ) ) Puis ensuite si tu veux compter tes blocs, tu rentres la ligne ci-dessous dans ta ligne de commande et tu appuies sur F2 pour avoir les résultats dans l'historique de commande : (select-filter "BLC" '("*") (list "_CP" (mapcar '(lambda (pt) (trans pt 0 1)) (vlax-curve-getPolylineCoordinates (car (entsel "\nSélectionner un contour : "))))'()) nil T) PS : C'est évidemment moins "accessible" pour un utilisateur (lambda) mais cela fonctionne bien pour ma part (et puis c'est juste un copier/coller au final). Bisous, Luna
-
récupérer l'expression d'un champs d'un attribut de bloc, VBA
Luna a répondu à un sujet dans AutoCAD 2019
C'est plus rapide en effet 😉 Je me le note dans un coin ! Bisous, Luna
