Aller au contenu

Copie et rotation mais en boucle


Messages recommandés

Posté(e)

Bonjour,

 

j'aime bien cette routine qui permet de copier et tourner un objet dans la meme commande mais je trouve dommage que une fois la rotation effectuée la commande s'arrete. Est-il possible une fois la rotation effectuée, de pouvoir à nouveau coller l'objet puis de le tourner etc... sans fin jusqu'a ce qu'on appuie sur echap.

De meme, pourrait t'on des le debut de la commande, demander le point de base puis un point de reference pour ensuite lors de la rotation, tourner l'objet selon ses deux points ?

Pour resumer ma demande, les etapes de la commande seraient donc:

lancement de la commande

>selectionner objet

>choisir point de base

>choisir point de référence

>choisir point de collage du point de base

>rotation de l'objet en cliquant sur l'endroit où l'on veut coller le point de reference

>retour à l'étape point de collage du point de base

etc.... (commande illimitée)

ECHAP pour sortir de la commande

 

Voici la routine de base:

 

 (defun c:cpr(/ cmd der js pt)
(setq cmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
(vl-cmdf "_.undo" "_group")
(and (setq js (ssget))
(setq pt (getpoint "\nPoint de Base : "))
(setq der (entlast))
(vl-cmdf "_.copy" js "" pt pause)
(setq js (ssadd))
(progn
(while (setq der (entnext der))
(ssadd der js)
)
(princ "\nAngle de Rotation : ")
(vl-cmdf "_.rotate" js "" (getvar "lastpoint") pause)
)
)
(vl-cmdf "_.undo" "_end")
(setvar "cmdecho" cmd)
(princ)
)



 

[Edité le 27/1/2009 par brunopub333]

 

[Edité le 27/1/2009 par brunopub333]

Posté(e)

Bonjour,

 

Comme ceci ?

 

(defun c:cpr(/ cmd der js js2 pt)
 (setq cmd (getvar "cmdecho"))
 (setvar "cmdecho" 0)
 (vl-cmdf "_.undo" "_group")
 (and (setq js (ssget))
   (setq pt (getpoint "\nPoint de Base : "))
   (setq der (entlast))
   (while (vl-cmdf "_.copy" js "" pt pause)
     (setq js2 (ssadd))
     (while (setq der (entnext der))
       (ssadd der js2)
     )
     (princ "\nAngle de Rotation : ")
     (vl-cmdf "_.rotate" js2 "" (getvar "lastpoint") pause)
     (setq der (entlast))
   )
 )
 (vl-cmdf "_.undo" "_end")
 (setvar "cmdecho" cmd)
 (princ)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Bonjour

au lieu de la ligne,

 (vl-cmdf "_.rotate" js2 "" (getvar "lastpoint") pause)

je vous propose

 (vl-cmdf "_.rotate" js2 "" (getvar "lastpoint") "_r" "@" pause pause)

qui permet de choisir un angle de référence bien précis.

 

Admettons maintenant qu'on ait une polyligne de 30 sommet,

serait il possible de répéter cette boucle 30 fois ?

Je m'explique, on choisit la polyligne avec comme point de base le premier sommet, on oriente l'objet avec référence avec le second sommet de la polyligne puis on utilise comme point de base suivant le second point de la polyligne et ainsi de suite,.......jusqu'au 30eme sommet ou le lisp s'arrête.

 

C'est peut être un peut de charabia....

Bonne journée.

John.

Posté(e)

Super pour la rapidité :D

Apres avoir compilées les modifs de BONUSCAD et ensuite de CHRIS_MTP cela donne exactement ce que je cherchais. C'est super pour placer du mobilier par exemple comme je fais en ce moment des amenagements de bureaux.

Donc au final cela donne ceci:

 



(defun c:cpr(/ cmd der js js2 pt)
(setq cmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
(vl-cmdf "_.undo" "_group")
(and (setq js (ssget))
(setq pt (getpoint "\nPoint de Base : "))
(setq der (entlast))
(while (vl-cmdf "_.copy" js "" pt pause)
(setq js2 (ssadd))
(while (setq der (entnext der))
(ssadd der js2)
)
(princ "\nAngle de Rotation : ")
(vl-cmdf "_.rotate" js2 "" (getvar "lastpoint") "_r" "@" pause pause)
(setq der (entlast))
)
)
(vl-cmdf "_.undo" "_end")
(setvar "cmdecho" cmd)
(princ)
) 



 

 

Merci à tous !

Posté(e)

Est ce qu'on pourrait apporter le même genre de modifs à la fonction ROTATION ?

Je m'explique: j'utilise beaucoup la fonction rotation avec la plupart du temps l'option "Référence". J'aimerais donc bien dès le départ, choisir le point de base puis le point de reference de depart et enfin le point de reference d'arrivee. Donc sans avoir à taper R dans la commande puis à recliquer de nouveau sur le point de base.

 

En tous cas je suis epatée par votre connaissance de la programmation de script car pour moi c'est du charabia quand je regarde les lignes de codes. J'aimerais bien apprendreà programmer aussi pour mes besoins et pour apporter mon aide à mes collegues et aux gens du forum. Comment puis-je m'initier ? Existe t-il un livre ?

 

@+ !

 

Bruno

Posté(e)

Est ce qu'on pourrait apporter le même genre de modifs à la fonction ROTATION ?

 

En respectant ta 1ere philosophie (sortir de la boucle par "ESC")

(defun c:cpr(/ cmd der js js2 pt alpha)
 (setq cmd (getvar "cmdecho"))
 (setvar "cmdecho" 0)
 (vl-cmdf "_.undo" "_group")
 (and (setq js (ssget))
   (setq pt (getpoint "\nPoint de Base: "))
   (setq alpha (getangle pt "\nAngle de référence: "))
   (setq der (entlast))
   (princ "\nNouvel emplacement: ")
   (while (vl-cmdf "_.copy" js "" pt pause)
     (setq js2 (ssadd))
     (while (setq der (entnext der))
       (ssadd der js2)
     )
     (princ "\nAngle de Rotation : ")
     (initget 1)
     (vl-cmdf "_.rotate" js2 "" (getvar "lastpoint") "_r" "_none" "@"
       "_none" (polar (getvar "lastpoint")  alpha 100.0)
       "_none" (polar (getvar "lastpoint") (angle (getvar "lastpoint") 
         (getpoint (getvar "lastpoint") "\nNouvel angle: ")) 100.0)
     )
     (setq der (entlast))
     (princ "\nNouvel emplacement: ")
   )
 )
 (vl-cmdf "_.undo" "_end")
 (setvar "cmdecho" cmd)
 (princ)
)

 

Le second identique, mais plus propre (contrôle les entrées utilisateurs "initget" et sort de la boucle par une entée nulle pour lors déplacement de la copie)

 

(defun c:cpr(/ cmd der js js2 pt nw_pt alpha)
 (setq cmd (getvar "cmdecho"))
 (setvar "cmdecho" 0)
 (vl-cmdf "_.undo" "_group")
 (cond
   ((setq js (ssget))
   (initget 1)
   (setq pt (getpoint "\nPoint de Base: "))
   (setq alpha (getangle pt "\nAngle de référence[b]<[/b]0.0[b]>[/b]: "))
   (if (not alpha) (setq alpha 0.0))
   (setq der (entlast))
   (while (setq nw_pt (getpoint pt "\nNouvel emplacement: "))
     (vl-cmdf "_.copy" js "" pt "_none" nw_pt)
     (setq js2 (ssadd))
     (while (setq der (entnext der))
       (ssadd der js2)
     )
     (initget 1)
     (vl-cmdf "_.rotate" js2 ""
       "_none" nw_pt
       "_r"
       "_none" nw_pt
       "_none" (polar nw_pt alpha 100.0)
       "_none" (polar nw_pt (angle nw_pt (getpoint nw_pt "\nNouvel angle: ")) 100.0)
     )
     (setq der (entlast))
   )
 ))
 (vl-cmdf "_.undo" "_end")
 (setvar "cmdecho" cmd)
 (princ)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

J'ai réussi à pondre çà pour avoir le point de base qui se place automatiquement à la suite des sommets de la polyligne mais il ya un pb. J'ai pu faire la liste des sommets.

 

Au départ, je sélectionne tous les objets dont je veux apliquer la copie et rotation en boucle, ensuite je sélectionne la polyligne projet, celle pour faire la liste des sommets et incrémenter le point de base. La copie se passe bien mais la rotation non car elle ne concerne que la polyligne projet et non pas les objets sélectionnés au début.

 

 (defun c:crrotmult (/ i bdent pol ptlst cmd der js js2 pt)
(setq cmd (getvar "cmdecho"))
(setvar "cmdecho" 0)
(vl-cmdf "_.undo" "_group")
(and (setq js (ssget))
(setq pol (car (entsel "\nCliquez la polyligne projet:")))
(setq bdent (entget pol))
(setq ptlst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) bdent)))
(setq i 0)
(repeat (length ptlst)
(setq pt (nth i ptlst))
(setq der (entlast))
(vl-cmdf "_.copy" js "" pt pause)
(setq js2 (ssadd))
(setq der (entnext der))
(ssadd der js2)
(princ "\nAngle de Rotation : ")
(vl-cmdf "_.rotate" js2 "" (getvar "lastpoint") "_r" "@" pause pause)
(setq der (entlast))
(setq i (+ i 1))
)
)
(vl-cmdf "_.undo" "_end")
(setvar "cmdecho" cmd)
(princ)
) 

 

De plus, lorsque que la copie est faite, il faudrait que le point de base suiivant soit celui de la poly projet copié et non celui de la poly d'origine.

 

Merci par avance de votre aide.

John.

 

[Edité le 31/1/2009 par chris_mtp]

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é