Aller au contenu

Question d\'un machot du code


Concombre_masque

Messages recommandés

Bonjour,

 

Est-ce qu'il est possible avec un code lisp de calculer la longueur d'une polyligne 3D, d'y appliquer une formule du type

 

x=3100

x1=((x*2)/5)+x

x2=((x1*2)/5)+x1

.

.

Autant de fois que necessaire pour arriver au bout de la polyligne.

 

Et ensuite, à chaque point x - x1 - x2... coller un bloc

 

Je fais 20 fois par jour ce genre de dessin, la ligne rouge est une polyligne 3D et les ronds bleus sont des blocs. Je fais ca à chaque fois, à la main et j'aimerais automatiser le trucs.

 

http://concombre.nuxit.net/temp/mur3d.jpg

 

Question bonus, est ce que ce code peut déterminer l'angle de la polyligne par rapport au plan xy afin d'appliquer une rotation 3D à chaque bloc ?

 

Merci de me guider.

 

[Edité le 17/11/2005 par Concombre_masque]

www.concombre-masque.com

 

Lien vers le commentaire
Partager sur d’autres sites

bonjour,

 

Est-ce qu'il est possible avec un code lisp de calculer la longueur d'une polyligne 3D

 

Sélectionner une polyligne

lancer la commande _list sur cet objet

récupérer la valeur de la variable PERIMETER

 

Pour ce qui est de placer des blocs le long d'une polyligne 3d, je pense qu'en utilisant les commandes autocad _divide (diviser) ou _measure (mesurer), tu devrais arriver a te simplifier la vie.

 

La commande DIVISER permet de placer un nombre déterminé d'objets[surligneur] ou de blocs [/surligneur] sur le pourtour d'un objet divisé en intervalles égaux. Les objets pouvant être divisés comprennent les arcs, les cercles, les ellipses et les arcs elliptiques, les polylignes et les splines.

 

La commande MESURER

Place des points[surligneur] ou des blocs [/surligneur]selon des intervalles mesurés sur un objet.

 

En plus, ces fonctions permettent d'aligner le bloc avec l'objet.

 

Je ne sais pas si ça répond à ta demande

 

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)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Une ébauche de code pour te donner le corps principal de la fonction.

Il ne te reste plus qu'a paufiner. (remplacer la commande "_.point" par "_.-insert" avec un bloc existant de ton dessin)

 

((lambda peut être remplacé par un (defun c:macommande, enlever dans ce cas la paranthèse fermante supplémentaire à la fin.

 

Rappel ((lambda est une fonction anonyme qui n'est executé qu'une seule fois lors de son chargement ou appel, elle ne reste pas en mémoire.

 

((lambda ( / ent vlaobj pt_org pt_end param_start param_end perim_obj x lst_pt x1)
(while (not (setq js (ssget "_+.:S" '((0 . "POLYLINE")(-4 . "< NOT")(-4 . "&") (70 . 112)(-4 . "NOT> "))))))
(vl-load-com)
(setvar "pdmode" 32)
(redraw (setq ent (ssname js 0)) 3)
(setq
	vlaobj (vlax-ename->vla-object ent)
	pt_org (vlax-curve-getStartPoint vlaobj)
	pt_end (vlax-curve-getEndPoint vlaobj)
	param_start (vlax-curve-getStartParam vlaobj)
	param_end (vlax-curve-getEndParam vlaobj)
	perim_obj (vlax-curve-getDistAtParam vlaobj param_end)
)
(setq x (getdist "\nAbscisse de départ: "))
(setq lst_pt (list (vlax-curve-getPointAtParam vlaobj (vlax-curve-getParamAtDist vlaobj x))))
(while (< x perim_obj)
	(setq x1 (+ (/ (* x 2.0) 5.0) x))
	(setq lst_pt (cons (vlax-curve-getPointAtParam vlaobj (vlax-curve-getParamAtDist vlaobj x1)) lst_pt))
	(setq x x1)
)
(foreach n lst_pt (command "_.point" n))
(redraw ent 4)
(prin1)
))

 

NB: Enlever les espace aprés le symbole "> " et "< "

 

[Edité le 18/11/2005 par bonuscad]

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

(defun c:divispe ( / ent vlaobj pt_org pt_end param_start param_end perim_obj x lst_pt x1)
  (setq js (car(entsel)))
  (vl-load-com)
  (setvar "pdmode" 32)
;;;   (redraw (setq ent (ssname js 0)) 3)
  (setq
    vlaobj (vlax-ename->vla-object js)
    pt_org (vlax-curve-getStartPoint vlaobj)
    pt_end (vlax-curve-getEndPoint vlaobj)
    param_start (vlax-curve-getStartParam vlaobj)
    param_end (vlax-curve-getEndParam vlaobj)
    perim_obj (vlax-curve-getDistAtParam vlaobj param_end)
    )
  (setq x (getdist "\nAbscisse de départ: "))
  (setq lst_pt (list (vlax-curve-getPointAtParam vlaobj (vlax-curve-getParamAtDist vlaobj x))))
  (while (     (setq x1 (+ (/ (* x 2.0) 5.0) x))
    (setq lst_pt (cons (vlax-curve-getPointAtParam vlaobj (vlax-curve-getParamAtDist vlaobj x1)) lst_pt))
    (setq x x1)
    )
  (foreach n lst_pt (command "_.point" n))
;;;   (redraw ent 4)
  (prin1)
  )

(toutes mes excuses à l'auteur :cool: )

 

et tape divispe

 

Mais reste un prob, l'orientation dans l'espace !

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

http://img501.imageshack.us/img501/5152/divispe2yn.jpg

 

(defun c:divispe ( / js vlaobj lipoints liang x  x1 compt)
 (setq js (car(entsel))lipoints nil liang nil)
 (vl-load-com)
 (setq vlaobj (vlax-ename->vla-object js))
 (setq x (getdist "\nAbscisse de départ: "))
 (if(vlax-curve-getPointAtDist vlaobj x)
   (progn
     (while (vlax-curve-getPointAtDist vlaobj x)
(setq x1 (+ (* x 0.4) x))
(setq lipoints (append lipoints(list(vlax-curve-getPointAtDist vlaobj x))))
(setq x x1)
)
     )
   )
 (setq  compt 0)
 (repeat (1-(length lipoints))
   (setq liang(append liang(list(angle(list(car(nth compt lipoints))(caddr(nth compt lipoints)))
			       (list(car(nth(1+ compt)lipoints))(caddr(nth(1+ compt)lipoints))))))
  compt(1+ compt)))  
 (setq  compt 0)
 (repeat (1-(length lipoints))
   (command "_insert" "bloc" (nth compt lipoints) 1 1 0 "_rotate3D" (entlast) "" "Y" (nth compt lipoints) (-(* 180(/(nth compt liang) pi))))
   (setq  compt(1+ compt))
   )  
  (princ)
  )

 

Ce code est très limité car il obtiendra la bonne direction si la poly a un Y constant (autrement dit qu'elle est sur un plan XZ).

 

De plus, et c'est IMPORTANT, le calcul de l'angle est fait entre un point et le suivant, alors gaffe ! Avant le virage, le bloc dévie toujours (le deuxi_ème en partant du bas ici, même si ca ne se voit pas. Le troisième est après le virage).[Edité le 18/11/2005 par Tramber]

 

Autre chose :

(defun c:divispe ( / js vlaobj lipoints liang x x1 compt)

(if (not (member "geom3d.arx" (arx)))

(arxload "geom3d"))

(setq js (car(entsel))lipoints nil liang nil)

........

 

à la place au début du code permettra de charger _3Drotate qui n'est pas chargé par défaut.

 

[Edité le 18/11/2005 par Tramber]

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Comprend pas, chez moi ca ne donne pas du tout le meme resultat.

 

http://concombre.nuxit.net/temp/mur3d2.jpg

 

le premier point que j'ai sélectionné est celui du bas. Le 2è l'extremité haute de la poly. J'ai n'importe quoi en résultat et je comprend rien au code :mad:

 

C'est bête ca semblait bien parti

www.concombre-masque.com

 

Lien vers le commentaire
Partager sur d’autres sites

J'ai (honteusement) repris le GETDIST de Bonuscad !

Si tu rentre cette distance, ca ne m'étonne pas que rien ne marche. Tu avais dit 3100. Ne saisi pas la distance qui dépasserait presque

Bien sur tu peux saisir au clavier ou à la souris.

 

Au fond de ton image, je vois des objets dans l'espace, tu es sur de tes points d'insertion ? Et puis, mieux vaut ravailler en SCG, au cas où.

 

Et n'oublie pas d'appeler ton bloc "bloc" (ou autre nom + original mais il faut modifier le mot dans le prog).

 

Je ne sais pas ce que tu ne piges pas dans le code mais :

(list(car(nth(1+ compt)lipoints))(caddr(nth(1+ compt)lipoints))))))

par exemple, sépare X zt Z de chaque point pour reconstituer une paire XY dans laquelle on calcule les angles d'une rotation 3D autour de Y.

 

Autrement dit, on cherche des angles dans un autre plan, par un simple tour de passe-passe !

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

J'ai (honteusement) repris le GETDIST de Bonuscad !

Si tu rentre cette distance, ca ne m'étonne pas que rien ne marche. Tu avais dit 3100. Ne saisi pas la distance qui dépasserait presque

Bien sur tu peux saisir au clavier ou à la souris.

 

Hmm, je me suis un peu embrouillé aussi, je vais changer la valeur 0,4 car 3100 c'est de millimètres et le +2 *5 c'est des mètres. Ca je pense pouvoir y arriver comme un grand.

 

OK, je n'avais pas compris ca comme ca, je pensais qu'il fallait entrer le point de depart de la poly et la fin.

 

Au fond de ton image, je vois des objets dans l'espace, tu es sur de tes points d'insertion ?

 

Oui, ce sont les blocs qui ont été collés par le code.

 

Et puis, mieux vaut ravailler en SCG, au cas où.

 

Effectivement, désormais les blocs sont bien sur la polyligne mais pas aux bons endroits.

 

Et n'oublie pas d'appeler ton bloc "bloc" (ou autre nom + original mais il faut modifier le mot dans le prog).

 

Fait, j'ai gardé bloc pour les tests chez moi, je changerais au boulot.

 

Je ne sais pas ce que tu ne piges pas dans le code mais :

(list(car(nth(1+ compt)lipoints))(caddr(nth(1+ compt)lipoints))))))

par exemple, sépare X zt Z de chaque point pour reconstituer une paire XY dans laquelle on calcule les angles d'une rotation 3D autour de Y.

 

Autrement dit, on cherche des angles dans un autre plan, par un simple tour de passe-passe !

 

Ouh la la. Bon ca c'est un autre probleme, pour l'instant l'angle n'est pas bon parce qu'il faut que je modifie le bloc de 90° afin qu'il soit dans le bon plan.

 

Ce que je n'ai pas saisi c'est la fonction qui test si il faut ajouter encore un bloc ou pas selon si on est au bout de la poly ou pas. Parce que des fois mes volumes font 5000 mm de haut et des fois ils font 12000 mm donc forcement, il y a plus de points

 

Je vais essayer de paufiner tout ca et je reviens pleurer si j'y arrive pas :)

www.concombre-masque.com

 

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é