Aller au contenu

Quelle fonction utiliser pour des objets?


Messages recommandés

Posté(e)

Bonjour à tous!

 

Dans ma programmation, j'insère des commandes dans cet ordre là :

 

commande "inserer"

commande "reseau"

commande "miroir"

 

Tout d'abord, j'insère un bloc, ensuite je le copie en réseau, puis pour finir, je voudrai faire un miroir de toute ces copies.

 

Voici le passage en question :

 

(command

"scu" "3" pt1 (polar pt1 ang0 1)(polar pt1 (+ ang0 (/ pi 2)) 1)

"inserer" "B250" "0" "1" "1" "0"

"reseau" "d" "" "rec" "1" nbbanche "2.50"

"miroir" "d" "" (setq mil1 (getpoint "\n 1er point :" )) (setq mil1 (getpoint "\n 2ème point :" )) "n" )

 

Sauf qu'en faisant ceci, le miroir s'exécute uniquement pour le dernier bloc et c'est normal car j'ai écris "miroir" "d" (comme dernier). Du coup, je voulais remplacer "d" par une fonction (setq objet (....)). Et justement, quelle est cette fonction qui sert à sélectionner des objets?

 

Je sais que :

pour les angles = getangle

pour les distances = getdist

pour les points = getpoint

...

et pour les objets???????

 

Merci d'avance, bonne fin de journée à tous!

Posté(e)

Tu as (entlast), équivalent de "D". Mais n'oublie pas une fois ENTREE ou " " pour validerton choix d'objet.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Tu as (entlast), équivalent de "D". Mais n'oublie pas une fois ENTREE ou " " pour validerton choix d'objet.

 

Justement, je ne veux pas l'équivalent de "d" puisque "d" c'est que le dernier objet. Moi je veux tous les objets qui ont été copié en réseau.

Posté(e)

Salut

 

Une astuce pour retrouver tous les objets qui ont été ajoutés.

Après l'insertion d'un bloc, tu utilises (setq dernier (entlast)) pour retrouver le dernier objet de la base de données d'Autocad (en l'occurrence, l'objet inséré)

Tu fais toutes tes manips, réseau, miroir, etc... et tu utilises la fonction lisp entnext sur la variable dernier pour retrouver le/les objets qui ont été ajoutés.

Tu utilises autant de fois entnext qu'il y a d'objets ajoutés. Un entnext sur le dernier objet devra retourner nil.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e) (modifié)

Bonjour,

Etudie plus particulièrement les fonctions entlast, entnext et ssadd

Tout d'abord, j'insère un bloc, ensuite je le copie en réseau, puis pour finir, je voudrai faire un miroir de toute ces copies.

 

 

Rapidement l’idée général pour ce que tu souhaite faire :

 

 

En 1 : Après avoir inséré ton bloc, récupère avec entlast le nom de l’entité dessin que tu viens de créer, puis crée ensuite un jeu de sélection vide dans lequel tu stockera cette entitée (tu viens en quelque sorte d’obtenir un marqueur dans ta base de données)

Le code en lisp :

(setq e (entlast)); récupère le nom de la dernière entité
(setq ss (ssadd)); Crée un jeu de sélection vide
(ssadd e ss); place l'entité dans le jeu de sélection

 

 

En 2 : Tu crées ton réseau comme tu le faisais précédemment, puis avec la fonction entnext et une itération tu liste toutes les entités nouvellement créé, que tu ajoutes à ton jeu de sélection, comme ceci…

(while (setq e (entnext e))
 (ssadd e ss)
)

 

 

En 3 : Dans ta ligne de command miroir au lieu de donné "d" en paramètre tu passe ss (ton jeu de sélection de toutes les entités créer précédemment..)

 

A+ et bonne continuation

 

 

 

-----------------------

Edit : Visiblement je viens de faire de l’écho au message de Patrick_35 qui a été plus rapide..

Modifié par VDH-Bruno

Apprendre => Prendre => Rendre

Posté(e)

salut,

 

Plus personne ne veut me répondre? :)

 

je répète : quand j'écris ceci dans mon programme,

 

(setq e (entlast))

(setq ss (ssadd))

(ssadd e ss)

 

Pour passer de l'un à l'autre il faut que j'appuis sur entrée à chaque fois. Le passage ne se fait pas automatiquement. Pourquoi?

 

Merci d'avance

Posté(e)

Mais ?

Tu n'as pas inclus tout cela dans une fonction ?

 

(defun c:maf ()

...

(setq e (entlast))

(setq ss (ssadd))

(ssadd e ss)

...

)

 

A charger avant de lancer MAF ?

 

J'avoue que je ne comprends pas trop la question.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

ben j'ai fais comme ca moi :

 

(defun c:test9 ()

 

(command "scu" "")

(setq ACC (getvar "osmode")); désactivation de l'accroch objet

(setvar "osmode" 0)

 

(setq long (getdist "\n donner la longueur du voile :" ))

(setq larg (getdist "\n donner la largeur du voile :" ))

(setvar "OSMODE" ACC)

(setq pt1 (getpoint "\n spécifier le point d'insertion : "))

(setq rep (getstring "\n voulez-vous inserer votre banche à gauche? (o/n) : "))

(setq ang0 (getangle pt1 "\n angle d'orientation des banches /Ox :"))

(setvar "osmode" 0)

 

 

 

(setq nbbanche (rtos (fix (/ long 2.5)) 2 0))

(setq demilarg (/ larg -2))

(setq p1 (list 0 demilarg))

(setq p2 (list 1 demilarg))

 

 

 

(setvar "cmdecho" 0)

(if (= rep "o")

 

(command

"scu" "3" pt1 (polar pt1 ang0 1)(polar pt1 (+ ang0 (/ pi 2)) 1)

"inserer" "B250" "0" "1" "1" "0"

 

"" (setq e (entlast))""; récupère le nom de la dernière entité insérer : soit le bloc

(setq ss (ssadd)); Crée un jeu de sélection vide

(ssadd e ss); place l'entité dans le jeu de sélection

 

 

"reseau" "d" "" "rec" "1" nbbanche "2.50" ""

 

(while

(setq e (entnext e))

(ssadd e ss)

 

)

 

"miroir" ss "" p1 p2 "n" )

;"miroir" (setq NJ (ssget "\n choisir un ensemble d'objet :")) "" (setq mil1 (getpoint "\n 1er point :" )) (setq mil1 (getpoint "\n 2ème point :" )) "n" )

(command "inserer" "B250bis" pt1 "1" "0")

 

 

 

)

 

(command "scu" "g")

(setvar "OSMODE" ACC)

 

 

(setq reponse (strcat "la longueur est de " (rtos long 2 4) " m et la largeur de " (rtos larg 2 4) " m" ))

 

)

Posté(e)

Il est INTERDIT de mélanger du code lisp et de l'instruction de commande (COMMAND)

 

Donc je corrige ton IF en prenant PROGN pour grouper tes instructions :

 

(if (= rep "o")
   (progn
     (command  "scu" "3" pt1 (polar pt1 ang0 1)(polar pt1 (+ ang0 (/ pi 2)) 1)
	"inserer" "B250" "0" "1" "1" "0")
     (setq e (entlast))
     (setq ss (ssadd))
     (ssadd e ss)
     (command   "reseau" "d" "" "rec" "1" nbbanche "2.50" "")
     (while
(setq e (entnext e))
(ssadd e ss)
)
     (command      "miroir" ss "" p1 p2 "n" )
     (command "inserer" "B250bis" pt1 "1" "0")
     )
   )

 

Je n'ai pas débuggé ma propre suggestion, à toi de bien vérifier, tu y es presque maintenant ;)

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Bonsoir!!

 

J'ai encore une question à ce sujet...

 

Une fois que j'ai insérer mon bloc, que j'ai fais un réseau et un miroir, je dispose donc d'un ensemble de bloc.

Si j'ai besoin de copier ou de déplacer cet ensemble de bloc, comment je peux faire pour tous les sélectionner?

 

Je crois avoir compris qu'il va falloir que j'utilise ssget...mais après plusieurs tentatives, je sèche...

 

Je sais qu'on peut faire une sélection par nom de bloc, mais je ne peux pas l'utiliser car d'autre bloc du même nom font partis de mon plan, et je ne dois surtout pas les toucher.

 

merci d'avance...

Posté(e)

Bonjour,

 

Si j'ai besoin de copier ou de déplacer cet ensemble de bloc, comment je peux faire pour tous les sélectionner?

Comme la demande est assez similaire à la précédente, je t’invite à relire ma réponse précédente que je vais compléter …

 

Donc en partant du postulat que tu as réussi à construire un jeu de sélection contenant toutes les entités créer par ta commande réseau.

Tu souhaites compléter ce jeu de sélection par toutes les entités créer par la commande miroir, pour cela tu peux procéder comme précédemment en utilisant un "marqueur" dans la base de donnée ou alors pour compléter ton arsenal de fonction utilise sslength et ssname, ce qui te retournera respectivement le nombre d’éléments de ton jeu de sélection et le nom d’entité à l’indice spécifié.

 

Donc pour récupérer le nom de la dernière entité ajouté à ton jeu de sélection :

(setq e (ssname ss (1- (sslength ss))))

 

Puis pour compléter ton jeu de sélection avec toutes les entités nouvellement créé par ta commande miroir (ou autre):

(while (setq e (entnext e))
 (ssadd e ss)
)

 

Maintenant tu peux passer ss en argument à la commande copier ou déplacer.

 

A+

Apprendre => Prendre => Rendre

Posté(e)

ok merci, je vais essayer ca.

 

Heu... un truc qui n'a rien à voir...

 

Dans mon programme, j'ai écris :

 

(setq long (getdist "\n donner la longueur du voile :"))

(setq L1 (+ long 0.4))

(setq N1 (/ L1 2.50))

(setq reste (rem L1 2.50))

 

Pour traduire ceci:

 

long : soit j'entre la valeur numérique au clavier, soit je sélectionne 2 points qui définira ma longueur

L1 : à cette longueur j'y ajoute 0.4m

N1 : je divise ma nouvelle longueur L1 par 2.50m

reste : il me renvoit le reste de la division si elle existe.

 

Un problème s'impose pour cet exemple :

 

Soit: long = 12.1

Alors: L1= 12.1+0.4 = 12.5

N1 = 12.5/2.5 = 5

Et reste = 0

 

Quand j'entre au clavier "long" = 12.1, il me renvoit ces valeurs ci-dessus. Seulement, quand je sélectionne 2 points de distance 12.1, il me renvoit toute ces valeurs sauf "reste" où "reste" = 2.5

 

On dirait qu'il me dit que dans "12.5", il y a "4x2.5" et qu'il reste "2.5". Mais pourtant, pour la division de "12.5/2.5" il me renvoit bien "5" .

Donc il traduit bien que dans "12.5", il y a "5x2.5" mais qu'il reste quand même 2.5... c'est incohérent! mais je ne sais pas pourquoi... une idée?

Posté(e)

Re,

 

Quand j'entre au clavier "long" = 12.1, il me renvoit ces valeurs ci-dessus. Seulement, quand je sélectionne 2 points de distance 12.1, il me renvoit toute ces valeurs sauf "reste" où "reste" = 2.5

 

Je vois que tu bloques toujours sur le même problème à savoir la précision à l’affichage et les arrondies, nous en avons déjà discuté dans ce postil me semble... Je ne sais pas trop ce que je peux ajouter de plus. Peut-être que quelqu’un d’autre saura mieux se faire comprendre que moi...

 

 

En tentant une dernière explication si tu entre au clavier une distance, tu as vraiment la distance à la précision saisie. Maintenant si tu récupère la distance entre 2 points, il se peut suivant la précision de ton dessin que la distance réelle ne soit pas tout à fait égale à 12.1 même si à l’affichage (ou en mesurant) cela semble être le cas.

 

Il n’y a donc rien de surprenant aux résultats que tu donnes, à toi d’intégrer cela dans tes routines, à la saisie au moyen d’une fonction round (cf lien précèdent) ou dans tes tests de comparaisons au moyen de la fonction equal

 

A+

Apprendre => Prendre => Rendre

Posté(e)

ben en fait si, j'ai tenu compte de notre discussion précédemment car grace a tes conseils, j'ai pu corriger pleins de problèmes, et créer d'autres fonctions. Mais je suis certaine que la distance fait 12.1, car j'ai créé une ligne de distance 12.1, c'est moi qui l'ai faite cette ligne, et qui ai rentré sa longueur... c'est pour ca que je ne comprends pas.

Posté(e)

bon...je pense avoir trouvé...mais il est vrai que j'ai toujours un problème avec les précisions, mais je commence a bien tout comprendre, je pense qu'il fallait juste un petit rappel... Merci

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é