Aller au contenu

Décalé à gauche et droite en 1 seul clic


willy95

Messages recommandés

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 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 @)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

(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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

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)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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)

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité