Aller au contenu

Insérer/étirer en 3d


(gile)

Messages recommandés

Salut,

 

Ce sujet m'a motivé pour finaliser un truc que j'avais en tête.

 

Comme on ne peut pas (encore ?) faire de bloc dynamique 3d, j'ai essayé de faire un truc pour insérer un bloc en 3d tout en l'étirant sur son axe X en spécifiant 2 points.

Le bloc peut contenir des solides 3d.

Si le bloc contient un attribut dont l'étiquette est LONG il prendra automatiquement pour valeur la longueur du bloc sur l'axe X et elle pourra être extraite avec EXTATTBE.

 

EDIT : réparé bug dans les SCU non // au SCG

EDIT 2 : Ajout de données attachées au bloc pour l'utilisation de EDITLEN (voir plus bas)

 

;;; STRETCHINS (gile) 24/07/08
;;; Insère le bloc spécifié en l'étirant sur son axe X suivant les
;;; 2 points 3d spécifiés.
;;; Si le bloc contient un attribut dont l'étiquette est LONG,
;;; il prendra automatiquement la valeur de la longueur du bloc.

(defun c:stretchins (/ blk bl minpt maxpt len p1 p2 dis scl vec x y z att)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (if (setq blk (getblock nil))
   (progn
     (setq bl (vla-InsertBlock
	 (vla-get-ModelSpace *acdoc*)
	 (vlax-3d-point '(0 0 0))
	 blk
	 1
	 1
	 1
	 0
       )
     )
     (vla-put-Normal bl (vlax-3d-point '(0 0 1)))
     (vla-getBoundingBox bl 'minpt 'maxpt)
     (setq len	(- (car (vlax-safearray->list maxpt))
	   (car (vlax-safearray->list minpt))
	)
     )
     (vla-delete bl)
     (while
(and
  (setq	p1 (getpoint
	     "\nSpécifiez le point d'insertion ou : "
	   )
  )
  (setq
    p2 (trans (getpoint p1 "\nSpécifiez l'autre extrémité: ")
	      1
	      0
       )
  )
)
 (setq p1  (trans p1 1 0)
       dis (distance p1 p2)
       scl (/ dis len)
       vec   (mapcar '(lambda (x) (/ x scl)) (mapcar '- p2 p1))
 )
 (mapcar '(lambda (x1 x2) (set x1 (eval x2))) '(x y z) vec)
 (setq bl
	(vla-InsertBlock
	  (vla-get-ModelSpace *acdoc*)
	  (vlax-3d-point '(0 0 0))
	  blk
	  scl
	  1
	  1
	  0
	)
 )
 (vla-put-Normal bl (vlax-3d-point '(0 0 1)))
 (if (and (equal x 0 1e-9) (equal y 0 1e-9))
   (vla-Rotate3d
     bl
     (vlax-3d-point '(0 0 0))
     (vlax-3d-point '(0 1 0))
     (if (minusp z)
       (/ pi 2)
       (/ pi -2)
     )
   )
   (progn
     (vla-Rotate3d
       bl
       (vlax-3d-point '(0 0 0))
       (vlax-3d-point '(0 0 1))
       (setq a (atan y x))
     )
     (vla-Rotate3d
       bl
       (vlax-3d-point '(0 0 0))
       (vlax-3d-point (list y (- x) 0))
       (if (equal x 0 1e-9)
	 (atan z (abs y))
	 (atan z (/ x (cos a)))
       )
     )
   )
 )
 (vla-Move bl (vlax-3d-point '(0 0 0)) (vlax-3d-point p1))
 (if (and (setq att (vlax-invoke bl 'getAttributes))
	  (setq
	    att	(mapcar
		  (function
		    (lambda (x) (cons (vla-get-TagString x) x))
		  )
		  att
		)
	  )
	  (setq att (cdr (assoc "LONG" att)))
     )
   (vla-put-Textstring att (rtos dis))
 )
(vlax-ldata-put bl "len" len)
(vlax-ldata-put bl "vec" vec)
     )
   )
 )
 (princ)
)

;;; Getblock (gile) 03/11/07
;;; Retourne le nom du bloc entré ou choisi par l'utilisateur 
;;; dans une liste déroulante de la boite de dialogue ou depuis la boite
;;; de dialogue standard d'AutoCAD
;;; Argument : le titre (string) ou nil (défaut : "Choisir un bloc")

(defun getblock	(titre / bloc n lst tmp file what_next dcl_id nom)
 (while (setq bloc (tblnext "BLOCK" (not bloc)))
   (setq lst (cons (cdr (assoc 2 bloc)) lst)
   )
 )
 (setq	lst  (acad_strlsort
       (vl-remove-if
	 (function (lambda (n) (= (substr n 1 1) "*")))
	 lst
       )
     )
tmp  (vl-filename-mktemp "Tmp.dcl")
file (open tmp "w")
 )
 (write-line
   (strcat
     "getblock:dialog{label="
     (cond (titre (vl-prin1-to-string titre))
    ("\"Choisir un bloc\"")
     )
     ";initial_focus=\"bl\";:boxed_column{
     :row{:text{label=\"Sélectionner\";alignment=left;}
     :button{label=\">>\";key=\"sel\";alignment=right;fixed_width=true;}}
     spacer;
     :column{
     :button{label=\"Parcourir...\";key=\"wbl\";alignment=right;fixed_width=true;}}
     :column{:text{label=\"Nom :\";alignment=left;}}
     :edit_box{key=\"tp\";edit_width=25;}
     :popup_list{key=\"bl\";edit_width=25;}spacer;}
     spacer;
     ok_cancel;}"
   )
   file
 )
 (close file)
 (setq dcl_id (load_dialog tmp))
 (setq what_next 2)
 (while (>= what_next 2)
   (if	(not (new_dialog "getblock" dcl_id))
     (exit)
   )
   (start_list "bl")
   (mapcar 'add_list lst)
   (end_list)
   (if	(setq n	(vl-position
	  (strcase (getvar "INSNAME"))
	  (mapcar 'strcase lst)
	)
)
     (setq nom (nth n lst))
     (setq nom	(car lst)
    n	0
     )
   )
   (set_tile "bl" (itoa n))
   (action_tile "sel" "(done_dialog 5)")
   (action_tile "bl" "(setq nom (nth (atoi $value) lst))")
   (action_tile "wbl" "(done_dialog 3)")
   (action_tile "tp" "(setq nom $value) (done_dialog 4)")
   (action_tile
     "accept"
     "(setq nom (nth (atoi (get_tile \"bl\")) lst)) (done_dialog 1)"
   )
   (setq what_next (start_dialog))
   (cond
     ((= what_next 3)
      (if (setq nom (getfiled "Sélectionner un fichier" "" "dwg" 0))
 (setq what_next 1)
 (setq what_next 2)
      )
     )
     ((= what_next 4)
      (cond
 ((not (read nom))
  (setq what_next 2)
 )
 ((tblsearch "BLOCK" nom)
  (setq what_next 1)
 )
 ((findfile (setq nom (strcat nom ".dwg")))
  (setq what_next 1)
 )
 (T
  (alert (strcat "Le fichier \"" nom "\" est introuvable."))
  (setq	nom nil
	what_next 2
  )
 )
      )
     )
     ((= what_next 5)
      (if (and	(setq ent (car (entsel)))
	(= "INSERT" (cdr (assoc 0 (entget ent))))
   )
 (setq nom	 (cdr (assoc 2 (entget ent)))
       what_next 1
 )
 (setq what_next 2)
      )
     )
     ((= what_next 0)
      (setq nom nil)
     )
   )
 )
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 nom
) 

 

Exemple en image, le bloc "Tube100" est inséré avec STRETCHINS et le bloc "Rac_100_90°" avec INS3D (sur cette page)

Je n'y connais rien en tuyauterie, c'est juste un exemple.

 

http://img151.imageshack.us/img151/9522/stretchinsgf6.png [Edité le 24/7/2008 par (gile)][Edité le 24/7/2008 par (gile)][Edité le 24/7/2008 par (gile)][Edité le 24/7/2008 par (gile)]

 

[Edité le 25/7/2008 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

pour mon besoin perso je n'en ai pas besoin.... (ou je ne le vois pas encore).

Mais c'est vraiment un superbe outils !

Les logiciels de CAO paramétrables n'ont qu'on bien se tenir !

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

Merci :red:

 

J'ai apporté une modification à STRETCHINS pour pouvoir utiliser la routine suivante qui permettra de modifier ultérieurement la longueur totale des blocs insérés.

 

EDITLEN invite l'utilisateur à sélectionner un bloc,

contrôle si le bloc a été inséré avec STRETCHINS (données attachées),

Invite l'utilisateur à spécifier la nouvelle longueur totale du bloc.

Le bloc est modifié du côté duquel il a été sélectionné (comme avec MODIFLONG).

S'il contient l'attribut LONG, celui-ci est mis à jour.

 

EDIT : remplacé osnap qui (buguait parfois suivant les composants du bloc et le point de sélection) par une fonction de mon cru.

 

;;; EDITLEN (gile) 24/07/08
;;; Modifie la longueur totale d'un bloc inséré avec STRETCHINS
;;; Met à jour l'attribut LONG

(defun c:EditLen (/ ent bl att len pt ins vec scl ext move dis)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (if (and
(setq ent (entsel "\nSélectionnez un bloc: "))
(setq bl (vlax-ename->vla-object (car ent)))
(setq len (vlax-ldata-get bl "len"))
(setq ins (vlax-get bl 'InsertionPoint))
(setq pt
       ((lambda	(p1 / p2 nor sc)
	  (if (and (setq nor (vlax-get bl 'normal))
		   (setq p2 (trans p1 1 2))
		   (setq
		     p2	(trans
			  (list (car p2) (cadr p2) (1+ (caddr p2)))
			  2
			  0
			)
		   )
		   (/= 0
		       (setq sc
			      (apply '+ (mapcar '* nor (mapcar '- p2 p1)))
		       )
		   )
	      )
	    (mapcar
	      (function
		(lambda	(x1 x2)
		  (+
		    (*
		      (/ (apply	'+
				(mapcar '* nor (mapcar '- p1 ins))
			 )
			 sc
		      )
		      (- x1 x2)
		    )
		    x1
		  )
		)
	      )
	      p1
	      p2
	    )
	  )
	)
	 (cadr ent)
       )
)
(setq vec (vlax-ldata-get bl "vec"))
(setq scl (vla-get-XScaleFactor bl))
(setq ext (mapcar '(lambda (x1 x2) (+ x1 (* x2 scl))) ins vec))
(if (	  (setq move t)
  T
)
(setq dis (getdist (trans (if move
			    ext
			    ins
			  )
			  0
			  1
		   )
		   "\nSpécifiez la longueur: "
	  )
)
     )
   (progn
     (vla-StartUndoMark *acdoc*)
     (vla-put-XScaleFactor bl (/ dis len))
     (if move
(vla-Move bl
	  (vlax-3d-point '(0 0 0))
	   (vlax-3d-point (mapcar '(lambda (x) (* x (- scl (/ dis len)))) vec))
)
     )
     (if (and
    (setq att (vlax-invoke bl 'getAttributes))
    (setq
      att (mapcar
	    (function
	      (lambda (x) (cons (vla-get-TagString x) x))
	    )
	    att
	  )
    )
    (setq att (cdr (assoc "LONG" att)))
  )
(vla-put-TextString att (rtos dis))
     )
     (vla-EndUndoMark *acdoc*)
   )
 )
 (princ)
) 

 

[Edité le 24/7/2008 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Les logiciels de CAO paramétrables n'ont qu'on bien se tenir !

 

N'exagérons rien, on est loin du compte !

 

Ca marche à partir de quelle version?

 

À priori à partir de 2000 (mais je sais qu'il peut y avoir des problèmes avec les fonctions vlax dans les versions 2000/2002).

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

Lien vers le commentaire
Partager sur d’autres sites

N'exagérons rien, on est loin du compte !

 

 

 

Salut gile

 

Ah Probablement mais déjà ça rivalise sérieusement avec Mechanical

 

Alors oui,........ la cote ne pilote pas le modèle, pour certaines choses, ce n'est pas indispensable

Lien vers le commentaire
Partager sur d’autres sites

Alors oui,........ la cote ne pilote pas le modèle,

Moi, ce que j'en pense... ;)

Hein, (gile), en liaisonnant l'attribut à la cote (faire slectionner la cote puis l'élément correspondant) ? :P

Et sans réacteur, juste avec un bouton de mise à jour... pour rester simple... je suis sûr que tu ais déjà dessus....

 

(par contre je ne vois pas la possibilité de mettre à jour le reste du plan lors de la modification d'un élément)

 

Moi, je dis ça, mais je ne l'utiliserais pas....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

Tu as mis le doigt dessus Bred, le pilotage du modèle par les cotes suppose d'autres contraintes pour déterminer de quel côté le modèle doit être modifié par exemple.

C'est toute la philosophie des logiciels paramétriques.

 

J'ai fait EDITLEN pour ça, on modifie la longueur totale de l'objet en spécifiant la nouvelle longueur la modification intervenant du côté duquel l'objet a été sélectionné (mais le reste du dessin ne bouge pas...)

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

Lien vers le commentaire
Partager sur d’autres sites

Il reste quand même un problème avec ces routines que je crains de ne pouvoir résoudre.

 

Ces routines jouent avec l'échelle X du bloc, or ni APLANIRGEOM ni la "bombe" de Tramber n'agissent sur les bloc dont les échelles ne sont pas uniformes.

 

Impossible donc de générer un objet 2d à partir de ces objets :(

 

[Edité le 25/7/2008 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Re

 

 

je ne l'utiliserais peut être pas non plus...

 

Il empêche que EDITLEN n'est pas un gadget, et loin de là,il peut rendre un sacré service pour les domaines du procédé en pharmacopée "les points sensibles règle des 3D"........ tuyauterie en tout genre....

 

Alors pour eux je dis merci

Lien vers le commentaire
Partager sur d’autres sites

À priori à partir de 2000 (mais je sais qu'il peut y avoir des problèmes avec les fonctions vlax dans les versions 2000/2002).

j'ai un message d'erreur sur ma version 2005

erreur dans le fichier de boite de dialogue

"C:\Temp\Temp03.dcl",ligne5:

attribut incorrect.

Symbole : "dth".

 

Merci d'avance pour toutes explications

HPZ400 Workstation

Intel Xeon W3550 3.07 GHz

6 Go ram

QUADRO FX 1800

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Je connais comment dessiner en 3D ce que tu as fait j'en suis capable mais sortir la nomenclature automatiquement ça je ne suis pas assez calé la dedans c'est pour cela que je vous demande des explications

et comme vous etes bien bon a ce niveau j'en profite pour m'améliorer et apprendre

 

Giles c'est exactement ce que je recherche ce que tu as fais sur ton plan 3D sauf que je ne métrise pas ta démarche peux tu m'expliquer simplement merci de ta comprehension

 

Dis moi les coude tu les as sortis d'une bibliothèque ?

 

Moi pour faire le piping j'utilise le routing et les raccords 3D polyligne suite à ton pgm

voila un peu comment je procéde et pours les vannes je les dessines

 

Par contre j'ai un pgm en 2D si ca interresse

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Dis moi les coude tu les as sortis d'une bibliothèque ?

 

Non, je n'ai de bibliothèque pour ce genre de chose, ce n'est pas mon domaine (je fais dans la menuiserie/construction de décors).

 

J'ai fait le bloc de manière à pouvoir l'insérer avec le LISP ins3d (sur cette page).

Le point d'insertion et l'orientation sont choisis pour qu'il soit axé comme les axes X et Y.

http://img177.imageshack.us/img177/9408/pipe1lg6.png

 

Le bloc "tube100" est fait pour être inséré avec le LISP stretrchins (voir plus haut).

Il doit être axé sur l'axe X et comporter au moins un attribut (invisible) dont l'étiquette est : LONG.

 

http://img297.imageshack.us/img297/3568/pipe2xp1.png

 

Ensuite, en m'accrochant sur une polyligne 3d servant d'axe, j'insère les coudes avec ins3d.

 

http://img208.imageshack.us/img208/8124/pipe3zu3.png

 

Puis j'insère les tubes avec stretchins en m'accrochant aux extrémités de la polyligne ou aux centres des cylindres des coudes.

 

http://img364.imageshack.us/img364/1210/pipe4aq1.png

 

Une extraction d'attributs avec la commande EXTATTBE me fait mon quantitatif.

 

http://img364.imageshack.us/img364/8499/pipe5if8.png

 

Je peux modifier ultérieurement la longueur des tubes avec le LISP editlen (voir plus haut); mon quantitatif se met à jour.

 

http://img185.imageshack.us/img185/8646/pipe6zo3.png

 

 

[Edité le 29/7/2008 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Je comprends ta méthode elle est pas mal

Merci.

 

y a t'il une astuce pour sortir la longueur d'une polyligne?

Tu sélectionnes la polyligne et sa longueur est affichée dans la fenêtre des Propriétés.

Sinon, il doit y avoir une demi douzaine de LISP qui calculent la longueur totale des lignes/polylignes... sélectionnées. Fais une recherche.

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

Lien vers le commentaire
Partager sur d’autres sites

J'ai cherché j'ai trouvéquelque chose qui m'interesserais , isérer un champ sur une polyligne

mais j'ai essayé je comprend pas

 

Pour info j'utilise :

le Pgm que tu as fais curve2pipe je m'en sert il est top par contre dis moi si c'est possible d'inserer un champs ( Diamètre) sur une polyligne si oui peux tu m'expliquer ou me le faire

 

ex tu choisis par ex DN100 , j'aimerais que le champs donne DN100

Idem pour les autres diamètres

et derniere demande si tu peux intégrer la commande de cotation intégré

 

Merci en tout cas pour tes gracieuses aides

 

Lien vers le commentaire
Partager sur d’autres sites

Les polylignes 3d n'ont, par définition, pas de plan.

 

Faire un cotation automatique est déjà quelque chose de complexe en 2d et risque de souvent donner des résultats insatisfaisants.

En 3d, je pense que rien ne peut remplacer l'œil de l'utilisateur pour faire une cotation lisible en fonction de la vue choisie.

Je sais, c'est du boulot, mais on te paye pour ça ? non ?

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

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...

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é