Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

Comme je ne sais pas si (gile) m'octroie la permission d'éditer sa routine de PointFile (Insertion d'un bloc en 3D avec attributs) je ne le fais donc pas. L'idée est que dans cette routine on insert des blocs 3D dans Espace Objet et en SCG. Est-il possible insérer les blocs dans une vue différente exemple suivant XZ ou vue de face et que les attributs soient lisibles? Le but final étant de pouvoir dessiner une vue de face ou façade directement.

 

A bientôt.

 

Posté(e)

je ne sais pas si (gile) m'octroie la permission d'éditer sa routine de PointFile

 

Mais bien sûr, modifie ce que tu veux, chacun peut faire ce qu'il veut des routines que je publie ici.

 

Précise ce que tu veux :

- que l'utilisateur puisse choisir la vue (haut bas gauche droite avant arrière) ?

- que la vue soit précisée en dédut de liste dans le fichier ? ou avant chaque matricule ?

- que le bloc soit inséré (ainsi que les attributs) dans un plan parallèle à la vue choisie.

 

Et je t'aiderais, j'ai un peu de temps ces jours ci.

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

Posté(e)

OK, Merci (gile)

 

Je sais que c'est une pratique courante sur le forum pour moi c'est juste une question de politesse vue et au regard de toutes les solutions et aides que tu apportes à chacun.

 

Précise ce que tu veux :

- que l'utilisateur puisse choisir la vue (haut bas gauche droite avant arrière) ?

- que la vue soit précisée en dédut de liste dans le fichier ? ou avant chaque matricule ?

- que le bloc soit inséré (ainsi que les attributs) dans un plan parallèle à la vue choisie.

 

J'ai (si je peux m'exprimer ainsi) simplement besoin que mes blocs (ainsi que les attributs) soient inséres dans une vue (haut bas gauche droite avant arrière) préalablement choisi ou pas, c'est en fonction de la complexité à modifier le lisp.

Et j'ai plutôt besoin d'un traitement global qu'un traitement point par point.

 

J'espère que cela ne représente pas trop de boulot!

 

A bientôt.

Posté(e)

Voilà, on choisit la vue avant de choisir le fichier.

 

EDIT : réparé un dysfonctionnement si le plan du SCU courant n'était pas parallèle au plan de SCG. Ça semble fonctionner maintenant.

 

EDIT 2 : groupe d'annulation et gestion des erreurs.

 

(defun c:PointFile
	   (/ erreur AcDoc Space bloc opt norm file str	mat alt
	    ins	ref)
 (vl-load-com)
 (setq	AcDoc	(vla-get-ActiveDocument (vlax-get-acad-object))
Space	(if (= (getvar "CVPORT") 1)
	  (vla-get-PaperSpace AcDoc)
	  (vla-get-ModelSpace AcDoc)
	)
m:err	*error*
*error*	erreur
 )

 (defun erreur	(msg)
   (if	(= msg "Fonction annulée")
     (princ)
     (princ (strcat "Erreur: " msg))
   )
   (vla-EndUndoMark AcDoc)
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 (vla-StartUndoMark acDoc)
 (if (or
(tblsearch "BLOCK" (setq bloc "PointFile"))
(findfile (setq bloc "PointFile.dwg"))
     )
   (progn
     (initget "Haut Bas Avant ARrière Gauche Droite")
     (setq opt
     (getkword
       "\nSpécifiez le plan d'insertion [Haut/Bas/Avant/ARrière/Gauche/Droite] : "
     )
     )
     (cond
((or (not opt) (= opt "Haut")) (setq norm '(0 0 1)))
((= opt "Bas") (setq norm '(0 0 -1)))
((= opt "Avant") (setq norm '(0 -1 0)))
((= opt "ARrière") (setq norm '(0 1 0)))
((= opt "Gauche") (setq norm '(-1 0 0)))
((= opt "Droite") (setq norm '(1 0 0)))
     )
     (if (setq file (getfiled "Choisir le fichier" "" "txt" 0))
(progn
  (setq file (open file "r"))
  (while (setq str (read-line file))
    (setq
      str (vl-string-right-trim "," str)
      mat
	  (substr str 1 (vl-string-position (ascii ",") str))
      str (substr str
		  (+ 2 (vl-string-position (ascii ",") str))
	  )
      alt
	  (substr str
		  (+ 2 (vl-string-position (ascii ",") str 1 T))
	  )
      ins nil
      ins (cons (atof alt) ins)
      str (substr str
		  1
		  (vl-string-position (ascii ",") str 1 T)
	  )
      ins
	  (cons
	    (atof
	      (substr str
		      (+ 2 (vl-string-position (ascii ",") str 1 T))
	      )
	    )
	    ins
	  )
      str (substr str
		  1
		  (vl-string-position (ascii ",") str 1 T)
	  )
      ins (cons (atof str) ins)
      ref (vla-InsertBlock
	    Space
	    (vlax-3d-point '(0 0 0))
	    bloc
	    1.0
	    1.0
	    1.0
	    0.0
	  )
    )
    (vla-put-Normal ref (vlax-3d-point norm))
    (mapcar '(lambda (x y)
	       (vla-put-TextString x y)
	       (vla-put-Normal x (vlax-3d-point norm))
	     )
	    (vlax-invoke ref 'GetAttributes)
	    (list mat alt)
    )
    (vla-move ref
	      (vlax-3d-point '(0 0 0))
	      (vlax-3d-point ins)
    )
  )
  (close file)
)
(princ "\nFichier introuvable.")
     )
   )
   (princ "\nBloc introuvable.")
 )
 (vla-EndUndoMark AcDoc)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
)

[Edité le 28/6/2007 par (gile)]

 

[Edité le 29/6/2007 par (gile)]

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

Posté(e)

Oups!

 

J'ai un problème au niveau des coordonnées:

_les abscisses décroissent apparemment proportionnellement.

_pour ce qui est des ordonnées juste une petite modif à partir des mm.

 

A bientôt.

Posté(e)

As tu essayé la dernière version ?

J'ai modifié le code entre tes deux derniers messages (SCU différent du SCG).

 

Je le re-modifie maintenant : ajout d'un groupe d'annulation et d'une gestion des erreurs.

 

[Edité le 29/6/2007 par (gile)]

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

Posté(e)

Je n'ai pas trouvé la dernière version, je me suis servi du lisp ci-dessus.

 

C'est celle là, j'ai modifié le code ci-dessus hier soir et ce matin, refais un copier/coller si tu ne l'as pas fait depuis.

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

Posté(e)

Ok (gile) c'est fait,

 

J'y perds mon français lorsque je compare mes points positionnés sur ma façade avec ceux nouvellement générés j'ai encore un écart (Je génère le fichier en premier puis j'insère ma façade je la mets sur un même point d'insertion (pour construire ma façade j'ai effectué une rotation suivant X puis suivant Y j'ai ensuite utilisé ton lisp r2v pour rendre lisible les bloc avec attrib. )). Pourtant lorsque j'effectue 2 mesures l'une sur ma façade et l'autre sur les points générés j'obtiens la MÊME DISTANCE?????

 

Je vais essayer d'approfondir.

Posté(e)

Je ne comprends pas bien ton problème.

 

Le LISP ci-dessus insère les blocs aux coordonnées récupérées dans le fichier (coordonnées SCG) les blocs sont juste pivotés pour être dans un plan parallèle à la vue spécifiée.

 

 

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

Posté(e)

Est ce que je peux te faire parvenir un extrait de fichier que je viens d'essayer sur une autre façade par contre je ne sais pas ou, ni comment te le faire parvenir sur tu es d'accord?

Posté(e)

J'ai trouvé une petite différence entre les points d'insertion des blocs insérés avec cett routine et ceux insérés avec celle donnée ci-dessus.

Dans la première routine tu m'avais demandé d'arrodir l'altitude à 2 décimales et les blocs s'insèrent avec cette altitude alors qu'avec la seconde routines ils sont insérés à l'altitude donnée dans le fichier txt. :red:

 

PS : as tu eu mon message privé ?

 

[Edité le 29/6/2007 par (gile)]

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

Posté(e)

Bonjour à tous,

 

Quelqu'un a-t-il testé le lisp de (gile)? et quels sont les résultats? juste pour savoir si cela vient de moi ou de mon pc ou autre. Un très grand MERCI de toute façon à (gile) pour son temps et ses réponses!!!!

Posté(e)

Sincèrement, je ne pense pas que ça vienne du LISP. Il fonctionne comme je pensais qu'il fallait quil le fasse.

 

Dans un dessin vierge, je lance le LISP, je choisis l'option pour le plan d'insertion des bloc et sélectionne le fichier .txt.

Quelque soit l'option choisie, le point d'insertion de chaque bloc est bien positionné sur les coordonnées (SCG) spécifiées dans le fichier.

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

Posté(e)

Tu as raison (gile), c'est exactement ça, pourtant lorsque je superpose les 2 dessins je constate des écarts (je deviens fou!). Je m'y remets.

Posté(e)

Tu as raison (gile), c'est exactement ça, pourtant lorsque je superpose les 2 dessins je constate des écarts (je deviens fou!)

 

C'est donc que sur un des deux dessins les point sont mal positionné. Excuse moi, je ne comprends pas bien ce que tu fais. Je pensais que tu utilisais les points d'insertion des blocs (insérés avec le LISP) pour dessiner ta façade et que pour ça tu avais besoin, suivant les vues de pouvoir lire les attributs.

 

Me trompe-je ?

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

Posté(e)

Je pensais que tu utilisais les points d'insertion des blocs (insérés avec le LISP) pour dessiner ta façade et que pour ça tu avais besoin, suivant les vues de pouvoir lire les attributs.(Je te cite)

 

Oui, c'est ça (gile) le fait de pouvoir lire les attributs est vraiment très pratique. C'est comme lorsque tu as un plan topo à dessiner avec les matricules et les altitudes..... Donc pour la construction de la façade c'est la même chose. Et oui il y a forcement un bug sur l'un ou sur l'autre à moins que se soit au niveau de mon fichier txt (il est de la forme : N,X,Y,Z, mais bon, je ne pense pas). Je n'ai pas eu encore le temps d'approfondir, je te tiens au courant.

Posté(e)

Salut,

 

J'ai bien reçu tes fichiers, ton problème semble venir des rotaitions 3d que tu fais faire au semis de points pour essayer d'amener la façade parallèle au plan XY. Essaye une orbite3d ou une vue de face, tu verra que le semis est mal orienté.

 

Enfin, je pense avoir mieux compris ce que tu voulais. Pour dessiner des élévations sur le pan XY à partir d'un semis de points 3D, je te propose un nouveau LISP qui insèrera les point de façon à aligner le plan spécifié par 3points sur le plan XY.

Il s'agit de choisir les 3 points de la même façon que pour faire SCU3points : le premier à "l'origine", le second sur l'axe des X (ces deux point définissent l'horizontale) et le troisième dans la zone positive des Y (ce point défini le plan et doit être à la verticale des deux autres).

Le LISP demande à l'utilisateur les matricules de ces 3 points.

Une option permet d'aplanir la géométrie : tous les points en Z=0.

 

(defun c:pf2 (/ erreur file2ptlst AcDoc Space bloc file xdir ydir norm plst falt)
 (vl-load-com)
 (setq	AcDoc	(vla-get-ActiveDocument (vlax-get-acad-object))
Space	(if (= (getvar "CVPORT") 1)
	  (vla-get-PaperSpace AcDoc)
	  (vla-get-ModelSpace AcDoc)
	)
m:err	*error*
*error*	erreur
 )

 (defun erreur	(msg)
   (if	(= msg "Fonction annulée")
     (princ)
     (princ (strcat "Erreur: " msg))
   )
   (vla-EndUndoMark AcDoc)
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 (defun file2ptlst (file / file str pt ptlst)
 (setq file (open file "r"))
 (while (setq str (read-line file))
   (setq str (vl-string-right-trim "," str))
   (repeat 3
     (setq pt	(cons
	  (atof (substr str (+ 2 (vl-string-position 44 str 1 T))))
	  pt
	)
    str	(substr str 1 (vl-string-position 44 str 1 T))
     )
   )
   (setq ptlst	(cons (cons (atoi str) pt) ptlst)
  pt	nil
   )
 )
 (close file)
 ptlst
)

 (vla-StartUndoMark AcDoc)
 (if (or
(tblsearch "BLOCK" (setq bloc "PointFile"))
(findfile (setq bloc "PointFile.dwg"))
     )
   (if	(and (setq file (getfiled "Choisir le fichier" "" "txt" 0))
     (setq lst (file2ptlst file))
)
     (if (and
    (setq org
	   (getint
	     "\nSpécifiez le matricule du point d'origine du plan d'insertion: "
	   )
    )
    (setq org (assoc org lst))
    (setq xdir
	   (getint
	     "\nSpécifiez le matricule d'un point sur l'axe X du plan d'insertion: "
	   )
    )
    (setq xdir (assoc xdir lst))
    (setq ydir
	   (getint
	     "\nSpécifiez le matricule d'un point dans la zone des Y positifs du plan d'insertion: "
	   )
    )
    (setq ydir (assoc ydir lst))
  )
(progn
  (initget "Oui Non")
  (if (= "Oui" (getkword "\nAplanir la géométrie ? [Oui/Non] : "))
    (setq flat T)
    )
  (setq	norm (norm_3pts (cdr org) (cdr xdir) (cdr ydir))
	plst (mapcar '(lambda (x)
			(setq trp (trans (cdr x) 0 norm))
			(if flat
			  (list (car x) (car trp) (cadr trp) 0.0)
			  (cons (car x) trp)
			)
		      )
		     lst
	     )
  )
  (mapcar '(lambda (p)
	     (setq ref (vla-InsertBlock
			 Space
			 (vlax-3d-point (cdr p))
			 bloc
			 1.0
			 1.0
			 1.0
			 0.0
		       )
	     )
	     (mapcar '(lambda (x y)
			(vla-put-TextString x y)
		      )
		     (vlax-invoke ref 'GetAttributes)
		     (list (itoa (car p)) (rtos (cadddr (assoc (car p) lst)) 2 2))
	     )
	   )
	  plst
  )
)
(princ "\nMatricule erroné.")
     )
   )
   (princ "\nBloc introuvable")
 )
 (vla-EndUndoMark AcDoc)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
)

   ;;; NORM_3PTS retourne le vecteur normal du plan défini par 3 points

(defun norm_3pts (org xdir ydir)
 ((lambda (n)
    (if (inters org xdir org ydir)
      (mapcar '(lambda (x) (/ x (distance '(0 0 0) n))) n)
    )
  )
   ((lambda (x y)
      (list (-	(* (cadr x) (caddr y))
	(* (caddr x) (cadr y))
     )
     (-	(* (caddr x) (car y))
	(* (car x) (caddr y))
     )
     (-	(* (car x) (cadr y))
	(* (cadr x) (car y))
     )
      )
    )
     (mapcar '- xdir org)
     (mapcar '- ydir org)
   )
 )
) 

 

[Edité le 3/7/2007 par (gile)]

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

Posté(e)

Que de travail (gile)!!!

 

Merci, sur le fichier que tu m'as envoyé tout colle, je viens de généré avec le nouveau lisp et j'obtiens ceci ; warning: same symbol found before and after / in arguments list: FILE

; warning: local variable used as function: FILE2PTLST

mais la routine fonctionne, par contre j'ai maintenant un différence en altitude ou suivant l'axe des Y de l'ordre de 0 à 5 cm.

Posté(e)

par contre j'ai maintenant un différence en altitude ou suivant l'axe des Y de l'ordre de 0 à 5 cm

 

Est-tu sûr, quand tu as spécifié les 3 points, que le dernier était bien dans le même plan vertical que les deux premiers ?

 

Les LISP que j'ai donné devraient servir à dessiner des façades plutôt qu'à vérifier un dessin déjà fait. Je pense qu'ils sont géométriquement "justes" il ne font que transformer des point d'un système de coordonnées à un autre.

 

En voici une autre version avec seulement 2 points à spécifier, la projection se fait dans le plan vertical de ces points, le second doit-être à droite du premier dans le sens de la vue.

Plus de risque d'imprécision dans l'horizontalité ou la verticalité.

 

(defun c:pf3 (/ erreur FlattenPoint file2ptlst AcDoc Space bloc file x1 x2 norm plst trp flat)
 (vl-load-com)
 (setq	AcDoc	(vla-get-ActiveDocument (vlax-get-acad-object))
Space	(if (= (getvar "CVPORT") 1)
	  (vla-get-PaperSpace AcDoc)
	  (vla-get-ModelSpace AcDoc)
	)
m:err	*error*
*error*	erreur
 )

 (defun erreur	(msg)
   (if	(= msg "Fonction annulée")
     (princ)
     (princ (strcat "Erreur: " msg))
   )
   (vla-EndUndoMark AcDoc)
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 (defun FlattenPoint (pt)
   (list (car pt) (cadr pt) 0.0)
   )

 (defun file2ptlst (file / str pt ptlst)
 (setq file (open file "r"))
 (while (setq str (read-line file))
   (setq str (vl-string-right-trim "," str))
   (repeat 3
     (setq pt	(cons
	  (atof (substr str (+ 2 (vl-string-position 44 str 1 T))))
	  pt
	)
    str	(substr str 1 (vl-string-position 44 str 1 T))
     )
   )
   (setq ptlst	(cons (cons (atoi str) pt) ptlst)
  pt	nil
   )
 )
 (close file)
 ptlst
)

 (vla-StartUndoMark AcDoc)
 (if (or
(tblsearch "BLOCK" (setq bloc "PointFile"))
(findfile (setq bloc "PointFile.dwg"))
     )
   (if	(and (setq file (getfiled "Choisir le fichier" "" "txt" 0))
     (setq lst (file2ptlst file))
)
     (if (and
    (princ
      "\nSpécifiez les matricule de deux points sur le plan vertical."
    )
    (setq x1
	   (getint
	     "\nPremier matricule: "
	   )
    )
    (setq x1 (assoc x1 lst))
    (setq x2
	   (getint
	     "\nSecond matricule: "
	   )
    )
    (setq x2 (assoc x2 lst))
    (not (equal	(setq x1 (FlattenPoint (cdr x1)))
		(setq x2 (FlattenPoint (cdr x2)))
		1e-9
	 )
    )
  )
(progn
  (initget "Oui Non")
  (if (= "Oui" (getkword "\nAplanir la géométrie ? [Oui/Non] : "))
    (setq flat T)
    )
  (setq x1 (FlattenPoint (cdr x1))
	x2 (FlattenPoint (cdr x2))
	norm (norm_3pts x1 x2 (list (car x1) (cadr x1) 1.0))
	plst (mapcar '(lambda (x)
			(setq trp (trans (cdr x) 0 norm))
			(if flat
			  (cons (car x) (FlattenPoint trp))
			  (cons (car x) trp)
			)
		      )
		     lst
	     )
  )
  (mapcar '(lambda (p)
	     (setq ref (vla-InsertBlock
			 Space
			 (vlax-3d-point (cdr p))
			 bloc
			 1.0
			 1.0
			 1.0
			 0.0
		       )
	     )
	     (mapcar '(lambda (x y)
			(vla-put-TextString x y)
		      )
		     (vlax-invoke ref 'GetAttributes)
		     (list (itoa (car p)) (rtos (cadddr (assoc (car p) lst)) 2 2))
	     )
	   )
	  plst
  )
)
(princ "\nMatricule erroné.")
     )
   )
   (princ "\nBloc introuvable")
 )
 (vla-EndUndoMark AcDoc)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
)

   ;;; NORM_3PTS retourne le vecteur normal du plan défini par 3 points

(defun norm_3pts (org xdir ydir)
 ((lambda (n)
    (if (inters org xdir org ydir)
      (mapcar '(lambda (x) (/ x (distance '(0 0 0) n))) n)
    )
  )
   ((lambda (x y)
      (list (-	(* (cadr x) (caddr y))
	(* (caddr x) (cadr y))
     )
     (-	(* (caddr x) (car y))
	(* (car x) (caddr y))
     )
     (-	(* (car x) (cadr y))
	(* (cadr x) (car y))
     )
      )
    )
     (mapcar '- xdir org)
     (mapcar '- ydir org)
   )
 )
)

 

[Edité le 3/7/2007 par (gile)]

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

Posté(e)

Oups désolé (gile) ,

 

J'avais bien précisé un point dans l'axe perpendiculaire et positif par rapport aux deux précédent pts par contre je ne me suis pas soucié de savoir s'il était dans le même plan. Mille excuses!!!!!!!

En fait ce n'est pas pour contrôler un travail déjà existant c'est vraiment pour créer de nouvelles choses mais cela doit-être du à mon background chez les géomètres (Essayer de toujours vérifier son job).

 

Mille fois MERCI c'est du GRAND ART.

Posté(e)

Avec la dernière version, tu ne devrait plus avoir ce genre de soucis. les deux points doivent juste être dans un plan vertical parallèle à celui de la façade (1 et 199 par exemple sur le fichier que tu m'as envoyé) peu importe s'ils ne sont pas à la même altitude (un peu comme la commande section ou _slice depuis 2007).

Et avec l'option "Aplanir" tu peux t'accrocher directement aux pointsd'insertion des blocs.

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

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é