Aller au contenu

Random Block Rotate Autolisp


Messages recommandés

Invité ingoenius
Posté(e)

Je voudrait cree un script , qui permet aprés selection de plusieur bloc, d'effectuer au choix

rotation

scale ou

Move

mais avec un parametre de randomisation , avec 2 variables min et max

 

Je sais pas par quel bout commencer, si vous avez des conseils ;-)

Invité ingoenius
Posté(e)

Enfin J'ai commencé et pour l'instant ca fonctionne, par contre je voudrais savoir comment contrandre mon numero random generé pour etre a l'interieur des 2 valeur min et max a decider

 

ici le script elaboré a present



(defun rnd ()
 (if (not seed)
   (setq seed (getvar "DATE"))
 )
 (setq modulus    65536
       multiplier 25173
       increment  13849
       seed  (rem (+ (* multiplier seed) increment) modulus)
       random     (/ seed modulus)
 )

(princ(setq rand (fix(* 200 random))))
;print rand
)


(defun c:RRB ();RandomRotateBlocks
 
(setq sel (ssget '((0 . "INSERT"))));set selzione blocchi
(setq n (sslength sel))
(setq INDEX 0)

(repeat n
     (setq ent (ssname sel INDEX))
     (SETQ PT1 (cdr (assoc 10 (entget ent))))
     (rnd)
     (setq Ang rand)
     (command "_rotate" ent "" pt1 ang)
     (setq n (1+ n))
     (setq INDEX (1+ INDEX))
)
)


(defun c:RSB ();RandomScaleBlocks
 
(setq sel (ssget '((0 . "INSERT"))));set selzione blocchi
(setq n (sslength sel))
(setq INDEX 0)
(setq Smin 0.3)
(setq Smax 1.5)	  

(repeat n
     (setq ent (ssname sel INDEX))
     (SETQ PT1 (cdr (assoc 10 (entget ent))))
     (rnd)
     (setq Scale (/ rand 100.0))
     (command "_scale" ent "" pt1 Scale)
     (setq n (1+ n))
     (setq INDEX (1+ INDEX))
)
)

Posté(e)

Salut,

 

Voilà les routines que j'utilise :

 

;;; Retourne un nombre "pseudo-aléatoire" entre 0 et 1
(defun randomGen ()
 (or *seed* (setq *seed* (getvar "DATE")))
 (setq *seed* (rem (1+ (* 1664525 *seed*)) 4294967296.0))
 (/ *seed* 4294967296.0)
)

;;; Retourne un nombre "pseudo-aléatoire" entre mini et maxi
(defun boundRandom (mini maxi)
 (+ mini (* (- maxi mini) (randomGen)))
)

;; Retourne un nombre "pseudo-aléatoire" entre mini et maxi
;; arrondi au pas spécifié
(defun stepRandom (mini maxi step)
 (+ mini (round (* (- maxi mini) (randomGen)) step))
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Invité ingoenius
Posté(e)

Merci Gile ;-)

J'ai pu completer, ici ma routine (avec l'utilisation de tes codes random ;-))

RandomScaleBlock

 

 

 

(defun randomGen ()
 (or *seed* (setq *seed* (getvar "DATE")))
 (setq *seed* (rem (1+ (* 1664525 *seed*)) 4294967296.0))
 (/ *seed* 4294967296.0)
)
;;; Retourne un nombre "pseudo-aléatoire" entre mini et maxi
(defun boundRandom (mini maxi)
 (+ mini (* (- maxi mini) (randomGen)))
)
;; Retourne un nombre "pseudo-aléatoire" entre mini et maxi
;; arrondi au pas spécifié
(defun stepRandom (mini maxi step)
 (+ mini (round (* (- maxi mini) (randomGen)) step))
)

(defun c:RSB ();Random_Scale_Block
 
(setq sel (ssget '((0 . "INSERT"))));set selzione blocchi
(setq n (sslength sel))
(setq INDEX 0)
(setq Smin (getint "\nEnter Min Scale Factor "));Facteur Echelle %
(setq Smax (getint "\nEnter Max Scale Factor "));Facteur Echelle %

(repeat n
 	(setq ent (ssname sel INDEX))
(setq Scale(fix (boundRandom Smin Smax)))
(setq Scale2 (/  Scale 100.0 ))

     (command "_scale" ent "" pt1 Scale2)
     (setq n (1+ n))
     (setq INDEX (1+ INDEX))
)
)

Invité ingoenius
Posté(e)

Maintenat l'etape successive ideale serait:

creer une routine qui:

liste le nom des blocs dans une selction (selection 1)

 

remplace toujour de facon random

un'autre selection de blocs identiques (selection 2)

par une suite aleatoire des blocs dans la liste

 

avec variations de Rotation Echelle (min max) et

variation random sur couleur R V B

 

 

Ensuite si serit possible de faire generer de facon (Airbrush en deplacant la souris le blocs)

Alors selait genial ;-)

Invité ingoenius
Posté(e)

- le point de base de la mise à l'échelle pt1 n'est défini nulle part :unsure:

- la ligne suivante ne sert à rien a priori :

(setq n (1+ n))

;)

Tu as raison, c est que j ai recycles de vieux script, et parfois evec les copier coller on oublie des choses :-)

Le point pt1 de mise a l echelle doit etre le point d i sertion du bloc, je vais rectifier cela lundi

merci pour les conseils :-)

Invité ingoenius
Posté(e)

Ici 3 Routines completes :P

 

RRB RandomRotateBlock

effectue une rotation random aux blocks selectionnes

 

RSB RandomScaleBLock

effectue une scale random (entre 2 valeurs min et max )

ex min 40 max 130

l'echelle serà entre 40% et 130%

 

RREPL RandomReplaceBlocks

un inseres d'abord une serie de blocks, qui seront la source

et ensuite les blocks a substituer peuvent etre dejà dans le dessin ou inserer avant le script

 

Le script demande une premiere selection (les blocks source)

ensuite la seconde selection serà celle des blocks a remplacer

 

Les script remplacera de facon aleatoire les blocks de la deuxieme selection avec ceux de la premiere

 

 

;-------------------------------------------------------------------------------------------------------------------
;;; Retourne un nombre "pseudo-aléatoire" entre 0 et 1
(defun randomGen ()
 (or *seed* (setq *seed* (getvar "DATE")))
 (setq *seed* (rem (1+ (* 1664525 *seed*)) 4294967296.0))
 (/ *seed* 4294967296.0)
)

;;; Retourne un nombre "pseudo-aléatoire" entre mini et maxi
(defun boundRandom (mini maxi)
 (+ mini (* (- maxi mini) (randomGen)))
)

;; Retourne un nombre "pseudo-aléatoire" entre mini et maxi
;; arrondi au pas spécifié
(defun stepRandom (mini maxi step)
 (+ mini (round (* (- maxi mini) (randomGen)) step))
)
;-------------------------------------------------------------------------------------------------------------------
(defun rnd ()
 (if (not seed)
   (setq seed (getvar "DATE"))
 )
 (setq modulus    65536
       multiplier 25173
       increment  13849
       seed  (rem (+ (* multiplier seed) increment) modulus)
       random     (/ seed modulus)
 )

(princ(setq rand (fix(* 200 random))))
;print rand
)
;-------------------------------------------------------------------------------------------------------------------
(defun c:RRB ();RandomRotateBlock
 
(setq sel (ssget '((0 . "INSERT"))));set selzione blocchi
(setq n (sslength sel))
(setq INDEX 0)

(repeat n
     (setq ent (ssname sel INDEX))
     (SETQ PT1 (cdr (assoc 10 (entget ent))))
     (rnd)
     (setq Ang rand)
     (command "_rotate" ent "" pt1 ang)
     (setq n (1+ n))
     (setq INDEX (1+ INDEX))
)
)
;-------------------------------------------------------------------------------------------------------------------

(defun c:RSB ();RandomScaleBlock
 
(setq sel (ssget '((0 . "INSERT"))));set selzione blocchi
(setq n (sslength sel))
(setq INDEX 0)
(setq Smin (getint "\nEnter Min Scale Factor "));percentuale
(setq Smax (getint "\nEnter Max Scale Factor "));percentuale

(repeat n
 	(setq ent (ssname sel INDEX))
 	(SETQ PT1 (cdr (assoc 10 (entget ent))))
	;(SETQ PT1 (cdr (assoc 10 (entget ent))))
;(SETQ ScX (cdr (assoc 41 (entget ent))))
;(SETQ ScX (cdr (assoc 42 (entget ent))))
;(SETQ ScX (cdr (assoc 43 (entget ent))))


 (setq Scale(fix (boundRandom Smin Smax)))
(setq Scale2 (/  Scale 100.0 ))

 
     (command "_scale" ent "" pt1 Scale2)
     ;(setq n (1+ n))
     (setq INDEX (1+ INDEX))
)
)
;-------------------------------------------------------------------------------------------------------------------
(defun c:RRepl ();Random Replace Bloks
(setq INDEX 0)
(prompt "select the source list Blocks: ")  
(setq sel (ssget '((0 . "INSERT"))));set selzione blocchi
(setq n (sslength sel))
(setq Smin 0);percentuale
(setq Smax n);percentuale

(setq lb (list nil));lista vuota
	(repeat n
(setq ent (ssname sel INDEX))
(SETQ Nom_Bloc (cdr (assoc 2 (entget ent))));nome Blocco
(setq lb (append  lb( list Nom_Bloc) ));append nome a lista 
(setq INDEX (1+ INDEX))
	)
 
(setq lb (cdr lb)) ; elimination premier nil de la liste 

;fine creazione lista

(prompt "select block to replace: ")

(setq sel2 (ssget '((0 . "INSERT"))));set selection blocks a substituer
(setq n2 (sslength sel2))
(setq I 0)
(repeat n2

(setq NLista (fix (boundRandom Smin Smax)))       ;prend  un block au hazard dans la liste lb
(setq NEWBL (nth Nlista lb))
(setq BL1 (entget (ssname sel2 I)))
(setq NWNM (cons 2 NEWBL))
(setq OLD (assoc 2 BL1))
(setq ODNM (cdr OLD))
(entmod (subst NWNM OLD BL1))
(setq I (1+ I))	  
 )
)

Invité ingoenius
Posté(e)

Maintenat que j'ai fait le debut

j'ai besoin d'aide pour melanger tout ca, en une seule routine

 

1 Je selectionne une serie de blocks

2 A chaque click le script ensére un de ces block au

hazard avec

rotation aleatoire et echelle aleatoire entre min et max

 

 

merci a vous pour l'aide ;-)

 

Cest bon j'ai ouvert un autre Post pour cela

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é