Aller au contenu

Messages recommandés

Posté(e)

Bonjour la communauté,

j'essaye d'automatiser des choses sur mes heures creuses/perdues et bon ... je butte..

j'ai donc un lisp qui propose à mon utilisateur de dessiner un réseau (VRD), et suivant le type de réseau choisi dans une liste d'un léger fichier DCL.

mais la création du calque avec entmakeX me pose problème au niveau de la couleur et du style de trait.

mais déjà la si je veux faire un load automatique du style de trait FANTOME bêtement depuis acadiso.lin j ai tout le mal du monde (pour le moment j ai donc simplement pré chargé ce trait avant de lancer la fonction..

j'ai une création de valeurs qui suit le choix de l'opérateur dans la fenêtre dcl

      (cond
        ((or (wcmatch chosenNetwork Type_reseau_1))
         (progn
           (setq layerColor "1") ; Rouge
           (setq layerLinetype "FANTOME")
           (setq layerLineweight 50)
         )
        )
        ((or (wcmatch chosenNetwork Type_reseau_2))
         (progn
           (setq layerColor "3") ; Vert
           (setq layerLinetype "FANTOME")
           (setq layerLineweight 50)
         )
        )
        ((or (wcmatch chosenNetwork Type_reseau_3))
         (progn
           (setq layerColor "114") ; Couleur 114
           (setq layerLinetype "FANTOME")
           (setq layerLineweight 50)
         )
        )
      )

mais je n'arrive pas à créer le calque avec le bon style de trait et la bonne couleur.. :

;; Créer le calque s'il n'existe pas
      (if (not (tblsearch "LAYER" chosenNetwork))
       (entmakex (list '(0 . "LAYER")
                      '(100 . "AcDbSymbolTableRecord")
                      '(100 . "AcDbLayerTableRecord")
                       (2 . chosenNetwork)
                      '(70 . 0)
                      '(62 . layerColor)   ;; couleur du calque
                      '(6 . layerLinetype)  ;; Type de ligne FANTOME
                      '(370 . 50)  ;; épaisseur de ligne 0.50 mm
               )
       )
      )

à la création du calque  j'ai une erreur DFX 62, les variables dans le entmakex me pose problème.

si une bonne âme passe par là 😀

Posté(e)

Coucou @YuGzeBuL et @didier,
En effet, il faut toujours utiliser (cons) lorsqu'on a une variable (et donc (list) et non une (quote) / ' ) pour pouvoir justement interpréter la valeur d'une variable.
Je remarque également ceci :

(setq layerColor "114") ; Couleur 114

Donc ici layerColor est de type 'STR (string), donc une chaîne de caractères. Si maintenant tu fais un (entget) sur le calque "0" par exemple, tu as ceci :

Explore-DXF in progress from "LAYER" (<Nom d'entité: 1f472e8c900>) :
|      (-1 . <Nom d'entité: 1f472e8c900>)
|      (0 . "LAYER")
|      (5 . "10")
|      (102 . "{ACAD_XDICTIONARY")
|      (360 . <Nom d'entité: 1f472e8d9e0>)
|      (102 . "}")
|      (330 . <Nom d'entité: 1f472e8c820>)
|      (100 . "AcDbSymbolTableRecord")
|      (100 . "AcDbLayerTableRecord")
|      (2 . "0")
|      (70 . 0)
|      (62 . 7)
|      (6 . "Continuous")
|      (290 . 1)
|      (370 . 0)
|      (390 . <Nom d'entité: 1f472e8c8f0>)
|      (347 . <Nom d'entité: 1f472e8ce00>)
|      (348 . <Nom d'entité: 0>)
|
End of exploration...

Et plus particulièrement la ligne

|      (62 . 7)

Que remarques-tu @YuGzeBuL ?
(je vais répondre directement 🙂)
Le code DXF 62 attend une valeur entière, comprise entre 0 et 254 (pour les calques uniquement) correspondant à la valeur ACI (AutoCAD Color Index). Cette valeur est donc de type 'INT (Integer), soit un nombre entier.

A titre purement éducatif, si tu désires utiliser des couleurs RGB (et non ACI), alors il faudra définir ta couleur RGB à partir du code DXF 420 (qui requiert d'ailleurs une petite conversion, cf. les explications >>ici<<) tout en conservant le code DXF 62 le plus proche de ta couleur RGB (pour cela tu peux t'aider des fonctions développées par LeeMac pour faire toutes les conversions possibles des couleurs >>ici<<). Et s'il faut utiliser des couleurs d'un carnet de couleur, alors il faudra également ajouter le code DXF 430 (qui cette fois-ci n'est qu'une chaîne de caractères représentant le nom de la couleur) en plus des codes DXF 420 et 62 les plus proches de cette couleur.
Bref, tout chat pour dire que le choix des couleurs peut être plus ou moins complexe selon le type de couleur souhaité 🙂

Dernière remarque vis-à-vis de ton code :

(setq layerLineweight 50)
'(370 . 50)  ;; épaisseur de ligne 0.50 mm

Pourquoi ne pas utiliser ta variable layerLineweight ici ? Car je trouve chat dommage de créer une variable que tu n'utilises pas...Du coup il faudrait juste remplacer ta ligne par :

(cons 370 layerLineweight) ;; épaisseur de ligne

Bisous,
Luna

  • Like 1
Posté(e)

Merci pour l'aide et cette rapidité🧡,

oui je n'ai pas compris la différence entre les syntaxes (62 . layerColor) et (cons 62 layercolor)

je vais me pencher sur ça

pour autant j avais encore une erreur qui est la suivante :

j avais défini les couleurs comme suit:

(setq layerColor "1") ; Rouge

mais c'est une erreur car la bonne méthode était la suivante..:

(setq layerColor 1) ; Rouge

les quotes changeant la nature de la variable enregistrée qui n est plus reconnue comme un nombre.

Citation

C'est que je dis souvent pour la formation, et du coup, je le répète :
il faut que les bases soient parfaitement assimilées avant de relever le niveau du but à atteindre.

je pensais vraiment qu'en commançant par les calques c'était un parfait moyen d'assimiler 😆

j'ai bien essayé d'autres méthode comme les "command" mais j'obtiens des prompt user qui stop mon élan et dont je n'arrive pas à me dépétrer.

comme par exemple le chargement du LINETYPE FANTOME:

(command "_.-linetype" "load" "*" "chemin d'accès au fichier lin" "")

j'essaye de parcourrir les forums mais ça parle de beaucoup de choses dont les modes expert 3 etc qui ne change rien à ma sauce.

la formule précédente me retourne simplement une erreur d'option?..

Posté(e)
Il y a 2 heures, Luna a dit :

Coucou @YuGzeBuL et @didier,
En effet, il faut toujours utiliser (cons) lorsqu'on a une variable (et donc (list) et non une (quote) / ' ) pour pouvoir justement interpréter la valeur d'une variable.
Je remarque également ceci :

(setq layerColor "114") ; Couleur 114

Donc ici layerColor est de type 'STR (string), donc une chaîne de caractères. Si maintenant tu fais un (entget) sur le calque "0" par exemple, tu as ceci :

Explore-DXF in progress from "LAYER" (<Nom d'entité: 1f472e8c900>) :
|      (-1 . <Nom d'entité: 1f472e8c900>)
|      (0 . "LAYER")
|      (5 . "10")
|      (102 . "{ACAD_XDICTIONARY")
|      (360 . <Nom d'entité: 1f472e8d9e0>)
|      (102 . "}")
|      (330 . <Nom d'entité: 1f472e8c820>)
|      (100 . "AcDbSymbolTableRecord")
|      (100 . "AcDbLayerTableRecord")
|      (2 . "0")
|      (70 . 0)
|      (62 . 7)
|      (6 . "Continuous")
|      (290 . 1)
|      (370 . 0)
|      (390 . <Nom d'entité: 1f472e8c8f0>)
|      (347 . <Nom d'entité: 1f472e8ce00>)
|      (348 . <Nom d'entité: 0>)
|
End of exploration...

Et plus particulièrement la ligne

|      (62 . 7)

Que remarques-tu @YuGzeBuL ?
(je vais répondre directement 🙂)
Le code DXF 62 attend une valeur entière, comprise entre 0 et 254 (pour les calques uniquement) correspondant à la valeur ACI (AutoCAD Color Index). Cette valeur est donc de type 'INT (Integer), soit un nombre entier.

A titre purement éducatif, si tu désires utiliser des couleurs RGB (et non ACI), alors il faudra définir ta couleur RGB à partir du code DXF 420 (qui requiert d'ailleurs une petite conversion, cf. les explications >>ici<<) tout en conservant le code DXF 62 le plus proche de ta couleur RGB (pour cela tu peux t'aider des fonctions développées par LeeMac pour faire toutes les conversions possibles des couleurs >>ici<<). Et s'il faut utiliser des couleurs d'un carnet de couleur, alors il faudra également ajouter le code DXF 430 (qui cette fois-ci n'est qu'une chaîne de caractères représentant le nom de la couleur) en plus des codes DXF 420 et 62 les plus proches de cette couleur.
Bref, tout chat pour dire que le choix des couleurs peut être plus ou moins complexe selon le type de couleur souhaité 🙂

Dernière remarque vis-à-vis de ton code :

(setq layerLineweight 50)
'(370 . 50)  ;; épaisseur de ligne 0.50 mm

Pourquoi ne pas utiliser ta variable layerLineweight ici ? Car je trouve chat dommage de créer une variable que tu n'utilises pas...Du coup il faudrait juste remplacer ta ligne par :

(cons 370 layerLineweight) ;; épaisseur de ligne

Bisous,
Luna

Bonjour Luna,

bon j ai compris comment citer un message .... (la bulle en bas de l'écran n'est pas intuitive pour tous apparemment)

j'étais en train d 'écrire quand tu as déjà pointé ma Nième erreur 😆 sur le nombre entier attendu.

merci pour la variable inutilisée j'allais la changer quand mes définitionS primaireS allaient montrer d'autres épaisseurs? je balbucine

et merci pour les liens vers Gile et Lee Mac

 

Posté(e)

et pour clore mes recherches et encore avec une histoire de syntaxe:

pour charger le seul type de ligne qui m'interresse actuellement:

(command "_.linetype" "_load" "FANTOME" "acadiso.lin")

le underscore avant load m'a fait tourner en rond..

merci pour votre aide à tout les deux déjà!

je passe le sujet en résolu 😜

 

Posté(e)

Bien vu ! Pour info soit tu utilises les noms de commandes / options de commandes en langue internationale, auquel cas il faut toujours utiliser un underscore, soit tu considères uniquement les commandes dans la langue locale (donc par exemple en français) et du coup, pas besoin de mettre d'underscore. Il est fortement conseillé d'utiliser les commandes internationales, pour éviter toute erreur potentielle (imaginons par exemple qu'un collègue français préfère utiliser un AutoCAD anglais) mais cela requiert d'être parfaitement au courant des options dans cette langue. Pour le nom des commandes tu peux utiliser la fonction (getcname) lorsque tu as un doute (mais pas dans un programme, c'est juste pour toi pour connaître l'orthographe exacte).

Bisous,
Luna

  • Like 1

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é