Aller au contenu

multiplier ou divisé la valeur d'un champs


Messages recommandés

Posté(e)

Bonjour , sans faire de lisp , ni tableau , créer un champs automatique qui combine deux information champs , les divisé multiplier et indiqué la valeur .

le but créer un texte pente lié a une ligne .

j'arrive a affiché la distance de cette ligne , l’écart de Z entre les 2 sommets , et donc je me dis que que l'on combiné ces valeurs ? non ? sans lisp ni tableau , je vous vois venir , simple ,simple toujours simple.

 

du concret :

la distance : %<\AcObjProp Object(%<\_ObjId 140702321951504>%).Length \f "%lu2%pr2">%

 

ecart Z : %<\AcObjProp Object(%<\_ObjId 140702321951504>%).Delta \f "%lu2%pt4%pr2">%

 

Comment récupérer les valeurs les multiplier diviser et afficher un résultat.

ya que se qui ne cherche pas , qui ne trouve rien

Posté(e)

Hello

 

En theorie avec les champs et une formule de calcul avec les champs, on doit y arriver !

 

Mais je n'y arrive pas sur une simple ligne 2D ... Peut etre suis je trop fatigue !?

 

Formule theorique en 2D = 100 x DeltaY / DeltaX

 

DeltaY = %%).Delta \f "%lu6%pt2%zs8">%

DeltaX = %%).Delta \f "%lu6%pt1%zs8">%

 

 

**** Merci Gilles pour ta routine Lisp ****

 

(defun c:PentePC (/ p1 p2 a)

 

(if

(and

(setq p1 (getpoint "\nPremier point: "))

(setq p2 (getpoint "\nDeuxieme point: "))

(setq a (angle p1 p2))

)

(entmake

(list

'(0 . "TEXT")

'(100 . "AcDbEntity")

'(100 . "AcDbText")

'(10 0. 0. 0.)

(cons 40 (getvar 'textsize))

(cons 1

(strcat (rtos (abs (* 100 (/ (sin a) (cos a)))) 2 2) " %")

)

(cons 50

(if (minusp (cos a))

(+ pi a)

a

)

)

'(72 . 1)

(cons 11 (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.)) p1 p2))

'(73 . 1)

)

)

)

(princ)

)

 

 

Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

Hello

 

Mais comme je suis Vieux et Tetu, j'ai reussi !

(En fait j'ai cherche en Mode "Je me complique la Vie" )

 

Formule theorique en 2D = 100 x DeltaY / DeltaX

 

Le BON DeltaY = %%).Delta \f "%lu2%pt2%pr2">%

Le BON DeltaX = %%).Delta \f "%lu2%pt1%pr2">%

 

Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

Pour la distance, on peut mettre un facteur de conversion, c'est facile dans les options du champ.

Mais on voit bien, en manuel sur les différences en X,Y ou Z ou les trois, qu'il n'est pas possible de spécifier le facteur.

Donc distance oui, différence non !

 

Ici j'ai un [0.01], il suffit peut-être de le tricher par prog et l'injecter dans le code pour la différence. Je sais que cela se pratique.

(jamais fait).

 

%%).Length \f "%lu2%ct8[0.01]">%

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Salut,

 

D'abord, il me semble qu'il faut corriger une petite erreur de raisonnement.

La pente c'est le rapport entre la différence d'altitudes entre les deux points et la distance horizontale (donc pas la longueur de la ligne.

 

Ceci dit, on peut quand même y arriver, je te propose deux formules.

 

La première en calculant la distance horizontale avec Pythagore :

Delta.Z / sqrt(Delta.X * Delta.X + Delta.Y * Delta.Y)

 

La seconde en utilisant la trigonométrie

tang(asin(Delta.Z / Length))

 

Pour construire la formule de champ :


     
  1. tu lances la commande CHAMP
  2. tu choisis Objet dans le panneau de gauche et tu sélectionnes la ligne
  3. tu choisis Différence (Delta) dans le panneau central et décoches tout sauf Z dans celui de droite
  4. tu copies l'expression de champ (panneau du bas)
  5. dans le panneau de gauche, tu choisis maintenant : Formule
  6. dans la case Formule: tu colles l'expression de champ (c'est le résultat qui s'affiche)
  7. tu ajoutes derrière ce champ le signe diviser : /, puis sqrt (pour racine carrée) et enfin une parenthèse ouvrante : (
  8. dans la panneau de gauche tu reviens à Objet (la ligne est toujours sélectionnée)
  9. tu coches X et décoches Z pour avoir le Delta X
  10. tu copies l'expression de champ
  11. tu retournes dan la Formule
  12. à la suite de ce que tu as déjà entré, tu colles le nouveau champ puis * (multiplier) puis à nouveau le champ (mise au carré) et enfin un +
  13. retour dans Objet pour copier le Delta Y
  14. et enfin, de retour dans Formule, tu fais comme pour X et tu fermes la parenthèse )

 

L'expression de champ dans la boite de dialogue devrait ressembler à ça (FldPtr est un pointeur sur un champ):

%<\AcExpr (%<\_FldPtr 729000976>%/sqrt(%<\_FldPtr 728999792>%*%<\_FldPtr 728999120>%+%<\_FldPtr 728997744>%*%<\_FldPtr 728996048>%)) \f "%lu2">%

en développé c'est ça :

%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId 8796087805376>%).Delta \\f \"%lu2%pt4\">%/sqrt(%<\\AcObjProp Object(%<\\_ObjId 8796087805376>%).Delta \\f \"%lu2%pt1\">%*%<\\AcObjProp Object(%<\\_ObjId 8796087805376>%).Delta \\f \"%lu2%pt1\">%+%<\\AcObjProp Object(%<\\_ObjId 8796087805376>%).Delta \\f \"%lu2%pt2\">%*%<\\AcObjProp Object(%<\\_ObjId 8796087805376>%).Delta \\f \"%lu2%pt2\">%)) \\f \"%lu2\">%

 

Pour l'autre formule, je te laisse faire (c'est plus rapide).

L'expression dans la boite de dialogue est plus simple:

%<\AcExpr (tang(asin(%<\_FldPtr 728769280>%/%<\_FldPtr 728769152>%))) \f "%lu2">%

De même que l'expression développée :

%<\\AcExpr (tang(asin(%<\\AcObjProp Object(%<\\_ObjId 8796087805376>%).Delta \\f \"%lu2%pt4\">%/%<\\AcObjProp Object(%<\\_ObjId 8796087805376>%).Length \\f \"%lu2\">%))) \\f \"%lu2\">%

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

Posté(e)

J'avais oublié, pour une valeur en pourcentage, il suffit d'ajouter 100* au début des formules (pour multiplier le résultat par 100) ou d'affecter un facteur de conversion de 100 au champ formule (il faut faire Evaluer avant) et ont peut aussi modifier ce format (précision, suffixe).

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

Posté(e)

Comme le processus est un peu fastidieux, voici un petit LISP qui crée le champ pour la ligne sélectionnée et insère un texte multiligne contenant le champ au point spécifié.

 

Le LISP utilise les paramètre de texte courant et un formatage de champ basique.

Libre à chacun de l'adapter pour ses besoins spécifiques.

 

;; SLOPEFIELD
;; Insère un texte multiligne contenant un champ indiquant la pente (3D) de la ligne sélectiionnée
(defun c:slopefield (/ line pt doc id)
 (vl-load-com)
 (and
   (setq line (car (entsel "\nSélectionnez une ligne: ")))
   (setq line (vlax-ename->vla-object line))
   (= (vla-get-ObjectName line) "AcDbLine")
   (setq pt (getpoint "\nSpecifiez le point d'insertion: "))
   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
   (setq id (vla-GetObjectIdString (vla-get-Utility doc) line :vlax-false))
   (vla-AddMText
     (vla-get-Block (vla-get-ActiveLayout doc))
     (vlax-3d-point pt)
     0.0
     (strcat
       "%<\\AcExpr (100*tang(asin(%<\\AcObjProp Object(%<\\_ObjId "
       id
       ">%).Delta \\f \"%lu2%pt4\">%/%<\\AcObjProp Object(%<\\_ObjId "
       id
       ">%).Length>%))) "
       "\\f \"%lu2%pr2%ps[,%]\">%"               ; <- formatage du texte
     )
   )
 )
 (princ)
)

 

Format de champ :

%lu2 : unités décimales (CF la variablle système LUNITS)

%pr2 : précision (2 décimales)

%ps[,%] : [préfixe,suffixe]

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

Posté(e)

Génial !

J'utilise les champs depuis toujours mais je n'avais travaillé, je l'avoue, la zone de formule.

Il faut dire qu'ici on a parlé en large et en travers notamment ces années où l'on avait découvert comment bien manipuler tout cela par lisp mais que je lisais aussi en travers.

 

J'ai fait la procédure et me dis vraiment que j'ai manqué un chapitre sur ce tout petit carré de formule où l'on travaille vraiment ses données d'objet en collant d'autres formules :P

Juste le sentiment d'avoir jamais fait assez gaffe à l’existence d'une bonne fonctionnalité.

Merci pour le rappel.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Le problème, c'est qu'il n'existe pas, à ma connaissance de documentation sur les fonctions utilisables dans les formules. On donc un peu obligé d'y aller par tâtonnement.

 

Par exemple, pour la tangente, j'ai d'abord essayé tan (comme dans les langages que je connais) et ça ne marchait pas ; j'ai ensuite essayé tg comme on écrivait quand j'étais au collège, pas mieux ; puis tangente en toutes lettres, non plus ; finalement tang a marché, mais j'ai l'impression d'avoir eu de la chance, c'est bien la première fois que je je vois ce symbole pour la tangente d'un angle.

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

Posté(e)

Coucou

 

Fantastique, bravo (gile)

Je n'ai pas besoin de ce genre de champ ayant des outils mais ça ne m'empêche pas de bayer devant tant de virtuosité

J'ai lu la question, j'ai séché très vite (après la distance) et j'ai conclu que je ne viendrais pas répondre simplement pour dire que je n'y arrivait pas

Et quand j'ai vu que (gile) avait répondu je n'ai pas retenu ma souris qui piaffait de cliquer sur le lien et elle a bien fait.

Encore bravo d'apporter la preuve que la ténacité, basée sur une connaissance parfaite des arcanes logicielles, paye et est rentable.

 

Amicalement

Posté(e)

Salut lili2006

 

Il semble qu'il ne reconnaisse pas Delta Z

Il semble tout simplement que ton delta Z est égal à 0.0, autrement dit que ta ligne est horizontale (parallèle au plan XY).

 

Pourquoi passer par la trigo alors que l'on pourrait écrire simplement:

Citation

Pente = DeltaZ/dh ?

Personnellement je n'ai pas trouvé de moyen d'obtenir directement la distance horizontale (dh), mais si tu as vu un truc qui m'aurait échappé, dis nous où ça se trouve.

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

Posté(e)

Hello

 

1) MERCI Gilles pour la Routine VLisp !

 

GRRR, j'avais deja essaye tan & tangente mais pas TANG !!

 

2) RAPPELs : les champs dynamiques sont apparus avec la version 2005 et les Formules avec la 2006 ...

 

3) Je connais les champs dynamiques depuis "toujours" mais je les ai reellement utilises qu'a partir de la version 2008/2009 (Pourquoi je ne sais pas !?)

 

4) Lors de "mes" formations AutoCAD, j'essaye de parler des champs dynamiques (si j'ai le temps) au niveau 1 : recuperation des longueurs / surfaces ... avec un eventuel facteur d'echelle pour les conversions M / CM / MM ...

 

5) Et si j'ai "un poil de temps", (dans l'Espace PAPIER) je fais realiser la formule : 1000 / Echelle_Personnalisee_de_la_Fenetre_FMULT (Avec ZERO decimale) ainsi on dispose d'un champ dynamique refletant l'Echelle de Trace/Impression de la FMULT concernee ...

NOTE: 1000 pour les DWG en M -- 10 pour les DWG en CM -- 1 pour les DWG en MM

 

6) Voir l'Image : http://dl.free.fr/odikPQ7XS

 

7) Question pour Gilles (ou autre Grand Maitre du Lisp/VLisp/Dotnet, etc sous AutoCAD): y a t-il une limite physique a la longueur d'un champ dynamique en terme d'expression ??

J'ai deja mis dans un champ dynamique (en formule) la somme de 2/3/4 Longueurs/Surfaces ...

 

8) Demande pour Gilles - SVP serait il possible d'envisager une routine LSP qui :

- Selection classique de N Polylignes (Closes ou NON) (2D ou 3D) - Mais pas les 3DMesh !

- Construction des N champs dynamiques permettant de recuperer la Longueur

- Construction et placement de la formule de la Somme des N champs ...

 

9) NOTE: j'ai deja utilise les champs dynamiques sur les Volumes 3D ACIS d'AutoCAD !

En essayant des proprietes NON proposees et CA MARCHE !!

 

Ainsi on peut recuperer en Formule le VOLUME et AREA d'un Solid 3D ACIS alors que ces proprietes ne sont pas proposees par AutoCAD !!!

%%).Area \f "%lu2">%

%%).Volume \f "%lu2">%

 

Et avec des Formules (sur les objets 2D ou 3D) on peut faire des JOLIES choses ...

 

Bon Dimanche, Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

2) RAPPELs : les champs dynamiques sont apparus avec la version 2005 et les Formules avec la 2006 ...

Je comprends mieux car je me souviens très bien, 2005, avoir fait le tour. Je comprends mieux mon ignorance maintenant.

9) NOTE: j'ai deja utilise les champs dynamiques sur les Volumes 3D ACIS d'AutoCAD !

En essayant des proprietes NON proposees et CA MARCHE !!

 

Ainsi on peut recuperer en Formule le VOLUME et AREA d'un Solid 3D ACIS alors que ces proprietes ne sont pas proposees par AutoCAD !!!

%%).Area \f "%lu2">%

%%).Volume \f "%lu2">%

Ben ça alors !!!

 

Le problème, c'est qu'il n'existe pas, à ma connaissance de documentation sur les fonctions utilisables dans les formules. On donc un peu obligé d'y aller par tâtonnement.

C'est justement ce que j'allais demander. J'ai cherché un peu...

 

Prochain coup, j'essaie de penser à tout ça et merci à l'auteur du sujet (s'il s'en sort) d'avoir fait tirer quelques tiroirs B)

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

7) Question pour Gilles (ou autre Grand Maitre du Lisp/VLisp/Dotnet, etc sous AutoCAD): y a t-il une limite physique a la longueur d'un champ dynamique en terme d'expression ??

J'ai deja mis dans un champ dynamique (en formule) la somme de 2/3/4 Longueurs/Surfaces ...

Je n'en ai aucune idée.

 

8) Demande pour Gilles - SVP serait il possible d'envisager une routine LSP qui :

- Selection classique de N Polylignes (Closes ou NON) (2D ou 3D) - Mais pas les 3DMesh !

- Construction des N champs dynamiques permettant de recuperer la Longueur

- Construction et placement de la formule de la Somme des N champs ...

Tant qu'à utiliser un LISP, tu as TotalPerim (sur cette page) qui fait ça et même plus sans champ dynamique.

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

Posté(e)

8) Demande pour Gilles - SVP serait il possible d'envisager une routine LSP qui :

- Selection classique de N Polylignes (Closes ou NON) (2D ou 3D) - Mais pas les 3DMesh !

- Construction des N champs dynamiques permettant de recuperer la Longueur

- Construction et placement de la formule de la Somme des N champs ...

 

(defun c:PolyLength (/ doc expr ss)
 (vl-load-com)
 (if
   (and
     (ssget '((0 . "*POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>")))
     (setq pt (getpoint "\nSpécifiez le point d'insertion: "))
   )
    (progn
      (setq doc  (vla-get-ActiveDocument (vlax-get-acad-object))
            expr "%<\\AcExpr 0"
      )
      (vlax-for pl (setq ss (vla-get-ActiveSelectionSet doc))
        (setq expr (strcat
                     expr
                     "+%<\\AcObjProp Object(%<\\_ObjId "
                     (vla-GetObjectIdString (vla-get-Utility doc) pl :vlax-false)
                     ">%).Length>%"
                   )
        )
      )
      (vla-Delete ss)
      (setq expr (strcat expr " \\f \"%lu2%pr2%ps[longueur totale: ,m]\">%")) ; formatage du champ
      (terpri)
      (prompt expr)
      (vla-AddMText
        (vla-get-Block (vla-get-ActiveLayout doc))
        (vlax-3d-point pt)
        0.0
        expr
      )
    )
 )
 (princ)
)

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

Posté(e)

lili2006,

 

Relis bien le premier message et mes réponses.

J'ai dit : "parallèle au plan XY", pas "parallèle à l'axe X".

 

Nous parlons de la pente en 3D où le dénivelé correspond à la différence des coordonnées Z des points de départ et de fin et où la distance horizontale correspond à la longueur de la ligne projetée sur le plan XY. D'où l'utilisation de Pythagore ou de la trigonométrie.

 

Si on parle de la représentation 2D d'une pente (coupe, profil), il suffit de calculer le rapport entre le delta Y et le delta X

 

Un petit screencast.

 

En LISP:

 

(defun c:slope2d (/ line pt doc id)
 (vl-load-com)
 (and
   (setq line (car (entsel "\nSélectionnez une ligne: ")))
   (setq line (vlax-ename->vla-object line))
   (= (vla-get-ObjectName line) "AcDbLine")
   (setq pt (getpoint "\nSpecifiez le point d'insertion: "))
   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
   (setq id (vla-GetObjectIdString (vla-get-Utility doc) line :vlax-false))
   (vla-AddMText
     (vla-get-Block (vla-get-ActiveLayout doc))
     (vlax-3d-point pt)
     0.0
     (strcat
       "%<\\AcExpr abs(100*%<\\AcObjProp Object(%<\\_ObjId "
       id
       ">%).Delta \\f \"%pt2\">%/%<\\AcObjProp Object(%<\\_ObjId "
       id
       ">%).Delta \\f \"%pt1\">%) "
       "\\f \"%lu2%pr2%ps[,%]\">%"               ; <- formatage du texte
     )
   )
 )
 (princ)
)

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

Posté(e)

Bon bah merci , si moi je suis un super utilisateur , vous vous êtes des extrémistes , je reviendrais plus tard pour vous donnez un nouveau défi .

 

Donc Problème résolu pour moi , j'ai appris le champs formule grâce au screencast .

 

la solution : %<\AcExpr ((100*%<\_FldPtr 2444499792>%)/%<\_FldPtr 2444499856>%) \f "%lu2%pr2%ps[,%]">%

 

en rappel de départ :

la distance : %<\AcObjProp Object(%<\_ObjId 140702321951504>%).Length \f "%lu2%pr2">%

 

ecart Z : %<\AcObjProp Object(%<\_ObjId 140702321951504>%).Delta \f "%lu2%pt4%pr2">%

 

Sujet résolu merci les geeks

 

j'ai plus qu'a dynamisé çà en bloc .

 

Edit : après quelque test , arrhhhh , la distance prise par le champs est la distance réel de l'objet et pas en plan XY , donc ça fausse tout.

 

Re-edit : je suis trop con , suffit de lire et de comprendre .

ya que se qui ne cherche pas , qui ne trouve rien

Posté(e)

Hello

 

Bien content que l'on ait pu t'aider et resoudre ton probleme !

 

J'espere que le Derive de ton sujet (En effet c la faute des Extremistes) ne t'a pas trop "perturbe" !?

 

Bonne Semaine, Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

Salut,

 

Il me semble que tu fais toujours l'erreur géométrique que j'ai noté dans mon premier message : la pente n'est pas le rapport entre le dénivelé (delta Z) et la longueur de la ligne, mais le rapport entre le dénivelé et la distance horizontale (longueur de la ligne projetée sur XY).

 

La formule n'est donc pas :

100 * deltaZ / longueur

mais, en utilisant Pythagore :

100 * deltaZ / sqrt(sqr(deltaX) + sqr(deltaY))

 

Un screencast.

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

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é