Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

Pour mon 2ème lisp,

Le principe consiste a dessiner les points relevés d'une façade de batiment, en général les points brut se retrouve tous les un sur les autres sur une ligne (façade du batiment) puisque ils sont principalement différent en Z.

Pour çà, je selectionne (ssget) les points interessant de la façade et indique le sens de la façade par 2 pts, puis je transfert les z en y et dessine la ligne horizontal du batiment , jusque là j'y arrive, mais je n'arrive pas à aligner mon dessin parallele à l'écran, car il se trouve que mon scu n'est pas forcément aligné à l'écran... j'ai essayé ttes sortes de manière mais rien à faire, je flanche...

 

Question :

1 - Comment aligner mon dessin a l'écran ?

2 - dessiner un cadre autour de mon dessin ?

 

Merci à vous tous, Pierre.

 

Voici mon code qui fonctionne :

 

(defun c:test (/ som pt1 pt1x pt1xa pt1y pt2 pt2x pt2y pt3 sel n i nom coord ptx pty ptz pto ptn )
 
 	; RELEVE DES PTS ET TRANSFORMATION 2D
 	(initget 1)
(setq pt1 (getpoint "\n1er point : "))
 	(initget 1)
(setq pt2 (getpoint pt1 "\n2eme point : "))

 	; selection des points de facade
 	(setq sel (ssget (list (cons 2 "tcpoint"))))

   	(setq oldosmode (getvar "osmode"))
(setvar "osmode" 0)

; recup
 	(setq pt1x (car pt1) pt1y (cadr pt1) pt1z (caddr pt1))
 	(setq pt1 (list pt1x pt1y 0))
 	(setq pt2x (car pt2) pt2y (cadr pt2))
 	(setq pt2 (list pt2x pt2y 0))
 
 	;calcul du point aligné au X
 	(setq pt1xa (+ pt1x 10))
 	(setq pt3 (list pt1xa pt1y 0))
 
 	; rotation des points parallele au X
 	(command "_rotate" sel "" pt1 "_r" pt1 pt2 pt3)

; modif des points Y selon Z
(setq n (sslength sel))
(setq i 0)
(repeat n
  	(setq nom (ssname sel i))
	(setq coord (cdr (assoc 10 (entget nom))))
	(setq ptx (car coord) pty (cadr coord) ptz (caddr coord)) ; extraction coord du point d'origine
  
  	(setq deltaz (- pt1z ptz)) ; calcul le delta entre z et celui du refz
	(setq ptynew (- pt1y deltaz)) ; ajout du deltaz au y
	(setq ptn1 (list ptx ptynew ptz)) ; nouvelle coord du point
	(command "_move" nom "" coord ptn1) ; move le pt a son nouvelle emplacement
  
(setq i (1+ i))
)
 	; FIN DE LA BOUCLE
 
 	; dessine la ligne d'horizon par rapport à la façade
 	(setq dis (distance pt1 pt2))
   	(setq li (polar pt1 0 dis))
(command "_line" pt1 li "")
 
 	(setvar "osmode" oldosmode)
 (princ)
)

[Edité le 25/3/2007 par pierrevig]

 

[Edité le 25/3/2007 par pierrevig]

Posté(e)

car il se trouve que mon scu n'est pas forcément aligné à l'écran...

 

regarde la commande REPERE (_plan). Elle te permet de tourner la vue selon le scu courant.

 

(command "_plan" "_c")

 

Regarde aussi la variable UCSFOLLOW

0 Le SCU n'a pas d'incidence sur la vue.

1Tout changement de SCU provoque le passage à une vue en plan du nouveau SCU dans la fenêtre courante.

 

amicalement

Zebulon_

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Bonjour,

 

je vois que tu utilises les "TCPOINT"

donc tu es dans l'environnement Covadis,

tu fais des élévations de façades

il y a des chances que tu sois géomètre

déduction fine de mon esprit embrumé n'est ce pas ?

 

je viens te proposer ce que j'ai pensé pour le même travail.

 

pour le faire marcher, tu vas avoir besoin de créer un bloc

PTFAC, qui aura les mêmes attriburs que le TCPOINT mais avec un attribut de plus

NUM, ALTI, PROJ.

ce dernier attribut te servira à connaître la distance

positive ou négative rapport à ton "plan" de façade

en effet il est interessant de savoir si le point est pris sur un balcon ou au fond d'un retrait.

avant de lancer le lisp, il te faudra créer un SCU avec ton plan de façade

soit en Objet, soit en 3Points et que celui-ci soit le courant

 

voici le code :

(setvar "osmode" 0)

(setq jeu (ssget '((-4 . "")(-4 . "AND>"))))

(setq nb (sslength jeu))

(setq n 0)

(while (

(progn

(setq ent (ssname jeu n))

(setq blk (entget ent))

(setq ech_ins 0.1)

(setq xyz (cdr (assoc 10 blk)))

(setq xyz (trans xyz 0 1))

(setq x (car xyz))

(setq y (car (cdr xyz)))

(setq z (car (cdr (cdr xyz))))

(setq ent2 (entnext ent))

(setq num (cdr (assoc 1 (entget (entnext ent)))))

(setq z (cdr (assoc 1 (entget (entnext ent2)))))

(if (/= z "")

(command "_-insert"

"ptfac"

(list x (atof z))

ech_ins

""

""

num

z

(rtos y 2 2)

)

)

(setq n (+ 1 n))

)

)

 

amicalement

 

Éternel débutant…
Mon site perso : Programmer dans AutoCAD

 

Posté(e)

Bonjour à tous,

 

J'ai finalement fini par réussir à faire tous ce que je voulais,

Le principe permet de faire des élévations de façade, quelque soit l'orientation du scu et le tout encadré.

 

Merci à didier et zebulon qui m'ont mis sur la voie.

 

Il y a surement plus simple à faire mais çà fonctionne...

 

(defun c:facade (/ anccmd ancfla ancerr ancosm som pt1 pt2 pt3 ptynew ptnew sel n i nom coord pt1xa ptymini ptynew ptymax ptxmini ptxmax ptx pty ptz)


(setq anccmd (getvar "cmdecho" )
     ancfla (getvar "flatland" )
     ancerr *error*
     ancosm (getvar "osmode" )
); fin setq
;redefinition du traitement des erreurs
;**************************************
(defun *error* (msg)
      (command "scu"  "p")
      (setvar "cmdecho" anccmd)
      (setvar "flatland" ancfla)
      (setvar "osmode" ancosm)
      (setq *error* ancerr)
      (princ)
);fin defun error

 
 	(command "scu" "_v")
 
 	; RELEVE DES PTS ET TRANSFORMATION 2D
 	(initget 1)
(setq pt1 (getpoint "\n1er point : "))
 	(initget 1)
(setq pt2 (getpoint pt1 "\n2eme point : "))

 	; recup des 2 pts
 	(setq pt1x (car pt1) pt1y (cadr pt1) pt1z (caddr pt1))
 	(setq pt1 (list pt1x pt1y 0))
 	(setq pt2x (car pt2) pt2y (cadr pt2))
 	(setq pt2 (list pt2x pt2y 0))

 	; selection des points de facade
 	(setq sel (ssget (list (cons 2 "tcpoint"))))

   	(setq oldosmode (getvar "osmode"))
(setvar "osmode" 0)

 	;calcul du point aligné au X
 	(setq pt1xa (+ pt1x 10))
 	(setq pt3 (list pt1xa pt1y 0))


 	; rotation des points parallele au X
 	(command "_rotate" sel "" pt1 "_r" pt1 pt2 pt3)
 

; modif des points Z selon Y
(setq n (sslength sel))
(setq i 0)
(repeat n
  	(setq nom (ssname sel i))
	(setq coord (trans(cdr (assoc 10 (entget nom))) 0 1))
	(setq ptx (car coord) pty (cadr coord) ptz (caddr coord)) ; extraction coord du point d'origine
  	(setq deltaz (- pt1z ptz)) ; calcul le delta entre z et celui du refz
	(setq ptynew (- pt1y deltaz)) ; ajout du deltaz au y
	(setq ptnew (list ptx ptynew ptz)) ; nouvelle coord du point
	(command "_.move" nom "" coord ptnew) ; move le pt a son nouvelle emplacement

  ; calcul les coordonées max et mini des pts pour le cadre
  (if (= ptymini nil) (setq ptymini ptynew) )
  (if (> ptymini ptynew) (setq ptymini ptynew) )
  (if (= ptymax nil) (setq ptymax ptynew) )
  (if (< ptymax ptynew) (setq ptymax ptynew) )
  (if (= ptxmini nil) (setq ptxmini ptx) )
  (if (> ptxmini ptx) (setq ptxmini ptx) )
  (if (= ptxmax nil) (setq ptxmax ptx) )
  (if (< ptxmax ptx) (setq ptxmax ptx) )

(setq i (1+ i))
)
 	; FIN DE LA BOUCLE
 

; ajoute 5m. pour décaler le cadre des pts
 	(setq ptxmax (+ 5 ptxmax))
 	(setq ptymax (+ 5 ptymax))
 	(setq ptxmini (+ -5 ptxmini))
 	(setq ptymini (+ -5 ptymini))

 	; construit les pts du cadre et le dessine
(setq ptHD (list ptxmax ptymax 0))
(setq ptBG (list ptxmini ptymini 0))
(command "_rectang" ptHD ptBG)

 	(command "scu" "_p" "")
 	(setvar "osmode" oldosmode)
 (princ)
) 

 

[Edité le 27/3/2007 par pierrevig]

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é