willy95 Posté(e) le 20 juin 2022 Posté(e) le 20 juin 2022 Bonjour les amis, Est-il possible de simplifié mon code pour obtenir un décalage à gauche et a droite de la moitié de la valeur de départ en cliquant uniquement sur la ligne à décaler ? (et fini les deux clics pour lui dire de quel coté) (defun c:TAB ( / Dis DemiDis Ent IniCmd) (setq Dis (getdist (strcat "\nLargeur totale du Tableau <" (rtos (getvar "OFFSETDIST")) ">: ")) Ent (entsel "\nChoix de l'Axe : ") IniCmd (getvar "CMDECHO") ) (setq DemiDis (/ Dis 2)) (command "_OFFSET" DemiDis ; Distance Ent ; Sélection de l'objet à décaler Pause ; Coté à décaler "" ; Sort de la commande Décaler ) (command "_OFFSET" DemiDis ; Distance Ent ; Sélection de l'objet à décaler Pause ; Coté à décaler "" ; Sort de la commande Décaler ) (setvar "CMDECHO" IniCmd) (princ) ) Merci par avance
Luna Posté(e) le 20 juin 2022 Posté(e) le 20 juin 2022 Coucou, (defun c:TAB ( / Dis DemiDis Ent IniCmd) (setq Dis (getdist (strcat "\nLargeur totale du Tableau <" (rtos (getvar "OFFSETDIST")) ">: ")) Ent (car (entsel "\nChoix de l'Axe : ")) ; Attention au retour de (entsel) ! Pour obtenir le nom d'entité, il s'agit du (car) du résultat ;) IniCmd (getvar "CMDECHO") ) (setq DemiDis (/ Dis 2.0)) ; Attention, il faut diviser par un réel pour obtenir un réel ! (/ 5 2) = 2 et (/ 5 2.) = 2.5 (command "_OFFSET" DemiDis ; Distance Ent ; Sélection de l'objet à décaler Pause ; Coté à décaler "" ; Sort de la commande Décaler ) (command "_OFFSET" DemiDis ; Distance Ent ; Sélection de l'objet à décaler Pause ; Coté à décaler "" ; Sort de la commande Décaler ) (setvar "CMDECHO" IniCmd) (princ) ) Ceci convient-il ? Je peux également te proposer une piste pour n'avoir qu'à sélectionner l'objet, sans cliquer à gauche ou à droite ^^" Bisous, Luna
(gile) Posté(e) le 20 juin 2022 Posté(e) le 20 juin 2022 Salut, Avec la fonction vla-Offset on peut décaler des deux côtés dans intervention de l'utilisateur. (defun c:TAB (/ dis ent) (vl-load-com) (if (setq dis (getdist (strcat "\nLargeur totale du Tableau <" (rtos (getvar "OFFSETDIST")) ">: " ) ) ) (setvar "OFFSETDIST" dis) (setq dis (getvar "OFFSETDIST")) ) (if (setq ent (car (entsel "\nChoix de l'Axe : "))) (progn (setq ent (vlax-ename->vla-object ent)) (vla-Offset ent (* 0.5 dis)) (vla-Offset ent (* -0.5 dis)) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
willy95 Posté(e) le 20 juin 2022 Auteur Posté(e) le 20 juin 2022 Merci à vous deux, c'est top, les fonctions "VLA" sont vraiment super mais cela reste une autre langue, ayant déjà du mal avec le lisp classique, mais je pensai bien après quelques lectures sur le forum que la solution serait avec vla-Offset. Merci pour votre aide, votre temps passé et votre promptitude.
rebcao Posté(e) le 20 juin 2022 Posté(e) le 20 juin 2022 Bonjour, C'est un peu hors sujet, mais j'avais développé une MACRO DIESEL pour les LTsiens... 😇 c'est encore moins digeste que le LISP !!! *^C^C"Valeur du décalage : "^CUSERR4;\OFFSETDIST;$m=$(/,$(getvar,USERR4),2);_line;_NEA;\_NEA;@0.01<45;;_erase;_L;;_offset;;@;@10<$m=$(*,57.295779,$(+,$(getvar,LASTANGLE),1.57079));;_offset;;@10<$m=$(*,57.295779,$(-,$(getvar,LASTANGLE),1.57079));@10<$m=$(*,57.295779,$(-,$(getvar,LASTANGLE),1.57079));; Attention au COPIER-COLLER, il faut tout mettre sur une seule ligne derrière une ICONE... Christian Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)
didier Posté(e) le 20 juin 2022 Posté(e) le 20 juin 2022 Bonjour @rebcao Ce n'est pas vraiment hors-sujet. Je reste admiratif devant ces macros à rallonge. Je n'ai pas testé ce que tu as livré, mais je te crois sur parole, Entre parenthèses, j'aimerais rassurer les gens, le lisp n'est pas indigeste ! Bravo. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
willy95 Posté(e) le 22 juin 2022 Auteur Posté(e) le 22 juin 2022 Et si je peu abusé un peu plus sur ce sujet et bien que j'ai testé sans résultat, peut-on mettre les deux lignes "décalés" dans le claque courant plutôt que dans le même calque que celui de l'objet décalé ? Merci par avance
(gile) Posté(e) le 22 juin 2022 Posté(e) le 22 juin 2022 (defun c:TAB (/ dis ent) (vl-load-com) (if (setq dis (getdist (strcat "\nLargeur totale du Tableau <" (rtos (getvar "OFFSETDIST")) ">: " ) ) ) (setvar "OFFSETDIST" dis) (setq dis (getvar "OFFSETDIST")) ) (if (setq ent (car (entsel "\nChoix de l'Axe : "))) (progn (setq ent (vlax-ename->vla-object ent) clayer (getvar 'clayer) ) (foreach obj (vlax-safearray->list (vlax-variant-value (vla-Offset ent (* 0.5 dis)) ) ) (vla-put-Layer obj clayer) ) (foreach obj (vlax-safearray->list (vlax-variant-value (vla-Offset ent (* -0.5 dis)) ) ) (vla-put-Layer obj clayer) ) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
willy95 Posté(e) le 22 juin 2022 Auteur Posté(e) le 22 juin 2022 Merci beaucoup Gile, effectivement il va falloir que je buche vraiment sur le VLA.
DenisHen Posté(e) le 4 août 2022 Posté(e) le 4 août 2022 Bonjour à la communauté. Ce sujet m'a inspiré autre chose en restant dans le sujet. Tracer deux parallèles en dessinant un axe. Voici ce que j'ai écris (grâce à vous bien sur) : ;;; ******************************************************* (defun c:DessMur (/ doc PtA PtB) (setq EpMur (vlax-ldata-get "DenisH" "EpMur" 20)) (princ "\nDessinez l'axe du mur :") (command "_.pline" (while (not (zerop (getvar "cmdactive"))) (command pause))) (DoubleDecalage EpMur) (princ) ) ;_ Fin de defun ;;; ******************************************************* (defun DoubleDecalage (Dist / ent) (setq ent (vlax-ename->vla-object (entlast))) (vla-Offset ent (* 0.5 Dist)) (vla-Offset ent (* -0.5 Dist)) (princ) ) ;_ Fin de defun Bien à toi la communauté. Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Luna Posté(e) le 4 août 2022 Posté(e) le 4 août 2022 Coucou @DenisHen, Petite remarque concernant ton code (setq EpMur (vlax-ldata-get "DenisH" "EpMur" 20)) Tu as confondu (vlax-ldata-put "DenisH" "EpMur" 20) et (vlax-ldata-get "DenisH" "EpMur") Dans le code ci-dessus, étant donné que tu redéfinies la valeur à 20 de manière forcée, je ne vois pas bien l'intérêt de passer par une ldata, alors que (setq EpMur 20) aurait strictement le même effet, sans rajouter une donnée étendue à ton dessin. Personnellement je pense qu'il est préférable de faire plutôt ceci (si tu veux conserver l'utilisation des ldata) : ((lambda (/ EpMur) (or (setq EpMur (getreal (strcat "\nDéfinir la distance entre les axes <" (rtos (cond ((vlax-ldata-get "DenisH" "EpMur")) (20))) "> : "))) (setq EpMur (cond (EpMur) (20))) ) (vlax-ldata-put "DenisH" "EpMur" EpMur))) Bisous, Luna
DenisHen Posté(e) le 4 août 2022 Posté(e) le 4 août 2022 Coucou @Luna, et merci pour tes remarques, je n'avais pas fais attention à mon (vlax-ldata. J'aurais du effectivement demander à l'utilisateur cette valeur et la stocker dans un vlax-ldata. Oui, j'utilise très souvent le stockage de valeur via les vlax-ldata. Déjà parceque c'est la seule méthode que j'ai trouvé entre deux sessions AutoCAD. Mais je vais peut-être t'apprendre quelque chose : (setq EpMur (vlax-ldata-get "DenisH" "EpMur" 20)) Donnera EpMur=20 si il n'y a rien dans le vlax-ldata. Si j'ai raison, je suis super content de te renvoyer la balle, après tout ce que tu m'as appris, et aidé... Bien à toi. Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Luna Posté(e) le 5 août 2022 Posté(e) le 5 août 2022 En effet my bad, je ne connaissais pas cet argument facultatif [default-data] pour cette fonction ! 😉 en revanche, juste une petite correction tout de même Il y a 13 heures, DenisHen a dit : Oui, j'utilise très souvent le stockage de valeur via les vlax-ldata. Déjà parceque c'est la seule méthode que j'ai trouvé entre deux sessions AutoCAD. C'est vrai à condition que tu restes dans le même DWG. Car tu n'auras pas de conservation de la valeur entre tes différents DWG. Donc après tout dépend comment tu désires faire les choses, si tu veux que la valeur soit conservée indépendamment du DWG (donc valeur partagée sur l'ensemble de tes fichiers), tu peux utiliser (setenv) et (getenv) ; tandis que si tu veux que la valeur soit conservée en fonction du DWG (donc valeur pouvant être différente en fonction du dessin), tu peux en effet utiliser (vlax-ldata-put) et (vlax-ldata-get). Fais juste attention avec (setenv) car AutoCAD n'a pas prévu la fonction (delenv) (mais fort heureusement j'avais trouvé cette fonction de Patrick_35 sur les forums AutoDesk) : (defun delenv (env / key) (setq key (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\FixedProfile\\General")) (if (vl-registry-read key env) (vl-registry-delete key env) ) ) Je m'en vais simplifier l'écriture de mes programmes avec ces nouvelles connaissances du coup ! Bisous, Luna
DenisHen Posté(e) le 5 août 2022 Posté(e) le 5 août 2022 Coucou @Luna. Merci pour ces précisions, j'en prend bien note... Mais effectivement, mes valeurs ne sont stockées que pour un et un seul dessin. Mais je garde (setenv) et (getenv) en tête, au cas où... Encore merci à toi. Bisous. Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
DenisHen Posté(e) le 10 août 2022 Posté(e) le 10 août 2022 Je viens de relire le sujet. Donc, setenv se stock dans la base de registre ? Curieux... C'est donc accessible entre plusieurs cessions AutoCAD, même après redémarrage de Windows ? Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Luna Posté(e) le 11 août 2022 Posté(e) le 11 août 2022 Exactement 😉 C'est enregistré dans le registre Windows, et non AutoCAD, donc c'est très pratique dans certains scénario où tu as besoin de conserver la valeur par défaut une bonne fois pour toute ^^ Bisous, Luna
DenisHen Posté(e) le 23 août 2022 Posté(e) le 23 août 2022 Donc, je viens de penser à un trus, on peut stocker de vrais variables ? Qui éviterait d'avoir un gabarit "pollué" pas des calques ou des blocs... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
DenisHen Posté(e) le 24 août 2022 Posté(e) le 24 août 2022 Je pensais à des variables "connues" d'AutoCAD, comme OSNAP, ou OSMODE... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Curlygoth Posté(e) le 24 août 2022 Posté(e) le 24 août 2022 oui tu peux récupérer les valeurs des variables connues d'autocad et heureusement ^^ Exemple : avant ma procédure je sauvegarde les valeurs de certains variables que je vais modifier pour les remettre ensuite à leur état d'origine Mon site Web (en cours de construction) : Site DA-CODE de @didier
Luna Posté(e) le 24 août 2022 Posté(e) le 24 août 2022 Coucou @DenisHen, J'avoue être perplexe...parles-tu des fonctions (getvar) et (setvar) permettant respectivement de récupérer la valeur d'une variable AutoCAD ou de définir une nouvelle valeur pour une variable AutoCAD (si elle n'est pas en lecture seule). Ou bien parles-tu d'autre chose ? Car pourquoi "stocker" des variables d'AutoCAD alors qu'AutoCAD le fait déjà pour toi...? Qu'entends-tu exactement par "stocker des variables" ? Bisous, Luna
DenisHen Posté(e) le 24 août 2022 Posté(e) le 24 août 2022 Coucou @Luna. Je pense, peut-être à tord, que certaines variables sont enregistrées dans le profil utilisateur d'AutoCAD. Et le fait de pouvoir stocker des variables avec une valeur commune à tous les utilisateurs serait intéressant, je pense. Mais c'était une question juste pour savoir si c'était possible, car actuellement, j'utilise un LiSP qui réaffecte certaines variables. En tous cas, merci pour ta réponse. Denis. Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Luna Posté(e) le 24 août 2022 Posté(e) le 24 août 2022 Ben en théorie, les variables enregistrées dans le profil utilisateur sont définie ainsi parce que chacun ne travaille pas de la même façon ! Pour l'exemple, OSMODE et OSNAP sont des variables que je modifie uniquement de manière locale pour le fonctionnement d'un programme et où je réaffecte leur valeur initiale à la fin, parce que je ne vais aucunement imposer à une autre personne que moi d'utiliser telle valeur d'OSMODE ! C'est pour respecter les méthodes de travail de chacun. Après évidemment, tu peux utiliser un fichier LISP pour réaffecter certaines variables à des valeurs par défaut mais dans ces cas-là, je passerai par une variable environnement servant de clé si on veut forcer l'utilisation des valeurs par défaut des variables ou si on laisse l'utilisateur gérer sa tambouille. Une variable environnement du genre VAROVERRIDE égale à 0 ou 1 avec un fichier LISP dans ce style-ci. (or (getenv "VAROVERRIDE") (setenv "VAROVERRIDE" "0") ) (if (= 1 (getenv "VAROVERRIDE")) (progn (setvar "OSMODE" 1) ... ) ) (defun c:VAROVERRIDE (/ vor val) (setq vor (getenv "VAROVERRIDE")) (initget "0 1") (or (setq val (getkword (strcat "\nSpécifier une nouvelle valeur pour VAROVERRIDE [0/1] <" vor "> : "))) (setq val vor) ) (setenv "VAROVERRIDE" val) ) Comme cela, si la personne refuse qu'on touche à ses variables, il lui suffit de mettre VAROVERRIDE = 0 et il n'y aura pas de soucis, sinon si elle préfère ne pas avoir à s'en occuper et utiliser plutôt les valeurs par défaut à l'ouverture du dessin (rien ne l'empêche de les modifier ensuite au cours de la session), elle met VAROVERRIDE = 1. Comme c'est des variables environnement, la valeur est enregistrée dans Windows donc si elle est conservée entre chaque dessin et sessions d'AutoCAD. Bisous, Luna
DenisHen Posté(e) le 24 août 2022 Posté(e) le 24 août 2022 Merci @Luna pour ton aide. Effectivement, je ne redonne toujours la valeur initiale des variables que je change pour les besoins de mes routines... Mais il y a des certaines variables qui sont et doivent restées communes à tous les utilisateurs (sur un même poste ou sur les autres du réseau. Merci encore, tu m'ouvres une porte sur d'autres perspectives... Bisous. Denis. Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant