Aller au contenu

Déplacer objets graçe à LISP


GautierVsr

Messages recommandés

Bonjour,

Néophyte sur Autolisp, je cherche à déplacer des objets 3D de mon espace graphique Autocad, sans que l'utilisateur n'ai à intervenir.

L'utilisateur n'intervient qu'une seule fois, au début, pour sélectionner tous les objets qui seront à déplacer (tous les objets du jeu de sélection).

Voici mon code pour le moment :

(defun c:coffrage()
  (setq jeu (ssget))
  (repeat (setq compteur (sslength jeu))
        (setq objetadeplacer (ssname jeu 0))
        ;déplacer objetadeplacer (nom du premier élément de ma liste de jeu) de la valeur d'un certain vecteur
        (setq jeu (cdr (jeu)))
        
   )

)

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Il va falloir donner un peu plus d'explications car à ce stade, je ne comprends pas où on peut gagner du temps par rapport à la commande déplacer...
Parce que sinon l'exercice peut se faire directement via un (command) >_<

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Pas de soucis, je contextualise :

Dans ma boite, nous faisons des pièces en bois qui étaient, jusqu'à maintenant, coupées et assemblées par nos menuisiers. La découpe est longue et fastidieuse et dans le but de faciliter cette tâche, nous avons acheté une machine de découpe de plaques de contreplaqués de 21mm d'épaisseur.
Mon entreprise me demande de créer un programme sur AutoCad permettant plusieurs choses :
  • À partir d'un assemblage de pièces 3D, séparer/éclater (en les déplaçant) tous les objets « solide 3D » afin qu’ils ne soient pas en conflit en vue en plan
  • Orienter tous les pièces dans le même sens (pour chaque pièce, la plus petite épaisseur (de 21mm) doit être alignée avec l'axe Z ; reviendrait à dire "plus grande surface doit être normale à l'axe Z")

Il me faut donc dans un premier temps, séparer chaque solide et les espaçant tous les uns des autres par en vecteur qui sera définit pas l'utilisateur de préférence. Suite à ca, il faudrait que mes pièces soient orientée dans le sens de Z.

En fait, la machine va digérer le dwg final en analysant la géométrie de chaque pièce en vue en plan.

Voili voilou, j'espère avoir été assez clair ! :))

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @GautierVsr

Dans les explications il est question de 2D et de 3D, pourquoi ?
Les solides sont simples ou plus évolués ? Cubes et parallélépipèdes ou surfaces gauches ?
Je ne comprends pas le coup de "alignée en Z", ça veut dire "vue en plan" tout simplement ?

Un fichier serait le bienvenu.

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @GautierVsr

OK, rien à voir avec la 3D donc.
Je ne sais pas comment se nomme cette opération, mais je dirais "mise en plan des éléments".

On peut avoir le DWG car j'ai pas spécialement envie de le refaire pour tester.

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

@didier, tu t'en occupes ? 😉
Donc si je comprends bien, le but est de déplacer chaque pièce non pas d'une distance équivalente de la position initiale mais de N fois la distance spécifiée en fonction de la position des objets dans le jeu de sélection, right ? Donc le premier objet du jeu de sélection sera à 0 x Distance et le dernier objet N du jeu de sélection sera à N x Distance ?

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @didier,

Non, rien à voir avec la forme des solides, je cherche juste à leur affecter un déplacement chacun, puis à bien les orienter indépendamment les uns des autres.

S'il y a une fonction permettant cela, je suis preneur ! 😄 mais ca m'étonnerait...du moins de je la trouve pas 😢

Yes, je te mets le dwg en lien !

Coffrage 3D.dwg

Lien vers le commentaire
Partager sur d’autres sites

C'est exactement ça pour la première étape @Luna !

Voici le code que j'ai pour le moment mais il ne fonctionne pas (je crois que le getreal ne va pas)...je sens quand même que je suis sur la bonne voie :

 

(defun c:test()
(setq distance_deplacement (getreal "Renseigner ecartement des objets"))
(setq p0 '(0.0 0.0))
(setq p1 '(distance_deplacement 0.0))
(setq index_objet_a_deplacer (0))
(setq jeu (ssget))
(setq objet (ssname jeu index_objet_a_deplacer))
(repeat (setq i (sslength jeu))
    (command "deplacer" objet "" p0 p1)
      (setq objet (ssname (1+ jeu index_objet_a_deplacer)))
      (setq distance_deplacement (* distance_deplacement jeu index_objet_a_deplacer))

)

  )

Merci pour le temps que vous m'accordez ! 🙂

Lien vers le commentaire
Partager sur d’autres sites

@GautierVsr

Il semble que tu aies compris l'esprit, mais que tu ne saches pas transformer le langage naturel en lsp

As-tu testé ton code ?
Je dirais que non, car tu devrais poser des questions sur les messages d'erreur provoqués.

En même temps je ne pense pas que le déplacement doit être une valeur constante en réfléchissant un petit peu.

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @GautierVsr

De l'aide, pas de souci...

Préférez-vous que j'explique en langage naturel ce qui ne va pas ?
Ou dois-je fournir un code corrigé ?

Les deux sont possibles et dépendent de votre implication dans l'apprentissage.

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @didier,

Un code corrigé serait bien, je comprendrai mes erreurs par la suite.

Update, voici la dernière version de mon code qui s’exécute mais qui ne déplace pas les objets comme souhaité :

 

(defun c:coffrage()

  (command "-purger" "tout" "*" "oui")
  (command "ZOOM" "etendu")
  (setq distance_deplacement (getreal "Renseigner ecartement des objets"))
  (setq p0 '(0.0 0.0))
  (setq p1 '(distance_deplacement 0.0))
  (setq index_objet_a_deplacer 0)
  (setq jeu (ssget))
  (setq objet (ssname jeu index_objet_a_deplacer))
  (repeat (sslength jeu)
  	(command "deplacer" objet "" p0 p1)
  	(setq index_objet_a_deplacer (1+ index_objet_a_deplacer))
  	(setq objet (ssname jeu index_objet_a_deplacer))
    	(setq distance_deplacement (* distance_deplacement index_objet_a_deplacer))

   	
   )
)

Chaleureusement

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Voici comment je corrige ton code actuel, je te laisse consulter (et comprendre) les nuances entre les deux.

(defun c:coffrage ( / distance_deplacement p0 p1 index_objet_a_deplacer jeu objet)
  (command "_.-purge" "_all" "*" "_yes")
  (command "_.ZOOM" "_extent")
  (initget 7)
  (setq distance_deplacement (getreal "\nRenseigner ecartement des objets: "))
  (setq p0 '(0.0 0.0))
  (setq p1 (list distance_deplacement 0.0))
  (setq index_objet_a_deplacer 0)
  (setq jeu (ssget))
  (repeat (sslength jeu)
	(setq objet (ssname jeu index_objet_a_deplacer))
  	(command "_.move" objet "" p0 p1)
  	(setq index_objet_a_deplacer (1+ index_objet_a_deplacer))
	(setq p1 (list (+ (car p1) distance_deplacement) 0.0))
   )
   (prin1)
)

 

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

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é