-
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
-
+1 avec @JPhil ! La première question que tu dois te poser c'est : qu'est-ce que je veux exactement ? Une échelle de type de ligne peut parfaitement être un nombre réel strictement positif et pas uniquement un nombre entier. Comme le souligne @JPhil, il faut en effet prévoir les erreurs de l'utilisateur lambda. Donc il faut faire attention à connaître les zones contraignantes de ton programme (pour me citer 😉 ), et donc ici de connaître les limites des valeurs pouvant être prise en compte. La fonction (getint) permet de demander à l'utilisateur un nombre appartenant à l'ensemble Z (donc tout nombre entier) et la fonction (getreal) permet de demander à l'utilisateur un nombre appartenant à l'ensemble R (donc tout nombre réel). Une échelle de type de ligne est un nombre réel strictement positif, il te faut donc restreindre les entrées utilisateurs lors des demandes (getint) ou (getreal), selon ton choix. Pour cela il y a la fonction (initget) qui permet, comme son nom l'indique, d'initialiser les fonctions (get...). Essaye de voir son fonctionnement pour restreindre la saisie utilisateur à un nombre entier/réel strictement positif. Ensuite à quoi sert la parenthèse toute seule juste avant le (setq e ...) ? Car elle n'est pas utile 😉 De plus tu demandes à l'utilisateur de sélectionner un objet avec (entsel) (je te conseille de jeter un oeil au retour de cette fonction d'ailleurs via l'aide AutoCAD, car tu risques d'être surpris !), mais tu ne sembles pas utiliser cet objet ensuite puisque tu modifies uniquement la variable système LTSCALE. D'ailleurs, est-ce bien LTSCALE que tu souhaites modifier ? Pour modifier une propriété, tu peux soit regarder les propriétés DXF d'un objet, accessible via (entget), soit regarder les propriétés ActiveX d'un objet, accessible via (dumpallproperties), soit regarder les propriétés Visual d'un objet, accessible via (vlax-dump-object). Bref je suppose que ton programme n'est pas encore terminé et il te faut encore découvrir 2-3 petites choses avant d'y parvenir (comme par exemple la déclaration des variables locales qui me semble primordiale !), mais il ne faut pas se décourager pour autant ! Bisous, Luna
-
Coucou, Visual Studio Code est bien, attention tout de même à l'encodage car il n'est pas le même que l'IDE classique d'AutoCAD. Si tu veux simplement apprendre à coder simplement pour AutoCAD, je pense que l'IDE classique d'AutoCAD convient parfaitement (LISPSYS = 0 pour AutoCAD 2020 ou plus et tu y accèdes avec la commande VLIDE). Pour les fonctions, je te suggère de consulter régulièrement l'aide d'AutoCAD et notamment de garder en favori la page correspondante "Functions Reference (AutoLISP)" pouvant être accessible depuis le menu "AutoLISP: Reference > Functions Reference (AutoLISP)". Cette page permet d'accéder à l'ensemble des fonctions AutoLISP soit en cherchant par ordre alphabétique, soit par feature et fonctionnalité. Dans le cas présent, je te conseille par exemple de consulter les fonctions "User Input" situé dans la "Feature list" "Utility". (cf. User Input Functions Reference (AutoLISP) ) Il y a également les sites de (gile), didier et LeeMac (anglais) qui sont des références, on ne le répétera jamais assez 🙂 Bon courage et surtout n'oublie pas, si tu veux apprendre, commence par comprendre ! Pour cela, rien ne vaut les essais directement sur AutoCAD, faire des recherches en s'aidant de l'aide AutoCAD et de tout autre document, ... La programmation c'est pas du par cœur, c'est uniquement de la logique et de la compréhension du pourquoi et comment on peut le faire. Après tout il n'y a pas une seule et unique solution à un problème, le principal c'est de bien cerner les limites du problème, les zones contraignantes et les zones de liberté. Bisous, Luna
-
@PHILPHIL, Je remarque que tu utilises (getcfg) et (setcfg), donc comme je ne connaissais pas et que chat m'a intrigué je suis allé voir et je suis tombé sur cela : Donc à voir si cela ne risque pas de poser problème à l'avenir 😉 Bisous, Luna
-
(defun c:ATTROT180 (/ infinitySel break name) (defun infinitySel (msg / break g r e) (princ msg) (while (and (not break) (setq g (grread nil 12 2))) (cond ((= 3 (car g)) (setq e (nentselp (cadr g)) r (cond ((null e) nil) ((= (length e) 2) e) (T (list (last (last e)) (cadr g))) ) break r ) ) (T (setq break T)) ) ) r ) (while (and (setq name (car (infinitySel "\nVeuillez cliquer sur un attribut : "))) (= (cdr (assoc 0 (entget name))) "ATTRIB") ) (entmod (subst (cons 50 (+ (cdr (assoc 50 (entget name))) (/ pi 1.0))) (assoc 50 (entget name)) (entget name))) (entmod (subst (cons 73 0) (assoc 73 (entget name)) (entget name))) (entmod (subst (cons 72 4) (assoc 72 (entget name)) (entget name))) ) (if name (prompt "\nErreur : L'objet sélectionné n'est pas un attribut") (prompt "\nFin de la commande") ) (princ) )
-
[LISP/Diesel ou Full Lisp] Renommer des onglets et des folios dans un cartouche automatiquement
Luna a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Coucou, Ma commande NAMECART étant un peu vieillote, j'ai fait une refonte complète et déclaré 100% des fonctions localement pour son bon fonctionnement. Au début de la définition de la commande, il y a une zone de définition des paramètres utilisateur (les commentaires sont là pour aider à la situer et à la remplir correctement). Dans la version ci-dessous j'ai déjà défini les paramètres utilisateurs pour ton utilisation perso, mais si jamais le nom de ton bloc change, si tu as plusieurs nom de bloc, ou si tu souhaites changer le modèle du nom des présentations, tu suis les indications dans les commentaires pour ne pas faire de bêtises. (defun c:NAMECART (/ ListBox lst2str SelDynBlock setLayoutName setLayoutPos AttList2Name BlockName LayoutName) ;--- Définition utilisateur pour le bon fonctionnement et l'adaptation du programme aux besoins de chacun. ; ;--• BlockName, chaîne de caractères comprise entre guillemets "" spécifiant le nom du ou des blocs servant à renommer les présentations. ; ; -> Les caractères spéciaux (cf. "Wild-Card Characters Reference") sont autorisés ! Utilisation de la fonction (wcmatch) ; ; -> Plusieurs nom et/ou clés de recherche peuvent être spécifiés en les séparant par une virgule "," ; ; -> Ex. : "CARTOUCHE" ; ; "Cartouche*" ; ; "A0-Paysage*Cartouche,A0-Portrait*Cartouche" ; ;--• LayoutName, liste dont l'ordre et le type de chaque élément permet de servir de modèle d'appelation pour les présentations. ; ; -> Ne SURTOUT PAS modifier/supprimer la fonction (quote) ni modifier le nombre et la position des parenthèses () !!! ; ; -> Le nom des étiquettes d'attributs ne doivent pas être compris entre guillemet "", écrire directement le nom des étiquettes ; ; -> Les chaînes de caractères correspondent aux chaînes de caractères de séparation si vous désirez en mettre, tout est autorisé du ; ; moment que les chaînes de séparation sont entre guillemets "" ; ; -> Le nombre d'éléments dans la liste est libre, il peut contenir autant d'attribut que souhaité, autant de chaînes de séparation que ; ; souhaité et l'ordre entre les différents élément est également libre ; ; -> Ex. : N°AFFAIRE "-" NIVEAU "-" TECHNIQUE "-" NUMERO "-" DERIND ; ; (getvar "DWGNAME") "_" PHASE "_" Indice "-" PLANCHE "_" TITRE1 TITRE2 ; (setq BlockName "CARTOUCHE" ;--• Définition du ou des noms des blocs cartouche LayoutName (quote (N°AFFAIRE "-" NIVEAU "-" TECHNIQUE "-" NUMERO "-" DERIND)) ;--• Définition de la méthode d'appelation des présentation ) ;--- Fin de la définition des paramètres utilisateurs. ; (defun ListBox (title msg lst value flag / str2lst tmp file DCL_ID choice tlst) (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) ) ) (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 lst2str (lst sep) (vl-string-left-trim sep (apply 'strcat (mapcar '(lambda (l) (strcat sep (vl-princ-to-string l))) lst))) ) (defun SelDynBlock (BlockName sslist / jsel i name) (cond ((null sslist) (setq sslist (list "_X" (list '(0 . "INSERT") (cons 2 (strcat "`*U*," BlockName))))) ) ((or (not (listp (last sslist))) (and (listp (last sslist)) (vl-list-length (car (last sslist))))) (setq sslist (append sslist (list '(0 . "INSERT") (cons 2 (strcat "`*U*," BlockName))))) ) ((and (listp (last sslist)) (null (vl-list-length (car (last sslist))))) (setq sslist (append (reverse (cdr (reverse sslist))) (list (if (assoc 0 (last sslist)) (subst '(0 . "INSERT") (assoc 0 (last sslist)) (last sslist)) (append (last sslist) '((0 . "INSERT"))) ) ) ) sslist (append (reverse (cdr (reverse sslist))) (list (if (assoc 2 (last sslist)) (subst (cons 2 (strcat "`*U*," BlockName)) (assoc 2 (last sslist)) (last sslist)) (append (last sslist) (list (cons 2 (strcat "`*U*," BlockName)))) ) ) ) ) ) ) (if (setq jsel (apply 'ssget sslist)) (repeat (setq i (sslength jsel)) (setq name (ssname jsel (setq i (1- i)))) (if (not (and (= (getpropertyvalue name "ClassName") "") (wcmatch (getpropertyvalue name "BlockTableRecord/Name") BlockName) ) ) (ssdel name jsel) ) ) ) jsel ) (defun setLayoutName (layout str / getLayoutList ll) (defun getLayoutList (/ l ll) (vlax-for l (vla-get-Layouts (vla-get-ActiveDocument (vlax-get-acad-object))) (setq ll (cons (cons (vla-get-Name l) l) ll)) ) (reverse ll) ) (setq ll (getLayoutList)) (if (and (/= str layout) (assoc layout ll)) (if (not (assoc str ll)) (vla-put-name (cdr (assoc layout ll)) str) (progn (while (assoc str ll) (cond ((wcmatch str "* (#)") (setq str (strcat (substr str 1 (- (strlen str) 2)) (itoa (1+ (atoi (substr str (- (strlen str) 1) 1)))) ")")) ) ((wcmatch str "* (##)") (setq str (strcat (substr str 1 (- (strlen str) 3)) (itoa (1+ (atoi (substr str (- (strlen str) 2) 2)))) ")")) ) (T (setq str (strcat str " (2)")) ) ) ) (vla-put-name (cdr (assoc layout ll)) str) ) ) ) ) (defun setLayoutPos (/ i l ll) (setq i 0 ll (vla-get-Layouts (vla-get-ActiveDocument (vlax-get-acad-object))) ) (mapcar '(lambda (l) (vla-put-TabOrder (vla-item ll l) (setq i (1+ i)))) (layoutlist)) (princ) ) (defun AttList2Name (l name / attlist) (if (setq attlist (mapcar '(lambda (a) (cons (vla-get-tagstring a) (vla-get-textstring a))) (vlax-invoke (vlax-ename->vla-object name) 'getAttributes) ) ) (mapcar '(lambda(x) (if (= (type x) 'SYM) (if (assoc (vl-princ-to-string x) attlist) (cdr (assoc (vl-princ-to-string x) attlist)) "" ) (eval x) ) ) l ) ) ) (initget "Active Toutes Sélection") (if (null (setq c (getkword "\nQuelle(s) présentation(s) souhaitez-vous rennomer [Active/Toutes/Sélection] <Active> ? "))) (setq c "Active") ) (cond ((= c "Active") (setq ll (list (getvar "CTAB")))) ((= c "Toutes") (setq ll (layoutlist))) ((= c "Sélection") (setq ll (ListBox "Sélection des présentations" "Veuillez sélectionner une ou plusieurs présentation :" (vl-sort (layoutlist) '<) (getvar "CTAB") 2 ) ) ) ) (foreach l ll (if (and (setq jsel (SelDynBlock BlockName (list "_X" (list (cons 410 l))))) (= (sslength jsel) 1)) (progn (setq name (ssname jsel 0)) (setLayoutName l (lst2str (AttList2Name LayoutName name) "")) ) ) ) (setLayoutPos) ) Cela devrait répondre à tes besoins (et probablement aux besoins d'autres personnes) concernant la numérotation des présentations. Bisous, Luna -
Création Type de ligne avec des triangles pour un losange
Luna a répondu à un(e) sujet de Eli-110 dans AutoCAD 2020-2024
Coucou, Peut-être essaye de regarder du côté de la définition de la LIMITE2 et d'y ajouter une rotation. Après tout un losange est simplement un carré tourné à 45° 😉 Donc si on se réfère à la définition de ZIGZAG, on peut ajouter le r=45 dans la définition d'un type d'objet ltypeshp.shx. Bisous, Luna -
Coucou, Normalement il s'agit des codes 72 et 73 qui régissent l'alignement d'un texte donc il te suffit de copier la ligne (entmod ...) et de remplacer le code 50 par les codes 72, puis 73 (dans une 3ème ligne) et de spécifier la valeur souhaitée. Cela donnerait quelque chose du genre : (defun c:ATTROT180 (/ name) (while (and (setq name (car (nentsel "\nVeuillez cliquer sur un attribut : "))) (= (cdr (assoc 0 (entget name))) "ATTRIB") ) (entmod (subst (cons 50 (+ (cdr (assoc 50 (entget name))) (/ pi 1.0))) (assoc 50 (entget name)) (entget name))) (entmod (subst (cons 73 0) (assoc 73 (entget name)) (entget name))) (entmod (subst (cons 72 4) (assoc 72 (entget name)) (entget name))) ) (if name (prompt "\nErreur : L'objet sélectionné n'est pas un attribut") (prompt "\nFin de la commande") ) (princ) ) Bisous, Luna
-
[LISP/Diesel ou Full Lisp] Renommer des onglets et des folios dans un cartouche automatiquement
Luna a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Et bien aucune idée, j'ai besoin d'un .dwg d'exemple avec ton cartouche et la méthode de fonctionnement souhaité, autrement je ne pourrais rien faire... Bisous, Luna -
[LISP/Diesel ou Full Lisp] Renommer des onglets et des folios dans un cartouche automatiquement
Luna a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
c'est parfaitement normal, ce programme n'est pas adapté pour fonctionner de manière générale, donc je l'ai uniquement posté en temps qu'exemple mais pas pour être exécuter étant donné qu'il ne fonctionnera pas vraiment. Du coup il y a certaine utilisation de fonctions perso qui ne sont pas définies dans l'exemple. Bisous, Luna -
[LISP/Diesel ou Full Lisp] Renommer des onglets et des folios dans un cartouche automatiquement
Luna a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Coucou, tout va dépendre de comment sont nommés tes attributs relatifs aux attributs 🙂 Je pense que le plus simple c'est de récupérer dans un premier temps la liste de tous tes attributs de ton bloc via la fonction (get-att-list) par exemple et si tes attributs relatifs aux attributs portent un nom commun genre "INDICE_A", "INDICE_B", etc... il te suffit de supprimer tous les attributs dont l'étiquette ne possède pas "INDICE_*" et tous les attributs dont leur valeur est "". Du coup il te restera uniquement la liste des attributs relatifs aux indices ayant une valeur et tu regardes le dernier attribut de la liste une fois triée dans l'ordre alphabétique à partir du nom de l'étiquette. Comme chat, tu connais le dernier indice défini dans ton cartouche. J'ai un fonctionnement dans le genre avec ma commande MODCART : (defun C:MODCART (/ vl-all-position nth-remove laylist jsel i ind name Mod Mod_Ind Auteur att-list lst l mod-list aut-list n) (defun vl-all-position (x lst / i p) (setq i 0) (while (< i (length lst)) (if (= x (nth i lst)) (setq p (cons i p)) ) (setq i (1+ i)) ) (reverse p) ) (defun nth-remove (lst tag / i) (setq i 0) (vl-remove-if '(lambda (x) (member (setq i (1+ i)) tag)) lst) ) (if (setq laylist (ListBox "Commande MODCART : Sélection des présentations" "Veuillez sélectionner les présentations à modifier :" (DXF_List (vl-remove "TOOLKIT" (layoutlist)) nil nil t nil) (getvar "CTAB") 2 ) ) (progn (setq jsel (Select-filter "BLC" "Cartouche*" "_X" (list (cons 410 (DXF_List laylist "," "right" t t)))) i 0 ) (sssetfirst nil nil) (initget "Reset +1 -1") (if (null (setq Mod (getkword "Que souhaitez-vous faire [Reset/+1/-1] <+1> ? "))) (setq Mod "+1") ) ) ) (cond ((and (= Mod "Reset") jsel (> (sslength jsel) 0) ) (while (< i (sslength jsel)) (setq name (ssname jsel i) att-list (vl-remove-if-not '(lambda (x) (and (wcmatch (strcase (car x)) (strcase "MODIFICATIONS_IND_[B-F],AUTEUR_[B-F]")) (/= (cdr x) ""))) (get-att-list name)) lst (cons (cdr (assoc 410 (entget name))) lst) i (1+ i) ) (if att-list (set-att-list name (append (list '("MODIFICATIONS_IND_A" . "CREATION DU PLAN")) (mapcar '(lambda (x) (cons (car x) "")) att-list))) (prompt (strcat "\nLe cartouche \"" (cdr (assoc 410 (entget name))) "\" est déjà à l'indice A.")) ) ) (set-date laylist nil) (prompt (strcat "\n" (itoa (sslength jsel)) " cartouches présents sur les présentations \"" (DXF_List lst "\", \"" "right" t t) "\" ont été redéfini à l'indice A : \"CREATION DU PLAN\"." ) ) ) ((and (= Mod "+1") jsel (> (sslength jsel) 0) (setq Mod (strcase (getstring t (strcat "\nVeuillez spécifier la modification à afficher dans " (itoa (sslength jsel)) " cartouche(s) : ")))) ) (if (= "" (setq Auteur (getstring (strcat "\nVeuillez spécifier l'auteur pour cette modification <" (vlax-get-property (vlax-get-property (vla-get-activedocument (vlax-get-acad-object)) 'SummaryInfo) 'Author) "> : ")))) (setq Auteur (vlax-get-property (vlax-get-property (vla-get-activedocument (vlax-get-acad-object)) 'SummaryInfo) 'Author)) ) (set-date laylist nil) (while (< i (sslength jsel)) (setq name (ssname jsel i) att-list (get-att-list name) Mod_Ind (caar (vl-remove-if-not '(lambda (x) (and (wcmatch (strcase (car x)) (strcase "MODIFICATIONS_IND_*")) (= (cdr x) ""))) att-list)) lst (cons (cons (cdr (assoc 410 (entget name))) (substr Mod_Ind (strlen Mod_Ind) 1)) lst) i (1+ i) ) (set-att-list name (list (cons Mod_Ind Mod) (cons (strcat "AUTEUR_" (substr Mod_Ind (strlen Mod_Ind) 1)) Auteur))) ) (prompt (strcat "\n" (itoa (sslength jsel)) " cartouches présents sur les présentations \"" (DXF_List (mapcar '(lambda (x) (strcat (car x) " (" (cdr x) ")")) lst) "\", \"" "right" t t) "\" ont été modifiés." ) ) ) ((and (= Mod "-1") jsel (> (sslength jsel) 0) (repeat (setq i (sslength jsel)) (setq name (ssname jsel (setq i (1- i))) att-list (cons (cons name (sort-cons (vl-remove-if-not '(lambda (x) (wcmatch (strcase (car x)) (strcase "MODIFICATIONS_IND_[B-F],AUTEUR_[B-F]"))) (get-att-list name)))) att-list) ) ) (setq Mod (ListBox "Commande MODCART : Sélection des modifications à retirer" (strcat "Veuillez sélectionner les modifications à retirer dans " (itoa (sslength jsel)) " cartouche(s) :") (DXF_List (mapcar 'cdr (vl-remove-if '(lambda (x) (or (wcmatch (strcase (car x)) "AUTEUR_*") (wcmatch (strcase (cdr x)) ""))) (apply 'append (mapcar 'cdr att-list)))) nil nil t nil) 0 2 ) ) ) (set-date laylist nil) (foreach lst att-list (setq name (car lst) lst (cdr lst) mod-list (mapcar 'cdr (vl-remove-if '(lambda (x) (wcmatch (strcase (car x)) (strcase "AUTEUR_*"))) lst)) aut-list (mapcar 'cdr (vl-remove-if '(lambda (x) (wcmatch (strcase (car x)) (strcase "MODIFICATIONS_IND_*"))) lst)) Mod_Ind (apply 'append (mapcar '(lambda (x) (vl-all-position x mod-list)) Mod)) mod-list (append (nth-remove mod-list (mapcar '1+ Mod_Ind)) (progn (setq l nil) (repeat (length Mod_Ind) (setq l (cons "" l))))) aut-list (append (nth-remove aut-list (mapcar '1+ Mod_Ind)) (progn (setq l nil) (repeat (length Mod_Ind) (setq l (cons "" l))))) Mod_Ind "A" mod-list (mapcar '(lambda (x) (cons (strcat "MODIFICATIONS_IND_" (setq Mod_Ind (Sup-Incr Mod_Ind 1))) (strcase x))) mod-list) Mod_Ind "A" aut-list (mapcar '(lambda (x) (cons (strcat "AUTEUR_" (setq Mod_Ind (Sup-Incr Mod_Ind 1))) (strcase x))) aut-list) lst (append aut-list mod-list) ) (set-att-list name lst) (setq att-list (get-att-list name) Mod_Ind (substr (caar (vl-remove-if-not '(lambda (x) (and (wcmatch (strcase (car x)) (strcase "MODIFICATIONS_IND_*")) (= (cdr x) ""))) att-list)) (strlen "MODIFICATIONS_IND_*") 1) laylist (subst (strcat (cdr (assoc 410 (entget name))) " (" (Sup-Incr Mod_Ind -1) ")") (cdr (assoc 410 (entget name))) laylist) ) ) (prompt (strcat "\n" (itoa (sslength jsel)) " cartouches présents sur les présentations \"" (DXF_List laylist "\", \"" "right" t t) "\" ont été modifiés." ) ) ) ((or (null laylist) (null jsel) (= (sslength jsel) 0) ) (prompt "\nErreur: Commande MODCART annulée...") ) (prompt (strcat "\nAucune modification apportée pour le(s) " (itoa (sslength jsel)) " cartouche(s) présents sur la/les présentation(s) \"" (DXF_List laylist "\", \"" "right" t t) "\"..." ) ) ) (princ) ) Bisous, Luna -
J'ai surtout remarqué que j'avais très souvent l'accès refusé au site de CADxp lorsque j'essaye de me connecter avec mon téléphone (que je sois en wifi ou non) alors qu'avec l'ordi aucun problème...Ce qui est assez énervant mais bon... Concernant les spams de ces robots indésirables, ils ont surtout de nombreux points communs entre eux ! On retrouve à 90% toujours certains mots en commun et qui ont surtout l'avantage de ne jamais être utiliser par un utilisateur humain sur ce forum. Je pense que des filtres ou de nombreuses autres solutions sont envisageable pour rendre le forum un peu plus intransigeant face à ces vagues de robots numériques... Bisous, Luna
-
Aide création dans bloc avec un réseau rectangulaire
Luna a répondu à un(e) sujet de Netparty dans AutoCAD 2020-2024
Une autre solution pourrait de prévoir cela par de la programmation. C'est à peu près comme cela que je fonctionne avec mes cartouches perso (même si je dois ajouter cette fonctionnalité dans mon programme car pour l'instant c'est juste en projet). J'ai un nombre fixe d'attribut et de ligne d'indice et si je souhaite modifier plusieurs cartouche par la même modif', j'utilise un programme LISP pour augmenter l'indice de chaque cartouche en fonction des indices déjà présents. Par exemple si j'ai une modification "MAJ IMPLANTATION" qui impacte 3 plans différents (et donc 3 cartouches), j'utilise mon programme et les plans passeront à l'indice supérieur ("A" -> "B", "D" -> "E" et "B" -> "C"). On peut faire de même pour supprimer un indice. Mon idée (encore en projet) c'est de prévoir une sorte de roulement des indices, un peu comme une liste que l'on déroule à chaque nouvel indice. Autrement dit si il n'y a que 6 lignes fixes par exemple (donc initialement A, B, C, D, E et F), et qu'on a un indice G à ajouter, on passerait à 6 indices B, C, D, E, F et G. Certes il y a une perte d'infos de l'indice A mais généralement cela n'a plus forcément d'importance vu qu'on est à l'indice G... Car le soucis c'est que l'action de réseau dans un bloc ne peut pas sélectionner les attributs car le nombre de définition d'attribut ne peut pas être variable... Le seul moyen serait de passer par une visibilité, de prévoir un bloc de 26 lignes avec 26 définitions d'attributs et 26 états de visibilité avec à chaque fois la visibilité n+1 qui correspond à la visibilité n et une ligne supplémentaire...Par contre à l'utilisation cela doit être extrêmement pénible je pense.. Bisous, Luna -
Insertion d'un Nuage de Point dans le SCU Général
Luna a répondu à un(e) sujet de willy95 dans Débuter en LISP
et bien chaque fois que tu spécifies un point depuis un SCU mais que les coordonnées doivent être en SCG, tu l'utilises. Par exemple je suppose que dans ta ligne (command ".PointCloudAttach" "0,0,0" "~") Tu veux que le point "0,0,0" soit en coordonnées SCG et non SCU ? Donc tu écris : (command ".PointCloudAttach" (trans '(0.0 0.0 0.0) 1 0) "~") Cependant en lançant la commande ".POINTCLOUDATTACH", la première chose que la commande me demande c'est de sélectionner un fichier de nuage de point via une fenêtre windows. Or dans ton programme, la première chose que tu renseignes est un point d'insertion...Cela ne pose-t-il pas déjà un soucis ? De plus je ne connais pas le "~", à quoi sert-il ? Bisous, Luna -
Nan je crois que tu n'as pas compris la démarche. Le but est simplement de ne pas utiliser l'écriture fractionnaire mais décimale. Le but de l'écriture fractionnaire c'est uniquement de pouvoir gérer les arrondis à 0.5, 0.25, 0.125, ... près. Donc Au lieu d'avoir le résultat 5+1/4, je trouve que c'est plus compréhensible d'écrire 5.25 🙂 Et c'est tout... Voici un exemple d'écriture avec un seul champ : 0.25*trunc((740/(240-28))/0.25+0.5) Ce qui me donne le résultat 3,50 Et si tu prends 0.25*trunc(5.27/0.25+0.5) Cela va renvoyer 5.25 Bisous, Luna
-
Et bien voilà, je me disais bien que j'avais oublié un élément important !!!! Merci @JPhil pour m'avoir rappelé l'existence de cette liste de fonctions éditée par (gile) ! 🙂 Du coup @srault voici ce que je te propose : -> Insérer un champ "Formule" dans ton objet texte, attribut, cotation, ... Valeur : 0.25*trunc(i) Format : Décimal (0.00) -> Insérer un champ "Formule" au niveau du i de la formule ci-dessus Valeur : i/0.25+0.5 Format : Décimal -> Insérer un champ quelqu'il soit correspondant à ta formule de base au niveau du i de la formule ci-dessus Valeur d'exemple : 740/(240-28) Format : Décimal Tu peux également limiter le nombre de champ en intégrant le calcul directement dans la formule mais c'est plus pour un soucis de lisibilité ^^" Mais tu peux en effet n'avoir que 2 champs par exemple en mergeant le 1er avec le second comme ceci : 0.25*trunc(i/0.25+0.5) Avec i le champ correspondant à ton calcul, ou directement ta formule ! J'ai testé vite fait, et j'obtiens bien des valeurs qui ne sont que des multiples de 0.25 et elles sont arrondi au multiple supérieur ;3 J'avais essayé mais la partie fractionnaire fait partie intégrante de la partie entière justement donc les suffixes et préfixes ne peuvent pas s'insérer entre les deux parties... Bisous, Luna
-
Insertion d'un Nuage de Point dans le SCU Général
Luna a répondu à un(e) sujet de willy95 dans Débuter en LISP
Coucou, Regarde du côté de la fonction (trans) pour faire le changement de base entre le SCU (= 1) et le SCG (= 0) ou directement avec l'ename de l'objet. Voici un exemple d'utilisation : (setq pt (getpoint "\nSaisir un point :")) (setq pt (trans pt 1 0)) ;; ou (setq pt (getpoint "\nSaisir un point :")) (setq name (car (entsel "\nSélectionner l'objet source du SCO courant :"))) (setq pt (trans pt name 0)) Bisous, Luna -
Yup +1 avec @didier, on ne peut pas vraiment donner de réponses toutes faites. Mais en effet si les seules infos que tu possèdes sont je pense tout simplement que le premier exercice serait de mieux cerner le problème. Car avec ces seules données d'entrées, même moi je ne pourrais répondre à l'exercice. Essaye de revoir comment est posé le problème et extrait un maximum d'infos exploitable avant de te lancer dans l'écriture même du problème. La première étape pour écrire un programme c'est avant tout de décortiquer le problème posé, l'étudier mathématiquement et/ou géométriquement parlant, récolter toutes les données d'entrées et réfléchir de manière algorithmique. Donc avant d'essayer d'écrire la moindre ligne de code essaye de produire un algorithme répondant strictement au problème posé (sans fioriture). Cela te donnera le fil rouge de ton programme en posant rapidement les balises (while), (if), ... La base de la programmation (ou raisonnement logique), c'est si un problème est trop complexe il faut le décomposer en plusieurs problèmes plus simples puis les joindre bout à bout. Il n'y a que comme chat qu'on progresse 😉 Reviens vers nous lorsque tu auras fait cela, et on pourra déjà t'aider plus simplement sur la partie vocabulaire. Mais c'est à toi de comprendre la conjugaison et la grammaire, car pour cela, on ne pourra pas t'aider ou alors de manière contre-productive ^^" Bisous, Luna
-
Bah j'ai eu comme une petite sensation de déjà-vu à la manière dont tu avais posé le problème dans ton premier message (et ton second message me l'a confirmé). J'ai suivi la même licence (ou du moins les mêmes cours de LISP) en 2019. Pour être honnête, tu comprendrais mieux la prog' AutoLISP en cherchant par toi-même, mais ce qui est sûr c'est que la demande est adaptée pour les personnes qui découvre AutoLISP donc le nombre de contraintes n'est pas aussi détaillé que le suggère @didier. Cependant, je suis à peu près persuadée que tu as un peu plus d'infos que juste "à partir du nombre d'ouvriers, il faut pouvoir déterminer les dimensions, le nombre et la disposition des bungalows" car c'est un peu maigre. Si tu manques d'infos, pose les questions à J. ROMAN, il est plutôt du genre ouvert et compréhensif donc il pourra t'aiguiller sur la marche à suivre. PS: C'est théoriquement un projet noté, donc sachant cela, est-ce bien raisonnable de te donner des réponses toutes faites ? Bisous, Luna
-
@jasonriri, Petite question qui n'a ABSOLUMENT rien à voir : ne serais-tu pas en licence pro LP CAO/DAO à l'IUT de Nîmes par hasard ? Avec J. ROMAN comme prof ? Parce que le sujet me parle quelque peu donc chat irait plus vite si c'est le cas >n< Bisous, Luna
-
Coucou, Il manque beaucoup de données pour faire les calculs pour le coup. Quels sont les calculs mathématiques pour sortir le nombre et dimensions des bungalows à partir du nombre d'ouvrier ? L'empilement des containers est-il un critère à prendre en compte ? Comment détermines-tu la position des bungalows entre eux ? Il y a-t-il une surface spécifique dans laquelle faire rentrer les rectangles, ou bien ils sont tous alignés, en U, en C, ... ? Un .dwg d'exemple avec des explications claires permettrait également de mieux comprendre la complexité du programme souhaité et les contraintes à prendre en compte. Bisous, Luna
-
Personnalisation des commandes dans une palette
Luna a répondu à un(e) sujet de Netparty dans AutoCAD 2020-2024
Coucou, Déjà si je me base uniquement sur ce que tu as publié, il manque la dernière parenthèse pour le (defun) mais je suppose tout de même que c'est uniquement une erreur de sélection lors du copier/coller. Autrement je pense avoir compris le soucis. De manière générale on utilise une boucle (while) avec les (command "_PLINE") afin de s'adapter au nombre variable de sommets. Ici le programme créé une polyligne avec un sommet unique, puis essaye de redéfinir les variables "CLAYER", "CELTSCALE" et "PLINEWID" alors qu'AutoCAD est toujours en train de créer une polyligne. Donc pour CLAYER et CELTSCALE pas de problème il arrive à gérer, par contre pour PLINEWID il est obligé de conserver la valeur à 50 pour continuer à tracer la polyligne correctement 😉 Essaye plutôt comme ceci : (defun c:ZONE-TD-PLAN (/ pt0 pt) (setvar "PLINEWID" 50) ; Largeur global de la polyligne (setvar "CELTSCALE" 25) ; Echelle du type de ligne (command "_layer" "_new" "COL_3_Tableaux-zonage" "") ; Création du calque (setvar "CLAYER" "COL_3_Tableaux-zonage") ; Se place sur le calque pour dessiner la polyligne (command "_PLINE" (setq pt0 (getpoint "\nSpécifiez le point de départ : "))) ; Dessiner la polyligne (while (setq pt (getpoint pt0 "\nPoint suivant : ")) (command pt) (setq pt0 pt) ) (command) (setvar "CLAYER" "0") ; Se place sur le calque 0 (setvar "CELTSCALE" 1) ; Redéfinit l'échelle à 1 (setvar "PLINEWID" 0) ; Redéfinit la largeur global à 0 (princ) ) Une autre solution serait celle-ci pour conserver toutes les options prévue par une commande grâce aux options pause (autrement dit, cela simule un lancement de commande parfaitement classique) : (command "_PLINE" pause) (while (/= (getvar "CMDACTIVE") 0) (command pause) ) en remplacement de : (command "_PLINE" (setq pt0 (getpoint "\nSpécifiez le point de départ : "))) (while (setq pt (getpoint pt0 "\nPoint suivant : ")) (command pt) (setq pt0 pt) ) (command) Bisous, Luna -
Coucou, Il faut utiliser la fonction (command) et les arguments que tu dois lui passer sont strictement les mêmes que tu utiliserais en ligne de commande sur AutoCAD. Autrement dit, regardes ce que TU ferais en faisant la manip' manuellement, et rentre chaque entrée clavier sous forme d'arguments pour ta fonction (command). Je ne comprends cependant pas la demande : Cela signifie t-il le sommet de départ et de fin de chaque segment ? de la polyligne ? Ou bien est-ce le sommet de départ de la polyligne qui possède une épaisseur, le reste doit être à 0, puis de nouveau une épaisseur pour le dernier sommet de la polyligne ? Pour les (command "_PLINE"), on utilise régulièrement une boucle (while) pour la saisie des points (et ainsi s'adapter au nombre variable de sommets désirés) : (command "_PLINE" pause "_Width" pause pause) (while (setq pt (getpoint "\nPoint suivant : ")) (command pt) ) (command) Cependant cette méthode ne peut pas prévoir un changement progressif de l'épaisseur car il faudrait connaître à l'avance le nombre de sommet ainsi que la largeur de chaque segment. Autrement dit, pour quelque chose du genre, ce n'est pas à la création de la polyligne qu'il faudrait le gérer mais en post-traitement via (entmod) et la gestion des codes DXF 40 (= Starting width) et 41 (= End width). Il faudrait également calculer les longueurs de segment afin d'avoir un changement d'épaisseur uniforme. Bisous, Luna
-
On ne peut pas justement, on peut faire agir un programme à un instant T mais on ne peux pas l'utiliser directement dans les valeurs d'un attribut en permanence. Comme je disais, il est possible de voir avec le langage DIESEL vu que l'on peut entrer une expression DIESEL comme valeur de champ dynamique mais en effet un .dwg permettrait de mieux s'adapter au problème et trouver une solution viable. Bisous, Luna
-
Personnalisation des commandes dans une palette
Luna a répondu à un(e) sujet de Netparty dans AutoCAD 2020-2024
Bien sûr, aide-toi du fichier réalisé par rebcao faisant la liste des variables systèmes AutoCAD : Liste des variables systèmes. Pour l'échelle il me semble que c'est LTSCALE. Il te suffit d'ajouter une ligne (setvar) là où tu le souhaites (avant le lancement de la (command) ou après). Bisous, Luna -
Personnalisation des commandes dans une palette
Luna a répondu à un(e) sujet de Netparty dans AutoCAD 2020-2024
une autre solution serait par de la prog pure est simple ^^" (defun c:NOMDELACOMMANDE () (setvar "PLINEWID" 50) (command "_PLINE" pause) (setvar "CLAYER" "0") (princ) ) Tu définis le nom de la commande que tu désires (il faut remplacer NOMDELACOMMANDE par le nom de la commande que tu souhaites, en conservant le 😄) et tu enregistres le fichier en .lsp Après chat, tu fais APPLOAD dans AutoCAD et tu spécifies ton fichier .lsp dans les fichiers à charger au démarrage (le bouton "Contenu" sous la valise). Tu peux même créer un bouton ou un alias de commande pour cela et chat fera ce que tu as demandé. Sinon, tu attends qu'une personne qui maîtrise davantage le script que moi passe par là et trouve une solution si solution il y a... 🙂 Bisous, Luna
