Aller au contenu

[RESOLU] EntMake Cote Alignée (AcDbAlignedDimension)


Ahimsa

Messages recommandés

Bonjour à toutes et tous,

 

Je cherche à faire un entmake d'une cote alignée.

Je ne suis pas sure de la syntaxe exacte, en particulier la syntaxe minimum que je pourrais ensuite étoffer.

J'essaie de comprendre comment ça fonctionne, mais ça fait plusieurs jours que je me casse la tete dessus... et là, ce n'est pas aussi simple que sur les formes de base.

 

Est-ce que c'est un problème de syntaxe ? est-ce que je ne donne pas les bonnes informations ?

 

Je suis perdue...

Je veux bien un coup de main, et un éclairage nouveau :)

 

pour l'instant j'ai ça :

 

(entmakex
 (list
(cons 0  "DIMENSION")
(cons 100 "AcDbEntity")
(cons 67 0) 
(cons 8 "01-EMPRISE-SECURITE")
(cons 100 "AcDbDimension")

;(1 . 26.5) 
(cons 1 valCote) ;valeur de la cote

(cons 100 "AcDbAlignedDimension")
;(10 453.241 276.946 0.0) 
(cons 10 (list c1X c1Y 0.0)) ; 1er point de cote
;(11 454.631 322.675 0.0)
(cons 11 (list c1X h0Y 0.0))  ;position du texte X et Y (texte du haut)
(cons 12 (list 0.0 0.0 0.0))

;(13 453.246 250.446 0.0)
(cons 13 (list c2X c2Y 0.0)) ; 2eme point de cote

;(cons 14 453.241 276.946 0.0) 


   ))

 

 

Je me suis basé sur :

https://www.autodesk...odes_dxf_06.htm

j'avoue que je ne comprends pas tout, en particulier la multitude des points :

(13,23,33),(14,24,34),(10,20,30),(11,21,31)...

 

J'ai repris le dxf de la cote exemple que j'essaie de reproduire, et j'ai essayé d'en sortir les infos de placement... :

 


'(0 . DIMENSION) 
'(5 . 1145F9)
'(100 . AcDbEntity)
'(67 . 0) 
'(410 . Model)
'(8 . 01-EMPRISE-SECURITE)
'(100 . AcDbDimension)
'(280 . 0)
'(2 . *D313)
 
;(1 . 26.5) ;valeur du texte
(list 1 valCote)

;(10 453.241 276.946 0.0) ;point centre 1
(list 10 c1X c1Y 0.0)
;(11 454.631 322.675 0.0) ;position du texte X et Y (texte du haut)
(list 11 c1X h0Y 0.0)
'(12 0.0 0.0 0.0) 
;(13 453.246 250.446 0.0) ;point centre 2
(list 13 c2X c2Y 0.0)
'(14 453.241 276.946 0.0) 

'(70 . 161)
'(71 . 5)
'(72 . 1)
'(41 . 1.0) 
'(42 . 26.4997) 

'(73 . 0) '(74 . 0) '(75 . 0) '(52 . 0.0) '(53 . 0.0) '(54 . 0.0) '(51 . 0.0) '(210 0.0 0.0 1.0) 
'(3 . RTE) 
'(100 . AcDbAlignedDimension)

'(15 0.0 0.0 0.0) 
'(16 0.0 0.0 0.0) 
'(40 . 0.0) '(50 . 0.0))

 

[EDIT: Description pour tenir à jour l'avancée]

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Le code minimum pour créer une cote alignée :

 

(and
 (setq pt1 (getpoint "\nSpécifiez le point d'origine de la première ligne d'attache: "))
 (setq pt2 (getpoint pt1 "\nIndiquez le point d'origine de la seconde ligne d'attache: "))
 (setq pt3 (getpoint "\nIndiquez la position de la ligne de cote: "))
 (entmake
   (list
     (cons 0 "DIMENSION")
     (cons 100 "AcDbEntity")
     (cons 100 "AcDbDimension")
     (cons 10 pt3)                               ; position de la ligne de cote
     (cons 70 1)                                 ; 1 = cote alignée
     (cons 100 "AcDbAlignedDimension")
     (cons 13 pt1)                               ; point d'origine de la première ligne d'attache
     (cons 14 pt2)                               ; point d'origine de la seconde ligne d'attache
   )
 )
)

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile,

 

Merci pour ton retour !

Il me manquait déjà le code 14. Je pensais que c'était le 13 le plus important des 2, merci pour le minimum nécessaire.

 

Cependant, je n'arrive pas à reproduire la forme de la cote alignée exemple.

 

Je vois que le code 70 est différent (161 à la place de 1 ; comme du 128+32+1, pour un positionnement personnalisé),

et que j'ai besoin de mettre le texte manuellement, car il doit être arrondi à 1 décimale (à moins de le modifier ensuite avec un entmod ou une autre solution).

Pourtant, je ne trouve pas quelle est la combinaison de code à renseigner pour arriver à reproduire l'exemple.

Quand je fais juste ces modifications là, plus d'autres pour essayer, je n'obtient pas de résultat.

 

Est-ce que l'ordre des éléments a de l'importance ?

 

Merci pour ton aide.

 

J'essaie de mettre le fichier en PJ avec l'outil du site, mais j'ai une erreur quand je le fais :/

Erreur :Le serveur a retourné une erreur durant l'envoi.

 

alors le voila sous WeTransfer : https://we.tl/VjsCtmpR8o

 

et le DXF complet de la cote exemple si besoin :

 

(
(-1 . <Nom d'entité: 7ffffb07450>) 
(0 . DIMENSION) 
(330 . <Nom d'entité: 7ffffb039f0>) 
(5 . 36D) 
(100 . AcDbEntity) 
(67 . 0) 
(410 . Model) 
(8 . 01-EMPRISE-SECURITE) 
(100 . AcDbDimension) 
(280 . 0) 
(2 . *D6) 
(10 1268.58 1899.69 0.0) 
(11 1269.95 1945.94 0.0) 
(12 0.0 0.0 0.0) 
(70 . 161) 
(1 . 25.5) 
(71 . 5) 
(72 . 1) 
(41 . 1.0) 
(42 . 25.48) 
(73 . 0) 
(74 . 0) 
(75 . 0) 
(52 . 0.0) 
(53 . 0.0) 
(54 . 0.0) 
(51 . 0.0) 
(210 0.0 0.0 1.0) 
(3 . RTE) 
(100 . AcDbAlignedDimension) 
(13 1268.57 1874.21 0.0) 
(14 1268.58 1899.69 0.0) 
(15 0.0 0.0 0.0) 
(16 0.0 0.0 0.0) 
(40 . 0.0) 
(50 . 0.0)
)

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

(gile) t'as donné le minimum requis pour créer une cote avec entmake.

Les autres codes dxf permettent d'affiner ton besoin, comme le calque (dxf 8), la couleur (dxf 62), etc...

Les codes non indiqués dans un entmake prennent les valeurs par défaut.

 

Donc, pour le code 70, tu peux aller voir ce lien.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Patrick,

et merci pour les précisions.

 

J'avais déjà vu cette page pour le code 70, c'est pourquoi j'avais identifié le 1 + 32 + 128.

1 c'est cote aligné,

128, c'est pour une position définie par l'utilisateur

le code 32 je ne comprends pas vraiment. Il fait référence au groupe code 2, alors j'ai essayé avec ou sans le dxf 2 (si c'est bien lui), mais le résultat est le même.

 

j'avais aussi ajouté le calque,

la couleur est gérée par le calque.

 

Ceci dit, j'ai bien avancé, mais il y a toujours un truc qui cloche, puisque ma cote (correcte) va s'écrire en 0,0,0 au lieu du point situé en (X du cercle, Y du trait de construction horizontal, 0.0).

 

Le calcul des points semble correct, si je regarde le résultat de construction du point... donc je me dit qu'il me manque des informations à transmettre.

C'est là où j'ai besoin d'aide, vu le nombre de points dans la description, je ne m'en sors pas toute seule.

 

pour l'instant j'en suis là :

(setq h0  (entget (car (entsel "\nSélectionnez l'horizontale où écrire les côtes ")))) ;;;Je sais que stocker tout le entget à la place du seul id n'est pas le plus optimisé en place mémoire.. c'est fait pour le debug et pouvoir vérifier les valeurs de mes variables.

(setq c1  (entget (car (entsel "\nSélectionnez le premier cercle "))))
 	(setq c2  (entget (car (entsel "\nSélectionnez le deuxieme cercle "))))
 	(setq cote (entget (car (entsel "\nSélectionnez la valeur de la côte "))))
 
 	(setq
h0X (cadr (assoc 10 h0))

c1X (cadr (assoc 10 c1))
c1Y (caddr (assoc 10 c1))

c2X (cadr (assoc 10 c2))
c2Y (caddr (assoc 10 c2))

valCote (rtos (* 2 (atof (cdr (assoc 1 cote)))) 2 1) ; je prends la cote d'un des cercles, la multiplie par 2 et la reconvertie en texte avec 1 décimale

)

(entmakex
 (list
     (cons 0 "DIMENSION")
     (cons 100 "AcDbEntity")
     (cons 8 "01-EMPRISE-SECURITE")
     (cons 2 "*D6") ; avec ou sans cette ligne le résultat semble identique
     (cons 100 "AcDbDimension")
     (cons 1 valCote)
     (cons 10 (list c1X h0Y 0.0))                           	; position de la ligne de cote
     (cons 70 161)                             	; 1 = cote alignée + user define
     (cons 100 "AcDbAlignedDimension")
     (cons 13 (list c1X c1Y 0.0))                           	; point d'origine de la première ligne d'attache
     (cons 14 (list c2X c2Y 0.0))                           	; point d'origine de la seconde ligne d'attache
   ))

 

 

Help, svp... O:)

Lien vers le commentaire
Partager sur d’autres sites

Salut salut,

 

Pour moi il y a un problème dans ton calcule des X/Y.

 

Le Code 10 DXF d'un cercle donne (X Y Z) du centre du cercle.

La fonction CAR donne le 1er élément d'une liste => (car '(X Y Z)) => X

La fonction CADR donne le 2eme élément d'une liste => (cadr '(X Y Z)) => Y

La fonction CADDR donne le 3eme élément d'une liste => (caddr '(X Y Z)) => Z

La fonction CADDDR donne le 4eme élément d'une liste => (cadddr '(X Y Z)) => nil (pas de 4eme élement)

 

Donc pour moi tu extrait les Y au lieux des X, et les Z au lieux des Y.

 

Enfin, pour (entmakex) si on précise le calque, mais que celui-ci n'existe pas, il est automatiquement créé? (je ne sais plus ...)

 

Biz

Lispeur débutant!
Autocad Map3D 2023
Covadis-Autopist 18.0C

Lien vers le commentaire
Partager sur d’autres sites

Et pour le probleme de point en 0 0 0, c'est le dxf 11 qui faut utiliser en plus.

 

ca m'écrit bien le texte en haut.

 

maintenant je cherche à modifier les type de côte (trait à la place de flèche) et l'écriture (horizontale au lieu de verticale)...

 

ca avance ;)

 

Je viendrais mettre mon résultat ici quand j'aurai terminé.

 

[EDIT:

Yes !

 

Ca y est j'ai trouvé le responsable du style différent, c'est bien sur le dxf 3 --> Dimension style name

dans mon cas : (cons 3 "RTE")

donc je n'ai pas à modifier tous les petits éléments, c'est un style transporté depuis chez le client, avec la cote exemple. (tout cela se trouve dans le fichier exemple que j'ai fourni plus haut si vous voulez voir.)

 

fiuuu, c'était fastidieux ^_^

Au final il fallait bien le 10 ET le 11 pour le point d'écriture de la cote, avec la même donnée. S'il en manque un, le résultat est radicalement différent.

Merci à tous pour votre aide !

Si ça peut servir à d'autres, voila la version finale :

[/size][/font]
[font="verdana, arial"][size="2"]      (setq h0  (entget (car (entsel "\nSélectionnez l'horizontale où écrire les côtes "))))
 	(setq c1  (entget (car (entsel "\nSélectionnez le premier cercle "))))
 	(setq c2  (entget (car (entsel "\nSélectionnez le deuxieme cercle "))))
 	(setq cote (entget (car (entsel "\nSélectionnez la valeur de la côte "))))
 
 	(setq
h0X (cadr (assoc 10 h0))
h0Y (caddr (assoc 10 h0))

c1X (cadr (assoc 10 c1))
c1Y (caddr (assoc 10 c1))

c2X (cadr (assoc 10 c2))
c2Y (caddr (assoc 10 c2))

valCote (rtos (* 2 (atof (cdr (assoc 1 cote)))) 2 1)

)


(entmakex
 (list
     (cons 0 "DIMENSION")
     (cons 100 "AcDbEntity")
     (cons 8 "01-EMPRISE-SECURITE")
     (cons 2 "*D6")
     (cons 100 "AcDbDimension")
     (cons 1 valCote)
     (cons 3 "RTE")
     (cons 10 (list c1X h0Y 0.0))                           	; position de la ligne de cote
     (cons 11 (list c1X h0Y 0.0))
     (cons 70 161)                             	; 1 = cote alignée + 128 + 32 (user define)
     (cons 100 "AcDbAlignedDimension")
     (cons 13 (list c1X c1Y 0.0))                           	; point d'origine de la première ligne d'attache
     (cons 14 (list c2X c2Y 0.0))                           	; point d'origine de la seconde ligne d'attache
   ))

[/EDIT]

Modifié par Ahimsa
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é