Aller au contenu

autocad : comment faire un \"reseau\" autour d\'une ellipse (par ex)


nardoz

Messages recommandés

Bonjour à tous,

Je me pose la question de savoir comment on peut faire l'équivalent d'un réseau autour d'un forme géométrique qui ne soit ne rectangulaire ni polaire : une ellipse par exemple.

Typiquement, cela pourrait servir à répartir uniformément des chaises autour d'une table elliptique.

Il y a bien la commande "diviser" avec l'option "bloc" (on aura pris soin de donner le point d'insertion de la "chaise" au centre de l'arrête avant de l'assise) puis l'option "aligner", mais la répartition des "chaises" se fait bien souvent à l'intérieur de l'ellipse !

Quelqu'un a t'il une solution rapide à me proposer ?

Lien vers le commentaire
Partager sur d’autres sites

Invité ingoenius

moi j'avait fait ce lisp si peut te servir

 

 
(defun C:ABLOC ()
 (setq nome (car (entsel "\nSelectionne le  Paarcours")))
 
(setq DTIPO (entget nome))
(setq TIPO (cdr (assoc 0 DTIPO)))		;determina cosé il tipo di oggetto

  (cond
   ((= TIPO "ARC")				;se é un arco

(command "_pedit" nome "o" "" "" )		;se non é un polilinea converte e poi procede
(setq nomeD (entget (entlast)))			;ultimo oggetto creato 
(setq nome (cdr (assoc -1  nomeD)))		;nuovo nome entità

(setq BLOCCO (car (entsel "\nSelect 1 block ")))
(setq DatiB (entget BLOCCO))			;estrae tutte le informazioni del blocco
(setq NBLOC (cdr (assoc 2 DatiB)))		;recupera il nome del blocco selezionato
(setq SPAZIO (getreal "\nInsert distance to blocks\n"))
(setq dati (entget nome))			;dati polilinea
(command "_area" "_object" nome)
(setq lung  (getvar "perimeter"))
(setq N (+ 1 (fix (/ lung SPAZIO))))		;calcola il numero delle copie da fare
(command "_divide" nome "B"  NBLOC "_Y" N "")
);fine cond 1

((= TIPO "CIRCLE");se é un cerchio
(setq BLOCCO (car (entsel "\nSelect 1 block ")))
(setq DatiB (entget BLOCCO));estrae tutte le informazioni del blocco
(setq NBLOC (cdr (assoc 2 DatiB)));recupera il nome del blocco selezionato
(setq SPAZIO (getreal "\nInsert distance to blocks\n"))
(setq dati (entget nome));dati polilinea
(command "_area" "_object" nome)
(setq lung  (getvar "perimeter"))
(setq N (+ 1 (fix (/ lung SPAZIO))));calcola il numero delle copie da fare
(command "_divide" nome "B"  NBLOC "_Y" N "")
);fine cond 2


((= TIPO "ELLIPSE");se é un'ellisse
(setq BLOCCO (car (entsel "\nSelect 1 block ")))
(setq DatiB (entget BLOCCO));estrae tutte le informazioni del blocco
(setq NBLOC (cdr (assoc 2 DatiB)));recupera il nome del blocco selezionato
(setq SPAZIO (getreal "\nInsert distance to blocks\n"))
(setq dati (entget nome));dati polilinea
(command "_area" "_object" nome)
(setq lung  (getvar "perimeter"))
(setq N (+ 1 (fix (/ lung SPAZIO))));calcola il numero delle copie da fare
(command "_divide" nome "B"  NBLOC "o" N "")
);fine cond 3
   

((= TIPO "LWPOLYLINE");se é una polilinea
(setq BLOCCO (car (entsel "\nSelect 1 block ")))
(setq DatiB (entget BLOCCO));estrae tutte le informazioni del blocco
(setq NBLOC (cdr (assoc 2 DatiB)));recupera il nome del blocco selezionato
(setq SPAZIO (getreal "\nInsert distance to blocks\n"))
(setq dati (entget nome));dati polilinea
(command "_area" "_object" nome)
(setq lung  (getvar "perimeter"))
(setq N (+ 1 (fix (/ lung SPAZIO))));calcola il numero delle copie da fare
(command "_divide" nome "B"  NBLOC "_Y" N "")
);fine cond 4


((= TIPO "SPLINE");se é una spline
(setq BLOCCO (car (entsel "\nSelect 1 block ")))
(setq DatiB (entget BLOCCO));estrae tutte le informazioni del blocco
(setq NBLOC (cdr (assoc 2 DatiB)));recupera il nome del blocco selezionato
(setq SPAZIO (getreal "\nInsert distance to blocks\n"))
(setq dati (entget nome));dati polilinea
(command "_area" "_object" nome)
(setq lung  (getvar "perimeter"))
(setq N (+ 1 (fix (/ lung SPAZIO))));calcola il numero delle copie da fare
(command "_divide" nome "B"  NBLOC "_Y" N "")
);fine cond 5   

   ((= TIPO "LINE");se é una line

(command "_pedit" nome "o" "" "" );se non é un polilinea converte e poi procede
(setq nomeD (entget (entlast)));dati ultima selezione 
(setq nome (cdr (assoc -1  nomeD)));nuovo nome entità

(setq BLOCCO (car (entsel "\nSelect 1 block ")))
(setq DatiB (entget BLOCCO));estrae tutte le informazioni del blocco
(setq NBLOC (cdr (assoc 2 DatiB)));recupera il nome del blocco selezionato
(setq SPAZIO (getreal "\nInsert distance to blocks\n"))
(setq dati (entget nome));dati polilinea
(command "_area" "_object" nome)
(setq lung  (getvar "perimeter"))
(setq N (+ 1 (fix (/ lung SPAZIO))));calcola il numero delle copie da fare
(command "_divide" nome "B"  NBLOC "_Y" N "")
);fine cond 6
(t nil)
   );fine delle cond
   
   );fine defun

;--------------------------------------------------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------------------------------------------------------

;inserisce dei blocchi all'interno di una zona selezionata
;calcolando quante linee e quante colonne inserire 

(defun C:QBLOC (/ OSN BLOCCO DatiB NBLOC NEWBLOC P1 P2
   x1 x2 Disty Distx Ecx Ecy COL LIN OB2 QUANTI message);variabili locali

(SETQ OSN (GETVAR "OSMODE"));salva gli snap
 (SETVAR "OSMODE" 0) ;toglie gli snap
 
(setq BLOCCO (car (entsel "\nSelect 1 block ")))
(setq DatiB (entget BLOCCO));estrae tutte le informazioni del blocco
(setq NBLOC (cdr (assoc 2 DatiB)));recupera il nome del blocco selezionato
(setq NEWBL NBLOC)

 
 (setq P1 (getpoint "\nseleziona angolo in basso a sinistra"))
 (setq P2 (getpoint "\nseleziona angolo alto destra "))
 (setq x1 (car p1))
 (setq x2 (car P2))
 (setq Distx (- x2 x1))
 (setq y1 (cadr P1))
 (setq y2 (cadr P2))
 (setq Disty (- y2 y1))
 ;(setq X (fix Distx))
 ;(setq Y (fix Disty))
(setq EcX (getreal "\n DISTANZA ORIZZONTALE X?\n"))
(setq Ecy (getreal "\n DISTANZA VERTICALE Y? \n"))
(setq COL (1+(fix (/ Distx  ECx))))
(setq LIN (1+ (fix (/ Disty  ECy))))

(setq QUANTI (itoa (* col lin)));stringa per il messaggio finale 

(command "_insert" NEWBL P1 "" "" "");inserisce il blocco in P1
(setq OB2 (entlast))

(command "_array" OB2 "" "_R" LIN COL  Ecy Ecx "")
(SETVAR "OSMODE" OSN) ;rimette gli snap salvati prima

 (setq message (strcat "inseriti " QUANTI " blocchi  " NEWBL));unisco le stringhe
 (alert message);message box col messaggio

 ;(alert 
 (princ)

 )

;--------------------------------------------------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------------------------------------------------------

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

La commande Diviser me semble la solution la plus simple.

Si le bloc se met du mauvais côté, tu peux:

 

- éditer le bloc, et dans l'éditeur de bloc faire un miroir/une rotation de la géométrie autour du point de base (si le bloc n'est pas utilisé ailleurs dans le dessin, sinon tu peux toujours le dupliquer sous un autre nom)

 

- ou mieux, sélectionner tes blocs après insertion, et dans la palette Propriétés leur donner une échelle négative en X, Y ou Z selon le cas (si la case "mettre à l'échelle uniformément" n'était pas cochée lors de la création du bloc, mais ça peut se modifier dans l'éditeur de blocs...)

 

- ou encore mieux, transformer tes blocs en blocs dynamiques en leur ajoutant une action d'inversion ou de rotation.

Il te suffit ensuite de les sélectionner et de changer leur état d'inversion dans la palette Propriétés, ou de donner à ton paramètre d'angle une valeur de 180° au lieu de 0°.

 

 

 

[Edité le 1/7/2010 par bryce]

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é