Aller au contenu

Ventilation de surfaces


Messages recommandés

Posté(e)

Bonjour,

 

Grâce aux différents posts du forum j'ai pu réaliser une bonne partie des fonctions que j'imaginais pour nous faciliter la vie sur autocad.

 

Je bloque sur une fonction que j'avais imaginé et je ne sais pas si elle est réalisable :

 

- demander le coefficient

- sélectionner une ou plusieurs polyligne fermée.

- pour chaque polyligne ventiler la surface avec 11.50m² et le coefficient renseigné. Le reste de la surface (arrondi au décimètre) est indiqué à 0.10

 

Par exemple, si ma première polyligne fait 12.62m² alors j'aurais un bloc :

 

11.50 | 0.35

1.1 |0.10

 

Si la polyligne fait 11.50m² (arrondi) alors seulement la première ligne est renseignée.

 

Si la polyligne fait 11.40m² alors la surface totale est appliqué au coefficient indiqué :

11.40 | 0.35

 

Cela serait-il possible ?

 

Merci pour votre aide et vos informations.

  • Réponses 82
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Posté(e)

je m’immisce même si je ne suis pas sur de savoir répondre...

autocad sais tout faire quand il s'agit de dessiner ou de calculer (en tout cas avec les lisp) mais il en aucun cas autocad sait ventiler ,sauf quand je demande une hachure par point et que le ventilo de mon PC s'affole.

Donc, si tu veux une réponse, commence par poser une question qui ait un sens intelligible pour un programmateur. Quand tu dis:

pour chaque polyligne ventiler la surface avec 11.50m² et le coefficient renseigné.ça veux dire quoi?

faire souffler le PC ?poser un texte avec écrit "11.50m²" au centre de gravité de la surface fermée?renseigner un attribut de bloc? (quel nom du bloc et des attributs et peut etre un exemple en DWG)

ajouter un bloc ventilateur de 11.50m²Le coef est il fixe sur le dessin? propre à chaque poly?

Le reste de la surface (arrondi au décimètre) est indiqué à 0.10ça veux dire quoi?

déduire arbitrairement une poly dont la surface est égale à la surface totale S - 11.50?Faut il y poser un texte? où? valeur = S-Sv ou =0.10 ou (S-Sv)/10 ?

 

En relisant les réponses type que tu proposes je comprend encore moinssi S=12.62 d’où sort le 0.35? (12.62-11.5 = 1.12)

Bref, éclairci un peu le post car en l'état je doit pas être le seul à pas comprendre le Quoi avant de chercher le Comment

 

Posté(e)

Merci pour ton intervention.

 

Effectivement je n'ai peut être pas assez expliqué mes attendus.

 

Au début de la fonction, on nous demande quel coefficient utiliser. Ici je lui renseigne "0.35".

 

Après je sélectionne la polyligne et ensuite il me demande où placer le block.

 

Je précise ici qu'il utilise la surface arrondi au décimètre, donc 12.62m² devient 12.60m². Et que 11.50m² ne changera pas donc indiqué en dur dans le code.

 

Ce block contiendrait les informations suivante :

 

11.50 / 0.35

1.10 / 0.10

 

Si j'ai une polyligne de 13.18m², il arrondi à 13.20m² et indique le bloc suivant :

11.50 / 0.35

1.7 / 0.10

 

Si j'ai une polyligne de 10.48m², il arrondi à 10.50m² et indique le bloc suivant :

10.50 / 0.35

 

J'espère que cela est plus compréhensible maintenant ;)

 

Edit : je rajoute également que le texte affiché est bien "11.50 / 0.35" et pas le résultat de la division des deux.

Posté(e)

J'ai essayé de modifier le Lisp TotalArea de gile sans succès.

 

A la ligne :

 

((= (vla-get-TagString att) "UNIT")

(vla-put-TextString att (cadr data))

)

 

J'ai mis :

 

((= (vla-get-TagString att) "UNIT")

(vla-put-TextString att strcat(" / "(cadr data)))

 

Mais sans succès.

)

Posté(e)

Salut,

 

Sans vouloir aucunement préjuger tes capacités en LISP, je tiens quand même à signaler que vouloir modifier TotalArea nécessite une bonne connaissance de concepts avancés de Visual LISP comme, entre autres, les réacteurs.

 

Ceci dit, si tu veux qu'on puisse t'aider, tu devrais montrer ce que tu as déjà essayer d'écrire pour ta fonction et expliquer clairement comment, à partir des données en entrée (le coefficient spécifié par l'utilisateur et l'ire d'une polyligne) tu procèdes pour arriver aux résultats escomptés. Ceci s'appelle l'algorithme et souvent, un algorithme correctement décrit représente l'essentiel du travail, sa conversion en code est alors évidente.

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

Posté(e)

Pour le moment mes essais ont surtout constitué à modifier ton code Lisp.

 

J'arrive à afficher ce que j'ai besoin dans le bloc mais il reste pas mal à faire.

 

Vu que j'y connais pas grand chose c'était plus simple de partir de ton code :/

Posté(e)

Ok j'avance pas mal sur la modification du code pour avoir ce dont j'ai besoin.

 

Petite question (gile), lors de la mise à jour d'une polyligne, est-ce possible de récupérer la valeur d'un des attributs pour le modifier ?

Posté(e)

Coucou

 

Allez j'enfourche mon cheval de bataille encore une fois !

Pour Hydro8 :

Avant de démonter un lance-flammes pour allumer tes clopes essaie avec des allumettes.

 

Tes explications, sans être confuses, ne sont pas tout à fait compréhensibles

Ce qui ferait avancer les choses serait de déposer (wetransfer) un dessin avec deux ou trois exemples de ce que tu souhaites comme résultat

Comme ça on travaillerait avec tes blocs et tes données entrantes

Par exemple : le coefficient, c'est quoi ? une entrée de l'utilisateur ou bien doit-il être déduit de la superficie obtenue ?

Franchement je pense qu'en quelques lignes de code on arrive à faire ce que tu veux

Mets-toi à la place de ceux qui veulent t'aider et donne-leur les moyens de le faire.

C'est pas bien compliqué ce que tu demandes

 

Amicalement

Posté(e)

Pour le moment mes essais ont surtout constitué à modifier ton code Lisp.

 

J'arrive à afficher ce que j'ai besoin dans le bloc mais il reste pas mal à faire.

 

Vu que j'y connais pas grand chose c'était plus simple de partir de ton code :/

 

Pour abonder dans le sens de didier, partir d'un code existant dont on pense qu'il fait "un peu" ce qu'on souhaite est rarement une bonne idée, et ce n'est jamais une bonne idée quand on ne comprends pas tout ou parie de ce code.

Comme je l'ai déjà dit, TotalArea est un des LISP les plus complexes que j'ai publié et ce n'est certainement pas une bonne base pour débuter. Vouloir mettre à jour dynamiquement des attributs liés à une polyligne à l'aide réacteurs quand on ne sais pas bien comment modifier une valeur d'attribut, c'est un peu comme vouloir courir un marathon quand on sait à peine marcher.

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

Posté(e)

Bonjour

 

Merci de vos réponses. Effectivement je suis parti trop rapidement dans la modification de ce Lisp.

 

Pour que sa soit plus simple, voici un dwg du résultat a peu prêt voulu :

 

https://we.tl/t-DJThMkUHha

 

Contrairement à TotalAraa, je ne souhaite pas de fenêtre de configuration mais utiliser le clavier.

 

Et que la fonction continue quand on a sélectionné une polyligne ( en effet on ne pourra pas en sélectionner plusieurs ).

Posté(e)

Je ré-essaye une dernière fois.

 

Il faut que tu réalises bien qu'en programmation tu t'adresses à une machine qui, certes calcule très vite, mais est complètement dénuée d'intelligence et d'intuition.

Il faut donc que tu lui donnes dans le détail toutes les instructions nécessaires pour obtenir le résultat désiré. Dis toi qu'il faut faire de même quand tu t'adresses à des humains à qui tu demandes de l'aide.

 

- À commencer par les données en entrée, lesquelles sont spécifiées par l'utilisateur, lesquelles sont des constantes définies "en dur" dans le programme.

- Puis quelles sont les opérations à effectuer avec ces données pour arriver aux résultats souhaités.

- Et pour finir, que faire avec ces résultats.

 

Quand tu auras clairement définit chacune de ces taches, la structure de ton programme sera faite, il ne restera plus qu'à coder.

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

Posté(e)

C'est clair dans ma tête mais j'ai pas réussi a bien le transposer par écrit.

 

L'utilisateur lance la fonction. Elle lui dit :

 

"Sélectionnez la polyligne ou [C]oeff (0.35) ou ase (11.5)"

 

Si l'utilisateur choisit "C" out "B" il rentre la valeur qui deviendront les valeurs par défaut pour le prochain lancement.

 

L'utilisateur sélectionné la polyligne puis indique l'endroit où insérer le bloc.

 

Dans ce bloc il y a 4 données dont trois variables :

- le coefficient indiqué avec [C]

- la base si la surface de la polyligne est supérieur sinon la surface de la polyligne.

- la surface de la polyligne - base si elle est supérieure à 0 sinon 0.

- un coefficient de 0.10 indiqué en dur dans le bloc.

 

Une fois le bloc inséré, l'utilisateur est invité à sélectionner la prochaine polyligne etc....

 

J'espère que ces explications sont plus clairs que précédemment !

Posté(e)

C'est clair dans ma tête mais j'ai pas réussi a bien le transposer par écrit.

 

"le transposer par écrit", c'est précisément ce qu'on fait quand on écrit un programme, c'est pourquoi je me suis permis d'insister pour que tu le fasses d'abord en français.

 

On peut maintenant essayer de résoudre chacune des étapes, séparément dans un premier temps, en fonction de ce que sais déjà faire.

 

Pour la saisie des données, par exemple, tu auras besoin d'utiliser entsel pour inviter l'utilisateur à sélectionner une polyligne, mais aussi initget pour lui permettre d'entrer des options (Coeff ou Base), d'utiliser if ou cond pour analyser l'entrée utilisateur, le tout probablement dans une boucle while tant que le résultat n'est pas une polyligne.

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

Posté(e)

Coucou

 

À mon tour,

Merci de ces explications, tardives mais elles sont tout de même là

Il est écrit : "Sélectionnez la polyligne ou [C]oeff (0.35) ou base (11.5)"

Je pense qu'il faut comprendre, Sélectionner la polyligne, valider, ensuite entrer le coefficient, deux étapes, non ?

 

Dans l'exemple fourni : pourquoi une polyligne a un coef de 0.26 ?

Posté(e)

Enfaite les valeurs coeff et base ont une valeur par défaut (11.5/0.35) qui permet d'éviter que l'utilisateur les rentres la première fois (si c'est possible) et qu'il sélectionne directement la polyligne.

 

Le 23 correspond a une valeur de base différente de la valeur par défaut.

Posté(e)

Désolé

 

Je ne comprends pas la logique à suivre.

Par défaut il y a un coef de 0.35, on peut le mettre en choix prédéfini, OK

Et dans ce cas on écrit la superficie de la polyligne moins 11.5 et le reste à 0.10

Mais si l'utilisateur répond autre chose que 0.35 quelle est la valeur qu'il faut écrire

Car dans le fichier exemple je ne vois pas le rapport entre 23 à 0.26 et 4 à 0.10

 

Merci de clarifier pour qu'on puisse s'y mettre

 

Posté(e)

Le calcul est identique seul la base et le coefficient change.

 

Prenons une polyligne de 25m², si je laisse par défaut j'aurais :

 

11.5 / 0.35

13.5 / 0.10

 

Maintenant si en base je mets 23, j'aurais :

 

23 / 0.35

2.0 / 0.10

 

Édit :

 

Prenons B = Base / C = Coeff / S = surface polyligne

 

Var1 = if(S > B ){ B }else{ S }

Var2 = C

Var3 = if(S > B ){ S - B }else { 0 }

 

Mon block sera composé de :

 

Var1 | Var2

Var3 | 0.10

Posté(e)

Coucou

 

Je pense qu'il y a un réel problème de communication, qu'est-ce que tu es compliqué !!!

J'ai écrit un truc vite fait (sans vrais contrôles) pour voir si j'ai bien compris intégré tes explications

 

Donc tu choisis une polyligne, un message te demande de rentrer base ou 0.35, si tu valides à vide ce sera le 0.35 qui sera pris par défaut

Deux cas se présentent

La superficie est supérieure à 11.5 et dans ce cas : attribut 1 sera 11.5 attribut 2 sera 0.35 attribut 3 sera (surf-Poly moins 11.5)

La superficie est inférieure à 11.5 et dans ce cas : attribut 1 sera SurfPoly attribut 2 sera 0.35 attribut 3 sera 0.0

 

Si tu n'as pas validé à vide au message, tu rentres la valeur de la base puis le coefficient et dans ce cas :

attribut 1 sera "base" attribut 2 sera le coefficient attribut 3 sera (surf-Poly moins base)

 

Pour ce qui de ton bloc tu n'es pas vraiment dans les clous, c'est quoi ces étiquettes ? UNIT et LABEL et quelle est son unité de création ?

Tu as dû copier-coller depuis un autre dessin et je me permets de te conseiller de créer un bloc dédié avec un point d'insertion qui veuille dire quelque chose

C'est pas très "informatique" cette façon de faire.

 

Les contrôles porteront si le code va dans le sens attendu, sur le fait que la poly soit fermée ou pas, sur la sélection de polyligne et pas d'autre chose... et plus si tu veux

Voici le code vite fait sur le gaz :

 

Posté(e)
(setq poly (car (entsel "\nChoix de la polyligne\n")))
(setq polyvla (vlax-ename->vla-object poly))
(setq surf (vlax-get-property polyvla 'area))

(setq dec 1)

(setq choix (getreal "\nChoisissez Base ou le coef <0.35> (par défaut) : "))
(if (null choix)
 (setq choix 0.35)
 (progn
(setq choix2 (getreal "\nEntrez le coefficient\n"))
)
 )


(cond
 ((and (< surf 11.5)(= 0.35 choix)) (setq surf1 surf surf2 0.0))
 ((and (> surf 11.5)(= 0.35 choix)) (setq surf1 11.50 surf2 (- surf surf1)))
 ((/= choix 0.35)(setq surf1 choix choix choix2 surf2 (- surf surf1)))
 )
(setq pins (getpoint"\nPoint d'insertion du bloc ?\n"))
(command "_insert" "Totalarea" pins "10" "" ""  (rtos surf1 2 dec) (rtos choix 2 2) (rtos surf2 2 dec))

(princ)

Posté(e)

Salut Didier,

 

Je n'ai pas vu le fichier d'Hydro8 mais d'après ton message, UNIT et LABEL sont les définitions d'attributs du super lisp de gile, Totalarea. UNIT est pour indiquer l'unité² et LABEL pour mettre Chambre, Bureau, Salon, etc.Lorsqu'on utilise le bloc Totalarea avec le lisp Totalarea, lorsqu'on sélectionne un polyligne fermé, la superficie s'indique directement grâce à la troisième définition d'attribut. Celle-ci se modifie automatiquement lorsqu'on modifie la polyligne. Mais encore faut-il utiliser le lisp Totalarea avec le bloc Totalarea qui lui est associé pour que ça fonctionne.

 

Dans le cas présent, Hydro8 est partie sur la base du lisp Totalarea qu'il souhaitait modifier et je suppose donc, qu'il a utiliser le bloc qui va avec.

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Posté(e)

Oui tout à fait j'ai oublié de modifier les noms des variables dans le bloc de totalarea.

 

Merci en tout cas didier je vais tester sa le plus rapidement possible !

Posté(e)

Alors j'ai essayé, après avoir sélectionné le point d'insertion, j'ai une boîte de dialogue qui me demande de valider les données du block.

 

Une fois valider j'ai les messages ( en laissant les valeurs par défaut) :

- Commande inconnue "5"

- Commande inconnue "35"

- Commande inconnue "7"

Posté(e)

Coucou

 

C'est sans doute la variable ATTDIA qui n'est pas à la bonne valeur

Je crois me souvenir que c'est 0 ou 1, change-la et relance un test.

Toutefois je n'ai pas fait de code pour créer le bloc, s'il n'est pas reconnu en tant que définition de bloc dans le dessin de test tu seras chocolat !

Posté(e)

Alors effectivement la variable n'était pas à la bonne valeur.

 

Quand tu parles de définition tu veux dire pouvoir l'insérer avec le nom ?

 

Quand j'ouvre un nouveau dessin, que je fais insérer, il trouve bien "Totalarea".

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é