Hydro8 Posté(e) le 7 février 2019 Posté(e) le 7 février 2019 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.351.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.
x_all Posté(e) le 7 février 2019 Posté(e) le 7 février 2019 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 quelques trucs sur autocad
Hydro8 Posté(e) le 7 février 2019 Auteur Posté(e) le 7 février 2019 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.351.10 / 0.10 Si j'ai une polyligne de 13.18m², il arrondi à 13.20m² et indique le bloc suivant :11.50 / 0.351.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.
Hydro8 Posté(e) le 7 février 2019 Auteur Posté(e) le 7 février 2019 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. )
(gile) Posté(e) le 7 février 2019 Posté(e) le 7 février 2019 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
Hydro8 Posté(e) le 7 février 2019 Auteur Posté(e) le 7 février 2019 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 :/
Hydro8 Posté(e) le 8 février 2019 Auteur Posté(e) le 8 février 2019 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 ?
didier Posté(e) le 9 février 2019 Posté(e) le 9 février 2019 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éhensiblesCe qui ferait avancer les choses serait de déposer (wetransfer) un dessin avec deux ou trois exemples de ce que tu souhaites comme résultatComme ça on travaillerait avec tes blocs et tes données entrantesPar 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 veuxMets-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 Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 9 février 2019 Posté(e) le 9 février 2019 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
Hydro8 Posté(e) le 9 février 2019 Auteur Posté(e) le 9 février 2019 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 ).
(gile) Posté(e) le 9 février 2019 Posté(e) le 9 février 2019 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
Hydro8 Posté(e) le 9 février 2019 Auteur Posté(e) le 9 février 2019 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 !
(gile) Posté(e) le 9 février 2019 Posté(e) le 9 février 2019 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
didier Posté(e) le 9 février 2019 Posté(e) le 9 février 2019 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 ? Éternel débutant... Mon site perso : Programmer dans AutoCAD
Hydro8 Posté(e) le 9 février 2019 Auteur Posté(e) le 9 février 2019 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.
didier Posté(e) le 9 février 2019 Posté(e) le 9 février 2019 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, OKEt dans ce cas on écrit la superficie de la polyligne moins 11.5 et le reste à 0.10Mais si l'utilisateur répond autre chose que 0.35 quelle est la valeur qu'il faut écrireCar 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 Éternel débutant... Mon site perso : Programmer dans AutoCAD
Hydro8 Posté(e) le 9 février 2019 Auteur Posté(e) le 9 février 2019 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.3513.5 / 0.10 Maintenant si en base je mets 23, j'aurais : 23 / 0.352.0 / 0.10 Édit : Prenons B = Base / C = Coeff / S = surface polyligne Var1 = if(S > B ){ B }else{ S }Var2 = CVar3 = if(S > B ){ S - B }else { 0 } Mon block sera composé de : Var1 | Var2Var3 | 0.10
didier Posté(e) le 10 février 2019 Posté(e) le 10 février 2019 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éfautDeux cas se présententLa 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 choseC'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 veuxVoici le code vite fait sur le gaz : Éternel débutant... Mon site perso : Programmer dans AutoCAD
didier Posté(e) le 10 février 2019 Posté(e) le 10 février 2019 (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) Éternel débutant... Mon site perso : Programmer dans AutoCAD
Steven Posté(e) le 10 février 2019 Posté(e) le 10 février 2019 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.
didier Posté(e) le 10 février 2019 Posté(e) le 10 février 2019 Coucou Je m'en doutais quelque peu et je maintiens, sans lui manquer de respect, que c'est une mauvaise façon de faire et une vraie "fausse bonne idée" Amitiés à Toi mon copain que j'ai... Éternel débutant... Mon site perso : Programmer dans AutoCAD
Hydro8 Posté(e) le 10 février 2019 Auteur Posté(e) le 10 février 2019 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 !
Hydro8 Posté(e) le 10 février 2019 Auteur Posté(e) le 10 février 2019 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"
didier Posté(e) le 10 février 2019 Posté(e) le 10 février 2019 Coucou C'est sans doute la variable ATTDIA qui n'est pas à la bonne valeurJe 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 ! Éternel débutant... Mon site perso : Programmer dans AutoCAD
Hydro8 Posté(e) le 11 février 2019 Auteur Posté(e) le 11 février 2019 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".
Messages recommandé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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant