Aller au contenu

cotation en lisp


aboumouiz

Messages recommandés

Bonjour,

 

Je suis tombé ces derniers mois sur un bout de code sur un forum US (je n'ai pas retrouvé le lien) qui je pense est à creuser pour faire ce que tu désire.

D'ailleurs je l'avais mis de coté dans cette attention de le peaufiner, mais le temps me manque...

 

Voici le bout de code trouvé et non travaillé. Pour faire un test, dessiner une polyligne optimisée et brisée (comme une ligne de TN d'un profil en travers ET une ligne (en mode ortho) qui sera la ligne du plan de comparaison.

 

(defun c:DimTwo(/ adoc space obj_dim pl refl pt pt2 ss)
 (vl-load-com)
 (setq
   adoc (vla-get-activedocument (vlax-get-acad-object))
   space
   (if (= 1 (getvar "CVPORT"))
     (vla-get-paperspace adoc)
     (vla-get-modelspace adoc)
   )
   obj_dim (vla-add (vla-get-Dimstyles adoc) "CADXP")
 )
 (vla-put-activedimstyle adoc obj_dim)
 (mapcar '(lambda (dimvar value / ) (vla-setvariable adoc dimvar Value))
 '("DIMPOST" "DIMAPOST" "DIMSCALE" "DIMASZ" "DIMEXO" "DIMDLI" "DIMEXE" "DIMRND" "DIMDLE" "DIMTP" "DIMTM" "DIMTXT" "DIMCEN" "DIMTSZ" "DIMALTF" "DIMLFAC" "DIMTVP" "DIMTFAC" "DIMGAP" "DIMALTRND" "DIMTOL" "DIMLIM" "DIMTIH" "DIMTOH" "DIMSE1" "DIMSE2" "DIMTAD" "DIMZIN" "DIMALT" "DIMALTD" "DIMTOFL" "DIMSAH" "DIMTIX" "DIMSOXD" "DIMCLRD" "DIMCLRE" "DIMCLRT" "DIMADEC" "DIMDEC" "DIMTDEC" "DIMALTU" "DIMALTTD" "DIMAUNIT" "DIMFRAC" "DIMLUNIT" "DIMDSEP" "DIMTMOVE" "DIMJUST" "DIMSD1" "DIMSD2" "DIMTOLJ" "DIMTZIN" "DIMALTZ" "DIMALTTZ" "DIMUPT" "DIMATFIT")
 '("" "" 1.0 2.5 0.625 3.75 1.25 0.0 0.0 0.0 0.0 2.5 2.5 0.0 0.0393701 1.0 0.0 1.0 0.625 0.0 0 0 0 0 1 1 1 8 0 3 1 0 0 0 0 0 0 0 2 2 2 3 0 0 2 "." 0 2 1 1 0 8 0 0 0 3)
 )
 (vla-copyfrom obj_dim adoc)
 (princ "\nSelectionner la Polyligne: ")
 (if
   (and
     (setq pl (ssget "_:E:S:L" '((0 . "LWPOLYLINE"))))
     (progn
       (princ "\nSelectionner la ligne du Plan de Comparaison: ")
       (setq refl (ssget "_:E:S:L" '((0 . "*LINE"))))
     )
   )
   (progn
     (setq refl (vlax-ename->vla-object (ssname refl 0)))
     (foreach pt
       (mapcar
         'cdr
         (vl-remove-if-not
           '(lambda (x) (= (car x) 10))
           (entget (ssname pl 0))
         )
       )
       (vla-addDimRotated
         space
         (vlax-3d-point (append pt '(0.0)))
         (vlax-3d-point
           (setq pt2 (vlax-curve-getclosestpointto refl pt))
         )
         (vlax-3d-point
            (mapcar (function (lambda (a B) (* (+ a B) 0.5))) pt pt2)
         )
         (* pi 0.5)
       )
     )
   )
 )
 (princ)
)

 

Pour avoir une cotation avec une présentation correcte façon profil en travers ou long, il suffirait d'utiliser un style de cotation approprié.

Je pense que ça peut être un bon départ, en plus si l'on fait un groupe de toutes les cotations, de la polyligne et de la ligne; une modification à l'aide des "grips" sur les sommets ou le déplacement de la ligne de comparaison mettrait à jour les cotations automatiquement (ou après un Regen).

 

Y a déjà de la matière! ;)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

mérci pour votre éffort;

ce que je cherche exactement c'est:

1- une première routine qui permet de personnaliser le style de cotation (type de fléche, hauteur de texte, precision....)

pour cela j'ai déjà essayer l'istruction (command "-cotstyle" "R" "S" "")qui réstaure le style de cote nommé "S" nom d'un style défini au paravant, mais il fallait toujours créer ce nom de style pour chaque nouveau dessin, je me demande s'il y a une methode pour créer des style de cotes qui pevent être appelés pour n'importe quel dessin et non suelement liéer au dessin courant;

 

2- une deuxième routine qui permet de faire la cotation entre des points qlq près définis, j'ai déjà essayer l'istruction (command "dimaligned" pt01 pt02 (* 2 (getvar "DIMTXT")) )

(command "dimaligned" pt03 pt04 (* 2 (getvar "DIMTXT")) )

(command "dimaligned" pt05 pt06 (* 2 (getvar "DIMTXT")) )

ect........ avec Pt01, Pt02, Pt03 .... points définis au paravant

le problème est que la routine s'arréte après la premier cotaion est donne un msg d'érreur , elle ne reconnue pas la positon de l'isertion de la cotation.

Mérci si vous pouvez m'aider!

Lien vers le commentaire
Partager sur d’autres sites

J'ai édité le code lisp précédent pour inclure la création d'un nouveau style de cotation nommé "CADXP" qui sera plus approprié pour ce style de cotation.

 

Donc ce code va coter le delta Z entre les sommets de la polyligne et la ligne de référence.

 

Je te laisse maintenant voir pour coter les distances entre sommets (ou en cumulé), je rappelle que le temps me manque <_<

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Un dernier coup de pouce! (c'est Noël) :)

 

Je te laisse comparer au dernier code donné pour comprendre l'évolution.

Ce qui a changé:

Ne cote plus le deltaZ mais bien l'altitude des sommets de la polyligne, les cotes sont placées sous la ligne sélectionnée.

Puis les distances cumulées et les distances partielles.

 

(defun c:DimTwo (/ adoc space obj_dim height_dim pl refl lst_pt pt_o nw_obj pt2)
 (vl-load-com)
 (setq
   adoc (vla-get-activedocument (vlax-get-acad-object))
   space
   (if (= 1 (getvar "CVPORT"))
     (vla-get-paperspace adoc)
     (vla-get-modelspace adoc)
   )
   obj_dim (vla-add (vla-get-Dimstyles adoc) "COTE-PT_VERT")
 )
 (vla-put-activedimstyle adoc obj_dim)
 (initget 6)
 (setq height_dim (getdist (getvar "VIEWCTR") (strcat "\nHauteur du texte de cotation <" (rtos (getvar "DIMTXT")) ">: ")))
 (if height_dim (vla-setvariable adoc "DIMTXT" height_dim) (setq height_dim (getvar "DIMTXT")))
 (mapcar '(lambda (dimvar value / ) (vla-setvariable adoc dimvar Value))
 '("DIMPOST" "DIMAPOST" "DIMSCALE" "DIMASZ" "DIMEXO" "DIMDLI" "DIMEXE" "DIMRND" "DIMDLE" "DIMTP" "DIMTM" "DIMCEN" "DIMTSZ" "DIMALTF" "DIMLFAC" "DIMTVP" "DIMTFAC" "DIMGAP" "DIMALTRND" "DIMTOL" "DIMLIM" "DIMTIH" "DIMTOH" "DIMSE1" "DIMSE2" "DIMTAD" "DIMZIN" "DIMALT" "DIMALTD" "DIMTOFL" "DIMSAH" "DIMTIX" "DIMSOXD" "DIMCLRD" "DIMCLRE" "DIMCLRT" "DIMADEC" "DIMDEC" "DIMTDEC" "DIMALTU" "DIMALTTD" "DIMAUNIT" "DIMFRAC" "DIMLUNIT" "DIMDSEP" "DIMTMOVE" "DIMJUST" "DIMSD1" "DIMSD2" "DIMTOLJ" "DIMTZIN" "DIMALTZ" "DIMALTTZ" "DIMUPT" "DIMATFIT")
 '("" "" 1.0 2.5 0.625 3.75 1.25 0.0 0.0 0.0 0.0 2.5 0.0 0.0393701 1.0 0.0 1.0 0.625 0.0 0 0 0 0 1 1 1 8 0 3 1 0 0 0 0 0 0 0 2 2 2 3 0 0 2 "." 0 2 1 1 0 8 0 0 0 3)
 )
 (vla-copyfrom obj_dim adoc)
 (princ "\nSelectionner la Polyligne: ")
 (while (null (setq pl (ssget "_+.:E:S:L" '((0 . "LWPOLYLINE"))))) (princ "\nCe n'est pas une polyligne optimisée!"))
 (princ "\nSelectionner la ligne du Plan de Comparaison: ")
 (while (null (setq refl (ssget "_+.:E:S:L" '((0 . "LINE"))))) (princ "\nCe n'est pas une ligne!"))
 (setq pt_o (cdr (assoc 10 (entget (ssname refl 0)))))
 (vla-addLine
   space
   (vlax-3d-point '(0.0 0.0 0.0))
   (vlax-3d-point '(100000.0 0.0 0.0))
 )
 (setq
   refl (vlax-ename->vla-object (setq ent_line (entlast)))
   lst_pt (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (ssname pl 0))))
 )
 (foreach pt lst_pt
   (setq nw_obj
     (vla-addDimRotated
       space
       (vlax-3d-point (append pt '(0.0)))
       (vlax-3d-point
         (setq pt2 (vlax-curve-getclosestpointto refl pt))
       )
       (vlax-3d-point
         (mapcar '(lambda (a B) (* (+ a B) 0.5)) pt pt2)
       )
       (* pi 0.5)
     )
   )
   (vlax-put nw_obj 'TextPosition (list (car (vlax-get nw_obj 'TextPosition)) (- (cadr pt_o) (* 3.0 (getvar "DIMTXT"))) (caddr pt2)))
 )
 (foreach pt (cdr lst_pt)
   (setq nw_obj
     (vla-addDimRotated
       space
       (vlax-3d-point (append (car lst_pt) '(0.0)))
       (vlax-3d-point (append pt '(0.0)))
       (vlax-3d-point
         (setq pt2 (vlax-curve-getclosestpointto refl pt))
       )
       0.0
     )
   )
   (vlax-put nw_obj 'TextRotation (* pi 0.5))
   (vlax-put nw_obj 'TextPosition (list (- (car pt2) (* 1.0 (getvar "DIMTXT"))) (- (cadr pt_o) (* 10.0 (getvar "DIMTXT"))) (caddr pt2)))
 )
 (setq obj_dim (vla-add (vla-get-Dimstyles adoc) "COTE-PT_HORI"))
 (vla-put-activedimstyle adoc obj_dim)
 (vla-setvariable adoc "DIMTXT" height_dim)
 (mapcar '(lambda (dimvar value / ) (vla-setvariable adoc dimvar Value))
 '("DIMPOST" "DIMAPOST" "DIMSCALE" "DIMASZ" "DIMEXO" "DIMDLI" "DIMEXE" "DIMRND" "DIMDLE" "DIMTP" "DIMTM" "DIMCEN" "DIMTSZ" "DIMALTF" "DIMLFAC" "DIMTVP" "DIMTFAC" "DIMGAP" "DIMALTRND" "DIMTOL" "DIMLIM" "DIMTIH" "DIMTOH" "DIMSE1" "DIMSE2" "DIMTAD" "DIMZIN" "DIMALT" "DIMALTD" "DIMTOFL" "DIMSAH" "DIMTIX" "DIMSOXD" "DIMCLRD" "DIMCLRE" "DIMCLRT" "DIMADEC" "DIMDEC" "DIMTDEC" "DIMALTU" "DIMALTTD" "DIMAUNIT" "DIMFRAC" "DIMLUNIT" "DIMDSEP" "DIMTMOVE" "DIMJUST" "DIMSD1" "DIMSD2" "DIMTOLJ" "DIMTZIN" "DIMALTZ" "DIMALTTZ" "DIMUPT" "DIMATFIT")
 '("" "" 1.0 2.5 0.625 3.75 1.25 0.0 0.0 0.0 0.0 2.5 0.0 0.0393701 1.0 0.0 1.0 0.625 0.0 0 0 0 0 1 1 0 8 0 3 1 0 0 0 0 0 0 0 2 2 2 3 0 0 2 "." 0 0 1 1 0 8 0 0 0 3)
 )
 (vla-copyfrom obj_dim adoc)
 (while (cdr lst_pt)
   (setq nw_obj
     (vla-addDimRotated
       space
       (vlax-3d-point (append (car lst_pt) '(0.0)))
       (vlax-3d-point (append (cadr lst_pt) '(0.0)))
       (vlax-3d-point
         (vlax-curve-getclosestpointto refl (mapcar '(lambda (a B) (* (+ a B) 0.5)) (car lst_pt) (cadr lst_pt)))
       )
       0.0
     )
     lst_pt (cdr lst_pt)
   )
   (vlax-put nw_obj 'TextPosition (list (car (vlax-get nw_obj 'TextPosition)) (- (cadr pt_o) (* 15.0 (getvar "DIMTXT"))) (caddr pt2)))
 )
 (entdel ent_line)
 (princ)
)

 

Tester que très rapidement, le principe est là, il faut améliorer encore...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

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é