SURF x coeff

SURF x coeff

joan.eychenne
Explorer Explorer
2 172 Visites
15 Réponses
Message 1 sur 16

SURF x coeff

joan.eychenne
Explorer
Explorer

Bonjour à toute la communauté,

 

je réalise des plans de plantation où je dois annoter chaque zone de plantation (hachure différentes pour chaque plante) avec les quantités nécessaires de plantes pour chaque zone.

 

Donc en fonction de la surface en m2 (mon dessin étant dessiné en cm) j'aimerai appliquer une série de coefficient pré-enregistré type :

- x 1 lorsque je met 1 plante au m2

- x 2 lorsque je met 2 plantes au m2...

- x 4 etc

- x 6 etc

- x 9

...

 

pour que s'affiche, d'un simple clic sur mon objet polyligne, le nombre de plantes adéquat selon la surface et la densité de plantation (coeff) choisies.

 

ex : pour une surface de 50000 cm2, et pour une plante de densité x5, j'aimerai voir affiché : "25u" 

 

J'ai bien essayé l'option CHAMPS type OBJET et AIRE, puis d'ajuster le format coeff puis suffixe pour obtenir le résultat souhaité sauf que je ne peux pas enregistrer ces paramètres et je dois pour chacune des zones refaire la manipulation ce qui est une forte perte de temps.

 

Je pense que ma requete doit pouvoir se gérer avec une LISP mais je n'ai aucune connaissance en la matière

 

Merci ENORMEMENT à celui ou celle qui trouvera la réponse.

 

Jojo

0 J'aime
Solutions acceptées (2)
2 173 Visites
15 Réponses
Replies (15)
Message 2 sur 16

x-all
Advocate
Advocate

pour un lisp, ça m'a l'air pas super adapter... je suis pas un super développeur, mais insérer un bloc avec un coèlf suivant le type de hachure, ça me parait un travail démesuré pour ce qu'il y a a faire. Un petit aller retour vers excel serai peut être plus simple

tu fait un bloc avec 3 attributs 

surface, nbr de plante, coèf.

une extraction vers excel (via les xpresstools ou des lisp)

une petite formule pour calculer nbr de tes plantes, et import pour mise à jour

 

 

(gile) à fait un super code pour poser des blocs liés à la surface d'une poly (il y a même un coéf paramétrable, mais de là à le lier au type de hachure...) . Tu peux partir de son bloc et le modifier pour  ajouter des attributs cherchez TotalArea sur son site

 

 

 

Message 3 sur 16

O_Eckmann
Mentor
Mentor

Bonjour,

 

si tu disposes de MAP3D ou Civil3D (et pas un simple AutoCAD) on est typiquement dans une problématique SIG (ou cartographique).

On associe la densité (et éventuellement de type de plantes) sous forme de données d'objet sur chaque polyligne.

A partir de là on peut coloriser et/ou choisir son type de hachure selon la densité ou le type de plante

Et une étiquette à partir d'un gabarit d'annotation qui calcule la surface*coef permettrait d'afficher la valeur souhaitée en un seul clic et ce de manière "dynamique" si une donnée change.

 

Olivier

Olivier Eckmann

EESignature

0 J'aime
Message 4 sur 16

joan.eychenne
Explorer
Explorer
Je ne possède malheureusement pas ces modules d’autocad. Je cherche une petite formule simple avec qq coefficient pré enregistré pour editer rapidement ces étiquettes
Merci bcp à celui qui trouvera.

0 J'aime
Message 5 sur 16

joan.eychenne
Explorer
Explorer

ci joint un exemple très basique de ce que je recherche

0 J'aime
Message 6 sur 16

tramber
Advisor
Advisor

Dessines-tu en cm ? Cela n'est pas clair.

Tu peux utiliser ce petit lisp à lancer avec POSEU

(defun c:poseU( / ent aire pins rep)
  (or *densite*(setq *densite* 1))
  (setq ent(car(entsel"\nSelectionner l'objet")))
  (cond((=(cdr(assoc 0(entget ent)))"LWPOLYLINE")
	(setq aire(/(vla-get-area (vlax-ename->vla-object ent))10000.0))
	(setq pins(getpoint"\nPoint d'insertion :"))
	(setq rep(getreal (strcat"\nCoefficient <"(rtos *densite* 2 2)"> :")))
	(setq *densite*(cond(rep)(*densite*)))
	(command "_TEXT" pins 5 0 (strcat (rtos(* aire *densite*)2 2)" & "(rtos aire 2 2)" m²"))
	)
       )
  )
  

Désolé pour les possesseurs de LT. Il faudrait alors des manipulations d'échelles avant de récupérer une aire.

 


EESignature

Message 7 sur 16

O_Eckmann
Mentor
Mentor

Bonjour,

 

voilà un bout de code qui devrait faire l'affaire :

 

(defun C:ETIQU ( / dEchelle dHauteur oPoly oPolyLst PT dAire iNombre)
  (setq dEchelle (getreal "\nFacteur d'échelle des surfaces : "))
  (setq dHauteur (getdist "\nHauteur des textes : "))
  (while (and (setq oPoly (car (entsel "\nSélectionner le contour : ")))
	      (setq oPolyLst (entget oPoly))
	      (= "LWPOLYLINE" (cdr (assoc 0 oPolyLst)))
	      (setq dDens (cdr (assoc 39 oPolyLst)))
	      (> dDens 0)
	      (setq PT (getpoint "\nPosition de l'étiquette : "))
	      (setq PT (trans PT 1 0))
	 )
    (setq dAire (* dEchelle (vla-get-area (vlax-ename->vla-object oPoly))))
    (setq iNombre (fix (* dAire dDens)))
    (entmakex (list (cons 0 "TEXT")
		    (cons 100 "AcDbEntity")
		    (cons 8 (getvar "CLAYER"))
	 	    (cons 100 "AcDbText")
		    (cons 10 PT)
		    (cons 40 dHauteur)
		    (cons 1 (itoa iNombre))
		    (cons 7 (getvar "TEXTSTYLE"))
		    (cons 50 0.0)
		    (cons 100 "AcDbText")
 	      )
    )
  )
)

Ce lisp lit la densité dans la propriété Epaisseur de la polyligne (section générale depuis l'OPM)

La formule utilise "facteur d'échelle des surfaces" * "Aire de la polyligne" * "Densité"

 

Olivier

 

Olivier Eckmann

EESignature

0 J'aime
Message 8 sur 16

joan.eychenne
Explorer
Explorer

GENIALLLLLL Tramber Smiley clignant de l'œil !!!! Ca marche, vous êtes mon sauveur !!!!

 

Seulement éventuellement un tout petit détail à perfectionner, serait-il possible de faire afficher seulement

  • Soit La densité avec l’unité - toujours « u » (ex : 25 u) sans la surface en m2
  • ou encore mieux la densité + unité (u) + indice du nom de la plante (ex : 25 u de Q . pub) - indice qui pourrait être entré comme le coeff. dans votre lisp

je ne me rends pas du tout compte mais cela vous semble-t-il possible de le rendre également lié et adaptatif à la surface, c'est à dire que si je modifie ma surface que mon étiquette se mette à jour ?

 

 

Mais d’ores et déjà un GRAND merci et un grand bravo pour votre maîtrise.

Chaleureusement,

 

Joan

0 J'aime
Message 9 sur 16

reb_c1
Mentor
Mentor

Bonjour,

 

Voici un exemple qui fonctionnerait aussi avec des versions LT...

 

1. Tu décompresses le ZIP...

2. Tu ajoutes le dossier qui contient le DWG dans le dossier support via les options AutoCAD

3. Tu charges la palette d'outils qui est dans le dossier SV_Palettes

 

Tu choisis le nombre de plantes, puis tu sélectionnes le contour, tu renseigne le nom de la zone et tu place l'étiquette !

 

Pour info, la barre d'état affiche le nombre de plante au M² en cours...

 

Le BLOC "étiquette" est un BLOC ANNOTATIF !

 

On peut ensuite envisager de récupérer ces données dans un fichier EXCEL...

 

Christian


Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

0 J'aime
Message 10 sur 16

tramber
Advisor
Advisor
Solution acceptée
(defun c:poseU( / ent aire pins rep)
 (or *densite*(setq *densite* 1))
 (or *nomcourant*(setq *nomcourant* "Q .pub"))
 (setq ent(car(entsel"\nSelectionner l'objet")))
 (cond((=(cdr(assoc 0(entget ent)))"LWPOLYLINE")
       (setq aire(/(vla-get-area (vlax-ename->vla-object ent))10000.0))
       (setq pins(getpoint"\nPoint d'insertion :"))
       (setq rep(getreal (strcat"\nCoefficient <"(rtos *densite* 2 2)"> :")))
       (setq *densite*(cond(rep)(*densite*)))
       (setq rep(getstring (strcat"\nNom <" *nomcourant* "> :")))
       (setq *nomcourant*(cond((and rep(not(= rep "")))rep)(*nomcourant*)))
       (command "_TEXT" pins 5 0 (strcat (rtos(* aire *densite*)2 2)" u de "*nomcourant*))
       )
  )
 )

De rien, c'est facile et pas très long. Si ca plait vraiment, marquer mon message comme solution n’arrêtera pas la conversation.

Ici un code avec deux variables.

Si les noms et la densité sont associés, on peut faire mieux avec une liste facile à mettre à jour pour vous. Je le ferai.

 

Oui, on peut faire adaptatif mais cela coûte plus cher : il faut utiliser les réacteurs et c'est compliqué ou encore les champs personnalisés je suppose car on peut les programmer, malheureusement je ne sais plus très bien ni n'ai le temps (mais libre à chacun de modifier mon code) de fouiller le net aujourd'hui.

Dans mon programme rapide, le texte ne se souvient pas de la polyligne. Tu comprends ?


EESignature

0 J'aime
Message 11 sur 16

tramber
Advisor
Advisor

Toujours sans gestion des erreurs, une version qui utilise une liste à tenir à jour toi-même.

Avec le code, la densité (tu peux mettre un chiffre réel) et le nom entre guillemets

Il suffit de spécifier le code, cette fois-ci.

 

(defun c:poseU( / ent aire pins rep listop *densite* *nomcourant*)
 (or *num*(setq *num* 0))
 (setq ent(car(entsel"\nSelectionner l'objet")))
 (setq listop '((0 1 "Truc")
                (1 2 "Truc2")
                (2 3 "Truc3")
                (3 4 "Truc4")
                (4 5 "Q .pub")))
 (cond((=(cdr(assoc 0(entget ent)))"LWPOLYLINE")
       (setq aire(/(vla-get-area (vlax-ename->vla-object ent))10000.0))
       (setq pins(getpoint"\nPoint d'insertion :"))
       (princ)
       (princ(apply 'strcat (mapcar (function(lambda(x)(strcat (itoa(car x))"="(rtos(cadr x)2 2)" "(caddr x)"\t"))) listop)))
       (setq rep(getint (strcat"\nNuméro <"(itoa *num*)"> :")))
       (setq *num*(cond(rep)(*num*)))
       (setq *densite*(cadr(nth *num* listop)))
       (setq *nomcourant*(caddr(nth *num* listop)))
       (command "_TEXT" pins 5 0 (strcat (rtos(* aire *densite*)2 2)" u de "*nomcourant*))
       )
  )
 )

EESignature

0 J'aime
Message 12 sur 16

joan.eychenne
Explorer
Explorer

Super ! L'idée de la liste est assez séduisante, à voir car il y a des quantités énormes de plantes à rentrer et puis après pour se souvenir du code ... pas sûr que ma mémoire suive.

 

Je pensais bien que l'adaptatif était une toute autre histoire. Ce n'est pas quelque chose d'essentiel. Ton résultat est déjà largement un gain de temps pour moi.

 

Je me demandais juste comment forcer Autocad à arrondir son résultat à l'entier supérieur car 58,86 plantes c'est assez tordu pour un jardinier hihihi.

 

P.S : J'ai accepté ton dernier message comme la solution ! Cela clôturera bien la conversation ? c'est que c'est mon tout premier post ici donc je suis vraiment le novice de base !

 

Merci encore 1000 fois

0 J'aime
Message 13 sur 16

joan.eychenne
Explorer
Explorer

Cela s'approche de LA solution également, excepté que le calcul : nb de plantes au m2 x  m2 donne souvent un total de plante erroné. D'où cela peut il venir ?

0 J'aime
Message 14 sur 16

tramber
Advisor
Advisor
Solution acceptée

Tu peux charger cette routine écrite à la suite (ou mieux avant) la routine livrée :

 

(defun gc:round	(num prec)
  (if (zerop (setq prec (abs prec)))
    num
    (* prec
       (fix ((if (minusp num)
	       -
	       +
	     )
	      (/ num prec)
	      0.5
	    )
       )
    )
  )
)

Cette routine de @_gile va traiter l'arrondi.

 

 

Pour se faire, tu remplaces :

(rtos(* aire *densite*)2 2)

par :

(rtos(gc:round(* aire *densite*)1)2 0)

Attention aux parenthèses !

gc:round est chargé de faire ton arrondi et non pas de tronquer, ce qui est bien pour avoir un peu plus de plantes vertes et sauver l'humanité.

rtos, lui, convertit le nombre obtenu en chaine de caractères. Le 0 permet de ne plus mettre de chiffres derrière la virgule.


EESignature

Message 15 sur 16

joan.eychenne
Explorer
Explorer

J'aurai tant aimé dire que ça marche mais impossible d'avoir l'arrondi comme indiqué. Je charge pourtant le premier code GC:Round

puis j'appload ma LIST de base en ayant changé la ligne de code, puis je rentre la commande Poseu et rien ne se passe j'obtiens toujours des 35.09 unités.

 

Y a-t-il une étape que j'ai loupée ?

 

Encore merci d'avance

0 J'aime
Message 16 sur 16

reb_c1
Mentor
Mentor

Bonjour,

 

Si je comprends bien, personne n'a testé ma réponse et l'outil proposé ? Smiley indifférent

 

Christian


Formateur Indépendant, Consultant, AutoCAD, AutoCAD LT, REVIT MEP, INVENTOR -
www.rebcao.fr

Christian REB

0 J'aime